Continuous mining works

This commit is contained in:
Ulf Wiger 2025-03-16 17:30:38 +01:00
parent a7b17a37f2
commit b03b89ef39

View File

@ -9,6 +9,7 @@
-export([ -export([
validate/2 validate/2
, encode/3
, decode/3 , decode/3
, encode_request/4 , encode_request/4
, encode_reply/4 , encode_reply/4
@ -59,6 +60,7 @@ validate(#{ connect := #{ pubkey := PK
, versions := Versions , versions := Versions
, pool_id := PoolId , pool_id := PoolId
, extra_pubkeys := Extra , extra_pubkeys := Extra
, nonces := Nonces
}} = Msg, _Vsn) -> }} = Msg, _Vsn) ->
valid({list, protocol}, Protocols), valid({list, protocol}, Protocols),
valid({list, version} , Versions), valid({list, version} , Versions),
@ -66,6 +68,7 @@ validate(#{ connect := #{ pubkey := PK
valid(contract, PoolId), valid(contract, PoolId),
valid(pubkey, PK), valid(pubkey, PK),
valid({list, pubkey}, Extra), valid({list, pubkey}, Extra),
valid(pos_int, Nonces),
Msg; Msg;
validate(#{ connect_ack := #{ protocol := Protocol validate(#{ connect_ack := #{ protocol := Protocol
, version := Version }} = Msg, _Vsn) -> , version := Version }} = Msg, _Vsn) ->
@ -88,6 +91,10 @@ validate(#{ get_nonces := #{ seq := Seq
valid(seq, Seq), valid(seq, Seq),
valid(pos_integer, N), valid(pos_integer, N),
Msg; Msg;
validate(#{ nonces := #{seq := Seq, nonces := Ns}} = Msg, _vsn) ->
valid(seq, Seq),
valid(nonces, Ns),
Msg;
validate(#{ solution := #{ seq := Seq validate(#{ solution := #{ seq := Seq
, nonce := Nonce , nonce := Nonce
, evidence := Evidence } } = Msg, _Vsn) -> , evidence := Evidence } } = Msg, _Vsn) ->
@ -95,6 +102,9 @@ validate(#{ solution := #{ seq := Seq
valid(nonce, Nonce), valid(nonce, Nonce),
valid(evidence, Evidence), valid(evidence, Evidence),
Msg; Msg;
validate(#{ solution_accepted := #{ seq := Seq }} = Msg, _Vsn) ->
valid(seq, Seq),
Msg;
validate(#{ no_solution := #{ seq := Seq validate(#{ no_solution := #{ seq := Seq
, nonce := Nonce } } = Msg, _Vsn) -> , nonce := Nonce } } = Msg, _Vsn) ->
valid(seq, Seq), valid(seq, Seq),
@ -147,6 +157,15 @@ decode(MsgBin, ?PROTOCOL_JSON, Vsn) ->
end end
end. end.
encode(#{call := Req0}, P, V) ->
{Id, Req} = maps:take(id, Req0),
encode_request(Req, Id, P, V);
encode(#{notification := #{msg := Msg}}, P, V) ->
encode_msg(Msg, P, V);
encode(#{reply := Reply0}, P, V) when is_map(Reply0) ->
{Id, Reply} = maps:take(id, Reply0),
encode_reply(Reply, Id, P, V).
encode_msg(Msg0, ?PROTOCOL_JSON, Vsn) -> encode_msg(Msg0, ?PROTOCOL_JSON, Vsn) ->
Msg = validate(Msg0, Vsn), Msg = validate(Msg0, Vsn),
[{Method, Args}] = maps:to_list(Msg), [{Method, Args}] = maps:to_list(Msg),
@ -192,13 +211,14 @@ encode_error(Reason) ->
, <<"message">> => Reason }. , <<"message">> => Reason }.
error_code(mining_disabled ) -> -32000; error_code(mining_disabled ) -> -32000;
error_code(pool_exists ) -> -32001; error_code(nyi ) -> -32001; %% random.org uses this code for nyi
error_code(pool_not_found ) -> -32002; error_code(pool_not_found ) -> -32002;
error_code(unknown_contract ) -> -32003; error_code(pool_exists ) -> -32003;
error_code(invalid_prefix ) -> -32004; error_code(unknown_contract ) -> -32004;
error_code(invalid_encoding ) -> -32005; error_code(invalid_prefix ) -> -32005;
error_code(outdated ) -> -32006; error_code(invalid_encoding ) -> -32006;
error_code(solution_mismatch) -> -32007; error_code(outdated ) -> -32007;
error_code(solution_mismatch) -> -32008;
error_code(unknown_method ) -> -32601; error_code(unknown_method ) -> -32601;
error_code(_ ) -> -32603. % internal error error_code(_ ) -> -32603. % internal error
@ -208,21 +228,25 @@ decode_result(#{<<"connect_ack">> := #{ <<"protocol">> := P
Msg = #{connect_ack => #{ protocol => P Msg = #{connect_ack => #{ protocol => P
, version => V }}, , version => V }},
validate(Msg, Vsn); validate(Msg, Vsn);
decode_result(#{<<"nonces">> := Nonces}, _) -> decode_result(#{<<"nonces">> := #{ <<"seq">> := Seq
, <<"nonces">> := Nonces}}, _) ->
valid(seq, Seq),
valid(nonces, Nonces), valid(nonces, Nonces),
#{nonces => Nonces}. #{nonces => #{seq => Seq, nonces => Nonces}}.
%% Mapping types %% Mapping types
decode_msg_(<<"connect">>, #{ <<"protocols">> := Protos decode_msg_(<<"connect">>, #{ <<"protocols">> := Protos
, <<"versions">> := Vsns , <<"versions">> := Vsns
, <<"pool_id">> := PoolId , <<"pool_id">> := PoolId
, <<"pubkey">> := PK , <<"pubkey">> := PK
, <<"extra_pubkeys">> := Extra }) -> , <<"extra_pubkeys">> := Extra
, <<"nonces">> := Nonces }) ->
#{connect => #{ protocols => Protos #{connect => #{ protocols => Protos
, versions => Vsns , versions => Vsns
, pool_id => PoolId , pool_id => PoolId
, pubkey => PK , pubkey => PK
, extra_pubkeys => Extra , extra_pubkeys => Extra
, nonces => Nonces
}}; }};
decode_msg_(<<"get_nonces">>, #{ <<"seq">> := Seq decode_msg_(<<"get_nonces">>, #{ <<"seq">> := Seq
, <<"n">> := N }) -> , <<"n">> := N }) ->
@ -243,6 +267,8 @@ decode_msg_(<<"solution">>, #{ <<"seq">> := Seq
#{solution => #{ seq => Seq #{solution => #{ seq => Seq
, nonce => Nonce , nonce => Nonce
, evidence => Evidence}}; , evidence => Evidence}};
decode_msg_(<<"solution_accepted">>, #{<<"seq">> := Seq}) ->
#{solution_accepted => #{seq => Seq}};
decode_msg_(<<"no_solution">>, #{ <<"seq">> := Seq decode_msg_(<<"no_solution">>, #{ <<"seq">> := Seq
, <<"nonce">> := Nonce }) -> , <<"nonce">> := Nonce }) ->
#{no_solution => #{ seq => Seq #{no_solution => #{ seq => Seq