From 230e2187ce07d8e265d5ebdfc6fd82c330a96529 Mon Sep 17 00:00:00 2001 From: Hans Svensson Date: Fri, 12 Apr 2019 14:10:56 +0200 Subject: [PATCH] Add bytes(int) as type + ecverify_secp256k1 --- .gitignore | 2 ++ include/aeb_opcodes.hrl | 13 +++++++------ include/aeb_typerep_def.hrl | 1 + src/aeb_aevm_data.erl | 1 + src/aeb_heap.erl | 21 ++++++++++++++------- 5 files changed, 25 insertions(+), 13 deletions(-) diff --git a/.gitignore b/.gitignore index b42f787..bae433e 100644 --- a/.gitignore +++ b/.gitignore @@ -24,3 +24,5 @@ doc cover aefate current_counterexample.eqc +.rebar3 +ebin diff --git a/include/aeb_opcodes.hrl b/include/aeb_opcodes.hrl index 86ecdff..6607a01 100644 --- a/include/aeb_opcodes.hrl +++ b/include/aeb_opcodes.hrl @@ -183,12 +183,13 @@ -define(PRIM_CALL_MAP_TOLIST, 305). -define(PRIM_CALL_IN_CRYPTO_RANGE(__TTYPE__), (((__TTYPE__) > 399) andalso ((__TTYPE__) < 500))). --define(PRIM_CALL_CRYPTO_ECVERIFY, 400). --define(PRIM_CALL_CRYPTO_SHA3, 401). --define(PRIM_CALL_CRYPTO_SHA256, 402). --define(PRIM_CALL_CRYPTO_BLAKE2B, 403). --define(PRIM_CALL_CRYPTO_SHA256_STRING, 404). --define(PRIM_CALL_CRYPTO_BLAKE2B_STRING, 405). +-define(PRIM_CALL_CRYPTO_ECVERIFY, 400). +-define(PRIM_CALL_CRYPTO_SHA3, 401). +-define(PRIM_CALL_CRYPTO_SHA256, 402). +-define(PRIM_CALL_CRYPTO_BLAKE2B, 403). +-define(PRIM_CALL_CRYPTO_SHA256_STRING, 404). +-define(PRIM_CALL_CRYPTO_BLAKE2B_STRING, 405). +-define(PRIM_CALL_CRYPTO_ECVERIFY_SECP256K1, 410). -define(PRIM_CALL_IN_AUTH_RANGE(__TTYPE__), (((__TTYPE__) > 499) andalso ((__TTYPE__) < 600))). -define(PRIM_CALL_AUTH_TX_HASH, 500). diff --git a/include/aeb_typerep_def.hrl b/include/aeb_typerep_def.hrl index 04200fb..61351dc 100644 --- a/include/aeb_typerep_def.hrl +++ b/include/aeb_typerep_def.hrl @@ -9,3 +9,4 @@ -define(TYPEREP_TYPEREP_TAG, 5). -define(TYPEREP_MAP_TAG, 6). -define(TYPEREP_FUN_TAG, 7). +-define(TYPEREP_BYTES_TAG, 8). diff --git a/src/aeb_aevm_data.erl b/src/aeb_aevm_data.erl index 479e8e1..9d53ae3 100644 --- a/src/aeb_aevm_data.erl +++ b/src/aeb_aevm_data.erl @@ -8,6 +8,7 @@ | {list, type()} | {option, type()} | {tuple, [type()]} + | {bytes, non_neg_integer()} | {variant, [[type()]]}. diff --git a/src/aeb_heap.erl b/src/aeb_heap.erl index 34f7202..c5e7fdc 100644 --- a/src/aeb_heap.erl +++ b/src/aeb_heap.erl @@ -38,7 +38,7 @@ maps_with_next_id(#heap{maps = #maps{next_id = N}}) -> #maps{ next_id = N }. -spec set_next_id(heap_fragment(), non_neg_integer()) -> heap_fragment(). -set_next_id(Heap, N) -> +set_next_id(Heap, N) -> Heap#heap{ maps = Heap#heap.maps#maps{ next_id = N } }. %% -- data type heap_fragment @@ -47,7 +47,7 @@ set_next_id(Heap, N) -> heap_fragment(Heap) -> heap_fragment(#maps{ next_id = 0 }, 0, Heap). --spec heap_fragment(#maps{}, offset(), +-spec heap_fragment(#maps{}, offset(), binary() | #{non_neg_integer() => non_neg_integer()}) -> heap_fragment(). heap_fragment(Maps, Offset, Heap) -> #heap{maps = Maps, offset = Offset, heap = Heap}. @@ -67,12 +67,12 @@ heap_fragment_heap(#heap{heap = Heap}) -> %% -- data type heap_value --spec heap_value(#maps{}, pointer(), +-spec heap_value(#maps{}, pointer(), binary() | #{non_neg_integer() => non_neg_integer()}) -> heap_value(). heap_value(Maps, Ptr, Heap) -> heap_value(Maps, Ptr, Heap, 0). --spec heap_value(#maps{}, pointer(), +-spec heap_value(#maps{}, pointer(), binary() | #{non_neg_integer() => non_neg_integer()}, offset()) -> heap_value(). heap_value(Maps, Ptr, Heap, Offs) -> {Ptr, heap_fragment(Maps, Offs, Heap)}. @@ -86,10 +86,10 @@ heap_value_maps({_, Heap}) -> Heap#heap.maps. -spec heap_value_offset(heap_value()) -> offset(). heap_value_offset({_, Heap}) -> Heap#heap.offset. --spec heap_value_heap(heap_value()) -> +-spec heap_value_heap(heap_value()) -> binary() | #{non_neg_integer() => non_neg_integer()}. heap_value_heap({_, Heap}) -> Heap#heap.heap. - + %% -- Value to binary -------------------------------------------------------- -spec to_binary(aeb_aevm_data:data()) -> aeb_aevm_data:heap(). @@ -122,6 +122,7 @@ to_binary1(function, Address) -> to_binary1({?TYPEREP_FUN_TAG}, Address); to_binary1({list, T}, Address) -> to_binary1({?TYPEREP_LIST_TAG, T}, Address); to_binary1({option, T}, Address) -> to_binary1({variant, [[], [T]]}, Address); to_binary1({tuple, Ts}, Address) -> to_binary1({?TYPEREP_TUPLE_TAG, Ts}, Address); +to_binary1({bytes, Len}, Address) -> to_binary1({?TYPEREP_BYTES_TAG, Len}, Address); to_binary1({variant, Cons}, Address) -> to_binary1({?TYPEREP_VARIANT_TAG, Cons}, Address); to_binary1({map, K, V}, Address) -> to_binary1({?TYPEREP_MAP_TAG, K, V}, Address); to_binary1({variant, Tag, Args}, Address) -> @@ -187,6 +188,11 @@ from_binary(_, bool, _, V) -> 0 -> false; 1 -> true end; +from_binary(_, {bytes, Len}, _Heap, V) when Len =< 32 -> + V; +from_binary(Visited, {bytes, Len}, Heap, V) -> + Words = (31 + Len) div 32, + from_binary(Visited, {tuple, lists:duplicate(Words, word)}, Heap, V); from_binary(_, string, Heap, V) -> StringSize = heap_word(Heap,V), BitAddr = 8*(V+32), @@ -248,7 +254,8 @@ from_binary(Visited, typerep, Heap, V) -> ?TYPEREP_TUPLE_TAG -> {tuple, Arg({list, typerep})}; ?TYPEREP_VARIANT_TAG -> {variant, Arg({list, {list, typerep}})}; ?TYPEREP_MAP_TAG -> {map, Arg(typerep), Arg1(typerep, 2)}; - ?TYPEREP_FUN_TAG -> function + ?TYPEREP_FUN_TAG -> function; + ?TYPEREP_BYTES_TAG -> {bytes, Arg(word)} end. map_binary_to_value(KeyType, ValType, N, Bin, Ptr) -> -- 2.30.2