diff --git a/modules/chain/dap_chain.c b/modules/chain/dap_chain.c index f14c5f712cf9ed0570c2b291e72a4fce5dac48c0..fa714eac7c3bc259cc570ba2b96747148dc22ce2 100644 --- a/modules/chain/dap_chain.c +++ b/modules/chain/dap_chain.c @@ -317,7 +317,10 @@ static uint16_t s_chain_type_convert(dap_chain_type_t a_type) return DAP_CHAIN_DATUM_CA; case CHAIN_TYPE_SIGNER: return DAP_CHAIN_DATUM_SIGNER; - + case CHAIN_TYPE_DECREE: + return DAP_CHAIN_DATUM_DECREE; + case CHAIN_TYPE_ANCHOR: + return DAP_CHAIN_DATUM_ANCHOR; default: return DAP_CHAIN_DATUM_CUSTOM; } diff --git a/modules/chain/dap_chain_ledger.c b/modules/chain/dap_chain_ledger.c index 500103bdb1767e77c203a2eb7e8081841675f6de..bf55dd1b97afa257ae2b159615006c22627fd557 100644 --- a/modules/chain/dap_chain_ledger.c +++ b/modules/chain/dap_chain_ledger.c @@ -1736,7 +1736,7 @@ static void s_threshold_emissions_proc(dap_ledger_t * a_ledger) int l_res = s_token_emission_add_unsafe(a_ledger, (byte_t *)l_emission_item->datum_token_emission, l_emission_item->datum_token_emission_size, &l_emission_item->datum_token_emission_hash, true); - if (l_res != DAP_CHAIN_CS_VERIFY_CODE_TX_NO_TOKEN) { + if (l_res != DAP_CHAIN_CS_VERIFY_CODE_NO_DECREE) { HASH_DEL(PVT(a_ledger)->threshold_emissions, l_emission_item); if (l_res) DAP_DELETE(l_emission_item->datum_token_emission); @@ -2127,17 +2127,17 @@ int dap_chain_ledger_token_emission_add_check(dap_ledger_t *a_ledger, byte_t *a_ int l_ret = 0; dap_ledger_private_t *l_ledger_pvt = PVT(a_ledger); - const char * c_token_ticker = ((dap_chain_datum_token_emission_t *)a_token_emission)->hdr.ticker; + const char *l_token_ticker = ((dap_chain_datum_token_emission_t *)a_token_emission)->hdr.ticker; dap_chain_ledger_token_item_t * l_token_item = NULL; pthread_rwlock_rdlock(&l_ledger_pvt->tokens_rwlock); - HASH_FIND_STR(l_ledger_pvt->tokens, c_token_ticker, l_token_item); + HASH_FIND_STR(l_ledger_pvt->tokens, l_token_ticker, l_token_item); pthread_rwlock_unlock(&l_ledger_pvt->tokens_rwlock); dap_chain_ledger_token_emission_item_t * l_token_emission_item = NULL; if (!l_token_item) { - log_it(L_WARNING, "Ledger_token_emission_add_check. Token ticker %s was not found", c_token_ticker); - return DAP_CHAIN_CS_VERIFY_CODE_TX_NO_TOKEN; // old return -5 + log_it(L_WARNING, "Ledger_token_emission_add_check. Token ticker %s was not found", l_token_ticker); + return -5; } // check if such emission is already present in table @@ -2157,12 +2157,12 @@ int dap_chain_ledger_token_emission_add_check(dap_ledger_t *a_ledger, byte_t *a_ if ( l_token_emission_item->datum_token_emission->hdr.version == 2 ) { char *l_balance = dap_chain_balance_print(l_token_emission_item->datum_token_emission->hdr.value_256); log_it(L_ERROR, "Can't add token emission datum of %s %s ( %s ): already present in cache", - l_balance, c_token_ticker, l_hash_str); + l_balance, l_token_ticker, l_hash_str); DAP_DELETE(l_balance); } else log_it(L_ERROR, "Can't add token emission datum of %"DAP_UINT64_FORMAT_U" %s ( %s ): already present in cache", - l_token_emission_item->datum_token_emission->hdr.value, c_token_ticker, l_hash_str); + l_token_emission_item->datum_token_emission->hdr.value, l_token_ticker, l_hash_str); } l_ret = -1; }else if ( (! l_token_item) && ( l_threshold_emissions_count >= s_threshold_emissions_max)) { @@ -2255,7 +2255,7 @@ int dap_chain_ledger_token_emission_add_check(dap_ledger_t *a_ledger, byte_t *a_ }else{ if(s_debug_more) log_it(L_WARNING,"Can't find token declaration %s:%s thats pointed in token emission datum", a_ledger->net_name, l_emission->hdr.ticker); - l_ret = DAP_CHAIN_CS_VERIFY_CODE_TX_NO_TOKEN; + l_ret = -5; } }break; default:{} @@ -2368,7 +2368,7 @@ static inline int s_token_emission_add(dap_ledger_t *a_ledger, byte_t *a_token_e dap_chain_ledger_token_emission_item_t * l_token_emission_item = NULL; int l_ret = dap_chain_ledger_token_emission_add_check(a_ledger, a_token_emission, a_token_emission_size); if (l_ret) { - if (l_ret == DAP_CHAIN_CS_VERIFY_CODE_TX_NO_TOKEN) { + if (l_ret == DAP_CHAIN_CS_VERIFY_CODE_NO_DECREE) { // TODO remove emissions threshold if (HASH_COUNT(l_ledger_pvt->threshold_emissions) < s_threshold_emissions_max) { l_token_emission_item = DAP_NEW_Z(dap_chain_ledger_token_emission_item_t); l_token_emission_item->datum_token_emission = DAP_DUP_SIZE(a_token_emission, a_token_emission_size); @@ -2395,7 +2395,7 @@ static inline int s_token_emission_add(dap_ledger_t *a_ledger, byte_t *a_token_e HASH_FIND_STR(l_ledger_pvt->tokens, c_token_ticker, l_token_item); pthread_rwlock_unlock(&l_ledger_pvt->tokens_rwlock); if (!l_token_item && a_from_threshold) - return DAP_CHAIN_CS_VERIFY_CODE_TX_NO_TOKEN; + return -5; // check if such emission is already present in table if(a_safe_call) pthread_rwlock_rdlock( l_token_item ? &l_token_item->token_emissions_rwlock @@ -2475,7 +2475,7 @@ static inline int s_token_emission_add(dap_ledger_t *a_ledger, byte_t *a_token_e HASH_ADD(hh, l_ledger_pvt->threshold_emissions, datum_token_emission_hash, sizeof(*a_emission_hash), l_token_emission_item); if(a_safe_call) pthread_rwlock_unlock(&l_ledger_pvt->threshold_emissions_rwlock); - l_ret = DAP_CHAIN_CS_VERIFY_CODE_TX_NO_TOKEN; + l_ret = -5; if(s_debug_more) { char * l_token_emission_address_str = dap_chain_addr_to_str(&(l_token_emission_item->datum_token_emission->hdr.address)); log_it(L_NOTICE, "Added token emission datum to emissions threshold: type=%s value=%.1Lf token=%s to_addr=%s ", @@ -2589,7 +2589,7 @@ int dap_chain_ledger_token_emission_load(dap_ledger_t *a_ledger, byte_t *a_token l_token_emission_item); pthread_rwlock_unlock(&PVT(a_ledger)->threshold_emissions_rwlock); if (l_token_emission_item) { - return DAP_CHAIN_CS_VERIFY_CODE_TX_NO_TOKEN; + return -5; } } return dap_chain_ledger_token_emission_add(a_ledger, a_token_emission, a_token_emission_size, &l_token_emission_hash, false); diff --git a/modules/chain/include/dap_chain_ledger.h b/modules/chain/include/dap_chain_ledger.h index 72e6e5cb85b7cb3873b08e70438c30fb49384cec..2b33563a07f87f5bf350c6f50abea57c95bc3faa 100644 --- a/modules/chain/include/dap_chain_ledger.h +++ b/modules/chain/include/dap_chain_ledger.h @@ -60,12 +60,12 @@ typedef struct dap_chain_net dap_chain_net_t; #define DAP_CHAIN_LEDGER_CACHE_ENABLED 0x0200 -// Error code for no previous transaction (candidate to threshold) -#define DAP_CHAIN_CS_VERIFY_CODE_TX_NO_PREVIOUS -111 -// Error code for no emission for a transaction (candidate to threshold) -#define DAP_CHAIN_CS_VERIFY_CODE_TX_NO_EMISSION -112 -// Error code for no token for an emission (candidate to threshold) -#define DAP_CHAIN_CS_VERIFY_CODE_TX_NO_TOKEN -113 +// Error code for no previous transaction (for stay in mempool) +#define DAP_CHAIN_CS_VERIFY_CODE_TX_NO_PREVIOUS -1111 +// Error code for no emission for a transaction (for stay in mempoold) +#define DAP_CHAIN_CS_VERIFY_CODE_TX_NO_EMISSION -1112 +// Error code for no decree for anchor (for stay in mempool) +#define DAP_CHAIN_CS_VERIFY_CODE_NO_DECREE -1113 #define DAP_CHAIN_LEDGER_TOKENS_STR "tokens" #define DAP_CHAIN_LEDGER_EMISSIONS_STR "emissions" diff --git a/modules/common/dap_chain_datum.c b/modules/common/dap_chain_datum.c index 7403c053105e49b06793626f7cec67344ffa2f88..888527d614a1cf45bd29914f9fa2054432188613 100644 --- a/modules/common/dap_chain_datum.c +++ b/modules/common/dap_chain_datum.c @@ -712,7 +712,7 @@ void dap_chain_datum_dump(dap_string_t *a_str_out, dap_chain_datum_t *a_datum, c } break; case DAP_CHAIN_DATUM_DECREE:{ dap_chain_datum_decree_t *l_decree = (dap_chain_datum_decree_t *)a_datum->data; - size_t l_decree_size = sizeof(dap_chain_datum_decree_t) + l_decree->header.data_size + l_decree->header.signs_size; + size_t l_decree_size = dap_chain_datum_decree_get_size(l_decree); dap_string_append_printf(a_str_out,"=== Datum decree ===\n"); dap_string_append_printf(a_str_out, "hash: %s\n", l_hash_str); dap_string_append_printf(a_str_out, "size: %zd\n", l_decree_size); diff --git a/modules/common/include/dap_chain_datum_anchor.h b/modules/common/include/dap_chain_datum_anchor.h index e9a9a19317c034530d3c57bbff3b66378ad517ba..044b8165f68ac20636796a08fb6da920556c9d23 100644 --- a/modules/common/include/dap_chain_datum_anchor.h +++ b/modules/common/include/dap_chain_datum_anchor.h @@ -43,6 +43,10 @@ typedef struct dap_chain_datum_anchor{ // ANCHOR TSD types #define DAP_CHAIN_DATUM_ANCHOR_TSD_TYPE_DECREE_HASH 0x0001 +DAP_STATIC_INLINE size_t dap_chain_datum_anchor_get_size(dap_chain_datum_anchor_t *a_datum_anchor) +{ + return sizeof(*a_datum_anchor) + a_datum_anchor->header.data_size + a_datum_anchor->header.signs_size; +} int dap_chain_datum_anchor_get_hash_from_data(dap_chain_datum_anchor_t* a_anchor, dap_hash_fast_t * l_out_hash); void dap_chain_datum_anchor_certs_dump(dap_string_t * a_str_out, byte_t * a_signs, diff --git a/modules/consensus/esbocs/dap_chain_cs_esbocs.c b/modules/consensus/esbocs/dap_chain_cs_esbocs.c index 388e5537a23b5887fa3fe3bf28df4e345adc023e..8e7bc7eada69a4d3713b51f3f6be48fcf124ca15 100644 --- a/modules/consensus/esbocs/dap_chain_cs_esbocs.c +++ b/modules/consensus/esbocs/dap_chain_cs_esbocs.c @@ -235,7 +235,7 @@ static int s_callback_created(dap_chain_t *a_chain, dap_config_t *a_chain_net_cf return 0; } else if (l_sign_cert->enc_key->priv_key_data) { l_esbocs_pvt->blocks_sign_key = l_sign_cert->enc_key; - log_it(L_INFO, "Loaded \"%s\" certificate to sign TON blocks", l_sign_cert_str); + log_it(L_INFO, "Loaded \"%s\" certificate to sign ESBOCS blocks", l_sign_cert_str); } else { log_it(L_ERROR, "Certificate \"%s\" has no private key", l_sign_cert_str); return 0; diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index 383a6dc4f0ad419a31b103ae60338ddf8aa1181f..e0af3e6001a7f37e5698287b70f02c4802613da4 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -3161,9 +3161,9 @@ int dap_chain_net_verify_datum_for_add(dap_chain_net_t *a_net, dap_chain_datum_t case DAP_CHAIN_DATUM_TOKEN_EMISSION: return dap_chain_ledger_token_emission_add_check( a_net->pub.ledger, a_datum->data, a_datum->header.data_size ); case DAP_CHAIN_DATUM_DECREE: - return dap_chain_net_decree_verify((dap_chain_datum_decree_t*)a_datum->data, a_net, NULL, NULL); + return dap_chain_net_decree_verify((dap_chain_datum_decree_t*)a_datum->data, a_net, a_datum->header.data_size, NULL); case DAP_CHAIN_DATUM_ANCHOR: - return dap_chain_net_anchor_verify((dap_chain_datum_anchor_t*)a_datum->data, a_net, NULL, NULL); + return dap_chain_net_anchor_verify((dap_chain_datum_anchor_t*)a_datum->data, a_datum->header.data_size); default: return 0; } } diff --git a/modules/net/dap_chain_net_anchor.c b/modules/net/dap_chain_net_anchor.c index b6743269d74562429b9856aab8ace8b41477fcba..83002e1ba255429feba157ce8920cdd9097dadd7 100644 --- a/modules/net/dap_chain_net_anchor.c +++ b/modules/net/dap_chain_net_anchor.c @@ -38,8 +38,16 @@ static bool s_verify_pubkeys(dap_sign_t *a_sign, dap_sign_t **a_decree_signs, si 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, dap_chain_net_t *a_net, uint32_t *a_signs_count, uint32_t *a_signs_verify) +int dap_chain_net_anchor_verify(dap_chain_datum_anchor_t * a_anchor, size_t a_data_size) { + if (a_data_size < sizeof(dap_chain_datum_anchor_t)) { + log_it(L_WARNING, "Anchor size is too small"); + return -120; + } + if (dap_chain_datum_anchor_get_size(a_anchor) != a_data_size) { + log_it(L_WARNING, "Anchor size is invalid"); + return -121; + } int ret_val = 0; dap_chain_datum_anchor_t *l_anchor = a_anchor; size_t l_signs_size = l_anchor->header.signs_size; @@ -90,7 +98,7 @@ int dap_chain_net_anchor_verify(dap_chain_datum_anchor_t * a_anchor, dap_chain_n DAP_DELETE(l_signs_arr); DAP_DELETE(l_unique_signs); log_it(L_WARNING,"Can't get decree by hash"); - return -107; + return DAP_CHAIN_CS_VERIFY_CODE_NO_DECREE; } if (l_is_applied) @@ -148,9 +156,6 @@ int dap_chain_net_anchor_verify(dap_chain_datum_anchor_t * a_anchor, dap_chain_n DAP_DELETE(l_signs_arr); DAP_DELETE(l_unique_signs); - if (a_signs_verify) - *a_signs_verify = l_signs_verify_counter; - return 0; } @@ -172,7 +177,7 @@ int dap_chain_net_anchor_load(dap_chain_datum_anchor_t * a_anchor, dap_chain_t * return -108; } - if ((ret_val = dap_chain_net_anchor_verify(a_anchor, l_net, NULL, NULL)) != 0) + if ((ret_val = dap_chain_net_anchor_verify(a_anchor, dap_chain_datum_anchor_get_size(a_anchor))) != 0) { log_it(L_WARNING,"Decree is not pass verification!"); return ret_val; diff --git a/modules/net/dap_chain_net_decree.c b/modules/net/dap_chain_net_decree.c index f357b28ee72b658b71d7ee771d8ba4a4e63df4d2..fd270ab2726630499259b048ee5b5242469c686d 100644 --- a/modules/net/dap_chain_net_decree.c +++ b/modules/net/dap_chain_net_decree.c @@ -113,7 +113,6 @@ int dap_chain_net_decree_deinit(dap_chain_net_t *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_chain_net_t *l_net = NULL; if (!a_decree) { @@ -137,8 +136,30 @@ int s_decree_verify_tsd(dap_chain_datum_decree_t * a_decree, dap_chain_net_t *a_ return ret_val; } -int dap_chain_net_decree_verify(dap_chain_datum_decree_t * a_decree, dap_chain_net_t *a_net, uint32_t *a_signs_count, uint32_t *a_signs_verify) +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) { + if (a_data_size < sizeof(dap_chain_datum_decree_t)) { + log_it(L_WARNING, "Decree size is too small"); + return -120; + } + if (dap_chain_datum_decree_get_size(a_decree) != a_data_size) { + log_it(L_WARNING, "Decree size is invalid"); + return -121; + } + if (a_decree->header.common_decree_params.net_id.uint64 != a_net->pub.id.uint64) { + log_it(L_WARNING, "Decree net id is invalid"); + return -122; + } + + dap_hash_fast_t l_decree_hash; + dap_hash_fast(a_decree, a_data_size, &l_decree_hash); + if (a_decree_hash) + *a_decree_hash = l_decree_hash; + struct decree_hh *l_decree_hh = NULL; + HASH_FIND(hh, s_decree_hh, &l_decree_hash, sizeof(dap_hash_fast_t), l_decree_hh); + if (l_decree_hh) + return DAP_DECREE_IS_PRESENT; + dap_chain_datum_decree_t *l_decree = a_decree; // Get pkeys sign from decree datum @@ -189,9 +210,6 @@ int dap_chain_net_decree_verify(dap_chain_datum_decree_t * a_decree, dap_chain_n l_signs_count++; } - if (a_signs_count) - *a_signs_count = l_signs_count; - // 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); @@ -235,9 +253,6 @@ int dap_chain_net_decree_verify(dap_chain_datum_decree_t * a_decree, dap_chain_n DAP_DELETE(l_signs_arr); DAP_DELETE(l_unique_signs); - if (a_signs_verify) - *a_signs_verify = l_signs_verify_counter; - 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) @@ -275,10 +290,11 @@ int dap_chain_net_decree_apply(dap_chain_datum_decree_t * a_decree, dap_chain_t return -108; } - if ((ret_val = dap_chain_net_decree_verify(a_decree, l_net, NULL, NULL)) != 0) - return ret_val; - + 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){ @@ -294,13 +310,8 @@ int dap_chain_net_decree_apply(dap_chain_datum_decree_t * a_decree, dap_chain_t ret_val = -100; } - if (!ret_val) - { - dap_hash_fast_t l_hash = {0}; - size_t l_data_size = sizeof(dap_chain_datum_decree_t) + a_decree->header.data_size + a_decree->header.signs_size; - dap_hash_fast(a_decree, l_data_size, &l_hash); + 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; @@ -311,8 +322,6 @@ int dap_chain_net_decree_apply(dap_chain_datum_decree_t * a_decree, dap_chain_t int dap_chain_net_decree_load(dap_chain_datum_decree_t * a_decree, dap_chain_t *a_chain) { - dap_hash_fast_t l_hash = {0}; - struct decree_hh *l_decree_hh = NULL; int ret_val = 0; if (!a_chain || !a_chain) { @@ -328,33 +337,25 @@ int dap_chain_net_decree_load(dap_chain_datum_decree_t * a_decree, dap_chain_t * return -108; } - if ((ret_val = dap_chain_net_decree_verify(a_decree, l_net, NULL, NULL)) != 0){ + dap_hash_fast_t l_hash = {}; + 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)) != 0) { log_it(L_ERROR,"Decree verification failed!"); return ret_val; } - - dap_chain_datum_decree_t * l_decree = NULL; - size_t l_data_size = sizeof(dap_chain_datum_decree_t) + a_decree->header.data_size + a_decree->header.signs_size; - l_decree = DAP_NEW_Z_SIZE(dap_chain_datum_decree_t, l_data_size); - memcpy(l_decree, a_decree, l_data_size); - dap_hash_fast(l_decree, l_data_size, &l_hash); - - l_decree_hh = DAP_NEW_Z_SIZE(struct decree_hh, sizeof(struct decree_hh) + l_decree->header.data_size + l_decree->header.signs_size); - l_decree_hh->decree = l_decree; + 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 (ret_val){ + if (ret_val) log_it(L_ERROR,"Decree applying failed!"); - - } else - { + else l_decree_hh->is_applied = true; - } - } HASH_ADD(hh, s_decree_hh, key, sizeof(dap_hash_fast_t), l_decree_hh); diff --git a/modules/net/dap_chain_node.c b/modules/net/dap_chain_node.c index abe671fea1598959f81027b5bbb04fcd4a1e90ca..1d14b367067945fb9014f85b33d4cd2fd4ede98f 100644 --- a/modules/net/dap_chain_node.c +++ b/modules/net/dap_chain_node.c @@ -215,7 +215,7 @@ bool dap_chain_node_mempool_process(dap_chain_t *a_chain, dap_chain_datum_t *a_d if (l_verify_datum != 0 && l_verify_datum != DAP_CHAIN_CS_VERIFY_CODE_TX_NO_PREVIOUS && l_verify_datum != DAP_CHAIN_CS_VERIFY_CODE_TX_NO_EMISSION && - l_verify_datum != DAP_CHAIN_CS_VERIFY_CODE_TX_NO_TOKEN) + l_verify_datum != DAP_CHAIN_CS_VERIFY_CODE_NO_DECREE) return true; if (!l_verify_datum #ifdef DAP_TPS_TEST diff --git a/modules/net/dap_chain_node_cli.c b/modules/net/dap_chain_node_cli.c index b8e3c60d0b32c90bded8b2353b124cb07704c376..18e74e08ee52b6ee42c070797228cdf38323d468 100644 --- a/modules/net/dap_chain_node_cli.c +++ b/modules/net/dap_chain_node_cli.c @@ -320,12 +320,12 @@ int dap_chain_node_cli_init(dap_config_t * g_config) dap_cli_server_cmd_add ("decree", cmd_decree, "Work with decree", "decree create common -net <net_name> [-chain <chain_name>] [-decree_chain <chain_name>] -certs <certs list> -<Subtype param name> <Subtype param Value>\n" "decree create service -net <net_name> [-chain <chain_name>] [-decree_chain <chain_name>] -srv_id <service_id> -certs <certs list> -<Subtype param name> <Subtype param Value>\n" - "decree sign -net <net_name> [-chain <chain_name>] -datum <datum_hash> -certs <certs list>\n" - "decree anchor -net <net_name> -chain <chain_name> -datum <datum_hash>\n" + "decree sign -net <net_name> [-chain <chain_name>] -datum <datum_hash> -certs <certs_list>\n" + "decree anchor -net <net_name> -chain <chain_name> -datum <datum_hash> -certs <certs_list>\n" "==Subtype Params==\n" "\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 -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"); diff --git a/modules/net/dap_chain_node_cli_cmd_tx.c b/modules/net/dap_chain_node_cli_cmd_tx.c index 441f45a176543465dbf79fcec658de885a24f79b..f5a76a287a21ddd1e0e6a1535ed58c5f1b617241 100644 --- a/modules/net/dap_chain_node_cli_cmd_tx.c +++ b/modules/net/dap_chain_node_cli_cmd_tx.c @@ -43,6 +43,7 @@ #include "dap_chain_node_cli.h" #include "dap_chain_node_cli_cmd_tx.h" #include "dap_chain_net_tx.h" +#include "dap_chain_mempool.h" #define LOG_TAG "chain_node_cli_cmd_tx" @@ -1658,37 +1659,11 @@ int cmd_decree(int a_argc, char **a_argv, char ** a_str_reply) sizeof(*l_datum_decree) + l_datum_decree->header.data_size + l_datum_decree->header.signs_size); DAP_DELETE(l_datum_decree); - size_t l_datum_size = dap_chain_datum_size(l_datum); - - // Calc datum's hash - dap_chain_hash_fast_t l_key_hash; - dap_hash_fast(l_datum->data, l_datum->header.data_size, &l_key_hash); - char * l_key_str = dap_chain_hash_fast_to_str_new(&l_key_hash); - char * l_key_str_out = dap_strcmp(l_hash_out_type, "hex") ? - dap_enc_base58_encode_hash_to_str(&l_key_hash) : l_key_str; - - // Add datum to mempool with datum_token hash as a key - char * l_gdb_group_mempool; - if (l_chain) - l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool_new(l_chain); - else - l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool_by_chain_type(l_net, CHAIN_TYPE_DECREE); - if (!l_gdb_group_mempool) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "No suitable chain for placing decree datum found"); - DAP_DELETE(l_datum); - DAP_DELETE(l_key_str); - DAP_DELETE(l_key_str_out); - DAP_DELETE(l_datum); - return -10; - } - bool l_placed = dap_global_db_set_sync(l_gdb_group_mempool, l_key_str, l_datum, l_datum_size, true) == 0; - dap_cli_server_cmd_set_reply_text(a_str_reply, "Datum %s is%s placed in datum pool", - l_key_str_out, l_placed ? "" : " not"); - - //additional checking for incorrect key format - DAP_DELETE(l_key_str); + char *l_key_str_out = dap_chain_mempool_datum_add(l_datum, l_chain, l_hash_out_type); DAP_DELETE(l_datum); - + dap_cli_server_cmd_set_reply_text(a_str_reply, "Datum %s is%s placed in datum pool", + l_key_str_out ? l_key_str_out : "", + l_key_str_out ? "" : " not"); break; } case CMD_SIGN:{ @@ -1922,37 +1897,11 @@ int cmd_decree(int a_argc, char **a_argv, char ** a_str_reply) sizeof(*l_datum_anchor) + l_datum_anchor->header.data_size + l_datum_anchor->header.signs_size); DAP_DELETE(l_datum_anchor); - size_t l_datum_size = dap_chain_datum_size(l_datum); - - // Calc datum's hash - dap_chain_hash_fast_t l_key_hash; - dap_hash_fast(l_datum->data, l_datum->header.data_size, &l_key_hash); - char * l_key_str = dap_chain_hash_fast_to_str_new(&l_key_hash); - char * l_key_str_out = dap_strcmp(l_hash_out_type, "hex") ? - dap_enc_base58_encode_hash_to_str(&l_key_hash) : l_key_str; - - // Add datum to mempool with datum_token hash as a key - char * l_gdb_group_mempool; - if (l_chain) - l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool_new(l_chain); - else - l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool_by_chain_type(l_net, CHAIN_TYPE_DECREE); - if (!l_gdb_group_mempool) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "No suitable chain for placing decree datum found"); - DAP_DELETE(l_datum); - DAP_DELETE(l_key_str); - DAP_DELETE(l_key_str_out); - DAP_DELETE(l_datum); - return -10; - } - bool l_placed = dap_global_db_set_sync(l_gdb_group_mempool, l_key_str, l_datum, l_datum_size, true) == 0; - dap_cli_server_cmd_set_reply_text(a_str_reply, "Datum %s is%s placed in datum pool", - l_key_str_out, l_placed ? "" : " not"); - - //additional checking for incorrect key format - DAP_DELETE(l_key_str); + char *l_key_str_out = dap_chain_mempool_datum_add(l_datum, l_chain, l_hash_out_type); DAP_DELETE(l_datum); - + dap_cli_server_cmd_set_reply_text(a_str_reply, "Datum %s is%s placed in datum pool", + l_key_str_out ? l_key_str_out : "", + l_key_str_out ? "" : " not"); break; } default: diff --git a/modules/net/include/dap_chain_net_anchor.h b/modules/net/include/dap_chain_net_anchor.h index 59a27d0df7d255648972e9ce611ef7c06787954d..a9405409f192c3dafce1baa6123988ff2b9b93c1 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, dap_chain_net_t *a_net, uint32_t *a_signs_count, uint32_t *a_signs_verify); +int dap_chain_net_anchor_verify(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 0533d796b328073c63fa67638202015a94bc2dd9..b9a2d4a72ea6b9c1963356172dfd86daf5c4b56b 100644 --- a/modules/net/include/dap_chain_net_decree.h +++ b/modules/net/include/dap_chain_net_decree.h @@ -32,14 +32,13 @@ typedef struct decree_params { dap_chain_addr_t *fee_addr; } dap_chain_net_decree_t; -// Default values - +#define DAP_DECREE_IS_PRESENT -1110 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_verify(dap_chain_datum_decree_t * a_decree, dap_chain_net_t *a_net, uint32_t *a_signs_count, uint32_t *a_signs_verify); +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); dap_chain_datum_decree_t *dap_chain_net_decree_get_by_hash(dap_hash_fast_t a_hash, bool *is_applied); diff --git a/modules/service/stake_pos_delegate/dap_chain_net_srv_stake_pos_delegate.c b/modules/service/stake_pos_delegate/dap_chain_net_srv_stake_pos_delegate.c index b12dd3e6f51530e568eab0ba633b02882607ad42..e8b73dc9d4bbce593a6c596daa7a6dbc79106ff8 100644 --- a/modules/service/stake_pos_delegate/dap_chain_net_srv_stake_pos_delegate.c +++ b/modules/service/stake_pos_delegate/dap_chain_net_srv_stake_pos_delegate.c @@ -461,11 +461,11 @@ static dap_chain_datum_decree_t *s_stake_decree_approve(dap_chain_net_t *a_net, l_decree->header.ts_created = dap_time_now(); l_decree->header.type = DAP_CHAIN_DATUM_DECREE_TYPE_COMMON; l_decree->header.common_decree_params.net_id = a_net->pub.id; - dap_chain_t *l_chain = dap_chain_net_get_default_chain_by_chain_type(a_net, CHAIN_TYPE_DECREE); + dap_chain_t *l_chain = dap_chain_net_get_default_chain_by_chain_type(a_net, CHAIN_TYPE_ANCHOR); if (!l_chain) - l_chain = dap_chain_net_get_chain_by_chain_type(a_net, CHAIN_TYPE_DECREE); + l_chain = dap_chain_net_get_chain_by_chain_type(a_net, CHAIN_TYPE_ANCHOR); if (!l_chain) { - log_it(L_ERROR, "No chain supported decree datum type"); + log_it(L_ERROR, "No chain supported anchor datum type"); return NULL; } l_decree->header.common_decree_params.chain_id = l_chain->id; @@ -513,8 +513,11 @@ static char *s_stake_decree_put(dap_chain_datum_decree_t *a_decree, dap_chain_ne // Put the transaction to mempool or directly to chains size_t l_decree_size = dap_chain_datum_decree_get_size(a_decree); dap_chain_datum_t *l_datum = dap_chain_datum_create(DAP_CHAIN_DATUM_DECREE, a_decree, l_decree_size); - dap_chain_t *l_chain = dap_chain_net_get_chain_by_chain_type(a_net, CHAIN_TYPE_DECREE); + dap_chain_t *l_chain = dap_chain_net_get_default_chain_by_chain_type(a_net, CHAIN_TYPE_DECREE); + if (!l_chain) + l_chain = dap_chain_net_get_chain_by_chain_type(a_net, CHAIN_TYPE_DECREE); if (!l_chain) { + log_it(L_ERROR, "No chain supported decree datum type"); return NULL; } // Processing will be made according to autoprocess policy @@ -651,7 +654,14 @@ static dap_chain_datum_decree_t *s_stake_decree_invalidate(dap_chain_net_t *a_ne l_decree->header.ts_created = dap_time_now(); l_decree->header.type = DAP_CHAIN_DATUM_DECREE_TYPE_COMMON; l_decree->header.common_decree_params.net_id = a_net->pub.id; - l_decree->header.common_decree_params.chain_id = dap_chain_net_get_default_chain_by_chain_type(a_net, CHAIN_TYPE_DECREE)->id; + dap_chain_t *l_chain = dap_chain_net_get_default_chain_by_chain_type(a_net, CHAIN_TYPE_ANCHOR); + if (!l_chain) + l_chain = dap_chain_net_get_chain_by_chain_type(a_net, CHAIN_TYPE_ANCHOR); + if (!l_chain) { + log_it(L_ERROR, "No chain supported anchor datum type"); + return NULL; + } + l_decree->header.common_decree_params.chain_id = l_chain->id; l_decree->header.common_decree_params.cell_id = *dap_chain_net_get_cur_cell(a_net); l_decree->header.sub_type = DAP_CHAIN_DATUM_DECREE_COMMON_SUBTYPE_STAKE_INVALIDATE; l_decree->header.data_size = l_total_tsd_size; @@ -709,7 +719,14 @@ static dap_chain_datum_decree_t *s_stake_decree_set_min_stake(dap_chain_net_t *a l_decree->header.ts_created = dap_time_now(); l_decree->header.type = DAP_CHAIN_DATUM_DECREE_TYPE_COMMON; l_decree->header.common_decree_params.net_id = a_net->pub.id; - l_decree->header.common_decree_params.chain_id = dap_chain_net_get_default_chain_by_chain_type(a_net, CHAIN_TYPE_DECREE)->id; + dap_chain_t *l_chain = dap_chain_net_get_default_chain_by_chain_type(a_net, CHAIN_TYPE_ANCHOR); + if (!l_chain) + l_chain = dap_chain_net_get_chain_by_chain_type(a_net, CHAIN_TYPE_ANCHOR); + if (!l_chain) { + log_it(L_ERROR, "No chain supported anchor datum type"); + return NULL; + } + l_decree->header.common_decree_params.chain_id = l_chain->id; l_decree->header.common_decree_params.cell_id = *dap_chain_net_get_cur_cell(a_net); l_decree->header.sub_type = DAP_CHAIN_DATUM_DECREE_COMMON_SUBTYPE_STAKE_MIN_VALUE; l_decree->header.data_size = l_total_tsd_size; diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c index dd8f5c7152ec246f287e130a46b3cfac0a645e46..8344824edcad7bb58ecab4930fe2b250aeb911ef 100644 --- a/modules/type/dag/dap_chain_cs_dag.c +++ b/modules/type/dag/dap_chain_cs_dag.c @@ -557,7 +557,6 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha break; case DAP_CHAIN_CS_VERIFY_CODE_TX_NO_PREVIOUS: case DAP_CHAIN_CS_VERIFY_CODE_TX_NO_EMISSION: - case DAP_CHAIN_CS_VERIFY_CODE_TX_NO_TOKEN: if(s_debug_more) log_it(L_DEBUG, "... ledger tresholded"); break; @@ -699,6 +698,7 @@ static bool s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain_d if (s_chain_callback_atom_add(a_chain, l_event, l_event_size) == ATOM_ACCEPT) { if (dap_chain_atom_save(a_chain, (uint8_t *)l_event, l_event_size, a_chain->cells->id) < 0) log_it(L_ERROR, "Can't add new event to the file"); + return true; } else { log_it(L_ERROR, "Can't add new event"); return false;