Compare commits
21 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| f67abea43a | |||
| d5eb3ad0fb | |||
| d28e63693c | |||
| f4999b6c2f | |||
| b5929e4d2e | |||
| 664f1f0c44 | |||
| 9cb67eeb98 | |||
| 7457d027fd | |||
| c31bcac249 | |||
| c0bf7b5b74 | |||
| 5139f130f5 | |||
| 8336d8113c | |||
| db7a9f62f2 | |||
| 8346df41f2 | |||
| 2488ff3978 | |||
| da8308821c | |||
| 213589ad9f | |||
| 270ebecc57 | |||
| 893ebb69f6 | |||
| 05c4f87619 | |||
| 91d6159ebd |
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
{erl_opts, [debug_info]}.
|
{erl_opts, [debug_info]}.
|
||||||
{deps, [ {base58, {git, "https://github.com/aeternity/erl-base58.git", {ref, "60a3356"}}}
|
{deps, [ {base58, {git, "https://github.com/aeternity/erl-base58.git", {ref, "60a3356"}}}
|
||||||
, {enacl, {git, "https://github.com/aeternity/enacl.git", {ref, "793ddb5"}}}
|
, {enacl, {git, "https://gitlab.com/ioecs/enacl.git", {ref, "4eb7ec70"}}}
|
||||||
]}.
|
]}.
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
[{<<"base58">>,
|
||||||
|
{git,"https://github.com/aeternity/erl-base58.git",
|
||||||
|
{ref,"60a335668a60328a29f9731b67c4a0e9e3d50ab6"}},
|
||||||
|
0},
|
||||||
|
{<<"enacl">>,
|
||||||
|
{git,"https://gitlab.com/ioecs/enacl.git",
|
||||||
|
{ref,"4eb7ec70084ba7c87b1af8797c4c4e90c84f95a2"}},
|
||||||
|
0}].
|
||||||
@@ -18,11 +18,13 @@
|
|||||||
| block_pof_hash
|
| block_pof_hash
|
||||||
| block_tx_hash
|
| block_tx_hash
|
||||||
| block_state_hash
|
| block_state_hash
|
||||||
|
| block_witness_hash
|
||||||
| channel
|
| channel
|
||||||
| contract_bytearray
|
| contract_bytearray
|
||||||
| contract_pubkey
|
| contract_pubkey
|
||||||
| contract_store_key
|
| contract_store_key
|
||||||
| contract_store_value
|
| contract_store_value
|
||||||
|
| contract_source
|
||||||
| transaction
|
| transaction
|
||||||
| tx_hash
|
| tx_hash
|
||||||
| oracle_pubkey
|
| oracle_pubkey
|
||||||
@@ -30,14 +32,19 @@
|
|||||||
| oracle_query_id
|
| oracle_query_id
|
||||||
| oracle_response
|
| oracle_response
|
||||||
| account_pubkey
|
| account_pubkey
|
||||||
|
| account_seckey
|
||||||
|
| associate_chain
|
||||||
|
| entry
|
||||||
| signature
|
| signature
|
||||||
| name
|
| name
|
||||||
|
| native_token
|
||||||
| commitment
|
| commitment
|
||||||
| peer_pubkey
|
| peer_pubkey
|
||||||
| state
|
| state
|
||||||
| poi
|
| poi
|
||||||
| state_trees
|
| state_trees
|
||||||
| call_state_tree
|
| call_state_tree
|
||||||
|
| mp_tree_hash
|
||||||
| bytearray.
|
| bytearray.
|
||||||
|
|
||||||
-type extended_type() :: known_type() | block_hash | {id_hash, [known_type()]}.
|
-type extended_type() :: known_type() | block_hash | {id_hash, [known_type()]}.
|
||||||
@@ -160,18 +167,26 @@ sha256_hash(Bin) ->
|
|||||||
crypto:hash(sha256, Bin).
|
crypto:hash(sha256, Bin).
|
||||||
|
|
||||||
|
|
||||||
id2type(account) -> account_pubkey;
|
id2type(account) -> account_pubkey;
|
||||||
id2type(channel) -> channel;
|
id2type(associate_chain) -> associate_chain;
|
||||||
id2type(commitment) -> commitment;
|
id2type(channel) -> channel;
|
||||||
id2type(contract) -> contract_pubkey;
|
id2type(commitment) -> commitment;
|
||||||
id2type(name) -> name;
|
id2type(contract) -> contract_pubkey;
|
||||||
id2type(oracle) -> oracle_pubkey.
|
id2type(contract_source) -> contract_source;
|
||||||
|
id2type(name) -> name;
|
||||||
|
id2type(native_token) -> native_token;
|
||||||
|
id2type(entry) -> entry;
|
||||||
|
id2type(oracle) -> oracle_pubkey.
|
||||||
|
|
||||||
type2id(account_pubkey) -> account;
|
type2id(account_pubkey) -> account;
|
||||||
|
type2id(associate_chain) -> associate_chain;
|
||||||
type2id(channel) -> channel;
|
type2id(channel) -> channel;
|
||||||
type2id(commitment) -> commitment;
|
type2id(commitment) -> commitment;
|
||||||
type2id(contract_pubkey) -> contract;
|
type2id(contract_pubkey) -> contract;
|
||||||
|
type2id(contract_source) -> contract_source;
|
||||||
type2id(name) -> name;
|
type2id(name) -> name;
|
||||||
|
type2id(native_token) -> native_token;
|
||||||
|
type2id(entry) -> entry;
|
||||||
type2id(oracle_pubkey) -> oracle.
|
type2id(oracle_pubkey) -> oracle.
|
||||||
|
|
||||||
type2enc(key_block_hash) -> ?BASE58;
|
type2enc(key_block_hash) -> ?BASE58;
|
||||||
@@ -179,11 +194,13 @@ type2enc(micro_block_hash) -> ?BASE58;
|
|||||||
type2enc(block_pof_hash) -> ?BASE58;
|
type2enc(block_pof_hash) -> ?BASE58;
|
||||||
type2enc(block_tx_hash) -> ?BASE58;
|
type2enc(block_tx_hash) -> ?BASE58;
|
||||||
type2enc(block_state_hash) -> ?BASE58;
|
type2enc(block_state_hash) -> ?BASE58;
|
||||||
|
type2enc(block_witness_hash) -> ?BASE58;
|
||||||
type2enc(channel) -> ?BASE58;
|
type2enc(channel) -> ?BASE58;
|
||||||
type2enc(contract_pubkey) -> ?BASE58;
|
type2enc(contract_pubkey) -> ?BASE58;
|
||||||
type2enc(contract_bytearray) -> ?BASE64;
|
type2enc(contract_bytearray) -> ?BASE64;
|
||||||
type2enc(contract_store_key) -> ?BASE64;
|
type2enc(contract_store_key) -> ?BASE64;
|
||||||
type2enc(contract_store_value) -> ?BASE64;
|
type2enc(contract_store_value) -> ?BASE64;
|
||||||
|
type2enc(contract_source) -> ?BASE64;
|
||||||
type2enc(transaction) -> ?BASE64;
|
type2enc(transaction) -> ?BASE64;
|
||||||
type2enc(tx_hash) -> ?BASE58;
|
type2enc(tx_hash) -> ?BASE58;
|
||||||
type2enc(oracle_pubkey) -> ?BASE58;
|
type2enc(oracle_pubkey) -> ?BASE58;
|
||||||
@@ -191,14 +208,20 @@ type2enc(oracle_query) -> ?BASE64;
|
|||||||
type2enc(oracle_query_id) -> ?BASE58;
|
type2enc(oracle_query_id) -> ?BASE58;
|
||||||
type2enc(oracle_response) -> ?BASE64;
|
type2enc(oracle_response) -> ?BASE64;
|
||||||
type2enc(account_pubkey) -> ?BASE58;
|
type2enc(account_pubkey) -> ?BASE58;
|
||||||
|
type2enc(account_seckey) -> ?BASE58;
|
||||||
|
type2enc(associate_chain) -> ?BASE58;
|
||||||
type2enc(signature) -> ?BASE58;
|
type2enc(signature) -> ?BASE58;
|
||||||
type2enc(commitment) -> ?BASE58;
|
type2enc(commitment) -> ?BASE58;
|
||||||
type2enc(peer_pubkey) -> ?BASE58;
|
type2enc(peer_pubkey) -> ?BASE58;
|
||||||
type2enc(name) -> ?BASE58;
|
type2enc(name) -> ?BASE58;
|
||||||
|
type2enc(native_token) -> ?BASE58;
|
||||||
type2enc(state) -> ?BASE64;
|
type2enc(state) -> ?BASE64;
|
||||||
type2enc(poi) -> ?BASE64;
|
type2enc(poi) -> ?BASE64;
|
||||||
type2enc(state_trees) -> ?BASE64;
|
type2enc(state_trees) -> ?BASE64;
|
||||||
type2enc(call_state_tree) -> ?BASE64;
|
type2enc(call_state_tree) -> ?BASE64;
|
||||||
|
type2enc(mp_tree_hash) -> ?BASE58;
|
||||||
|
type2enc(hash) -> ?BASE58;
|
||||||
|
type2enc(entry) -> ?BASE64;
|
||||||
type2enc(bytearray) -> ?BASE64.
|
type2enc(bytearray) -> ?BASE64.
|
||||||
|
|
||||||
|
|
||||||
@@ -207,11 +230,13 @@ type2pfx(micro_block_hash) -> <<"mh">>;
|
|||||||
type2pfx(block_pof_hash) -> <<"bf">>;
|
type2pfx(block_pof_hash) -> <<"bf">>;
|
||||||
type2pfx(block_tx_hash) -> <<"bx">>;
|
type2pfx(block_tx_hash) -> <<"bx">>;
|
||||||
type2pfx(block_state_hash) -> <<"bs">>;
|
type2pfx(block_state_hash) -> <<"bs">>;
|
||||||
|
type2pfx(block_witness_hash) -> <<"ws">>;
|
||||||
type2pfx(channel) -> <<"ch">>;
|
type2pfx(channel) -> <<"ch">>;
|
||||||
type2pfx(contract_pubkey) -> <<"ct">>;
|
type2pfx(contract_pubkey) -> <<"ct">>;
|
||||||
type2pfx(contract_bytearray) -> <<"cb">>;
|
type2pfx(contract_bytearray) -> <<"cb">>;
|
||||||
type2pfx(contract_store_key) -> <<"ck">>;
|
type2pfx(contract_store_key) -> <<"ck">>;
|
||||||
type2pfx(contract_store_value) -> <<"cv">>;
|
type2pfx(contract_store_value) -> <<"cv">>;
|
||||||
|
type2pfx(contract_source) -> <<"cx">>;
|
||||||
type2pfx(transaction) -> <<"tx">>;
|
type2pfx(transaction) -> <<"tx">>;
|
||||||
type2pfx(tx_hash) -> <<"th">>;
|
type2pfx(tx_hash) -> <<"th">>;
|
||||||
type2pfx(oracle_pubkey) -> <<"ok">>;
|
type2pfx(oracle_pubkey) -> <<"ok">>;
|
||||||
@@ -219,14 +244,20 @@ type2pfx(oracle_query) -> <<"ov">>;
|
|||||||
type2pfx(oracle_query_id) -> <<"oq">>;
|
type2pfx(oracle_query_id) -> <<"oq">>;
|
||||||
type2pfx(oracle_response) -> <<"or">>;
|
type2pfx(oracle_response) -> <<"or">>;
|
||||||
type2pfx(account_pubkey) -> <<"ak">>;
|
type2pfx(account_pubkey) -> <<"ak">>;
|
||||||
|
type2pfx(account_seckey) -> <<"sk">>;
|
||||||
|
type2pfx(associate_chain) -> <<"ac">>;
|
||||||
type2pfx(signature) -> <<"sg">>;
|
type2pfx(signature) -> <<"sg">>;
|
||||||
type2pfx(commitment) -> <<"cm">>;
|
type2pfx(commitment) -> <<"cm">>;
|
||||||
type2pfx(peer_pubkey) -> <<"pp">>;
|
type2pfx(peer_pubkey) -> <<"pp">>;
|
||||||
type2pfx(name) -> <<"nm">>;
|
type2pfx(name) -> <<"nm">>;
|
||||||
|
type2pfx(native_token) -> <<"nt">>;
|
||||||
type2pfx(state) -> <<"st">>;
|
type2pfx(state) -> <<"st">>;
|
||||||
type2pfx(poi) -> <<"pi">>;
|
type2pfx(poi) -> <<"pi">>;
|
||||||
type2pfx(state_trees) -> <<"ss">>;
|
type2pfx(state_trees) -> <<"ss">>;
|
||||||
type2pfx(call_state_tree) -> <<"cs">>;
|
type2pfx(call_state_tree) -> <<"cs">>;
|
||||||
|
type2pfx(mp_tree_hash) -> <<"mt">>;
|
||||||
|
type2pfx(hash) -> <<"hs">>;
|
||||||
|
type2pfx(entry) -> <<"en">>;
|
||||||
type2pfx(bytearray) -> <<"ba">>.
|
type2pfx(bytearray) -> <<"ba">>.
|
||||||
|
|
||||||
pfx2type(<<"kh">>) -> key_block_hash;
|
pfx2type(<<"kh">>) -> key_block_hash;
|
||||||
@@ -234,11 +265,13 @@ pfx2type(<<"mh">>) -> micro_block_hash;
|
|||||||
pfx2type(<<"bf">>) -> block_pof_hash;
|
pfx2type(<<"bf">>) -> block_pof_hash;
|
||||||
pfx2type(<<"bx">>) -> block_tx_hash;
|
pfx2type(<<"bx">>) -> block_tx_hash;
|
||||||
pfx2type(<<"bs">>) -> block_state_hash;
|
pfx2type(<<"bs">>) -> block_state_hash;
|
||||||
|
pfx2type(<<"ws">>) -> block_witness_hash;
|
||||||
pfx2type(<<"ch">>) -> channel;
|
pfx2type(<<"ch">>) -> channel;
|
||||||
pfx2type(<<"cb">>) -> contract_bytearray;
|
pfx2type(<<"cb">>) -> contract_bytearray;
|
||||||
pfx2type(<<"ck">>) -> contract_store_key;
|
pfx2type(<<"ck">>) -> contract_store_key;
|
||||||
pfx2type(<<"cv">>) -> contract_store_value;
|
pfx2type(<<"cv">>) -> contract_store_value;
|
||||||
pfx2type(<<"ct">>) -> contract_pubkey;
|
pfx2type(<<"ct">>) -> contract_pubkey;
|
||||||
|
pfx2type(<<"cx">>) -> contract_source;
|
||||||
pfx2type(<<"tx">>) -> transaction;
|
pfx2type(<<"tx">>) -> transaction;
|
||||||
pfx2type(<<"th">>) -> tx_hash;
|
pfx2type(<<"th">>) -> tx_hash;
|
||||||
pfx2type(<<"ok">>) -> oracle_pubkey;
|
pfx2type(<<"ok">>) -> oracle_pubkey;
|
||||||
@@ -246,14 +279,20 @@ pfx2type(<<"ov">>) -> oracle_query;
|
|||||||
pfx2type(<<"oq">>) -> oracle_query_id;
|
pfx2type(<<"oq">>) -> oracle_query_id;
|
||||||
pfx2type(<<"or">>) -> oracle_response;
|
pfx2type(<<"or">>) -> oracle_response;
|
||||||
pfx2type(<<"ak">>) -> account_pubkey;
|
pfx2type(<<"ak">>) -> account_pubkey;
|
||||||
|
pfx2type(<<"sk">>) -> account_seckey;
|
||||||
|
pfx2type(<<"ac">>) -> associate_chain;
|
||||||
pfx2type(<<"sg">>) -> signature;
|
pfx2type(<<"sg">>) -> signature;
|
||||||
pfx2type(<<"cm">>) -> commitment;
|
pfx2type(<<"cm">>) -> commitment;
|
||||||
pfx2type(<<"pp">>) -> peer_pubkey;
|
pfx2type(<<"pp">>) -> peer_pubkey;
|
||||||
pfx2type(<<"nm">>) -> name;
|
pfx2type(<<"nm">>) -> name;
|
||||||
|
pfx2type(<<"nt">>) -> native_token;
|
||||||
pfx2type(<<"st">>) -> state;
|
pfx2type(<<"st">>) -> state;
|
||||||
pfx2type(<<"pi">>) -> poi;
|
pfx2type(<<"pi">>) -> poi;
|
||||||
pfx2type(<<"ss">>) -> state_trees;
|
pfx2type(<<"ss">>) -> state_trees;
|
||||||
pfx2type(<<"cs">>) -> call_state_tree;
|
pfx2type(<<"cs">>) -> call_state_tree;
|
||||||
|
pfx2type(<<"mt">>) -> mp_tree_hash;
|
||||||
|
pfx2type(<<"hs">>) -> hash;
|
||||||
|
pfx2type(<<"en">>) -> entry;
|
||||||
pfx2type(<<"ba">>) -> bytearray.
|
pfx2type(<<"ba">>) -> bytearray.
|
||||||
|
|
||||||
-spec byte_size_for_type(known_type()) -> non_neg_integer() | not_applicable.
|
-spec byte_size_for_type(known_type()) -> non_neg_integer() | not_applicable.
|
||||||
@@ -263,11 +302,13 @@ byte_size_for_type(micro_block_hash) -> 32;
|
|||||||
byte_size_for_type(block_pof_hash) -> 32;
|
byte_size_for_type(block_pof_hash) -> 32;
|
||||||
byte_size_for_type(block_tx_hash) -> 32;
|
byte_size_for_type(block_tx_hash) -> 32;
|
||||||
byte_size_for_type(block_state_hash) -> 32;
|
byte_size_for_type(block_state_hash) -> 32;
|
||||||
|
byte_size_for_type(block_witness_hash) -> 32;
|
||||||
byte_size_for_type(channel) -> 32;
|
byte_size_for_type(channel) -> 32;
|
||||||
byte_size_for_type(contract_pubkey) -> 32;
|
byte_size_for_type(contract_pubkey) -> 32;
|
||||||
byte_size_for_type(contract_bytearray) -> not_applicable;
|
byte_size_for_type(contract_bytearray) -> not_applicable;
|
||||||
byte_size_for_type(contract_store_key) -> not_applicable;
|
byte_size_for_type(contract_store_key) -> not_applicable;
|
||||||
byte_size_for_type(contract_store_value) -> not_applicable;
|
byte_size_for_type(contract_store_value) -> not_applicable;
|
||||||
|
byte_size_for_type(contract_source) -> not_applicable;
|
||||||
byte_size_for_type(transaction) -> not_applicable;
|
byte_size_for_type(transaction) -> not_applicable;
|
||||||
byte_size_for_type(tx_hash) -> 32;
|
byte_size_for_type(tx_hash) -> 32;
|
||||||
byte_size_for_type(oracle_pubkey) -> 32;
|
byte_size_for_type(oracle_pubkey) -> 32;
|
||||||
@@ -275,14 +316,20 @@ byte_size_for_type(oracle_query) -> not_applicable;
|
|||||||
byte_size_for_type(oracle_query_id) -> 32;
|
byte_size_for_type(oracle_query_id) -> 32;
|
||||||
byte_size_for_type(oracle_response) -> not_applicable;
|
byte_size_for_type(oracle_response) -> not_applicable;
|
||||||
byte_size_for_type(account_pubkey) -> 32;
|
byte_size_for_type(account_pubkey) -> 32;
|
||||||
|
byte_size_for_type(account_seckey) -> 32;
|
||||||
|
byte_size_for_type(associate_chain) -> 32;
|
||||||
byte_size_for_type(signature) -> 64;
|
byte_size_for_type(signature) -> 64;
|
||||||
byte_size_for_type(name) -> not_applicable;
|
byte_size_for_type(name) -> not_applicable;
|
||||||
|
byte_size_for_type(native_token) -> 32;
|
||||||
byte_size_for_type(commitment) -> 32;
|
byte_size_for_type(commitment) -> 32;
|
||||||
byte_size_for_type(peer_pubkey) -> 32;
|
byte_size_for_type(peer_pubkey) -> 32;
|
||||||
byte_size_for_type(state) -> 32;
|
byte_size_for_type(state) -> 32;
|
||||||
byte_size_for_type(poi) -> not_applicable;
|
byte_size_for_type(poi) -> not_applicable;
|
||||||
byte_size_for_type(state_trees) -> not_applicable;
|
byte_size_for_type(state_trees) -> not_applicable;
|
||||||
byte_size_for_type(call_state_tree) -> not_applicable;
|
byte_size_for_type(call_state_tree) -> not_applicable;
|
||||||
|
byte_size_for_type(mp_tree_hash) -> 32;
|
||||||
|
byte_size_for_type(hash) -> 32;
|
||||||
|
byte_size_for_type(entry) -> not_applicable;
|
||||||
byte_size_for_type(bytearray) -> not_applicable.
|
byte_size_for_type(bytearray) -> not_applicable.
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ deserialize(Type, Vsn, Template, Binary) ->
|
|||||||
tag(account) -> 10;
|
tag(account) -> 10;
|
||||||
tag(signed_tx) -> 11;
|
tag(signed_tx) -> 11;
|
||||||
tag(spend_tx) -> 12;
|
tag(spend_tx) -> 12;
|
||||||
|
tag(data_extend_tx) -> 13;
|
||||||
tag(oracle) -> 20;
|
tag(oracle) -> 20;
|
||||||
tag(oracle_query) -> 21;
|
tag(oracle_query) -> 21;
|
||||||
tag(oracle_register_tx) -> 22;
|
tag(oracle_register_tx) -> 22;
|
||||||
@@ -57,8 +58,10 @@ tag(contract) -> 40;
|
|||||||
tag(contract_call) -> 41;
|
tag(contract_call) -> 41;
|
||||||
tag(contract_create_tx) -> 42;
|
tag(contract_create_tx) -> 42;
|
||||||
tag(contract_call_tx) -> 43;
|
tag(contract_call_tx) -> 43;
|
||||||
|
tag(contract_source) -> 44;
|
||||||
tag(channel_create_tx) -> 50;
|
tag(channel_create_tx) -> 50;
|
||||||
tag(channel_set_delegates_tx) -> 501;
|
tag(channel_set_delegates_tx) -> 501;
|
||||||
|
tag(channel_delegates) -> 502;
|
||||||
tag(channel_deposit_tx) -> 51;
|
tag(channel_deposit_tx) -> 51;
|
||||||
tag(channel_withdraw_tx) -> 52;
|
tag(channel_withdraw_tx) -> 52;
|
||||||
tag(channel_force_progress_tx) -> 521;
|
tag(channel_force_progress_tx) -> 521;
|
||||||
@@ -87,19 +90,42 @@ tag(channels_mtree) -> 623;
|
|||||||
tag(nameservice_mtree) -> 624;
|
tag(nameservice_mtree) -> 624;
|
||||||
tag(oracles_mtree) -> 625;
|
tag(oracles_mtree) -> 625;
|
||||||
tag(accounts_mtree) -> 626;
|
tag(accounts_mtree) -> 626;
|
||||||
|
tag(acs_mtree) -> 627;
|
||||||
|
tag(entries_mtree) -> 628;
|
||||||
tag(compiler_sophia) -> 70;
|
tag(compiler_sophia) -> 70;
|
||||||
tag(ga_attach_tx) -> 80;
|
tag(ga_attach_tx) -> 80;
|
||||||
tag(ga_meta_tx) -> 81;
|
tag(ga_meta_tx) -> 81;
|
||||||
tag(paying_for_tx) -> 82;
|
tag(paying_for_tx) -> 82;
|
||||||
tag(ga_meta_tx_auth_data) -> 810;
|
tag(ga_meta_tx_auth_data) -> 810;
|
||||||
|
tag(associate_chain) -> 90;
|
||||||
|
tag(ac_state) -> 91;
|
||||||
|
tag(ac_burn) -> 92;
|
||||||
|
tag(ac_create_tx) -> 93;
|
||||||
|
tag(ac_deposit_tx) -> 94;
|
||||||
|
tag(ac_update_cops_tx) -> 95;
|
||||||
|
tag(ac_rollup_tx) -> 96;
|
||||||
|
tag(ac_proposal_tx) -> 97;
|
||||||
tag(key_block) -> 100;
|
tag(key_block) -> 100;
|
||||||
tag(micro_block) -> 101;
|
tag(micro_block) -> 101;
|
||||||
tag(light_micro_block) -> 102;
|
tag(light_micro_block) -> 102;
|
||||||
|
tag(testimony) -> 110;
|
||||||
|
tag(testimony_tx) -> 111;
|
||||||
|
tag(nt_native_token) -> 120;
|
||||||
|
tag(nt_create_tx) -> 121;
|
||||||
|
tag(nt_mint_tx) -> 122;
|
||||||
|
tag(nt_finalize_tx) -> 123;
|
||||||
|
tag(nt_trade_tx) -> 124;
|
||||||
|
tag(nt_burn_tx) -> 125;
|
||||||
|
tag(entry) -> 140;
|
||||||
|
tag(entry_create_tx) -> 141;
|
||||||
|
tag(entry_transfer_tx) -> 142;
|
||||||
|
tag(entry_destroy_tx) -> 143;
|
||||||
tag(pof) -> 200.
|
tag(pof) -> 200.
|
||||||
|
|
||||||
rev_tag(10) -> account;
|
rev_tag(10) -> account;
|
||||||
rev_tag(11) -> signed_tx;
|
rev_tag(11) -> signed_tx;
|
||||||
rev_tag(12) -> spend_tx;
|
rev_tag(12) -> spend_tx;
|
||||||
|
rev_tag(13) -> data_extend_tx;
|
||||||
rev_tag(20) -> oracle;
|
rev_tag(20) -> oracle;
|
||||||
rev_tag(21) -> oracle_query;
|
rev_tag(21) -> oracle_query;
|
||||||
rev_tag(22) -> oracle_register_tx;
|
rev_tag(22) -> oracle_register_tx;
|
||||||
@@ -118,8 +144,10 @@ rev_tag(40) -> contract;
|
|||||||
rev_tag(41) -> contract_call;
|
rev_tag(41) -> contract_call;
|
||||||
rev_tag(42) -> contract_create_tx;
|
rev_tag(42) -> contract_create_tx;
|
||||||
rev_tag(43) -> contract_call_tx;
|
rev_tag(43) -> contract_call_tx;
|
||||||
|
rev_tag(44) -> contract_source;
|
||||||
rev_tag(50) -> channel_create_tx;
|
rev_tag(50) -> channel_create_tx;
|
||||||
rev_tag(501) -> channel_set_delegates_tx;
|
rev_tag(501) -> channel_set_delegates_tx;
|
||||||
|
rev_tag(502) -> channel_delegates;
|
||||||
rev_tag(51) -> channel_deposit_tx;
|
rev_tag(51) -> channel_deposit_tx;
|
||||||
rev_tag(52) -> channel_withdraw_tx;
|
rev_tag(52) -> channel_withdraw_tx;
|
||||||
rev_tag(521) -> channel_force_progress_tx;
|
rev_tag(521) -> channel_force_progress_tx;
|
||||||
@@ -148,12 +176,34 @@ rev_tag(623) -> channels_mtree;
|
|||||||
rev_tag(624) -> nameservice_mtree;
|
rev_tag(624) -> nameservice_mtree;
|
||||||
rev_tag(625) -> oracles_mtree;
|
rev_tag(625) -> oracles_mtree;
|
||||||
rev_tag(626) -> accounts_mtree;
|
rev_tag(626) -> accounts_mtree;
|
||||||
|
rev_tag(627) -> acs_mtree;
|
||||||
|
rev_tag(628) -> entries_mtree;
|
||||||
rev_tag(70) -> compiler_sophia;
|
rev_tag(70) -> compiler_sophia;
|
||||||
rev_tag(80) -> ga_attach_tx;
|
rev_tag(80) -> ga_attach_tx;
|
||||||
rev_tag(81) -> ga_meta_tx;
|
rev_tag(81) -> ga_meta_tx;
|
||||||
rev_tag(82) -> paying_for_tx;
|
rev_tag(82) -> paying_for_tx;
|
||||||
rev_tag(810) -> ga_meta_tx_auth_data;
|
rev_tag(810) -> ga_meta_tx_auth_data;
|
||||||
|
rev_tag(90) -> associate_chain;
|
||||||
|
rev_tag(91) -> ac_state;
|
||||||
|
rev_tag(92) -> ac_burn;
|
||||||
|
rev_tag(93) -> ac_create_tx;
|
||||||
|
rev_tag(94) -> ac_deposit_tx;
|
||||||
|
rev_tag(95) -> ac_update_cops_tx;
|
||||||
|
rev_tag(96) -> ac_rollup_tx;
|
||||||
|
rev_tag(97) -> ac_proposal_tx;
|
||||||
rev_tag(100) -> key_block;
|
rev_tag(100) -> key_block;
|
||||||
rev_tag(101) -> micro_block;
|
rev_tag(101) -> micro_block;
|
||||||
rev_tag(102) -> light_micro_block;
|
rev_tag(102) -> light_micro_block;
|
||||||
|
rev_tag(110) -> testimony;
|
||||||
|
rev_tag(111) -> testimony_tx;
|
||||||
|
rev_tag(120) -> nt_native_token;
|
||||||
|
rev_tag(121) -> nt_create_tx;
|
||||||
|
rev_tag(122) -> nt_mint_tx;
|
||||||
|
rev_tag(123) -> nt_finalize_tx;
|
||||||
|
rev_tag(124) -> nt_trade_tx;
|
||||||
|
rev_tag(125) -> nt_burn_tx;
|
||||||
|
rev_tag(140) -> entry;
|
||||||
|
rev_tag(141) -> entry_create_tx;
|
||||||
|
rev_tag(142) -> entry_transfer_tx;
|
||||||
|
rev_tag(143) -> entry_destroy_tx;
|
||||||
rev_tag(200) -> pof.
|
rev_tag(200) -> pof.
|
||||||
|
|||||||
@@ -0,0 +1,81 @@
|
|||||||
|
%%%-------------------------------------------------------------------
|
||||||
|
%%% @copyright (C) 2023, Aeternity Anstalt
|
||||||
|
%%% @doc
|
||||||
|
%%% Serialization of delegation signatures
|
||||||
|
%%% @end
|
||||||
|
%%%-------------------------------------------------------------------
|
||||||
|
-module(aeser_delegation).
|
||||||
|
|
||||||
|
-export([ aens_preclaim_sig/3
|
||||||
|
, aens_name_sig/4
|
||||||
|
, aens_sig/3
|
||||||
|
|
||||||
|
, oracle_sig/3
|
||||||
|
, oracle_response_sig/3
|
||||||
|
]).
|
||||||
|
|
||||||
|
%% Delegation signatures are prefixed with a unique tag, ensuring not to
|
||||||
|
%% collide with serialized transactions.
|
||||||
|
-define(DELEGATION_TAG, 16#1a01).
|
||||||
|
|
||||||
|
-define(TYPE_AENS, 1).
|
||||||
|
-define(TYPE_AENS_NAME, 2).
|
||||||
|
-define(TYPE_AENS_PRECLAIM, 3).
|
||||||
|
-define(TYPE_ORACLE, 4).
|
||||||
|
-define(TYPE_ORACLE_RESPONSE, 5).
|
||||||
|
|
||||||
|
-define(VSN, 1).
|
||||||
|
|
||||||
|
-type sig_data() :: binary().
|
||||||
|
|
||||||
|
-spec aens_preclaim_sig(binary(), aeser_id:id(), aeser_id:id()) -> sig_data().
|
||||||
|
aens_preclaim_sig(NetworkId, Account, Contract) ->
|
||||||
|
assert_id(account, Account),
|
||||||
|
assert_id(contract, Contract),
|
||||||
|
Template = [{account, id}, {contract, id}],
|
||||||
|
Fields = [{account, Account}, {contract, Contract}],
|
||||||
|
serialize(?TYPE_AENS_PRECLAIM, NetworkId, Template, Fields).
|
||||||
|
|
||||||
|
-spec aens_name_sig(binary(), aeser_id:id(), aeser_id:id(), aeser_id:id()) -> sig_data().
|
||||||
|
aens_name_sig(NetworkId, Account, Name, Contract) ->
|
||||||
|
assert_id(account, Account),
|
||||||
|
assert_id(name, Name),
|
||||||
|
assert_id(contract, Contract),
|
||||||
|
Template = [{account, id}, {name, id}, {contract, id}],
|
||||||
|
Fields = [{account, Account}, {name, Name}, {contract, Contract}],
|
||||||
|
serialize(?TYPE_AENS_NAME, NetworkId, Template, Fields).
|
||||||
|
|
||||||
|
-spec aens_sig(binary(), aeser_id:id(), aeser_id:id()) -> sig_data().
|
||||||
|
aens_sig(NetworkId, Account, Contract) ->
|
||||||
|
assert_id(account, Account),
|
||||||
|
assert_id(contract, Contract),
|
||||||
|
Template = [{account, id}, {contract, id}],
|
||||||
|
Fields = [{account, Account}, {contract, Contract}],
|
||||||
|
serialize(?TYPE_AENS, NetworkId, Template, Fields).
|
||||||
|
|
||||||
|
-spec oracle_sig(binary(), aeser_id:id(), aeser_id:id()) -> sig_data().
|
||||||
|
oracle_sig(NetworkId, Account, Contract) ->
|
||||||
|
assert_id(account, Account),
|
||||||
|
assert_id(contract, Contract),
|
||||||
|
Template = [{account, id}, {contract, id}],
|
||||||
|
Fields = [{account, Account}, {contract, Contract}],
|
||||||
|
serialize(?TYPE_ORACLE, NetworkId, Template, Fields).
|
||||||
|
|
||||||
|
-spec oracle_response_sig(binary(), aeser_id:id(), aeser_id:id()) -> sig_data().
|
||||||
|
oracle_response_sig(NetworkId, QueryId, Contract) ->
|
||||||
|
assert_id(oracle, QueryId),
|
||||||
|
assert_id(contract, Contract),
|
||||||
|
Template = [{query, id}, {contract, id}],
|
||||||
|
Fields = [{query, QueryId}, {contract, Contract}],
|
||||||
|
serialize(?TYPE_ORACLE_RESPONSE, NetworkId, Template, Fields).
|
||||||
|
|
||||||
|
%% ------------------------------------------------------------------------
|
||||||
|
%% -- Internal functions
|
||||||
|
%% ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
serialize(Type, NetworkId, Template, Fields) ->
|
||||||
|
Data = aeserialization:serialize(Type, ?VSN, Template, Fields),
|
||||||
|
<<?DELEGATION_TAG:16, NetworkId/binary, Data/binary>>.
|
||||||
|
|
||||||
|
assert_id(Type, AeserId) ->
|
||||||
|
Type = aeser_id:specialize_type(AeserId).
|
||||||
+18
-9
@@ -25,7 +25,8 @@
|
|||||||
}).
|
}).
|
||||||
|
|
||||||
-type tag() :: 'account' | 'oracle' | 'name'
|
-type tag() :: 'account' | 'oracle' | 'name'
|
||||||
| 'commitment' | 'contract' | 'channel'.
|
| 'commitment' | 'contract' | 'channel'
|
||||||
|
| 'associate_chain' | 'entry' .
|
||||||
-type val() :: <<_:256>>.
|
-type val() :: <<_:256>>.
|
||||||
-opaque(id() :: #id{}).
|
-opaque(id() :: #id{}).
|
||||||
|
|
||||||
@@ -43,7 +44,9 @@
|
|||||||
___TAG___ =:= name;
|
___TAG___ =:= name;
|
||||||
___TAG___ =:= commitment;
|
___TAG___ =:= commitment;
|
||||||
___TAG___ =:= contract;
|
___TAG___ =:= contract;
|
||||||
___TAG___ =:= channel
|
___TAG___ =:= channel;
|
||||||
|
___TAG___ =:= associate_chain;
|
||||||
|
___TAG___ =:= entry
|
||||||
).
|
).
|
||||||
-define(IS_VAL(___VAL___), byte_size(___VAL___) =:= 32).
|
-define(IS_VAL(___VAL___), byte_size(___VAL___) =:= 32).
|
||||||
|
|
||||||
@@ -94,13 +97,16 @@ decode(<<Tag:?TAG_SIZE/unit:8, Val:?PUB_SIZE/binary>>) ->
|
|||||||
%%% Internal functions
|
%%% Internal functions
|
||||||
%%%===================================================================
|
%%%===================================================================
|
||||||
|
|
||||||
encode_tag(account) -> 1;
|
encode_tag(account) -> 1;
|
||||||
encode_tag(name) -> 2;
|
encode_tag(name) -> 2;
|
||||||
encode_tag(commitment) -> 3;
|
encode_tag(commitment) -> 3;
|
||||||
encode_tag(oracle) -> 4;
|
encode_tag(oracle) -> 4;
|
||||||
encode_tag(contract) -> 5;
|
encode_tag(contract) -> 5;
|
||||||
encode_tag(channel) -> 6;
|
encode_tag(channel) -> 6;
|
||||||
encode_tag(Other) -> error({illegal_id_tag_name, Other}).
|
encode_tag(associate_chain) -> 7;
|
||||||
|
encode_tag(native_token) -> 8;
|
||||||
|
encode_tag(entry) -> 9;
|
||||||
|
encode_tag(Other) -> error({illegal_id_tag_name, Other}).
|
||||||
|
|
||||||
decode_tag(1) -> account;
|
decode_tag(1) -> account;
|
||||||
decode_tag(2) -> name;
|
decode_tag(2) -> name;
|
||||||
@@ -108,4 +114,7 @@ decode_tag(3) -> commitment;
|
|||||||
decode_tag(4) -> oracle;
|
decode_tag(4) -> oracle;
|
||||||
decode_tag(5) -> contract;
|
decode_tag(5) -> contract;
|
||||||
decode_tag(6) -> channel;
|
decode_tag(6) -> channel;
|
||||||
|
decode_tag(7) -> associate_chain;
|
||||||
|
decode_tag(8) -> native_token;
|
||||||
|
decode_tag(9) -> entry;
|
||||||
decode_tag(X) -> error({illegal_id_tag, X}).
|
decode_tag(X) -> error({illegal_id_tag, X}).
|
||||||
|
|||||||
@@ -28,12 +28,14 @@
|
|||||||
| 'binary'
|
| 'binary'
|
||||||
| 'id' %% As defined in aec_id.erl
|
| 'id' %% As defined in aec_id.erl
|
||||||
| [type()] %% Length one in the type. This means a list of any length.
|
| [type()] %% Length one in the type. This means a list of any length.
|
||||||
|
| #{items := [{field_name(), type()}]} %% Record with named fields represented as a map. Encoded as a list in the given order.
|
||||||
| tuple(). %% Any arity, containing type(). This means a static size array.
|
| tuple(). %% Any arity, containing type(). This means a static size array.
|
||||||
|
|
||||||
-type encodable_term() :: non_neg_integer()
|
-type encodable_term() :: non_neg_integer()
|
||||||
| binary()
|
| binary()
|
||||||
| boolean()
|
| boolean()
|
||||||
| [encodable_term()] %% Of any length
|
| [encodable_term()] %% Of any length
|
||||||
|
| #{atom() => encodable_term()}
|
||||||
| tuple() %% Any arity, containing encodable_term().
|
| tuple() %% Any arity, containing encodable_term().
|
||||||
| aeser_id:id().
|
| aeser_id:id().
|
||||||
|
|
||||||
@@ -101,6 +103,12 @@ decode_fields(Template, Values) ->
|
|||||||
|
|
||||||
encode_field([Type], L) when is_list(L) ->
|
encode_field([Type], L) when is_list(L) ->
|
||||||
[encode_field(Type, X) || X <- L];
|
[encode_field(Type, X) || X <- L];
|
||||||
|
encode_field(#{items := Items}, Map) ->
|
||||||
|
lists:map(
|
||||||
|
fun({K, Type}) ->
|
||||||
|
V = maps:get(K, Map),
|
||||||
|
encode_field(Type, V)
|
||||||
|
end, Items);
|
||||||
encode_field(Type, T) when tuple_size(Type) =:= tuple_size(T) ->
|
encode_field(Type, T) when tuple_size(Type) =:= tuple_size(T) ->
|
||||||
Zipped = lists:zip(tuple_to_list(Type), tuple_to_list(T)),
|
Zipped = lists:zip(tuple_to_list(Type), tuple_to_list(T)),
|
||||||
[encode_field(X, Y) || {X, Y} <- Zipped];
|
[encode_field(X, Y) || {X, Y} <- Zipped];
|
||||||
@@ -117,6 +125,13 @@ encode_field(Type, Val) -> error({illegal, Type, Val}).
|
|||||||
|
|
||||||
decode_field([Type], List) when is_list(List) ->
|
decode_field([Type], List) when is_list(List) ->
|
||||||
[decode_field(Type, X) || X <- List];
|
[decode_field(Type, X) || X <- List];
|
||||||
|
decode_field(#{items := Items}, List) when length(List) =:= length(Items) ->
|
||||||
|
Zipped = lists:zip(Items, List),
|
||||||
|
lists:foldl(
|
||||||
|
fun({{K, Type}, V}, Map) ->
|
||||||
|
maps:is_key(K, Map) andalso error(badarg, duplicate_field),
|
||||||
|
Map#{ K => decode_field(Type, V) }
|
||||||
|
end, #{}, Zipped);
|
||||||
decode_field(Type, List) when length(List) =:= tuple_size(Type) ->
|
decode_field(Type, List) when length(List) =:= tuple_size(Type) ->
|
||||||
Zipped = lists:zip(tuple_to_list(Type), List),
|
Zipped = lists:zip(tuple_to_list(Type), List),
|
||||||
list_to_tuple([decode_field(X, Y) || {X, Y} <- Zipped]);
|
list_to_tuple([decode_field(X, Y) || {X, Y} <- Zipped]);
|
||||||
|
|||||||
@@ -20,6 +20,7 @@
|
|||||||
, {account_pubkey , 32}
|
, {account_pubkey , 32}
|
||||||
, {signature , 64}
|
, {signature , 64}
|
||||||
, {name , not_applicable}
|
, {name , not_applicable}
|
||||||
|
, {native_token , 32}
|
||||||
, {commitment , 32}
|
, {commitment , 32}
|
||||||
, {peer_pubkey , 32}
|
, {peer_pubkey , 32}
|
||||||
, {state , 32}
|
, {state , 32}
|
||||||
|
|||||||
@@ -0,0 +1,67 @@
|
|||||||
|
%%%-------------------------------------------------------------------
|
||||||
|
%%% @copyright (C) 2023, Aeternity Anstalt
|
||||||
|
%%%-------------------------------------------------------------------
|
||||||
|
|
||||||
|
-module(aeser_delegation_tests).
|
||||||
|
|
||||||
|
-include_lib("eunit/include/eunit.hrl").
|
||||||
|
|
||||||
|
-define(TEST_MODULE, aeser_delegation).
|
||||||
|
|
||||||
|
-define(ACCOUNT, aeser_id:create(account, <<1:256>>)).
|
||||||
|
-define(CONTRACT, aeser_id:create(contract, <<2:256>>)).
|
||||||
|
-define(NAME, aeser_id:create(name, <<3:256>>)).
|
||||||
|
-define(ORACLE, aeser_id:create(oracle, <<3:256>>)).
|
||||||
|
|
||||||
|
-define(NETWORK_ID, <<"my_fancy_network"/utf8>>).
|
||||||
|
|
||||||
|
encode_correct_test_() ->
|
||||||
|
[{"Encode preclaim sig",
|
||||||
|
fun() ->
|
||||||
|
aeser_delegation:aens_preclaim_sig(?NETWORK_ID, ?ACCOUNT, ?CONTRACT)
|
||||||
|
end},
|
||||||
|
{"Encode name sig",
|
||||||
|
fun() ->
|
||||||
|
aeser_delegation:aens_name_sig(?NETWORK_ID, ?ACCOUNT, ?NAME, ?CONTRACT)
|
||||||
|
end},
|
||||||
|
{"Encode aens wildcard sig",
|
||||||
|
fun() ->
|
||||||
|
aeser_delegation:aens_sig(?NETWORK_ID, ?ACCOUNT, ?CONTRACT)
|
||||||
|
end},
|
||||||
|
{"Encode oracle sig",
|
||||||
|
fun() ->
|
||||||
|
aeser_delegation:oracle_sig(?NETWORK_ID, ?ACCOUNT, ?CONTRACT)
|
||||||
|
end},
|
||||||
|
{"Encode oracle response sig",
|
||||||
|
fun() ->
|
||||||
|
aeser_delegation:oracle_response_sig(?NETWORK_ID, ?ORACLE, ?CONTRACT)
|
||||||
|
end}
|
||||||
|
].
|
||||||
|
|
||||||
|
encode_fail_test_() ->
|
||||||
|
[{"Bad encoding preclaim sig",
|
||||||
|
fun() ->
|
||||||
|
?assertError(_, aeser_delegation:aens_preclaim_sig(?NETWORK_ID, <<42:256>>, ?CONTRACT)),
|
||||||
|
?assertError(_, aeser_delegation:aens_preclaim_sig(?NETWORK_ID, ?CONTRACT, ?ACCOUNT))
|
||||||
|
end},
|
||||||
|
{"Bad encoding name sig",
|
||||||
|
fun() ->
|
||||||
|
?assertError(_, aeser_delegation:aens_name_sig(?NETWORK_ID, ?ACCOUNT, <<42:256>>, ?CONTRACT)),
|
||||||
|
?assertError(_, aeser_delegation:aens_name_sig(?NETWORK_ID, ?NAME, ?ACCOUNT, ?CONTRACT))
|
||||||
|
end},
|
||||||
|
{"Bad encoding aens wildcard sig",
|
||||||
|
fun() ->
|
||||||
|
?assertError(_, aeser_delegation:aens_sig(?NETWORK_ID, ?ACCOUNT, <<42:256>>)),
|
||||||
|
?assertError(_, aeser_delegation:aens_sig(?NETWORK_ID, ?CONTRACT, ?CONTRACT))
|
||||||
|
end},
|
||||||
|
{"Bad encoding oracle sig",
|
||||||
|
fun() ->
|
||||||
|
?assertError(_, aeser_delegation:oracle_sig(?NETWORK_ID, <<42:256>>, ?CONTRACT)),
|
||||||
|
?assertError(_, aeser_delegation:oracle_sig(?NETWORK_ID, ?ACCOUNT, ?ACCOUNT))
|
||||||
|
end},
|
||||||
|
{"Bad encoding oracle response sig",
|
||||||
|
fun() ->
|
||||||
|
?assertError(_, aeser_delegation:oracle_response_sig(?NETWORK_ID, <<42:256>>, ?CONTRACT)),
|
||||||
|
?assertError(_, aeser_delegation:oracle_response_sig(?NETWORK_ID, ?ORACLE, ?ORACLE))
|
||||||
|
end}
|
||||||
|
].
|
||||||
Reference in New Issue
Block a user