JVURIEXR72OUGZ2EHP5HB6OMXUNPHMAV66YUUP2444TPOG5XGASQC J32TNYTRQJ3YTGFSI5FXW63R5ACT5SZQ6C4YSHLAZ4HXYAHAN7YQC JMYRP5MUPSBHABHBPIO45F6RC7QSQSNO2EJDUDUIQXX3MEEFDOAQC QHK3BXHEC6IAAI7HK76Y7W3IQQIEFH7TD7AYMBCLOE7U2L7BT2LQC RZB6HZ2NI5PIUIWQL63CSKXZGGUG4L6XCSCGR3TI723OO57NDT3AC R4JDMB7LL3FLA4NJEAV2DQEXII5XS5KIMG3H4YS5P6W7ZZUE7FIQC YA3ELS7AQZ2XCZZVNMZOM3TSVCWU7HSBVMDXFCIOFTXAYFZSRL2AC IBA3VK7OHBGLEYASI7JNTXPYVTNVFT4L4RRWLNF2VGPPCONDAWMQC 755UGKECZ3PFYEA2TFFOUZTF27CRQTBZWO7UYFU6WQDJMZDBVPRAC CZG24QKIB45EL7PK4UA6XVG3VEVKI7OAQXN4YMFUKKI2MXLHRANQC PFC6VDDZ55HDVMZYGJJOBUA4PTKDYIOBV7GKHT2FCWUJGXHXAPCAC CBHKQGLDCAH2E4ZNACITBSMADOKPERFCWQPUGMH7UN5TLJXLYI4QC YDZ3R5NY7II7WX4Q5O2UQ72TMCABDPPRLEMTTIBH5DGKOLAOPOPAC YWCRGWVDIMCPXBQFM23MKCYZCXJJSD733NJEPB6WUU4G4BSREILAC WHYWDNSL67TTB2AGAUACXERJ6X54YMNYVC32KJQFEXFFRYA4K3HQC ULS4X3VORQZFBSNPXN76UFH2PWS2MVBA64CJQS3IR4YUHIKEF6GQC OJ6KWAG7XUCYNQ6T3FRJK2QOP7DBO26PZEWDVH3Q2MJKIBMNWRPQC IHBNW3GI2XB6KAWUYRLL6KDOBUNUOU3N7RRLS6BFNW6SE7ZDHLWQC 55WLMLEEVBRSTAFRZ5RGF7TOGUF5OPVCPA2TMHAQK45OUO7PA3YQC DZZ4B3UGIYTN3OHAKS2HNCLK7KM2ZSHPZ4JC6YVQL6I2H4KCD5PAC M4TNRFRPHEH6T673JAMJ3CHABASCWMAJVU57HH2XEMDJCB3QPT5QC MONVI5STEDKY5ALVMEXJJXDUX6XQRKTFLP7BBNOQML3VSJEM2JAAC hashing_test() ->Table = [ { "Two hands clap and there is a sound. What is the sound of one hand?", "fcd7c41883c3564c5a6abec78e214159efe62d50f124b4afafc184ea3b764cd4"}, { "茶色", "46b321c236880cd861dafae3040cf8cc52990516d1a69ab2c170b1e615a7ebd5"}, { "elf", "ffe809405a3e1eaf77938bde2138832b177a51e47df02935edc12aacf8279f61"}, { "love collapses spacetime", "fea16c09f8aa581500fcf6ee2f6aabc59ccaa271d2a3568843930b7ff929ad86"}],lists:foreach(fun({InStr, Want}) ->In = unicode:characters_to_binary(InStr),%WantBin = hex:hexstr_to_bin(Want),Got = enacl:generichash(32, In),%?assertEqual(WantBin, Got)GotHex = hex:bin_to_hexstr(Got),?assertEqual(Want, string:lowercase(GotHex))end, Table).
EachChan = fun(Chan, {AccChannels, PeerSent}) ->{ok, {ReqId, Msg, Size}} = send_channel_state_request(Peer, Chan, true),ReqsForChan = maps:get(Chan, AccChannels, []),
EachChan = fun(Chan, {AccNewReqs, AccChannels, PeerSent}) ->{ok, {StateReqId, StateMsg, StateSize}} = send_channel_state_request(Peer, Chan, true),End = os:system_time(1000),Start = End - (12*60*60 * 1000),{ok, {TimeReqId, TimeMsg, TimeSize}} = send_channel_time_range_request(Peer, Chan, Start, End, 100),ReqsForChan = maps:get(Chan, AccChannels, [])++ [{sent, StateReqId, Peer}]++ [{sent, TimeReqId, Peer}],
{ReqId, Msg},{maps:update(Chan, ReqsForChan ++ [{sent, ReqId, Peer}], AccChannels),PeerSent + Size}
AccNewReqs ++ [{StateReqId, StateMsg}, {TimeReqId, TimeMsg}],maps:update(Chan, ReqsForChan, AccChannels),PeerSent + StateSize + TimeSize
{NewRequests, {NewChans, PeerSent}} = lists:mapfoldl(EachChan, {Chans, 0}, maps:keys(Chans)),%% Update the helper map for active outgoing ones
{NewRequests, NewChans, PeerSent} = lists:foldl(EachChan, {[], Chans, 0}, maps:keys(Chans)),%% Update the helper map for active outgoing reqs
%% TODO: keep track of which we asked for{ok, {PostReqId, _PostReqMsg, Size}} = send_post_request(Peer, NewHashes),UpdatedOut = maps:put(PostReqId, Peer, ActiveOut),%% update loop stateS#state{peers = update_peer_sent(Peers, Peer, Size),activeOut = UpdatedOut};
case length(NewHashes) of0 -> % nothing to requestS#state{peers = NewPeers};_ ->%% TODO: keep track of which hashes we asked for{ok, {PostReqId, _PostReqMsg, SentSize}} = send_post_request(Peer, NewHashes),UpdatedOut = maps:put(PostReqId, Peer, ActiveOut),%% update loop stateS#state{peers = update_peer_sent(NewPeers, Peer, SentSize),activeOut = UpdatedOut}end;
send_channel_time_range_request(Peer, Channel, Start, End, Limit) ->ReqId = crypto:strong_rand_bytes(4),io:format("[DEBUG] sending channel time range request(~p) for ~p to ~p~n", [hex:bin_to_hexstr(ReqId), Channel, Peer]),Header = [{requestId, ReqId},{circuitId, <<0,0,0,0>>},{ttl, 3}],Binary = wire:encode_channel_time_range_request(Header, Channel, Start, End, Limit),send_binary_to_peer(Peer, Binary).