diff --git a/src/region/blockchain_region_v1.erl b/src/region/blockchain_region_v1.erl index fbfa2559b9..493e7ce5b4 100644 --- a/src/region/blockchain_region_v1.erl +++ b/src/region/blockchain_region_v1.erl @@ -65,25 +65,31 @@ h3_to_region(H3, Ledger) -> -spec h3_to_region(H3 :: h3:h3_index(), Ledger :: blockchain_ledger_v1:ledger(), - RegionBins :: no_prefetch | [{atom(), binary() | {error, term()}}]) -> + RegionBins :: no_prefetch | {VarNonce :: pos_integer(), [{atom(), binary()} | {error, term()}]} | {error, term()}) -> {ok, atom()} | {error, any()}. h3_to_region(H3, Ledger, RegionBins) -> - {ok, VarsNonce} = blockchain_ledger_v1:vars_nonce(Ledger), %% maybe allow this to be passed in? Res = polyfill_resolution(Ledger), HasAux = blockchain_ledger_v1:has_aux(Ledger), Parent = h3:parent(H3, Res), Cache = persistent_term:get(?region_cache), + {MaybeBins, VarsNonce} = + case RegionBins of + no_prefetch -> + {ok, Nonce} = blockchain_ledger_v1:vars_nonce(Ledger), + {get_all_region_bins(Ledger), Nonce}; + {error, _} = Err -> + {Err, 0}; + {Nonce, B} when is_integer(Nonce), is_list(B) -> {{ok, B}, Nonce} + end, + + + {ok,VarsNonce} = blockchain_ledger_v1:vars_nonce(Ledger), + cream:cache( Cache, {HasAux, VarsNonce, Parent}, fun() -> - MaybeBins = - case RegionBins of - no_prefetch -> get_all_region_bins(Ledger); - {error, _} = Err -> Err; - B -> {ok, B} - end, case MaybeBins of {ok, Bins} -> h3_to_region_(Parent, Bins); @@ -109,7 +115,7 @@ h3_in_region(H3, RegionVar, Ledger) -> H3 :: h3:h3_index(), RegionVar :: atom(), Ledger :: blockchain_ledger_v1:ledger(), - RegionBins :: [{atom(), binary() | {error, any()}}] + RegionBins :: {pos_integer(), [{atom(), binary()} | {error, term()}]} | {error, any()} ) -> boolean() | {error, any()}. h3_in_region(H3, RegionVar, Ledger, RegionBins) -> Res = polyfill_resolution(Ledger), @@ -138,7 +144,7 @@ region_([{ToCheck, Bin} | Remaining], H3) -> end. -spec h3_to_region_(H3 :: h3:h3_index(), - RegionBins :: [{atom(), binary() | {error, any()}}]) -> + RegionBins :: [{atom(), binary()} | {error, term()}] | {error, any()}) -> {ok, atom()} | {error, any()}. h3_to_region_(H3, RegionBins) -> region_(RegionBins, H3). @@ -179,13 +185,14 @@ prewarm_cache(Ledger) -> {error, regulatory_regions_not_set} -> ok; {ok, RB} -> + {ok, Nonce} = blockchain_ledger_v1:vars_nonce(Ledger), blockchain_ledger_v1:cf_fold( active_gateways, fun({_, BG}, Acc) -> G = blockchain_ledger_gateway_v2:deserialize(BG), case blockchain_ledger_gateway_v2:location(G) of undefined -> Acc; - Loc -> _ = h3_to_region(Loc, Ledger, RB) + Loc -> _ = h3_to_region(Loc, Ledger, {Nonce, RB}) end end, 0, Ledger), diff --git a/src/transactions/v1/blockchain_txn_poc_receipts_v1.erl b/src/transactions/v1/blockchain_txn_poc_receipts_v1.erl index 59e230b999..d60edb407b 100644 --- a/src/transactions/v1/blockchain_txn_poc_receipts_v1.erl +++ b/src/transactions/v1/blockchain_txn_poc_receipts_v1.erl @@ -1414,8 +1414,9 @@ is_same_region(Version, SourceRegion0, DstRegion0) -> Channel :: non_neg_integer(), Ledger :: blockchain_ledger_v1:ledger()) -> tagged_witnesses(). tagged_witnesses(Element, Channel, Ledger) -> + {ok, VarsNonce} = blockchain_ledger_v1:vars_nonce(Ledger), {ok, RegionVars} = blockchain_region_v1:get_all_region_bins(Ledger), - tagged_witnesses(Element, Channel, RegionVars, Ledger). + tagged_witnesses(Element, Channel, {VarsNonce, RegionVars}, Ledger). tagged_witnesses(Element, Channel, RegionVars0, Ledger) -> SrcPubkeyBin = blockchain_poc_path_element_v1:challengee(Element), @@ -1586,8 +1587,9 @@ calculate_rssi_bounds_from_snr(SNR) -> get_channels(Txn, Chain) -> Ledger = blockchain:ledger(Chain), Version = poc_version(Ledger), + {ok, VarsNonce} = blockchain_ledger_v1:vars_nonce(Ledger), {ok, RegionVars} = blockchain_region_v1:get_all_region_bins(Ledger), - get_channels(Txn, Version, RegionVars, Chain). + get_channels(Txn, Version, {VarsNonce, RegionVars}, Chain). get_channels(Txn, Version, RegionVars, Chain) -> Challenger = ?MODULE:challenger(Txn), diff --git a/src/transactions/v2/blockchain_txn_poc_receipts_v2.erl b/src/transactions/v2/blockchain_txn_poc_receipts_v2.erl index 6d31b5f4df..19779add0a 100644 --- a/src/transactions/v2/blockchain_txn_poc_receipts_v2.erl +++ b/src/transactions/v2/blockchain_txn_poc_receipts_v2.erl @@ -912,8 +912,9 @@ valid_receipt(PreviousElement, Element, Channel, Ledger) -> Channel :: non_neg_integer(), Ledger :: blockchain_ledger_v1:ledger()) -> blockchain_poc_witness_v1:poc_witnesses(). valid_witnesses(Element, Channel, Ledger) -> + {ok, Nonce} = blockchain_ledger_v1:vars_nonce(Ledger), {ok, RegionVars} = blockchain_region_v1:get_all_region_bins(Ledger), - valid_witnesses(Element, Channel, RegionVars, Ledger). + valid_witnesses(Element, Channel, {Nonce, RegionVars}, Ledger). valid_witnesses(Element, Channel, RegionVars, Ledger) -> TaggedWitnesses = tagged_witnesses(Element, Channel, RegionVars, Ledger), @@ -970,8 +971,9 @@ is_same_region(SourceRegion0, DstLoc, Ledger) -> Channel :: non_neg_integer(), Ledger :: blockchain_ledger_v1:ledger()) -> tagged_witnesses(). tagged_witnesses(Element, Channel, Ledger) -> + {ok, Nonce} = blockchain_ledger_v1:vars_nonce(Ledger), {ok, RegionVars} = blockchain_region_v1:get_all_region_bins(Ledger), - tagged_witnesses(Element, Channel, RegionVars, Ledger). + tagged_witnesses(Element, Channel, {Nonce, RegionVars}, Ledger). %%-spec tagged_witnesses(Element :: blockchain_poc_path_element_v1:poc_element(), %% Channel :: non_neg_integer(), @@ -982,8 +984,7 @@ tagged_witnesses(Element, Channel, RegionVars0, Ledger) -> {ok, SourceLoc} = blockchain_ledger_v1:find_gateway_location(SrcPubkeyBin, Ledger), RegionVars = case RegionVars0 of - {ok, RV} -> RV; - RV when is_list(RV) -> RV; + {N, RV} when is_list(RV), is_integer(N) -> {N, RV}; {error, _Reason} -> no_prefetch end, SourceRegion = blockchain_region_v1:h3_to_region(SourceLoc, Ledger, RegionVars), @@ -1106,11 +1107,12 @@ get_channels(Txn, Chain) -> Ledger = blockchain:ledger(Chain), Version = poc_version(Ledger), {ok, RegionVars} = blockchain_region_v1:get_all_region_bins(Ledger), - get_channels(Txn, Version, RegionVars, Chain). + {ok, Nonce} = blockchain_ledger_v1:vars_nonce(Ledger), + get_channels(Txn, Version, {Nonce, RegionVars}, Chain). -spec get_channels(Txn :: txn_poc_receipts(), POCVersion :: pos_integer(), - RegionVars :: no_prefetch | [{atom(), binary() | {error, any()}}] | {ok, [{atom(), binary() | {error, any()}}]}, + RegionVars :: no_prefetch | {pos_integer(), [{atom(), binary() | {error, any()}}]} | {error, any()}, Chain :: blockchain:blockchain()) -> {ok, [non_neg_integer()]} | {error, any()}. get_channels(Txn, POCVersion, RegionVars, Chain) -> Path0 = ?MODULE:path(Txn), @@ -1135,13 +1137,13 @@ get_channels(Txn, POCVersion, RegionVars, Chain) -> Ledger :: blockchain_ledger_v1:ledger(), Path :: [libp2p_crypto:pubkey_bin()], LayerData :: [binary()], - RegionVars :: no_prefetch | [{atom(), binary() | {error, any()}}] | {ok, [{atom(), binary() | {error, any()}}]} | {error, any()}) -> [non_neg_integer()]. + RegionVars :: no_prefetch | [{atom(), binary() | {error, any()}}] | {error, any()}) -> [non_neg_integer()]. get_channels(_POCVersion, Ledger, Path, LayerData, RegionVars0) -> Challengee = hd(Path), RegionVars = case RegionVars0 of - {ok, RV} -> RV; - RV when is_list(RV) -> RV; + %{ok, RV} -> RV; + {N, RV} when is_list(RV), is_integer(N) -> {N, RV}; no_prefetch -> no_prefetch; {error, Reason} -> error({get_channels_region, Reason}) end, diff --git a/src/transactions/v2/blockchain_txn_rewards_v2.erl b/src/transactions/v2/blockchain_txn_rewards_v2.erl index 4e9947dc12..8c6fb90b55 100644 --- a/src/transactions/v2/blockchain_txn_rewards_v2.erl +++ b/src/transactions/v2/blockchain_txn_rewards_v2.erl @@ -294,14 +294,15 @@ calculate_rewards_(Start, End, Ledger, Chain, ReturnMD) -> calculate_rewards_metadata(Start, End, Chain) -> {ok, Ledger} = blockchain:ledger_at(End, Chain), Vars0 = get_reward_vars(Start, End, Ledger), + {ok, Nonce} = blockchain_ledger_v1:vars_nonce(Ledger), VarMap = case blockchain_hex:var_map(Ledger) of {error, _Reason} -> #{}; {ok, VM} -> VM end, - RegionVars = blockchain_region_v1:get_all_region_bins(Ledger), + {ok, RegionVars} = blockchain_region_v1:get_all_region_bins(Ledger), - Vars = Vars0#{ var_map => VarMap, region_vars => RegionVars}, + Vars = Vars0#{ var_map => VarMap, region_vars => {Nonce, RegionVars}}, %% Previously, if a state_channel closed in the grace blocks before an %% epoch ended, then it wouldn't ever get rewarded.