diff --git a/modules/chain/dap_chain_ch.c b/modules/chain/dap_chain_ch.c index 1132bc29786ded0108cced88df6833ae431f8f05..e58ecee55b9b161f94e686f0ee47221b9e831ef3 100644 --- a/modules/chain/dap_chain_ch.c +++ b/modules/chain/dap_chain_ch.c @@ -1438,11 +1438,11 @@ static bool s_sync_timer_callback(void *a_arg) " chain 0x%016" DAP_UINT64_FORMAT_x " cell 0x%016" DAP_UINT64_FORMAT_x, NODE_ADDR_FP_ARGS_S(l_context->addr), l_context->net_id.uint64, l_context->chain_id.uint64, l_context->cell_id.uint64); + l_ch_chain->sync_timer = NULL; // Preserve timer removing from s_ch_chain_go_idle() dap_stream_ch_write_error_unsafe(DAP_STREAM_CH(l_ch_chain), l_context->net_id.uint64, l_context->chain_id.uint64, l_context->cell_id.uint64, DAP_CHAIN_CH_ERROR_SYNC_TIMEOUT); - l_ch_chain->sync_timer = NULL; - s_ch_chain_go_idle(l_ch_chain); + return false; } return true; diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index 5d256ba44edf9caebfaa6f39c7d8f349bcf9b3b9..31eb79bfd85731ff82dacd00fd026df044a0d6cd 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -3054,9 +3054,9 @@ int dap_chain_net_verify_datum_for_add(dap_chain_t *a_chain, dap_chain_datum_t * case DAP_CHAIN_DATUM_TOKEN_EMISSION: return dap_ledger_token_emission_add_check(l_net->pub.ledger, a_datum->data, a_datum->header.data_size, a_datum_hash); case DAP_CHAIN_DATUM_DECREE: - return dap_chain_net_decree_verify((dap_chain_datum_decree_t *)a_datum->data, l_net, a_datum->header.data_size, a_datum_hash); + return dap_chain_net_decree_verify(l_net, (dap_chain_datum_decree_t *)a_datum->data, a_datum->header.data_size, a_datum_hash); case DAP_CHAIN_DATUM_ANCHOR: { - int l_result = dap_chain_net_anchor_verify((dap_chain_datum_anchor_t *)a_datum->data, a_datum->header.data_size); + int l_result = dap_chain_net_anchor_verify(l_net, (dap_chain_datum_anchor_t *)a_datum->data, a_datum->header.data_size); if (l_result) return l_result; } diff --git a/modules/net/dap_chain_net_anchor.c b/modules/net/dap_chain_net_anchor.c index 581836b24baa05aff34f609cdef0c5ad9d11ee6e..65673541cd3701db3f50855d13e7df862fad0cd7 100644 --- a/modules/net/dap_chain_net_anchor.c +++ b/modules/net/dap_chain_net_anchor.c @@ -38,8 +38,7 @@ static bool s_verify_pubkeys(dap_sign_t *a_sign, dap_sign_t **a_decree_signs, size_t a_num_of_decree_sign); static inline dap_sign_t *s_concate_all_signs_in_array(dap_sign_t *a_in_signs, size_t a_signs_size, size_t *a_sings_count, size_t *a_signs_arr_size); -// Public functions -int dap_chain_net_anchor_verify(dap_chain_datum_anchor_t *a_anchor, size_t a_data_size) +static int s_anchor_verify(dap_chain_net_t *a_net, dap_chain_datum_anchor_t *a_anchor, size_t a_data_size, bool a_load_mode) { if (a_data_size < sizeof(dap_chain_datum_anchor_t)) { log_it(L_WARNING, "Anchor size is too small"); @@ -55,121 +54,87 @@ int dap_chain_net_anchor_verify(dap_chain_datum_anchor_t *a_anchor, size_t a_dat //multiple signs reading from datum dap_sign_t *l_signs_block = (dap_sign_t *)((byte_t*)l_anchor->data_n_sign + l_anchor->header.data_size); - if (!l_signs_size || !l_signs_block) - { - log_it(L_WARNING,"Anchor data sign not found"); + if (!l_signs_size || !l_signs_block) { + log_it(L_WARNING, "Anchor data sign not found"); return -100; } - dap_sign_t *l_signs_arr = NULL; + size_t l_signs_count = 0; size_t l_signs_arr_size = 0; - l_signs_arr = s_concate_all_signs_in_array(l_signs_block, l_signs_size, &l_signs_count, &l_signs_arr_size); + dap_sign_t *l_signs_arr = s_concate_all_signs_in_array(l_signs_block, l_signs_size, &l_signs_count, &l_signs_arr_size); // Find unique pkeys in pkeys set from previous step and check that number of signs > min size_t l_num_of_unique_signs = 0; dap_sign_t **l_unique_signs = dap_sign_get_unique_signs(l_signs_arr, l_signs_arr_size, &l_num_of_unique_signs); - if (l_num_of_unique_signs != l_signs_count) - { - log_it(L_WARNING,"Signatures contain duplicate signs."); - return -105; + if (!l_num_of_unique_signs) { + log_it(L_WARNING, "Not enough unique signatures"); + return -106; + } + bool l_sign_authorized = false; + size_t l_signs_size_original = l_anchor->header.signs_size; + l_anchor->header.signs_size = 0; + for (size_t i = 0; i < l_num_of_unique_signs; i++) { + for (dap_list_t *it = a_net->pub.decree->pkeys; it; it = it->next) { + if (dap_pkey_compare_with_sign(it->data, l_unique_signs[i])) { + // TODO make signs verification in s_concate_all_signs_in_array to correctly header.signs_size calculation + size_t l_verify_data_size = l_anchor->header.data_size + sizeof(dap_chain_datum_anchor_t); + if (dap_sign_verify_all(l_unique_signs[i], l_signs_size_original, l_anchor, l_verify_data_size)) + continue; + l_sign_authorized = true; + break; + } + } + l_anchor->header.signs_size += dap_sign_get_size(l_unique_signs[i]); + if (l_sign_authorized) + break; } + DAP_DELETE(l_signs_arr); + DAP_DELETE(l_unique_signs); + l_anchor->header.signs_size = l_signs_size_original; - uint256_t l_num_of_valid_signs256 = GET_256_FROM_64((uint64_t)l_num_of_unique_signs); - if (compare256(l_num_of_valid_signs256, GET_256_FROM_64((uint64_t)0)) == 0) - { - log_it(L_WARNING,"Not enough unique signatures"); - return -106; + if (!l_sign_authorized) { + log_it(L_WARNING, "Anchor signs verify failed"); + return -108; } dap_hash_fast_t l_decree_hash = {}; dap_chain_datum_decree_t *l_decree = NULL; - if ((ret_val = dap_chain_datum_anchor_get_hash_from_data(l_anchor, &l_decree_hash)) != 0) - { - DAP_DELETE(l_signs_arr); - DAP_DELETE(l_unique_signs); - log_it(L_WARNING,"Can't get hash from anchor data"); + if ((ret_val = dap_chain_datum_anchor_get_hash_from_data(l_anchor, &l_decree_hash)) != 0) { + log_it(L_WARNING, "Can't get hash from anchor data"); return -106; } + if (a_load_mode) + return 0; + bool l_is_applied = false; l_decree = dap_chain_net_decree_get_by_hash(&l_decree_hash, &l_is_applied); - if (!l_decree) - { - DAP_DELETE(l_signs_arr); - DAP_DELETE(l_unique_signs); - char *l_decree_hash_str = dap_hash_fast_to_str_new(&l_decree_hash); - log_it(L_WARNING,"Can't get decree by hash %s", l_decree_hash_str); - DAP_DELETE(l_decree_hash_str); + if (!l_decree) { + log_it(L_WARNING, "Can't get decree by hash %s", dap_hash_fast_to_str_static(&l_decree_hash)); return DAP_CHAIN_CS_VERIFY_CODE_NO_DECREE; } - - if (l_is_applied) - { - DAP_DELETE(l_signs_arr); - DAP_DELETE(l_unique_signs); - log_it(L_WARNING,"The decree referred to by the anchor has already been applied"); + if (l_is_applied) { + log_it(L_WARNING, "The decree referred to by the anchor has already been applied"); return -109; } - size_t l_decree_signs_size = l_decree->header.signs_size; - //multiple signs reading from datum - dap_sign_t *l_decree_signs_block = (dap_sign_t *)((byte_t*)l_decree->data_n_signs + l_decree->header.data_size); - - if (!l_decree_signs_size || !l_decree_signs_block) - { - log_it(L_WARNING,"Anchor data sign not found"); - return -100; - } - dap_sign_t *l_decree_signs_arr = NULL; - size_t l_decree_signs_count = 0; - size_t l_decree_signs_arr_size = 0; - l_decree_signs_arr = s_concate_all_signs_in_array(l_decree_signs_block, l_decree_signs_size, &l_decree_signs_count, &l_decree_signs_arr_size); - - // Find unique pkeys in pkeys set from previous step and check that number of signs > min - size_t l_num_of_unique_decree_signs = 0; - dap_sign_t **l_unique_decree_signs = dap_sign_get_unique_signs(l_decree_signs_arr, l_decree_signs_arr_size, &l_num_of_unique_decree_signs); - - // Verify all keys and its signatures - uint16_t l_signs_size_for_current_sign = 0, l_signs_verify_counter = 0; - for(size_t i = 0; i < l_num_of_unique_signs; i++) - { - size_t l_sign_max_size = dap_sign_get_size(l_unique_signs[i]); - if (s_verify_pubkeys(l_unique_signs[i], l_unique_decree_signs, l_num_of_unique_decree_signs)) - { - // 3. verify sign - size_t l_verify_data_size = l_anchor->header.data_size + sizeof(dap_chain_datum_anchor_t); - l_anchor->header.signs_size = l_signs_size_for_current_sign; - if(!dap_sign_verify_all(l_unique_signs[i], l_sign_max_size, l_anchor, l_verify_data_size)) - { - l_signs_verify_counter++; - } - } - // Each sign change the sign_size field by adding its size after signing. So we need to change this field in header for each sign. - l_signs_size_for_current_sign += l_sign_max_size; - } - DAP_DELETE(l_unique_decree_signs); - DAP_DELETE(l_decree_signs_arr); - l_anchor->header.signs_size = l_signs_size_for_current_sign; - - if(!l_signs_verify_counter) - { - log_it(L_WARNING,"Anchor signs verify failed"); - return -108; - } - DAP_DELETE(l_signs_arr); - DAP_DELETE(l_unique_signs); - return 0; } +// Public functions +int dap_chain_net_anchor_verify(dap_chain_net_t *a_net, dap_chain_datum_anchor_t *a_anchor, size_t a_data_size) +{ + return s_anchor_verify(a_net, a_anchor, a_data_size, false); +} + int dap_chain_net_anchor_load(dap_chain_datum_anchor_t * a_anchor, dap_chain_t *a_chain) { int ret_val = 0; if (!a_anchor || !a_chain) { - log_it(L_WARNING,"Invalid arguments. a_decree and a_chain must be not NULL"); + log_it(L_WARNING, "Invalid arguments. a_decree and a_chain must be not NULL"); return -107; } @@ -177,27 +142,25 @@ int dap_chain_net_anchor_load(dap_chain_datum_anchor_t * a_anchor, dap_chain_t * if (!l_net->pub.decree) { - log_it(L_WARNING,"Decree is not inited!"); + log_it(L_WARNING, "Decree is not inited!"); return -108; } - if ((ret_val = dap_chain_net_anchor_verify(a_anchor, dap_chain_datum_anchor_get_size(a_anchor))) != 0) + if ((ret_val = s_anchor_verify(l_net, a_anchor, dap_chain_datum_anchor_get_size(a_anchor), true)) != 0) { - log_it(L_WARNING,"Decree is not pass verification!"); + log_it(L_WARNING, "Anchor is not pass verification!"); return ret_val; } dap_chain_hash_fast_t l_hash = {0}; if ((ret_val = dap_chain_datum_anchor_get_hash_from_data(a_anchor, &l_hash)) != 0) { - log_it(L_WARNING,"Can not find datum hash in anchor data"); + log_it(L_WARNING, "Can not find datum hash in anchor data"); return -109; } - if((ret_val = dap_chain_net_decree_apply(&l_hash, NULL, a_chain))!=0) - { - log_it(L_WARNING,"Decree applying failed"); - } + if ((ret_val = dap_chain_net_decree_apply(&l_hash, NULL, a_chain)) != 0) + log_it(L_WARNING, "Decree applying failed"); return ret_val; } diff --git a/modules/net/dap_chain_net_decree.c b/modules/net/dap_chain_net_decree.c index f0019c1b7f4db2402dde52dc4d3a868ef4d57295..973aab6f5477206fb85b11b3d079edaa3b139ef3 100644 --- a/modules/net/dap_chain_net_decree.c +++ b/modules/net/dap_chain_net_decree.c @@ -43,6 +43,7 @@ static struct decree_hh { dap_hash_fast_t key; bool is_applied; + bool wait_for_apply; dap_chain_datum_decree_t *decree; UT_hash_handle hh; } *s_decree_hh = NULL; @@ -52,7 +53,7 @@ static struct decree_hh { // Private fuctions prototype static bool s_verify_pkey (dap_sign_t *a_sign, dap_chain_net_t *a_net); -static int s_common_decree_handler(dap_chain_datum_decree_t *a_decree, dap_chain_net_t *a_net, bool a_apply); +static int s_common_decree_handler(dap_chain_datum_decree_t *a_decree, dap_chain_net_t *a_net, bool a_apply, bool a_load_mode); static int s_service_decree_handler(dap_chain_datum_decree_t *a_decree, dap_chain_net_t *a_net, bool a_apply); @@ -117,29 +118,7 @@ void dap_chain_net_decree_purge(dap_chain_net_t *a_net) dap_chain_net_decree_init(a_net); } -int s_decree_verify_tsd(dap_chain_datum_decree_t * a_decree, dap_chain_net_t *a_net) -{ - int ret_val = 0; - - dap_return_val_if_fail(a_decree && a_net, -107); - - // Process decree - switch(a_decree->header.type){ - case DAP_CHAIN_DATUM_DECREE_TYPE_COMMON:{ - ret_val = s_common_decree_handler(a_decree, a_net, false); - break; - } - case DAP_CHAIN_DATUM_DECREE_TYPE_SERVICE:{ - ret_val = s_service_decree_handler(a_decree, a_net, false); - } - default: - log_it(L_WARNING,"Decree type is undefined!"); - ret_val = -100; - } - return ret_val; -} - -int dap_chain_net_decree_verify(dap_chain_datum_decree_t *a_decree, dap_chain_net_t *a_net, size_t a_data_size, dap_chain_hash_fast_t *a_decree_hash) +static int s_decree_verify(dap_chain_net_t *a_net, dap_chain_datum_decree_t *a_decree, size_t a_data_size, dap_chain_hash_fast_t *a_decree_hash, bool a_load_mode) { if (a_data_size < sizeof(dap_chain_datum_decree_t)) { log_it(L_WARNING, "Decree size is too small"); @@ -156,8 +135,10 @@ int dap_chain_net_decree_verify(dap_chain_datum_decree_t *a_decree, dap_chain_ne struct decree_hh *l_decree_hh = NULL; HASH_FIND(hh, s_decree_hh, a_decree_hash, sizeof(dap_hash_fast_t), l_decree_hh); - if (l_decree_hh) + if (l_decree_hh && l_decree_hh->decree) { + log_it(L_WARNING, "Decree with hash %s is already present", dap_hash_fast_to_str_static(a_decree_hash)); return -123; + } dap_chain_datum_decree_t *l_decree = a_decree; // Get pkeys sign from decree datum @@ -167,7 +148,7 @@ int dap_chain_net_decree_verify(dap_chain_datum_decree_t *a_decree, dap_chain_ne dap_sign_t *l_signs_block = dap_chain_datum_decree_get_signs(l_decree, &l_signs_size); if (!l_signs_size || !l_signs_block) { - log_it(L_WARNING,"Decree data sign not found"); + log_it(L_WARNING, "Decree data sign not found"); return -100; } @@ -222,15 +203,31 @@ int dap_chain_net_decree_verify(dap_chain_datum_decree_t *a_decree, dap_chain_ne } // check tsd-section - int l_ret = s_decree_verify_tsd(a_decree, a_net); + int l_ret = 0; + switch(a_decree->header.type) { + case DAP_CHAIN_DATUM_DECREE_TYPE_COMMON: + l_ret = s_common_decree_handler(a_decree, a_net, false, a_load_mode); + break; + case DAP_CHAIN_DATUM_DECREE_TYPE_SERVICE: + l_ret = s_service_decree_handler(a_decree, a_net, false); + break; + default: + log_it(L_WARNING, "Decree type is undefined!"); + l_ret = -100; + } if (l_ret) { - log_it(L_WARNING,"TSD checking error. Decree verification failed"); + log_it(L_WARNING, "TSD checking error. Decree verification failed"); return l_ret; } return 0; } +int dap_chain_net_decree_verify(dap_chain_net_t *a_net, dap_chain_datum_decree_t *a_decree, size_t a_data_size, dap_chain_hash_fast_t *a_decree_hash) +{ + return s_decree_verify(a_net, a_decree, a_data_size, a_decree_hash, false); +} + int dap_chain_net_decree_apply(dap_hash_fast_t *a_decree_hash, dap_chain_datum_decree_t *a_decree, dap_chain_t *a_chain) { int ret_val = 0; @@ -251,28 +248,36 @@ int dap_chain_net_decree_apply(dap_hash_fast_t *a_decree_hash, dap_chain_datum_d } struct decree_hh *l_decree_hh = NULL; - if (!a_decree) { - HASH_FIND(hh, s_decree_hh, a_decree_hash, sizeof(dap_hash_fast_t), l_decree_hh); + HASH_FIND(hh, s_decree_hh, a_decree_hash, sizeof(dap_hash_fast_t), l_decree_hh); + + if (!l_decree_hh) { + l_decree_hh = DAP_NEW_Z(struct decree_hh); if (!l_decree_hh) { - char *l_decree_hash_str = dap_hash_fast_to_str_new(a_decree_hash); - log_it(L_WARNING, "Decree with hash %s is not found", l_decree_hash_str); - DAP_DELETE(l_decree_hash_str); + log_it(L_CRITICAL, "Memory allocation error"); + return -1; + } + l_decree_hh->key = *a_decree_hash; + HASH_ADD(hh, s_decree_hh, key, sizeof(dap_hash_fast_t), l_decree_hh); + } + + if (!a_decree) { // Processing anchor for decree + if (!l_decree_hh->decree) { + log_it(L_WARNING, "Decree with hash %s is not found", dap_hash_fast_to_str_static(a_decree_hash)); + l_decree_hh->wait_for_apply = true; return -110; } if (l_decree_hh->is_applied) { - log_it(L_WARNING,"Decree already applied"); + log_it(L_WARNING, "Decree already applied"); return -111; } - } else { - l_decree_hh = DAP_NEW_Z(struct decree_hh); - if (!l_decree_hh) { - log_it(L_CRITICAL, "Memory allocation error"); - return -1; + } else { // Process decree itself + if (l_decree_hh->decree) { + log_it(L_WARNING, "Decree with hash %s is already present", dap_hash_fast_to_str_static(a_decree_hash)); + return -123; } l_decree_hh->decree = DAP_DUP_SIZE(a_decree, dap_chain_datum_decree_get_size(a_decree)); - l_decree_hh->key = *a_decree_hash; - HASH_ADD(hh, s_decree_hh, key, sizeof(dap_hash_fast_t), l_decree_hh); - if (a_decree->header.common_decree_params.chain_id.uint64 != a_chain->id.uint64) + if (a_decree->header.common_decree_params.chain_id.uint64 != a_chain->id.uint64 && + !l_decree_hh->wait_for_apply) // Apply it with corresponding anchor return ret_val; } @@ -280,18 +285,20 @@ int dap_chain_net_decree_apply(dap_hash_fast_t *a_decree_hash, dap_chain_datum_d // Process decree switch(l_decree_hh->decree->header.type) { case DAP_CHAIN_DATUM_DECREE_TYPE_COMMON: - ret_val = s_common_decree_handler(l_decree_hh->decree, l_net, true); + ret_val = s_common_decree_handler(l_decree_hh->decree, l_net, true, false); break; case DAP_CHAIN_DATUM_DECREE_TYPE_SERVICE: ret_val = s_service_decree_handler(l_decree_hh->decree, l_net, true); + break; default: log_it(L_WARNING,"Decree type is undefined!"); ret_val = -100; } - if (!ret_val) + if (!ret_val) { l_decree_hh->is_applied = true; - else + l_decree_hh->wait_for_apply = false; + } else log_it(L_ERROR,"Decree applying failed!"); return ret_val; @@ -300,23 +307,21 @@ int dap_chain_net_decree_apply(dap_hash_fast_t *a_decree_hash, dap_chain_datum_d int dap_chain_net_decree_load(dap_chain_datum_decree_t * a_decree, dap_chain_t *a_chain, dap_chain_hash_fast_t *a_decree_hash) { int ret_val = 0; - if (!a_chain || !a_decree) - { + if (!a_chain || !a_decree) { log_it(L_ERROR, "Bad arguments"); return -100; } dap_chain_net_t *l_net = dap_chain_net_by_id(a_chain->net_id); - if (!l_net->pub.decree) - { + if (!l_net->pub.decree) { log_it(L_WARNING, "Decree is not inited!"); return -108; } size_t l_data_size = dap_chain_datum_decree_get_size(a_decree); - if ((ret_val = dap_chain_net_decree_verify(a_decree, l_net, l_data_size, a_decree_hash)) != 0) { + if ((ret_val = s_decree_verify(l_net, a_decree, l_data_size, a_decree_hash, true)) != 0) { log_it(L_ERROR, "Decree verification failed!"); return ret_val; } @@ -328,7 +333,7 @@ dap_chain_datum_decree_t *dap_chain_net_decree_get_by_hash(dap_hash_fast_t *a_ha { struct decree_hh* l_decree_hh = NULL; HASH_FIND(hh, s_decree_hh, a_hash, sizeof(dap_hash_fast_t), l_decree_hh); - if (!l_decree_hh) + if (!l_decree_hh || !l_decree_hh->decree) return NULL; if (is_applied) @@ -346,7 +351,7 @@ static bool s_verify_pkey (dap_sign_t *a_sign, dap_chain_net_t *a_net) return false; } -static int s_common_decree_handler(dap_chain_datum_decree_t *a_decree, dap_chain_net_t *a_net, bool a_apply) +static int s_common_decree_handler(dap_chain_datum_decree_t *a_decree, dap_chain_net_t *a_net, bool a_apply, bool a_load_mode) { uint256_t l_uint256_buffer; uint16_t l_uint16_buffer; @@ -407,22 +412,26 @@ static int s_common_decree_handler(dap_chain_datum_decree_t *a_decree, dap_chain } if (dap_chain_datum_decree_get_stake_value(a_decree, &l_uint256_buffer)){ log_it(L_WARNING,"Can't get stake value from decree."); - return -105; + return -106; } if (dap_chain_datum_decree_get_stake_signing_addr(a_decree, &l_addr)){ log_it(L_WARNING,"Can't get signing address from decree."); - return -105; + return -107; } if (dap_chain_datum_decree_get_stake_signer_node_addr(a_decree, &l_node_addr)){ log_it(L_WARNING,"Can't get signer node address from decree."); - return -105; + return -108; } - if (!a_apply) + if (a_load_mode) { + assert(!a_apply); break; + } if (dap_chain_net_srv_stake_verify_key_and_node(&l_addr, &l_node_addr)) { log_it(L_WARNING, "Key and node verification error"); - return -105; + return -109; } + if (!a_apply) + break; dap_chain_net_srv_stake_key_delegate(a_net, &l_addr, &l_hash, l_uint256_buffer, &l_node_addr); break; case DAP_CHAIN_DATUM_DECREE_COMMON_SUBTYPE_STAKE_INVALIDATE: diff --git a/modules/net/include/dap_chain_net_anchor.h b/modules/net/include/dap_chain_net_anchor.h index a9405409f192c3dafce1baa6123988ff2b9b93c1..34f8f084a86b86d66a48d5371cad83d5c52cac0f 100644 --- a/modules/net/include/dap_chain_net_anchor.h +++ b/modules/net/include/dap_chain_net_anchor.h @@ -24,5 +24,5 @@ #include "dap_chain_datum_anchor.h" #include "dap_chain_net.h" -int dap_chain_net_anchor_verify(dap_chain_datum_anchor_t * a_anchor, size_t a_data_size); +int dap_chain_net_anchor_verify(dap_chain_net_t *a_net, dap_chain_datum_anchor_t * a_anchor, size_t a_data_size); int dap_chain_net_anchor_load(dap_chain_datum_anchor_t * a_anchor, dap_chain_t *a_chain); diff --git a/modules/net/include/dap_chain_net_decree.h b/modules/net/include/dap_chain_net_decree.h index 4a1720c7df69af85c3cfa084c16156f72cd2d8bd..3d25ffba6208520de5128eb523dd665b0461a6d5 100644 --- a/modules/net/include/dap_chain_net_decree.h +++ b/modules/net/include/dap_chain_net_decree.h @@ -37,7 +37,7 @@ int dap_chain_net_decree_deinit(dap_chain_net_t *a_net); void dap_chain_net_decree_purge(dap_chain_net_t *a_net); int dap_chain_net_decree_apply(dap_hash_fast_t *a_decree_hash, dap_chain_datum_decree_t * a_decree, dap_chain_t *a_chain); -int dap_chain_net_decree_verify(dap_chain_datum_decree_t *a_decree, dap_chain_net_t *a_net, size_t a_data_size, dap_chain_hash_fast_t *a_decree_hash); +int dap_chain_net_decree_verify(dap_chain_net_t *a_net, dap_chain_datum_decree_t *a_decree, size_t a_data_size, dap_chain_hash_fast_t *a_decree_hash); int dap_chain_net_decree_load(dap_chain_datum_decree_t * a_decree, dap_chain_t *a_chain, dap_chain_hash_fast_t *a_decree_hash); dap_chain_datum_decree_t *dap_chain_net_decree_get_by_hash(dap_hash_fast_t *a_hash, bool *is_applied);