Connect handshake and candidate notification 'works'
This commit is contained in:
parent
7060c29099
commit
be8dfe32f2
@ -57,32 +57,34 @@ protocols(_Vsn) -> [?PROTOCOL].
|
|||||||
validate(#{ connect := #{ pubkey := PK
|
validate(#{ connect := #{ pubkey := PK
|
||||||
, protocols := Protocols
|
, protocols := Protocols
|
||||||
, versions := Versions
|
, versions := Versions
|
||||||
|
, pool_id := PoolId
|
||||||
|
, extra_pubkeys := Extra
|
||||||
}} = Msg, _Vsn) ->
|
}} = Msg, _Vsn) ->
|
||||||
valid({list, protocol}, Protocols),
|
valid({list, protocol}, Protocols),
|
||||||
valid({list, version} , Versions),
|
valid({list, version} , Versions),
|
||||||
valid(pubkey, PK),
|
valid(pubkey, PK),
|
||||||
|
valid(contract, PoolId),
|
||||||
|
valid(pubkey, PK),
|
||||||
|
valid({list, pubkey}, Extra),
|
||||||
Msg;
|
Msg;
|
||||||
validate(#{ connect_ack := #{ protocol := Protocol0
|
validate(#{ connect_ack := #{ protocol := Protocol
|
||||||
, version := Version
|
, version := Version }} = Msg, _Vsn) ->
|
||||||
, pubkey := PK
|
|
||||||
, edge_bits := EB }} = Msg, _Vsn) ->
|
|
||||||
Protocol = binary_to_existing_atom(Protocol0, utf8),
|
|
||||||
valid(protocol, Protocol),
|
valid(protocol, Protocol),
|
||||||
valid(version, Version),
|
valid(version, Version),
|
||||||
valid(pubkey, PK),
|
|
||||||
valid(edgebits, EB),
|
|
||||||
Msg#{ protocol => Protocol };
|
|
||||||
validate(#{ nonces := #{ seq := Seq
|
|
||||||
, n := N } } = Msg, _Vsn) ->
|
|
||||||
valid(seq, Seq),
|
|
||||||
valid(pos_int, N),
|
|
||||||
Msg;
|
Msg;
|
||||||
validate(#{ candidate := #{ candidate := C
|
validate(#{ candidate := #{ seq := Seq
|
||||||
|
, candidate := C
|
||||||
, nonces := Nonces
|
, nonces := Nonces
|
||||||
, seq := Seq } } = Msg, _Vsn) ->
|
, edge_bits := EdgeBits } } = Msg, _Vsn) ->
|
||||||
valid(candidate, C),
|
valid(candidate, C),
|
||||||
valid(nonces, Nonces),
|
valid(nonces, Nonces),
|
||||||
valid(seq, Seq),
|
valid(seq, Seq),
|
||||||
|
valid(edge_bits, EdgeBits),
|
||||||
|
Msg;
|
||||||
|
validate(#{ get_nonces := #{ seq := Seq
|
||||||
|
, n := N }} = Msg, _Vsn) ->
|
||||||
|
valid(seq, Seq),
|
||||||
|
valid(pos_integer, N),
|
||||||
Msg;
|
Msg;
|
||||||
validate(#{ solution := #{ seq := Seq
|
validate(#{ solution := #{ seq := Seq
|
||||||
, nonce := Nonce
|
, nonce := Nonce
|
||||||
@ -91,9 +93,6 @@ validate(#{ solution := #{ seq := Seq
|
|||||||
valid(nonce, Nonce),
|
valid(nonce, Nonce),
|
||||||
valid(evidence, Evidence),
|
valid(evidence, Evidence),
|
||||||
Msg;
|
Msg;
|
||||||
validate(#{ solution_ack := #{ 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),
|
||||||
@ -136,7 +135,7 @@ decode(MsgBin, ?PROTOCOL_JSON, Vsn) ->
|
|||||||
#{ <<"id">> := Id
|
#{ <<"id">> := Id
|
||||||
, <<"result">> := Result } ->
|
, <<"result">> := Result } ->
|
||||||
#{ reply => #{ id => Id
|
#{ reply => #{ id => Id
|
||||||
, result => validate(decode_result(Result), Vsn) }};
|
, result => decode_result(Result, Vsn) }};
|
||||||
#{ <<"id">> := Id
|
#{ <<"id">> := Id
|
||||||
, <<"error">> := #{ <<"code">> := Code
|
, <<"error">> := #{ <<"code">> := Code
|
||||||
, <<"message">> := Message }} ->
|
, <<"message">> := Message }} ->
|
||||||
@ -151,7 +150,7 @@ encode_msg(Msg0, ?PROTOCOL_JSON, Vsn) ->
|
|||||||
[{Method, Args}] = maps:to_list(Msg),
|
[{Method, Args}] = maps:to_list(Msg),
|
||||||
json_encode(#{ <<"jsonrpc">> => <<"2.0">>
|
json_encode(#{ <<"jsonrpc">> => <<"2.0">>
|
||||||
, <<"method">> => Method
|
, <<"method">> => Method
|
||||||
, <<"args">> => Args }).
|
, <<"params">> => Args }).
|
||||||
|
|
||||||
encode_request(Req0, Id, ?PROTOCOL_JSON, Vsn) ->
|
encode_request(Req0, Id, ?PROTOCOL_JSON, Vsn) ->
|
||||||
Req = validate(Req0, Vsn),
|
Req = validate(Req0, Vsn),
|
||||||
@ -159,7 +158,7 @@ encode_request(Req0, Id, ?PROTOCOL_JSON, Vsn) ->
|
|||||||
json_encode(#{ <<"jsonrpc">> => <<"2.0">>
|
json_encode(#{ <<"jsonrpc">> => <<"2.0">>
|
||||||
, <<"id">> => Id
|
, <<"id">> => Id
|
||||||
, <<"method">> => Method
|
, <<"method">> => Method
|
||||||
, <<"args">> => Args }).
|
, <<"params">> => Args }).
|
||||||
|
|
||||||
encode_reply(Reply0, Id, ?PROTOCOL_JSON, Vsn) when is_map(Reply0) ->
|
encode_reply(Reply0, Id, ?PROTOCOL_JSON, Vsn) when is_map(Reply0) ->
|
||||||
Reply = validate(Reply0, Vsn),
|
Reply = validate(Reply0, Vsn),
|
||||||
@ -170,10 +169,10 @@ encode_reply(Reply0, Id, ?PROTOCOL_JSON, Vsn) when is_map(Reply0) ->
|
|||||||
encode_reply(Reply, Id, ?PROTOCOL_JSON, _Vsn) ->
|
encode_reply(Reply, Id, ?PROTOCOL_JSON, _Vsn) ->
|
||||||
Msg = case Reply of
|
Msg = case Reply of
|
||||||
{error, Reason} ->
|
{error, Reason} ->
|
||||||
|
Error = encode_error(Reason),
|
||||||
#{ <<"jsonrpc">> => <<"2.0">>
|
#{ <<"jsonrpc">> => <<"2.0">>
|
||||||
, <<"id">> => Id
|
, <<"id">> => Id
|
||||||
, <<"error">> => #{ <<"code">> => error_code(Reason)
|
, <<"error">> => Error};
|
||||||
, <<"message">> => Reason }};
|
|
||||||
ok ->
|
ok ->
|
||||||
#{ <<"jsonrpc">> => <<"2.0">>
|
#{ <<"jsonrpc">> => <<"2.0">>
|
||||||
, <<"id">> => Id
|
, <<"id">> => Id
|
||||||
@ -184,6 +183,12 @@ encode_reply(Reply, Id, ?PROTOCOL_JSON, _Vsn) ->
|
|||||||
json_encode(Msg) ->
|
json_encode(Msg) ->
|
||||||
iolist_to_binary(json:encode(Msg)).
|
iolist_to_binary(json:encode(Msg)).
|
||||||
|
|
||||||
|
encode_error(#{code := _, message := _} = E) ->
|
||||||
|
E;
|
||||||
|
encode_error(Reason) ->
|
||||||
|
#{ <<"code">> => error_code(Reason)
|
||||||
|
, <<"message">> => Reason }.
|
||||||
|
|
||||||
error_code(mining_disabled ) -> -32000;
|
error_code(mining_disabled ) -> -32000;
|
||||||
error_code(pool_exists ) -> -32001;
|
error_code(pool_exists ) -> -32001;
|
||||||
error_code(pool_not_found ) -> -32002;
|
error_code(pool_not_found ) -> -32002;
|
||||||
@ -195,27 +200,49 @@ error_code(solution_mismatch) -> -32007;
|
|||||||
error_code(unknown_method ) -> -32601;
|
error_code(unknown_method ) -> -32601;
|
||||||
error_code(_ ) -> -32603. % internal error
|
error_code(_ ) -> -32603. % internal error
|
||||||
|
|
||||||
decode_result(<<"ok">>) -> ok;
|
decode_result(<<"ok">>, _) -> ok;
|
||||||
decode_result(#{<<"nonces">> := Nonces}) -> #{nonces => Nonces}.
|
decode_result(#{<<"connect_ack">> := #{ <<"protocol">> := P
|
||||||
|
, <<"version">> := V }}, Vsn) ->
|
||||||
|
Msg = #{connect_ack => #{ protocol => P
|
||||||
|
, version => V }},
|
||||||
|
validate(Msg, Vsn);
|
||||||
|
decode_result(#{<<"nonces">> := Nonces}, _) ->
|
||||||
|
valid(nonces, Nonces),
|
||||||
|
#{nonces => Nonces}.
|
||||||
|
|
||||||
%% Mapping types
|
%% Mapping types
|
||||||
decode_msg_(<<"connect">>, #{ <<"pubkey">> := PK }) ->
|
decode_msg_(<<"connect">>, #{ <<"protocols">> := Protos
|
||||||
#{connect => #{pubkey => PK}};
|
, <<"versions">> := Vsns
|
||||||
decode_msg_(<<"nonces">>, #{ <<"seq">> := Seq
|
, <<"pool_id">> := PoolId
|
||||||
, <<"n">> := N }) ->
|
, <<"pubkey">> := PK
|
||||||
#{nonces => #{seq => Seq, n => N}};
|
, <<"extra_pubkeys">> := Extra }) ->
|
||||||
|
#{connect => #{ protocols => Protos
|
||||||
|
, versions => Vsns
|
||||||
|
, pool_id => PoolId
|
||||||
|
, pubkey => PK
|
||||||
|
, extra_pubkeys => Extra
|
||||||
|
}};
|
||||||
|
decode_msg_(<<"get_nonces">>, #{ <<"seq">> := Seq
|
||||||
|
, <<"n">> := N }) ->
|
||||||
|
#{get_nonces => #{seq => Seq, n => N}};
|
||||||
decode_msg_(<<"candidate">>, #{ <<"candidate">> := C
|
decode_msg_(<<"candidate">>, #{ <<"candidate">> := C
|
||||||
, <<"nonces">> := Nonces
|
, <<"nonces">> := Nonces
|
||||||
, <<"seq">> := Seq }) ->
|
, <<"seq">> := Seq
|
||||||
|
, <<"edge_bits">> := EdgeBits }) ->
|
||||||
#{candidate => #{ candidate => C
|
#{candidate => #{ candidate => C
|
||||||
, nonces => Nonces
|
, nonces => Nonces
|
||||||
, seq => Seq }};
|
, seq => Seq
|
||||||
decode_msg_(<<"solution">>, #{ <<"seq">> := Seq
|
, edge_bits => EdgeBits }};
|
||||||
, <<"nonces">> := Nonces
|
decode_msg_(<<"solution">>, #{ <<"seq">> := Seq
|
||||||
|
, <<"nonce">> := Nonce
|
||||||
, <<"evidence">> := Evidence }) ->
|
, <<"evidence">> := Evidence }) ->
|
||||||
#{solution => #{ seq => Seq
|
#{solution => #{ seq => Seq
|
||||||
, nonce => Nonces
|
, nonce => Nonce
|
||||||
, evidence => Evidence}}.
|
, evidence => Evidence}};
|
||||||
|
decode_msg_(<<"no_solution">>, #{ <<"seq">> := Seq
|
||||||
|
, <<"nonce">> := Nonce }) ->
|
||||||
|
#{no_solution => #{ seq => Seq
|
||||||
|
, nonce => Nonce }}.
|
||||||
|
|
||||||
valid(Type, Val) ->
|
valid(Type, Val) ->
|
||||||
try valid_(Type, Val)
|
try valid_(Type, Val)
|
||||||
@ -225,12 +252,13 @@ valid(Type, Val) ->
|
|||||||
end.
|
end.
|
||||||
|
|
||||||
valid_({list,T}, Ps) -> lists:all(fun(X) -> valid_(T, X) end, Ps);
|
valid_({list,T}, Ps) -> lists:all(fun(X) -> valid_(T, X) end, Ps);
|
||||||
valid_(protocol, P) -> is_binary(P);
|
valid_(protocol, P) -> is_binary(P);
|
||||||
valid_(version, V) -> is_binary(V);
|
valid_(version, V) -> is_binary(V);
|
||||||
valid_(pubkey, PK) -> ok_tuple(gmser_api_encoder:safe_decode(account_pubkey, PK));
|
valid_(pubkey, PK) -> ok_tuple(gmser_api_encoder:safe_decode(account_pubkey, PK));
|
||||||
valid_(seq, Seq) -> pos_integer(Seq);
|
valid_(seq, Seq) -> pos_integer(Seq);
|
||||||
valid_(edgebits, E) -> pos_integer(E);
|
valid_(edge_bits, E) -> pos_integer(E);
|
||||||
valid_(pos_int, I) -> pos_integer(I);
|
valid_(pos_int, I) -> pos_integer(I);
|
||||||
|
valid_(contract, Id) -> ok_tuple(gmser_api_encoder:safe_defode(contract_pubkey, Id));
|
||||||
valid_(nonces, Ns) ->
|
valid_(nonces, Ns) ->
|
||||||
case Ns of
|
case Ns of
|
||||||
[N] -> pos_integer(N);
|
[N] -> pos_integer(N);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user