Pt 166696064 decode calldata fate #168

Merged
zxq9 merged 5 commits from PT-166696064-decode-calldata-fate into master 2019-06-20 20:05:44 +09:00
5 changed files with 14 additions and 2 deletions

View File

@ -71,7 +71,7 @@ prop_opcodes() ->
valid_opcodes() -> valid_opcodes() ->
lists:seq(0, 16#72) ++ lists:seq(16#fa, 16#fd). lists:seq(0, 16#75) ++ lists:seq(16#fa, 16#fd).
fate_code(Failure) -> fate_code(Failure) ->

View File

@ -112,6 +112,7 @@ fate_data(0, _Options) ->
fate_signature(), fate_signature(),
fate_contract(), fate_contract(),
fate_oracle(), fate_oracle(),
fate_oracle_q(),
fate_name(), fate_name(),
fate_bits(), fate_bits(),
fate_channel()])); fate_channel()]));
@ -142,6 +143,7 @@ fate_hash() -> {call, aeb_fate_data, make_hash, [non_zero_binary(32)]}.
fate_signature() -> {call, aeb_fate_data, make_signature, [non_zero_binary(64)]}. fate_signature() -> {call, aeb_fate_data, make_signature, [non_zero_binary(64)]}.
fate_contract() -> {call, aeb_fate_data, make_contract, [non_zero_binary(256 div 8)]}. fate_contract() -> {call, aeb_fate_data, make_contract, [non_zero_binary(256 div 8)]}.
fate_oracle() -> {call, aeb_fate_data, make_oracle, [non_zero_binary(256 div 8)]}. fate_oracle() -> {call, aeb_fate_data, make_oracle, [non_zero_binary(256 div 8)]}.
fate_oracle_q() -> {call, aeb_fate_data, make_oracle_query, [non_zero_binary(256 div 8)]}.
fate_name() -> {call, aeb_fate_data, make_name, [non_zero_binary(256 div 8)]}. fate_name() -> {call, aeb_fate_data, make_name, [non_zero_binary(256 div 8)]}.
fate_channel() -> {call, aeb_fate_data, make_channel, [non_zero_binary(256 div 8)]}. fate_channel() -> {call, aeb_fate_data, make_channel, [non_zero_binary(256 div 8)]}.

View File

@ -43,7 +43,7 @@ create_calldata(FunName, Args, ArgTypes0, RetType) ->
<<TypeHashInt:?HASH_SIZE/unit:8>> = <<TypeHashInt:?HASH_SIZE/unit:8>> =
function_type_hash(list_to_binary(FunName), ArgTypes, RetType), function_type_hash(list_to_binary(FunName), ArgTypes, RetType),
Data = aeb_heap:to_binary({TypeHashInt, list_to_tuple(Args)}), Data = aeb_heap:to_binary({TypeHashInt, list_to_tuple(Args)}),
{ok, Data, {tuple, [word, ArgTypes]}, RetType}. {ok, Data}.
-spec check_calldata(binary(), type_info()) -> -spec check_calldata(binary(), type_info()) ->
{'ok', typerep(), typerep()} | {'error', atom()}. {'ok', typerep(), typerep()} | {'error', atom()}.

View File

@ -10,6 +10,7 @@
-module(aeb_fate_abi). -module(aeb_fate_abi).
-export([ create_calldata/2 -export([ create_calldata/2
, decode_calldata/2
, get_function_hash_from_calldata/1 , get_function_hash_from_calldata/1
, get_function_name_from_function_hash/2 , get_function_name_from_function_hash/2
, get_function_type_from_function_hash/2 ]). , get_function_type_from_function_hash/2 ]).
@ -27,6 +28,14 @@ create_calldata(FunName, Args) ->
aeb_fate_data:make_tuple({FunctionId, aeb_fate_data:make_tuple({FunctionId,
aeb_fate_data:make_tuple(list_to_tuple(Args))}))}. aeb_fate_data:make_tuple(list_to_tuple(Args))}))}.
-spec decode_calldata(list(), binary()) -> {ok, term()} | {error, term()}.
decode_calldata(FunName, Calldata) ->
FunctionId = aeb_fate_code:symbol_identifier(list_to_binary(FunName)),
case ?FATE_TUPLE_ELEMENTS(aeb_fate_encoding:deserialize(Calldata)) of
[FunctionId, FateArgs] -> {ok, ?FATE_TUPLE_ELEMENTS(FateArgs)};
_ -> {error, decode_error}
end.
-spec get_function_name_from_function_hash(binary(), aeb_fate_code:fcode()) -> -spec get_function_name_from_function_hash(binary(), aeb_fate_code:fcode()) ->
{ok, term()} | {error, term()}. {ok, term()} | {error, term()}.
get_function_name_from_function_hash(<<SymbolHash:4/binary, _:28/binary>>, FateCode) -> get_function_name_from_function_hash(<<SymbolHash:4/binary, _:28/binary>>, FateCode) ->

View File

@ -373,6 +373,7 @@ deserialize2(<<?POS_BITS, Rest/binary>>) ->
{?FATE_BITS(Bint), Rest2}; {?FATE_BITS(Bint), Rest2};
deserialize2(<<?LONG_STRING, Rest/binary>>) -> deserialize2(<<?LONG_STRING, Rest/binary>>) ->
{S, Rest2} = deserialize_one(Rest), {S, Rest2} = deserialize_one(Rest),
true = is_integer(S) andalso S >= 0,
Size = S + ?SHORT_STRING_SIZE, Size = S + ?SHORT_STRING_SIZE,
String = binary:part(Rest2, 0, Size), String = binary:part(Rest2, 0, Size),
Rest3 = binary:part(Rest2, byte_size(Rest2), - (byte_size(Rest2) - Size)), Rest3 = binary:part(Rest2, byte_size(Rest2), - (byte_size(Rest2) - Size)),