Compare commits
11 Commits
uw-multipl
...
master
Author | SHA1 | Date | |
---|---|---|---|
f408af0eb3 | |||
![]() |
e9b027a353 | ||
ac3c1e52f1 | |||
![]() |
4ef670162b | ||
a006410ce6 | |||
![]() |
e21f8f6fbf | ||
fe47d3715c | |||
![]() |
b9681dec88 | ||
b7cf6375fe | |||
![]() |
6fd678b420 | ||
abb1bef2b6 |
@ -3,7 +3,7 @@
|
|||||||
{plugins, [rebar3_hex]}.
|
{plugins, [rebar3_hex]}.
|
||||||
{deps, [
|
{deps, [
|
||||||
{gmserialization, {git, "https://git.qpq.swiss/QPQ-AG/gmserialization.git",
|
{gmserialization, {git, "https://git.qpq.swiss/QPQ-AG/gmserialization.git",
|
||||||
{ref, "ac64e01b0f"}}}
|
{ref, "0288719ae1"}}}
|
||||||
]}.
|
]}.
|
||||||
|
|
||||||
{xref_checks, [undefined_function_calls, undefined_functions,
|
{xref_checks, [undefined_function_calls, undefined_functions,
|
||||||
|
@ -8,5 +8,5 @@
|
|||||||
1},
|
1},
|
||||||
{<<"gmserialization">>,
|
{<<"gmserialization">>,
|
||||||
{git,"https://git.qpq.swiss/QPQ-AG/gmserialization.git",
|
{git,"https://git.qpq.swiss/QPQ-AG/gmserialization.git",
|
||||||
{ref,"ac64e01b0f675c1a34c70a827062f381920742db"}},
|
{ref,"0288719ae15814f3a53114c657502a24376bebfa"}},
|
||||||
0}].
|
0}].
|
||||||
|
@ -60,9 +60,10 @@ validate(#{ connect := #{ pubkey := PK
|
|||||||
, versions := Versions
|
, versions := Versions
|
||||||
, pool_id := PoolId
|
, pool_id := PoolId
|
||||||
, extra_pubkeys := Extra
|
, extra_pubkeys := Extra
|
||||||
, type := Type
|
, type := Type0
|
||||||
, nonces := Nonces
|
, nonces := Nonces
|
||||||
}} = Msg, _Vsn) ->
|
}} = Msg, _Vsn) ->
|
||||||
|
Type = to_atom(Type0),
|
||||||
valid({list, protocol}, Protocols),
|
valid({list, protocol}, Protocols),
|
||||||
valid({list, version} , Versions),
|
valid({list, version} , Versions),
|
||||||
valid(pubkey, PK),
|
valid(pubkey, PK),
|
||||||
@ -91,18 +92,21 @@ validate(#{ candidate := #{ seq := Seq
|
|||||||
validate(#{ get_nonces := #{ seq := Seq
|
validate(#{ get_nonces := #{ seq := Seq
|
||||||
, n := N }} = Msg, _Vsn) ->
|
, n := N }} = Msg, _Vsn) ->
|
||||||
valid(seq, Seq),
|
valid(seq, Seq),
|
||||||
valid(pos_integer, N),
|
valid(pos_int, N),
|
||||||
|
Msg;
|
||||||
|
validate(#{ new_server := #{ host := Host, port := Port, keep := Keep }} = Msg, _Vsn) ->
|
||||||
|
valid(string, Host),
|
||||||
|
valid(pos_ind, Port),
|
||||||
|
valid(boolean, Keep),
|
||||||
Msg;
|
Msg;
|
||||||
validate(#{ nonces := #{seq := Seq, nonces := Ns}} = Msg, _vsn) ->
|
validate(#{ nonces := #{seq := Seq, nonces := Ns}} = Msg, _vsn) ->
|
||||||
valid(seq, Seq),
|
valid(seq, Seq),
|
||||||
valid(nonces, Ns),
|
valid(nonces, Ns),
|
||||||
Msg;
|
Msg;
|
||||||
validate(#{ solution := #{ seq := Seq
|
validate(#{ solutions := #{ seq := Seq
|
||||||
, nonce := Nonce
|
, found := Solutions } } = Msg, _Vsn) ->
|
||||||
, evidence := Evidence } } = Msg, _Vsn) ->
|
|
||||||
valid(seq, Seq),
|
valid(seq, Seq),
|
||||||
valid(nonce, Nonce),
|
valid(solutions, Solutions),
|
||||||
valid(evidence, Evidence),
|
|
||||||
Msg;
|
Msg;
|
||||||
validate(#{ solution_accepted := #{ seq := Seq }} = Msg, _Vsn) ->
|
validate(#{ solution_accepted := #{ seq := Seq }} = Msg, _Vsn) ->
|
||||||
valid(seq, Seq),
|
valid(seq, Seq),
|
||||||
@ -147,7 +151,7 @@ decode(MsgBin, ?PROTOCOL_JSON, Vsn) ->
|
|||||||
#{ <<"method">> := Method
|
#{ <<"method">> := Method
|
||||||
, <<"params">> := Params } ->
|
, <<"params">> := Params } ->
|
||||||
%% JSON-RPC notification
|
%% JSON-RPC notification
|
||||||
#{ notification => #{ msg => validate(decode_msg_(Method, Params), Vsn) }};
|
#{ notification => validate(decode_msg_(Method, Params), Vsn) };
|
||||||
#{ <<"id">> := Id
|
#{ <<"id">> := Id
|
||||||
, <<"result">> := Result } ->
|
, <<"result">> := Result } ->
|
||||||
#{ reply => #{ id => Id
|
#{ reply => #{ id => Id
|
||||||
@ -164,7 +168,7 @@ decode(MsgBin, ?PROTOCOL_JSON, Vsn) ->
|
|||||||
encode(#{call := Req0}, P, V) ->
|
encode(#{call := Req0}, P, V) ->
|
||||||
{Id, Req} = maps:take(id, Req0),
|
{Id, Req} = maps:take(id, Req0),
|
||||||
encode_request(Req, Id, P, V);
|
encode_request(Req, Id, P, V);
|
||||||
encode(#{notification := #{msg := Msg}}, P, V) ->
|
encode(#{notification := Msg}, P, V) ->
|
||||||
encode_msg(Msg, P, V);
|
encode_msg(Msg, P, V);
|
||||||
encode(#{reply := Reply0}, P, V) when is_map(Reply0) ->
|
encode(#{reply := Reply0}, P, V) when is_map(Reply0) ->
|
||||||
{Id, Reply} = maps:take(id, Reply0),
|
{Id, Reply} = maps:take(id, Reply0),
|
||||||
@ -201,7 +205,11 @@ encode_reply(Reply, Id, ?PROTOCOL_JSON, _Vsn) ->
|
|||||||
ok ->
|
ok ->
|
||||||
#{ <<"jsonrpc">> => <<"2.0">>
|
#{ <<"jsonrpc">> => <<"2.0">>
|
||||||
, <<"id">> => Id
|
, <<"id">> => Id
|
||||||
, <<"result">> => <<"ok">> }
|
, <<"result">> => <<"ok">> };
|
||||||
|
continue ->
|
||||||
|
#{ <<"jsonrpc">> => <<"2.0">>
|
||||||
|
, <<"id">> => Id
|
||||||
|
, <<"result">> => <<"continue">> }
|
||||||
end,
|
end,
|
||||||
json_encode(Msg).
|
json_encode(Msg).
|
||||||
|
|
||||||
@ -228,6 +236,7 @@ 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(<<"continue">>, _) -> continue;
|
||||||
decode_result(#{<<"connect_ack">> := #{ <<"protocol">> := P
|
decode_result(#{<<"connect_ack">> := #{ <<"protocol">> := P
|
||||||
, <<"version">> := V }}, Vsn) ->
|
, <<"version">> := V }}, Vsn) ->
|
||||||
Msg = #{connect_ack => #{ protocol => P
|
Msg = #{connect_ack => #{ protocol => P
|
||||||
@ -255,6 +264,10 @@ decode_msg_(<<"connect">>, #{ <<"protocols">> := Protos
|
|||||||
, type => Type
|
, type => Type
|
||||||
, nonces => Nonces
|
, nonces => Nonces
|
||||||
}};
|
}};
|
||||||
|
decode_msg_(<<"new_server">>, #{ <<"host">> := Host
|
||||||
|
, <<"port">> := Port
|
||||||
|
, <<"keep">> := Keep }) ->
|
||||||
|
#{new_server => #{host => Host, port => Port, keep => Keep}};
|
||||||
decode_msg_(<<"get_nonces">>, #{ <<"seq">> := Seq
|
decode_msg_(<<"get_nonces">>, #{ <<"seq">> := Seq
|
||||||
, <<"n">> := N }) ->
|
, <<"n">> := N }) ->
|
||||||
#{get_nonces => #{seq => Seq, n => N}};
|
#{get_nonces => #{seq => Seq, n => N}};
|
||||||
@ -268,12 +281,15 @@ decode_msg_(<<"candidate">>, #{ <<"candidate">> := C
|
|||||||
, nonces => Nonces
|
, nonces => Nonces
|
||||||
, seq => Seq
|
, seq => Seq
|
||||||
, edge_bits => EdgeBits }};
|
, edge_bits => EdgeBits }};
|
||||||
decode_msg_(<<"solution">>, #{ <<"seq">> := Seq
|
decode_msg_(<<"solutions">>, #{ <<"seq">> := Seq
|
||||||
, <<"nonce">> := Nonce
|
, <<"found">> := Found }) ->
|
||||||
|
Solutions = lists:map(
|
||||||
|
fun(#{ <<"nonce">> := Nonce
|
||||||
, <<"evidence">> := Evidence }) ->
|
, <<"evidence">> := Evidence }) ->
|
||||||
#{solution => #{ seq => Seq
|
#{nonce => Nonce, evidence => Evidence}
|
||||||
, nonce => Nonce
|
end, Found),
|
||||||
, evidence => Evidence}};
|
#{solutions => #{ seq => Seq
|
||||||
|
, found => Solutions }};
|
||||||
decode_msg_(<<"solution_accepted">>, #{<<"seq">> := Seq}) ->
|
decode_msg_(<<"solution_accepted">>, #{<<"seq">> := Seq}) ->
|
||||||
#{solution_accepted => #{seq => Seq}};
|
#{solution_accepted => #{seq => Seq}};
|
||||||
decode_msg_(<<"no_solution">>, #{ <<"seq">> := Seq
|
decode_msg_(<<"no_solution">>, #{ <<"seq">> := Seq
|
||||||
@ -282,10 +298,10 @@ decode_msg_(<<"no_solution">>, #{ <<"seq">> := Seq
|
|||||||
, nonce => Nonce }}.
|
, nonce => Nonce }}.
|
||||||
|
|
||||||
valid(Type, Val) ->
|
valid(Type, Val) ->
|
||||||
try valid_(Type, Val)
|
try true = valid_(Type, Val)
|
||||||
catch
|
catch
|
||||||
error:_ ->
|
error:_ ->
|
||||||
false
|
error({invalid, {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);
|
||||||
@ -293,11 +309,18 @@ 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_(nonce, Nonce) -> pos_integer(Nonce);
|
||||||
valid_(target, T) -> pos_integer(T);
|
valid_(target, T) -> pos_integer(T);
|
||||||
valid_(edge_bits, 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_(string, S) -> is_binary(S);
|
||||||
|
valid_(boolean, B) -> is_boolean(B);
|
||||||
|
valid_(contract, Id) -> ok_tuple(gmser_api_encoder:safe_decode(contract_pubkey, Id));
|
||||||
valid_(type, T) -> lists:member(T, [miner, monitor]);
|
valid_(type, T) -> lists:member(T, [miner, monitor]);
|
||||||
|
valid_(solutions, S) -> lists:all(fun(#{nonce := N, evidence := Evd}) ->
|
||||||
|
valid_(pos_int, N),
|
||||||
|
valid_({list, pos_int}, Evd)
|
||||||
|
end, S);
|
||||||
valid_(nonces, Ns) ->
|
valid_(nonces, Ns) ->
|
||||||
case Ns of
|
case Ns of
|
||||||
[N] -> pos_integer(N);
|
[N] -> pos_integer(N);
|
||||||
@ -315,3 +338,8 @@ ok_tuple(V) ->
|
|||||||
|
|
||||||
pos_integer(I) ->
|
pos_integer(I) ->
|
||||||
is_integer(I) andalso I >= 0.
|
is_integer(I) andalso I >= 0.
|
||||||
|
|
||||||
|
to_atom(A) when is_atom(A) ->
|
||||||
|
A;
|
||||||
|
to_atom(B) when is_binary(B) ->
|
||||||
|
binary_to_existing_atom(B, utf8).
|
||||||
|
Loading…
x
Reference in New Issue
Block a user