From fe745c9a727fd8fe3138d2dc684dc5e4639190bc Mon Sep 17 00:00:00 2001 From: Daniel Pezely Date: Mon, 8 Aug 2022 12:20:47 -0600 Subject: [PATCH] Fix miner#1779 by reverting PR 1412 --- include/blockchain_vars.hrl | 3 - rebar.config | 1 - rebar.lock | 4 - src/blockchain.app.src | 3 +- .../blockchain_state_channels_client.erl | 144 ++---------------- .../v1/blockchain_txn_vars_v1.erl | 41 ----- test/blockchain_ct_utils.erl | 5 +- test/blockchain_simple_SUITE.erl | 107 ------------- 8 files changed, 17 insertions(+), 291 deletions(-) diff --git a/include/blockchain_vars.hrl b/include/blockchain_vars.hrl index 0c97b23459..1bba596c87 100644 --- a/include/blockchain_vars.hrl +++ b/include/blockchain_vars.hrl @@ -624,9 +624,6 @@ %% Block size limit variable (in bytes). Set to 25 * 1024 * 1024. -define(block_size_limit, block_size_limit). -%% List of peer routers associating NetID to allocated OUI --define(routers_by_netid_to_oui, routers_by_netid_to_oui). - %% ------------------------------------------------------------------ %% Token version (aka support multiple tokens). Set to 2 (pos_integer). -define(token_version, token_version). diff --git a/rebar.config b/rebar.config index 42e56833fc..64af0fabb3 100644 --- a/rebar.config +++ b/rebar.config @@ -41,7 +41,6 @@ {cream, ".*", {git, "https://github.com/helium/cream", {branch, "main"}}}, {vincenty, ".*", {git, "https://github.com/helium/vincenty", {branch, "master"}}}, {helium_proto, {git, "https://github.com/helium/proto.git", {branch, "master"}}}, - {erlang_lorawan, {git, "https://github.com/helium/erlang-lorawan.git", {branch, "master"}}}, {merkerl, ".*", {git, "https://github.com/helium/merkerl.git", {branch, "master"}}}, {xxhash, {git, "https://github.com/pierreis/erlang-xxhash", {branch, "master"}}}, {exor_filter, ".*", {git, "https://github.com/mpope9/exor_filter", {branch, "master"}}}, diff --git a/rebar.lock b/rebar.lock index 32cc0e7105..bfc95cea9d 100644 --- a/rebar.lock +++ b/rebar.lock @@ -38,10 +38,6 @@ {ref,"c5476b6639314a75a99400c9dfa7603b24a6d18a"}}, 0}, {<<"erl_base58">>,{pkg,<<"erl_base58">>,<<"0.0.1">>},0}, - {<<"erlang_lorawan">>, - {git,"https://github.com/helium/erlang-lorawan.git", - {ref,"32d1c580c26ba41ad5230d080d4c0e23cf273d86"}}, - 0}, {<<"erlang_stats">>, {git,"https://github.com/helium/erlang-stats.git", {ref,"ba2d545f8e559bd4d46146a5f5277ce4f907c03f"}}, diff --git a/src/blockchain.app.src b/src/blockchain.app.src index c8ea1518cf..d1b0e74d68 100644 --- a/src/blockchain.app.src +++ b/src/blockchain.app.src @@ -29,8 +29,7 @@ base64url, jsx, erbloom, - hackney, - erlang_lorawan + hackney ]}, {env,[]}, {modules, []}, diff --git a/src/state_channel/blockchain_state_channels_client.erl b/src/state_channel/blockchain_state_channels_client.erl index cece152710..8d73cb985a 100644 --- a/src/state_channel/blockchain_state_channels_client.erl +++ b/src/state_channel/blockchain_state_channels_client.erl @@ -32,7 +32,6 @@ -include("blockchain.hrl"). -include("blockchain_rocks.hrl"). -include("blockchain_vars.hrl"). --include_lib("grpc/autogen/server/state_channel_pb.hrl"). -define(SERVER, ?MODULE). -define(ROUTING_CACHE, sc_client_routing). @@ -50,8 +49,7 @@ packets = #{} :: #{pid() => queue:queue(blockchain_helium_packet_v1:packet())}, waiting = #{} :: waiting(), pending_closes = [] :: list(), %% TODO GC these - sc_client_transport_handler :: atom(), - routers = [] :: list(netid_to_oui()) + sc_client_transport_handler :: atom() }). -type state() :: #state{}. @@ -61,27 +59,6 @@ -type waiting_packet() :: {Packet :: blockchain_helium_packet_v1:packet(), Region :: atom(), ReceivedTime :: non_neg_integer()}. -type waiting_key() :: non_neg_integer() | string(). -type waiting() :: #{waiting_key() => [waiting_packet()]}. --type netid_to_oui() :: {pos_integer(), pos_integer()}. - --ifdef(TEST). - --export([ - set_routers/2, - get_routers/1, - get_waiting/1, - handle_route_by_netid/6 -]). - --spec set_routers(list(string()), blockchain:blockchain()) -> state(). -set_routers(Routers, Chain) -> #state{chain=Chain, routers=Routers}. - --spec get_routers(state()) -> list(netid_to_oui()). -get_routers(State) -> State#state.routers. - --spec get_waiting(state()) -> waiting(). -get_waiting(State) -> State#state.waiting. - --endif. %% ------------------------------------------------------------------ %% API Function Definitions @@ -177,19 +154,18 @@ handle_cast({banner, Banner, HandlerPid}, #state{sc_client_transport_handler = H {noreply, maybe_send_packets(AddressOrOUI, HandlerPid, State)} end end; -%% Handle Uplink packets -handle_cast({packet, - #packet_pb{routing = #routing_information_pb{data = {devaddr, DevAddr}}} = Packet, - DefaultRouters, Region, ReceivedTime}, - State) - when is_integer(DevAddr) andalso DevAddr > 0 -> - State2 = - handle_route_by_netid(Packet, DevAddr, DefaultRouters, Region, ReceivedTime, State), - {noreply, State2}; -%% Handle Join packets handle_cast({packet, Packet, DefaultRouters, Region, ReceivedTime}, #state{chain=Chain}=State) -> State2 = - handle_packet_routing(Packet, Chain, DefaultRouters, Region, ReceivedTime, State), + case find_routing(Packet, Chain) of + {error, _Reason} -> + lager:notice( + "failed to find router for join packet with routing information ~p:~p, trying default routers", + [blockchain_helium_packet_v1:routing_info(Packet), _Reason] + ), + handle_packet(Packet, DefaultRouters, Region, ReceivedTime, State); + {ok, Routes} -> + handle_packet(Packet, Routes, Region, ReceivedTime, State) + end, {noreply, State2}; handle_cast({reject, Rejection, HandlerPid}, State) -> lager:warning("Got rejection: ~p for: ~p, dropping packet", [Rejection, HandlerPid]), @@ -221,13 +197,10 @@ handle_info(post_init, #state{chain=undefined}=State) -> erlang:send_after(500, self(), post_init), {noreply, State}; Chain -> - %% Also scan incoming blocks for updates; see add_block event. - State1 = chain_var_routers_by_netid_to_oui(Chain, State), - {noreply, State1#state{chain=Chain}} + {noreply, State#state{chain=Chain}} end; handle_info({blockchain_event, {new_chain, NC}}, State) -> - State1 = chain_var_routers_by_netid_to_oui(NC, State), - {noreply, State1#state{chain=NC}}; + {noreply, State#state{chain=NC}}; handle_info({dial_fail, AddressOrOUI, _Reason}, State0) -> Packets = get_waiting_packet(AddressOrOUI, State0), lager:error("failed to dial ~p: ~p dropping ~p packets", [AddressOrOUI, _Reason, erlang:length(Packets)+1]), @@ -256,8 +229,7 @@ handle_info({dial_success, OUIOrAddress, Stream}, State0) -> _ -> {noreply, maybe_send_packets(OUIOrAddress, Stream, State1)} end; -handle_info({blockchain_event, {add_block, _BlockHash, true, Ledger}}, State) - when Ledger =/= undefined -> +handle_info({blockchain_event, {add_block, _BlockHash, true, Ledger}}, State) -> SCs = state_channels(State), {ok, LedgerHeight} = blockchain_ledger_v1:current_height(Ledger), SCGrace = case ?get_var(?sc_grace_blocks, Ledger) of @@ -275,8 +247,7 @@ handle_info({blockchain_event, {add_block, _BlockHash, true, Ledger}}, State) ok end end, SCs), - State1 = chain_var_ledger_routers_by_netid_to_oui(Ledger, State), - {noreply, State1}; + {noreply, State}; handle_info({blockchain_event, {add_block, BlockHash, false, Ledger}}, #state{chain=Chain, pubkey_bin=PubkeyBin, sig_fun=SigFun, pending_closes=PendingCloses}=State) when Chain /= undefined -> Block = @@ -1099,91 +1070,6 @@ debug_multiple_scs(SC, KnownSCs) -> ok end. --spec chain_var_routers_by_netid_to_oui( - Chain :: undefined | blockchain:blockchain(), - State :: state() - ) -> State1 :: state(). -chain_var_routers_by_netid_to_oui(undefined, State) -> - Ledger = blockchain:ledger(), - chain_var_ledger_routers_by_netid_to_oui(Ledger, State); -chain_var_routers_by_netid_to_oui(Chain, State) -> - Ledger = blockchain:ledger(Chain), - chain_var_ledger_routers_by_netid_to_oui(Ledger, State). - --spec chain_var_ledger_routers_by_netid_to_oui( - Ledger :: blockchain:ledger(), - State :: state() - ) -> State1 :: state(). -chain_var_ledger_routers_by_netid_to_oui(Ledger, State) -> - Routers = - case ?get_var(?routers_by_netid_to_oui, Ledger) of - {ok, Bin} -> binary_to_term(Bin); - _ -> [] - end, - State#state{routers=Routers}. - --spec handle_route_by_netid( - Packet :: blockchain_helium_packet_v1:packet(), - DevAddr :: number() | binary(), - DefaultRouters :: [blockchain_ledger_routing_v1:routing()], - Region :: atom(), - ReceivedTime :: non_neg_integer(), - State :: state() - ) -> State1 :: state(). -handle_route_by_netid(Packet, DevAddr, DefaultRouters, Region, ReceivedTime, State) -> - #state{chain=Chain, routers=RoamingRouters} = State, - OurNetID = application:get_env(blockchain, devaddr_prefix, $H), - case lora_subnet:parse_netid(DevAddr) of - {ok, OurNetID} -> - handle_packet_routing(Packet, Chain, DefaultRouters, Region, ReceivedTime, State); - {ok, ExtractedNetID} -> - FoldFn = - fun({NetID, OUI}, Acc) when NetID == ExtractedNetID -> - Ledger = blockchain:ledger(Chain), - case blockchain_ledger_v1:find_routing(OUI, Ledger) of - {ok, Route} -> [Route|Acc]; - _ -> Acc - end; - ({_OtherNetID, _}, Acc) -> - Acc - end, - RoutesOrAddresses = - case lists:foldl(FoldFn, [], RoamingRouters) of - [] -> - lager:debug("no routes found for netid ~p", [ExtractedNetID]), - DefaultRouters; - Routes -> - lager:debug("found ~p for netid ~p", [[blockchain_ledger_routing_v1:oui(R) || R <- Routes], ExtractedNetID]), - Routes - end, - handle_packet(Packet, RoutesOrAddresses, Region, ReceivedTime, State); - _Error -> - %% Drop undeliverable packet - lager:warning("failed to route ~p with devaddr=~p", [_Error, DevAddr]), - State - end. - --spec handle_packet_routing( - Packet :: blockchain_helium_packet_v1:packet(), - Chain :: blockchain:blockchain(), - DefaultRouters :: [string()] | [blockchain_ledger_routing_v1:routing()], - Region :: atom(), - ReceivedTime :: non_neg_integer(), - State :: state() - ) -> state(). -handle_packet_routing(Packet, Chain, DefaultRouters, Region, ReceivedTime, State) -> - case find_routing(Packet, Chain) of - {error, _Reason} -> - lager:warning( - "failed to find router for join packet with routing information ~p:~p, trying default routers", - [blockchain_helium_packet_v1:routing_info(Packet), _Reason] - ), - handle_packet(Packet, DefaultRouters, Region, ReceivedTime, State); - {ok, Routes} -> - lager:debug("found routes ~p", [Routes]), - handle_packet(Packet, Routes, Region, ReceivedTime, State) - end. - print_routes(RoutesOrAddresses) -> lists:map(fun(RouteOrAddress) -> case blockchain_ledger_routing_v1:is_routing(RouteOrAddress) of diff --git a/src/transactions/v1/blockchain_txn_vars_v1.erl b/src/transactions/v1/blockchain_txn_vars_v1.erl index 43de286f2a..505d4edb05 100644 --- a/src/transactions/v1/blockchain_txn_vars_v1.erl +++ b/src/transactions/v1/blockchain_txn_vars_v1.erl @@ -1565,14 +1565,6 @@ validate_var(?discard_zero_freq_witness, Value) -> validate_var(?block_size_limit, Value) -> validate_int(Value, "block_size_limit", 1*1024*1024, 512*1024*1024, false); -validate_var(?routers_by_netid_to_oui, Bin) when is_binary(Bin) -> - %% Even though Rust will need to process the structure too, - %% gateway-rs fetches this via Validator, which in turn converts - %% to ProtoBuf. - validate_routers_by_netid_to_oui(binary_to_term(Bin)); -validate_var(?routers_by_netid_to_oui, _NotBinary) -> - throw({error, {invalid_routers_by_netid_to_oui, expect_binary_list_of_pairs}}); - validate_var(?token_version, Value) -> case Value of 2 -> ok; %% Add support for multiple tokens @@ -1705,26 +1697,6 @@ validate_region_params(Var, Value) -> purge_pocs(Ledger) -> blockchain_ledger_v1:purge_pocs(Ledger). -validate_routers_by_netid_to_oui(List) when is_list(List) -> - validate_routers_by_netid_to_oui(List, 1); -validate_routers_by_netid_to_oui(BadValue) -> - throw({error, {invalid_routers_by_netid_to_oui, {badvalue, BadValue}, - expect_list_of_pairs}}). - -validate_routers_by_netid_to_oui([{NetID, OUI} | T], Index) - when is_integer(NetID) andalso is_integer(OUI) andalso - NetID >= 0 andalso NetID =< 16#FFFFFF andalso - OUI >= 0 andalso OUI =< 16#FFFFFFFFFFFFFFFF-> - validate_routers_by_netid_to_oui(T, Index + 1); -validate_routers_by_netid_to_oui([], _) -> - true; -validate_routers_by_netid_to_oui([H | _T], Index) -> - throw({error, {invalid_routers_by_netid_to_oui, {{index, Index}, {entry, H}}, - expect_pair}}); -validate_routers_by_netid_to_oui(BadValue, Index) -> - throw({error, {invalid_routers_by_netid_to_oui, {{index, Index}, {value, BadValue}}, - expect_list_of_pairs}}). - %% ------------------------------------------------------------------ %% EUNIT Tests %% ------------------------------------------------------------------ @@ -1784,18 +1756,5 @@ to_json_test() -> [type, hash, vars, version_predicate, proof, master_key, key_proof, cancels, unsets, nonce])), ?assertEqual(<<"f is for ffffff\0">>, base64:decode(maps:get(f, maps:get(vars, Json)))). -routers_test() -> - ?assertEqual(true, validate_routers_by_netid_to_oui([{0, 0}])), - ?assertEqual(true, validate_routers_by_netid_to_oui([{0, 0}, {1, 1}])), - ?assertException(throw, {error, {invalid_routers_by_netid_to_oui, {{index, 2}, _}, _}}, - validate_routers_by_netid_to_oui([{0, 0}, {}])), - ?assertException(throw, {error, {invalid_routers_by_netid_to_oui, {{index, 1}, _}, _}}, - validate_routers_by_netid_to_oui([{non_integer, 0}])), - ?assertException(throw, {error, {invalid_routers_by_netid_to_oui, {{index, 1}, _}, _}}, - validate_routers_by_netid_to_oui([{0, non_integer}])), - ?assertException(throw, {error, {invalid_routers_by_netid_to_oui, _, _}}, - validate_routers_by_netid_to_oui({{0, 0}, {1, 1}})), - ?assertException(throw, {error, {invalid_routers_by_netid_to_oui, {{index, 2}, _}, _}}, - validate_routers_by_netid_to_oui([{0, 0}, {1, 2, 3}])). -endif. diff --git a/test/blockchain_ct_utils.erl b/test/blockchain_ct_utils.erl index 7bc9dc9349..d9e131483b 100644 --- a/test/blockchain_ct_utils.erl +++ b/test/blockchain_ct_utils.erl @@ -444,10 +444,7 @@ raw_vars(Vars) -> ?max_subnet_size => 65536, ?min_subnet_size => 8, ?max_subnet_num => 20, - ?dc_payload_size => 24, - ?routers_by_netid_to_oui => - term_to_binary([{16#000009, 1}, {16#600025, 1}, - {16#000037, 1}, {16#60003A, 1}]) + ?dc_payload_size => 24 }, maps:merge(DefVars, Vars). diff --git a/test/blockchain_simple_SUITE.erl b/test/blockchain_simple_SUITE.erl index b44f56b388..4cefa231fd 100644 --- a/test/blockchain_simple_SUITE.erl +++ b/test/blockchain_simple_SUITE.erl @@ -4,7 +4,6 @@ -include_lib("eunit/include/eunit.hrl"). -include("blockchain_vars.hrl"). -include("blockchain.hrl"). --include("blockchain_ct_utils.hrl"). -include_lib("helium_proto/include/blockchain_txn_token_burn_v1_pb.hrl"). -include_lib("helium_proto/include/blockchain_txn_payment_v1_pb.hrl"). @@ -26,7 +25,6 @@ fees_since_test/1, security_token_test/1, routing_test/1, - routing_netid_to_oui_test/1, block_save_failed_test/1, absorb_failed_test/1, missing_last_block_test/1, @@ -1346,111 +1344,6 @@ routing_test(Config) -> meck:unload(blockchain_ledger_v1), ok. -routing_netid_to_oui_test(Config) -> - %% Mostly same as routing_test()... - ConsensusMembers = ?config(consensus_members, Config), - Chain = ?config(chain, Config), - Swarm = ?config(swarm, Config), - Ledger = blockchain:ledger(Chain), - - [_, {Payer, {_, PayerPrivKey, _}}, {Router1, {_, RouterPrivKey, _}}|_] = ConsensusMembers, - SigFun = libp2p_crypto:mk_sig_fun(PayerPrivKey), - _RouterSigFun = libp2p_crypto:mk_sig_fun(RouterPrivKey), - - meck:new(blockchain_txn_oui_v1, [no_link, passthrough]), - %% See comment in routing_test() for caveats. - meck:expect(blockchain_ledger_v1, check_dc_or_hnt_balance, fun(_, _, _, _) -> ok end), - meck:expect(blockchain_ledger_v1, debit_fee, fun(_, _, _, _, _, _) -> ok end), - - OUI1 = 1, - Addresses0 = [libp2p_swarm:pubkey_bin(Swarm), Router1], - {Filter, _} = xor16:to_bin(xor16:new([0], fun xxhash:hash64/1)), - OUITxn0 = blockchain_txn_oui_v1:new(OUI1, Payer, Addresses0, Filter, 8), - SignedOUITxn0 = blockchain_txn_oui_v1:sign(OUITxn0, SigFun), - - ?assertEqual({error, not_found}, blockchain_ledger_v1:find_routing(OUI1, Ledger)), - - {ok, Block0} = test_utils:create_block(ConsensusMembers, [SignedOUITxn0]), - _ = blockchain_gossip_handler:add_block(Block0, Chain, self(), blockchain_swarm:tid()), - - ok = test_utils:wait_until(fun() -> {ok, 2} == blockchain:height(Chain) end), - - Routing0 = blockchain_ledger_routing_v1:new(OUI1, Payer, Addresses0, Filter, - <<0:25/integer-unsigned-big, (blockchain_ledger_routing_v1:subnet_size_to_mask(8)):23/integer-unsigned-big>>, 0), - ?assertEqual({ok, Routing0}, blockchain_ledger_v1:find_routing(OUI1, Ledger)), - - %% Diverging from routing_test()... - - RoamingRouters = - case ?get_var(?routers_by_netid_to_oui, Ledger) of - {ok, Bin} -> binary_to_term(Bin); - _ -> [] - end, - ?assertNotEqual([], RoamingRouters), - State = blockchain_state_channels_client:set_routers(RoamingRouters, Chain), - Region = 'US915', - Now = erlang:system_time(seconds), - DefaultRouters = - [libp2p_crypto:pubkey_bin_to_p2p(binary:list_to_bin(blockchain_ct_utils:randname(16))) - || _X <- lists:seq(1, 3)], - - %% Send packet using devaddr outside any of our test netids. - - DevAddr0 = lora_subnet:devaddr_from_netid($Z, 16#F0F0F0), - Payload0 = crypto:strong_rand_bytes(120), - Packet0 = blockchain_helium_packet_v1:new({devaddr, DevAddr0}, Payload0), - NewState0 = - blockchain_state_channels_client:handle_route_by_netid( - Packet0, DevAddr0, DefaultRouters, Region, Now, State - ), - - %% Checking packets ready to be sent; it should route them to default Routers - %% as the net id $Z is unknown to us. - Waiting0 = blockchain_state_channels_client:get_waiting(NewState0), - lists:foreach( - fun(K) -> - ?assert(lists:member(K, DefaultRouters)) - end, - maps:keys(Waiting0) - ), - - %% Send packet using devaddr within each of our test netids, - %% and confirm results of route_by_netid(). - lists:foreach( - fun({NetID, OUI}) -> - DevAddr = lora_subnet:devaddr_from_subnet(1, [NetID]), - Payload = crypto:strong_rand_bytes(120), - Packet = blockchain_helium_packet_v1:new({devaddr, DevAddr}, Payload), - NewState = - blockchain_state_channels_client:handle_route_by_netid( - Packet, DevAddr, DefaultRouters, Region, Now, State - ), - Waiting = blockchain_state_channels_client:get_waiting(NewState), - {ok, Route} = blockchain_ledger_v1:find_routing(OUI, Ledger), - ?assertEqual([blockchain_ledger_routing_v1:oui(Route)], maps:keys(Waiting)) - end, - RoamingRouters - ), - - %% Use devaddr within default router slab. - %% Official NetID assigned to Nova Labs by LoRa Alliance: - NetID = 16#60002D, - DevAddr1 = lora_subnet:devaddr_from_netid(NetID, 16#F0F0), - Payload1 = crypto:strong_rand_bytes(120), - Packet1 = blockchain_helium_packet_v1:new({devaddr, DevAddr1}, Payload1), - NewState1 = - blockchain_state_channels_client:handle_route_by_netid( - Packet1, DevAddr1, DefaultRouters, Region, Now, State - ), - Waiting1 = blockchain_state_channels_client:get_waiting(NewState1), - lists:foreach( - fun(K) -> - ?assert(lists:member(K, DefaultRouters)) - end, - maps:keys(Waiting1) - ), - ok. - max_subnet_test(Config) -> ConsensusMembers = ?config(consensus_members, Config), Chain = ?config(chain, Config),