diff --git a/modules/common/dap_chain_datum_decree.c b/modules/common/dap_chain_datum_decree.c index edfc1b7612f6da3084610f56e45e0e4ab7b6c520..e3af6de341b1d54203474a8b850abf4c0d41a098 100644 --- a/modules/common/dap_chain_datum_decree.c +++ b/modules/common/dap_chain_datum_decree.c @@ -105,7 +105,7 @@ int dap_chain_datum_decree_get_fee_addr(dap_chain_datum_decree_t *a_decree, dap_ return 1; } -dap_list_t *dap_chain_datum_decree_get_owners(dap_chain_datum_decree_t *a_decree, uint256_t *a_owners_num) +dap_list_t *dap_chain_datum_decree_get_owners(dap_chain_datum_decree_t *a_decree, uint16_t *a_owners_num) { if(!a_decree || !a_owners_num){ log_it(L_WARNING,"Wrong arguments"); @@ -140,11 +140,12 @@ dap_list_t *dap_chain_datum_decree_get_owners(dap_chain_datum_decree_t *a_decree } l_tsd_offset += l_tsd_size; } - *a_owners_num = GET_256_FROM_64(l_owners_num); + if (a_owners_num) + *a_owners_num = l_owners_num; return l_key_list; } -int dap_chain_datum_decree_get_min_owners(dap_chain_datum_decree_t *a_decree, uint256_t *a_min_owners_num) +int dap_chain_datum_decree_get_min_owners(dap_chain_datum_decree_t *a_decree, uint16_t *a_min_owners_num) { if(!a_decree || !a_min_owners_num){ log_it(L_WARNING,"Wrong arguments"); @@ -165,7 +166,9 @@ int dap_chain_datum_decree_get_min_owners(dap_chain_datum_decree_t *a_decree, ui log_it(L_WARNING,"Wrong fee tsd data size."); return -1; } - *a_min_owners_num = dap_tsd_get_scalar(l_tsd, uint256_t); + uint256_t l_min_owners_num = dap_tsd_get_scalar(l_tsd, uint256_t); + if (a_min_owners_num) + *a_min_owners_num = dap_chain_uint256_to(l_min_owners_num); return 0; } l_tsd_offset += l_tsd_size; diff --git a/modules/common/include/dap_chain_datum_decree.h b/modules/common/include/dap_chain_datum_decree.h index bc8096a855a14857ac1e138de78bd0c841db8c79..a2e9ab414eacb02fde712dfff0fe0e1ed9419e0f 100644 --- a/modules/common/include/dap_chain_datum_decree.h +++ b/modules/common/include/dap_chain_datum_decree.h @@ -76,7 +76,6 @@ DAP_STATIC_INLINE size_t dap_chain_datum_decree_get_size(dap_chain_datum_decree_ #define DAP_CHAIN_DATUM_DECREE_TSD_TYPE_FEE 0x0102 #define DAP_CHAIN_DATUM_DECREE_TSD_TYPE_OWNER 0x0103 #define DAP_CHAIN_DATUM_DECREE_TSD_TYPE_MIN_OWNER 0x0104 -#define DAP_CHAIN_DATUM_DECREE_TSD_TYPE_TON_SIGNERS_MIN 0x0105 #define DAP_CHAIN_DATUM_DECREE_TSD_TYPE_FEE_WALLET 0x0106 #define DAP_CHAIN_DATUM_DECREE_TSD_TYPE_STAKE_TX_HASH 0x0107 #define DAP_CHAIN_DATUM_DECREE_TSD_TYPE_STAKE_VALUE 0x0108 @@ -116,7 +115,7 @@ int dap_chain_datum_decree_get_fee_addr(dap_chain_datum_decree_t *a_decree, dap_ * @param a_owners_num pointer to total number of owners buffer * @return dap_list_t with owners keys in dap_pkey_t format */ -dap_list_t *dap_chain_datum_decree_get_owners(dap_chain_datum_decree_t *a_decree, uint256_t *a_owners_num); +dap_list_t *dap_chain_datum_decree_get_owners(dap_chain_datum_decree_t *a_decree, uint16_t *a_owners_num); /** * @brief dap_chain_datum_decree_get_min_owners get minimum number of owners @@ -124,7 +123,7 @@ dap_list_t *dap_chain_datum_decree_get_owners(dap_chain_datum_decree_t *a_decree * @param a_owners_num pointer to minimum number of owners buffer * @return result code. 0 - success */ -int dap_chain_datum_decree_get_min_owners(dap_chain_datum_decree_t *a_decree, uint256_t *a_min_owners_num); +int dap_chain_datum_decree_get_min_owners(dap_chain_datum_decree_t *a_decree, uint16_t *a_min_owners_num); /** * @brief dap_chain_datum_decree_get_tx_hash get stake tx hash diff --git a/modules/net/dap_chain_net_anchor.c b/modules/net/dap_chain_net_anchor.c index 83002e1ba255429feba157ce8920cdd9097dadd7..9812fbdbc7db586ef18df764a2f6f3ba004db1af 100644 --- a/modules/net/dap_chain_net_anchor.c +++ b/modules/net/dap_chain_net_anchor.c @@ -183,7 +183,6 @@ int dap_chain_net_anchor_load(dap_chain_datum_anchor_t * a_anchor, dap_chain_t * return ret_val; } - dap_chain_datum_decree_t * l_decree = NULL; dap_chain_hash_fast_t l_hash = {0}; if ((ret_val = dap_chain_datum_anchor_get_hash_from_data(a_anchor, &l_hash)) != 0) { @@ -191,22 +190,7 @@ int dap_chain_net_anchor_load(dap_chain_datum_anchor_t * a_anchor, dap_chain_t * return -109; } - bool l_is_applied = false; - l_decree = dap_chain_net_decree_get_by_hash(l_hash, &l_is_applied); - if (!l_decree) - { - log_it(L_WARNING,"Decree is not found."); - return -110; - } - - if (l_is_applied) - { - log_it(L_WARNING,"Decree already applyed."); - return -111; - } - - - if((ret_val = dap_chain_net_decree_apply(l_decree, a_chain))!=0) + if((ret_val = dap_chain_net_decree_apply(&l_hash, NULL, a_chain))!=0) { log_it(L_WARNING,"Decree applying failed"); } diff --git a/modules/net/dap_chain_net_decree.c b/modules/net/dap_chain_net_decree.c index fd270ab2726630499259b048ee5b5242469c686d..7ed6a3e767371c3a1801a7d890f0b91877b876e1 100644 --- a/modules/net/dap_chain_net_decree.c +++ b/modules/net/dap_chain_net_decree.c @@ -91,8 +91,8 @@ int dap_chain_net_decree_init(dap_chain_net_t *a_net) return -2; } - l_decree->min_num_of_owners = GET_256_FROM_64((uint64_t)l_count_verify); - l_decree->num_of_owners = GET_256_FROM_64((uint64_t)l_auth_certs_count); + l_decree->min_num_of_owners = l_count_verify; + l_decree->num_of_owners = l_auth_certs_count; l_decree->pkeys = l_net_keys; a_net->pub.decree = l_decree; @@ -214,17 +214,9 @@ int dap_chain_net_decree_verify(dap_chain_datum_decree_t *a_decree, dap_chain_ne 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; - } - - uint256_t l_min_signs = a_net->pub.decree->min_num_of_owners; - 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, l_min_signs) < 0) - { - log_it(L_WARNING,"Not enough unique signatures"); + uint16_t l_min_signs = a_net->pub.decree->min_num_of_owners; + if (l_num_of_unique_signs < l_min_signs) { + log_it(L_WARNING, "Not enough unique signatures, get %zu from %hu", l_num_of_unique_signs, l_min_signs); return -106; } @@ -253,11 +245,8 @@ int dap_chain_net_decree_verify(dap_chain_datum_decree_t *a_decree, dap_chain_ne DAP_DELETE(l_signs_arr); DAP_DELETE(l_unique_signs); - l_min_signs = a_net->pub.decree->min_num_of_owners; - l_num_of_valid_signs256 = GET_256_FROM_64((uint64_t)l_signs_verify_counter); - if (compare256(l_num_of_valid_signs256, l_min_signs) < 0) - { - log_it(L_WARNING,"Not enough valid signatures"); + if (l_signs_verify_counter < l_min_signs) { + log_it(L_WARNING,"Not enough valid signatures, get %hu from %hu", l_signs_verify_counter, l_min_signs); return -106; } @@ -271,12 +260,12 @@ int dap_chain_net_decree_verify(dap_chain_datum_decree_t *a_decree, dap_chain_ne return 0; } -int dap_chain_net_decree_apply(dap_chain_datum_decree_t * a_decree, dap_chain_t *a_chain) +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; dap_chain_net_t *l_net = NULL; - if (!a_decree || !a_chain) + if (!a_decree_hash || !a_chain) { log_it(L_ERROR,"Invalid arguments."); return -107; @@ -290,31 +279,34 @@ int dap_chain_net_decree_apply(dap_chain_datum_decree_t * a_decree, dap_chain_t return -108; } - dap_hash_fast_t l_hash = {0}; - 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, &l_hash)) != DAP_DECREE_IS_PRESENT) - return ret_val; - - // Process decree - switch(a_decree->header.type){ - case DAP_CHAIN_DATUM_DECREE_TYPE_COMMON:{ - ret_val = s_common_decree_handler(a_decree, l_net, a_chain, true); - break; + 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); + if (!l_decree_hh) { + log_it(L_WARNING,"Decree is not found."); + return -110; } - case DAP_CHAIN_DATUM_DECREE_TYPE_SERVICE:{ - ret_val = s_service_decree_handler(a_decree, a_chain, true); + if (l_decree_hh->is_applied) { + log_it(L_WARNING,"Decree already applyed."); + return -111; } - default: - log_it(L_WARNING,"Decree type is undefined!"); - ret_val = -100; + } else { + l_decree_hh = DAP_NEW_Z(struct decree_hh); + 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 (!ret_val) { - struct decree_hh *l_decree_hh = NULL; - HASH_FIND(hh, s_decree_hh, &l_hash, sizeof(dap_hash_fast_t), l_decree_hh); - if (l_decree_hh) - l_decree_hh->is_applied = true; + // Process decree + switch(a_decree->header.type) { + case DAP_CHAIN_DATUM_DECREE_TYPE_COMMON: + ret_val = s_common_decree_handler(l_decree_hh->decree, l_net, a_chain, true); + break; + case DAP_CHAIN_DATUM_DECREE_TYPE_SERVICE: + ret_val = s_service_decree_handler(l_decree_hh->decree, a_chain, true); + default: + log_it(L_WARNING,"Decree type is undefined!"); + ret_val = -100; } return ret_val; @@ -344,31 +336,21 @@ int dap_chain_net_decree_load(dap_chain_datum_decree_t * a_decree, dap_chain_t * log_it(L_ERROR,"Decree verification failed!"); return ret_val; } - struct decree_hh *l_decree_hh = DAP_NEW_Z(struct decree_hh); - l_decree_hh->decree = DAP_DUP_SIZE(a_decree, l_data_size);; - l_decree_hh->key = l_hash; - l_decree_hh->is_applied = false; - if (a_decree->header.common_decree_params.chain_id.uint64 == a_chain->id.uint64) - { - ret_val = dap_chain_net_decree_apply(a_decree, a_chain); + if (a_decree->header.common_decree_params.chain_id.uint64 == a_chain->id.uint64) { + ret_val = dap_chain_net_decree_apply(&l_hash, a_decree, a_chain); if (ret_val) log_it(L_ERROR,"Decree applying failed!"); - else - l_decree_hh->is_applied = true; } - HASH_ADD(hh, s_decree_hh, key, sizeof(dap_hash_fast_t), l_decree_hh); - return ret_val; } dap_chain_datum_decree_t * dap_chain_net_decree_get_by_hash(dap_hash_fast_t a_hash, bool *is_applied) { - dap_hash_fast_t l_hash = a_hash; struct decree_hh* l_decree_hh = NULL; - HASH_FIND(hh, s_decree_hh, &l_hash, sizeof(dap_hash_fast_t), l_decree_hh); + HASH_FIND(hh, s_decree_hh, &a_hash, sizeof(dap_hash_fast_t), l_decree_hh); if (!l_decree_hh) return NULL; @@ -400,7 +382,7 @@ 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, dap_chain_t *a_chain, bool a_apply) { uint256_t l_uint256_buffer; - + uint16_t l_uint16_buffer; dap_chain_addr_t l_addr = {}; //???????? dap_hash_fast_t l_hash = {}; dap_chain_node_addr_t l_node_addr = {}; @@ -444,7 +426,7 @@ static int s_common_decree_handler(dap_chain_datum_decree_t * a_decree, dap_chai } break; case DAP_CHAIN_DATUM_DECREE_COMMON_SUBTYPE_OWNERS: - l_owners_list = dap_chain_datum_decree_get_owners(a_decree, &l_uint256_buffer); + l_owners_list = dap_chain_datum_decree_get_owners(a_decree, &l_uint16_buffer); if (!l_owners_list){ log_it(L_WARNING,"Can't get ownners from decree."); return -104; @@ -453,19 +435,19 @@ static int s_common_decree_handler(dap_chain_datum_decree_t * a_decree, dap_chai if (!a_apply) break; - l_net->pub.decree->num_of_owners = l_uint256_buffer; + l_net->pub.decree->num_of_owners = l_uint16_buffer; dap_list_free_full(l_net->pub.decree->pkeys, NULL); l_net->pub.decree->pkeys = l_owners_list; break; case DAP_CHAIN_DATUM_DECREE_COMMON_SUBTYPE_OWNERS_MIN: - if (dap_chain_datum_decree_get_min_owners(a_decree, &l_uint256_buffer)){ + if (dap_chain_datum_decree_get_min_owners(a_decree, &l_uint16_buffer)){ log_it(L_WARNING,"Can't get min number of ownners from decree."); return -105; } if (!a_apply) break; - l_net->pub.decree->min_num_of_owners = l_uint256_buffer; + l_net->pub.decree->min_num_of_owners = l_uint16_buffer; break; case DAP_CHAIN_DATUM_DECREE_COMMON_SUBTYPE_TON_SIGNERS_MIN: if (!a_apply) @@ -515,6 +497,10 @@ static int s_common_decree_handler(dap_chain_datum_decree_t * a_decree, dap_chai log_it(L_WARNING,"Can't get min stake value from decree."); return -105; } + if (!a_chain->callback_set_min_validators_count) { + log_it(L_WARNING, "Can't apply this decree to specified chain"); + return -115; + } if (!a_apply) break; a_chain->callback_set_min_validators_count(a_chain, (uint16_t)dap_chain_uint256_to(l_uint256_buffer)); diff --git a/modules/net/dap_chain_node_cli.c b/modules/net/dap_chain_node_cli.c index 18e74e08ee52b6ee42c070797228cdf38323d468..4f5651f9fecc4135564ab52acb98948ac6db05dc 100644 --- a/modules/net/dap_chain_node_cli.c +++ b/modules/net/dap_chain_node_cli.c @@ -326,9 +326,7 @@ int dap_chain_node_cli_init(dap_config_t * g_config) "\t -fee <value>: sets fee for tx in net\n" "\t -to_addr <wallet_addr>: sets wallet addr for network fee\n" "\t -new_certs <certs_list>: sets new owners set for net\n" - "\t -signs_verify <value>: sets minimum number of owners needed to sign decree\n" - "\t -ton_signs_verify <value>: sets minimum number of TON signers"); - + "\t -signs_verify <value>: sets minimum number of owners needed to sign decree\n"); // Exit - always last! dap_cli_server_cmd_add ("exit", com_exit, "Stop application and exit", diff --git a/modules/net/dap_chain_node_cli_cmd_tx.c b/modules/net/dap_chain_node_cli_cmd_tx.c index f5a76a287a21ddd1e0e6a1535ed58c5f1b617241..b828ede4a7f1704d6fe93b4be9661c0a0bb94216 100644 --- a/modules/net/dap_chain_node_cli_cmd_tx.c +++ b/modules/net/dap_chain_node_cli_cmd_tx.c @@ -1394,7 +1394,7 @@ int cmd_decree(int a_argc, char **a_argv, char ** a_str_reply) { enum { CMD_NONE=0, CMD_CREATE, CMD_SIGN, CMD_ANCHOR }; enum { TYPE_NONE=0, TYPE_COMMON, TYPE_SERVICE}; - enum { SUBTYPE_NONE=0, SUBTYPE_FEE, SUBTYPE_OWNERS, SUBTYPE_MIN_OWNERS, SUBTYPE_TON_MIN_SIGNS}; + enum { SUBTYPE_NONE=0, SUBTYPE_FEE, SUBTYPE_OWNERS, SUBTYPE_MIN_OWNERS}; int arg_index = 1; const char *l_net_str = NULL; const char * l_chain_str = NULL; @@ -1553,11 +1553,9 @@ int cmd_decree(int a_argc, char **a_argv, char ** a_str_reply) l_subtype = SUBTYPE_OWNERS; dap_cert_parse_str_list(l_param_value_str, &l_new_certs, &l_new_certs_count); - dap_chain_net_t *a_net = dap_chain_net_by_name(l_net_str); - uint256_t l_min_signs = a_net->pub.decree->min_num_of_owners; - uint256_t l_num_of_valid_signs256 = GET_256_FROM_64((uint64_t)l_new_certs_count); - if (compare256(l_num_of_valid_signs256, l_min_signs) < 0) - { + dap_chain_net_t *l_net = dap_chain_net_by_name(l_net_str); + uint16_t l_min_signs = l_net->pub.decree->min_num_of_owners; + if (l_new_certs_count < l_min_signs) { log_it(L_WARNING,"Number of new certificates is less than minimum owner number."); return -106; } @@ -1584,15 +1582,17 @@ int cmd_decree(int a_argc, char **a_argv, char ** a_str_reply) }else if (dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-signs_verify", &l_param_value_str)){ l_subtype = SUBTYPE_MIN_OWNERS; uint256_t l_new_num_of_owners = dap_cvt_str_to_uint256(l_param_value_str); - - dap_chain_net_t *a_net = dap_chain_net_by_name(l_net_str); - uint256_t l_owners = a_net->pub.decree->num_of_owners; - uint256_t l_num_of_valid_signs256 = GET_256_FROM_64((uint64_t)l_new_certs_count); - if (compare256(l_num_of_valid_signs256, l_owners) > 0) - { + if (IS_ZERO_256(l_new_num_of_owners)) { + log_it(L_WARNING, "The minimum number of owners can't be zero"); + dap_list_free_full(l_tsd_list, NULL); + return -112; + } + dap_chain_net_t *l_net = dap_chain_net_by_name(l_net_str); + uint256_t l_owners = GET_256_FROM_64(l_net->pub.decree->num_of_owners); + if (compare256(l_new_num_of_owners, l_owners) > 0) { log_it(L_WARNING,"The minimum number of owners is greater than the total number of owners."); dap_list_free_full(l_tsd_list, NULL); - return -107; + return -110; } l_total_tsd_size = sizeof(dap_tsd_t) + sizeof(uint256_t); @@ -1601,18 +1601,9 @@ int cmd_decree(int a_argc, char **a_argv, char ** a_str_reply) l_tsd->size = sizeof(uint256_t); *(uint256_t*)(l_tsd->data) = l_new_num_of_owners; l_tsd_list = dap_list_append(l_tsd_list, l_tsd); - }else if (dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-ton_signs_verify", &l_param_value_str)){ - l_subtype = SUBTYPE_TON_MIN_SIGNS; - uint256_t l_new_num_of_owners = dap_cvt_str_to_uint256(l_param_value_str); - l_total_tsd_size = sizeof(dap_tsd_t) + sizeof(uint256_t); - l_tsd = DAP_NEW_Z_SIZE(dap_tsd_t, l_total_tsd_size); - l_tsd->type = DAP_CHAIN_DATUM_DECREE_TSD_TYPE_TON_SIGNERS_MIN; - l_tsd->size = sizeof(uint256_t); - *(uint256_t*)(l_tsd->data) = l_new_num_of_owners; - l_tsd_list = dap_list_append(l_tsd_list, l_tsd); }else{ dap_cli_server_cmd_set_reply_text(a_str_reply, "Decree subtype fail."); - return -107; + return -111; } l_datum_decree = DAP_NEW_Z_SIZE(dap_chain_datum_decree_t, sizeof(dap_chain_datum_decree_t) + l_total_tsd_size); diff --git a/modules/net/include/dap_chain_net_decree.h b/modules/net/include/dap_chain_net_decree.h index b9a2d4a72ea6b9c1963356172dfd86daf5c4b56b..a62ca0d07ae70f7cff4efdc2066d1e5b918879c5 100644 --- a/modules/net/include/dap_chain_net_decree.h +++ b/modules/net/include/dap_chain_net_decree.h @@ -27,8 +27,8 @@ typedef struct decree_params { dap_list_t *pkeys; - uint256_t num_of_owners; - uint256_t min_num_of_owners; + uint16_t num_of_owners; + uint16_t min_num_of_owners; dap_chain_addr_t *fee_addr; } dap_chain_net_decree_t; @@ -37,7 +37,7 @@ typedef struct decree_params { int dap_chain_net_decree_init(dap_chain_net_t *a_net); int dap_chain_net_decree_deinit(dap_chain_net_t *a_net); -int dap_chain_net_decree_apply(dap_chain_datum_decree_t * a_decree, dap_chain_t *a_chain); +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_hash_fast_t *a_decree_hash); int dap_chain_net_decree_load(dap_chain_datum_decree_t * a_decree, dap_chain_t *a_chain);