From 5760cc8e1aae6c1d77ff5647792abc4b35670e98 Mon Sep 17 00:00:00 2001 From: Roman Khlopkov <roman.khlopkov@demlabs.net> Date: Wed, 24 Jul 2024 21:07:54 +0000 Subject: [PATCH] [*] Radical performance improvement fixes --- dap-sdk | 2 +- modules/chain/tests/dap_chain_ledger_tests.c | 14 +- modules/common/dap_chain_datum.c | 4 +- modules/common/dap_chain_datum_token.c | 137 ++- .../common/include/dap_chain_datum_token.h | 231 ++--- .../consensus/dag-poa/dap_chain_cs_dag_poa.c | 2 +- .../consensus/esbocs/dap_chain_cs_esbocs.c | 18 +- modules/net/dap_chain_ledger.c | 918 +++++++----------- modules/net/dap_chain_net.c | 25 +- modules/net/dap_chain_net_decree.c | 8 +- modules/net/dap_chain_node.c | 12 +- modules/net/dap_chain_node_cli_cmd_tx.c | 12 +- modules/net/dap_chain_node_dns_server.c | 6 +- modules/net/include/dap_chain_ledger.h | 20 +- modules/net/srv/dap_chain_net_srv.c | 2 +- .../dap_chain_net_srv_stake_pos_delegate.c | 8 +- modules/type/blocks/dap_chain_cs_blocks.c | 11 +- modules/type/dag/dap_chain_cs_dag.c | 4 - modules/wallet/dap_chain_wallet.c | 6 +- 19 files changed, 572 insertions(+), 868 deletions(-) diff --git a/dap-sdk b/dap-sdk index 7c637ae9dd..8113c58299 160000 --- a/dap-sdk +++ b/dap-sdk @@ -1 +1 @@ -Subproject commit 7c637ae9ddb7903f7f78ceb1aa06cf067925b1a7 +Subproject commit 8113c58299d9e1537edbe03b5f1a2eab72404dd2 diff --git a/modules/chain/tests/dap_chain_ledger_tests.c b/modules/chain/tests/dap_chain_ledger_tests.c index 9fcb14a39e..93dab1a8b9 100644 --- a/modules/chain/tests/dap_chain_ledger_tests.c +++ b/modules/chain/tests/dap_chain_ledger_tests.c @@ -721,7 +721,7 @@ void dap_ledger_test_excess_supply(dap_ledger_t *a_ledger, dap_cert_t *a_cert, d dap_hash_fast(l_femi, dap_chain_datum_emission_get_size((byte_t*)l_femi), &l_femi_hash); dap_assert_PIF(!dap_ledger_token_emission_add(a_ledger, (byte_t*)l_femi, dap_chain_datum_emission_get_size((byte_t*)l_femi), - &l_femi_hash, false), "Added first emission in ledger"); + &l_femi_hash), "Added first emission in ledger"); //Second emi dap_chain_datum_token_emission_t *l_semi = dap_chain_datum_emission_create(l_value_second_emi, l_token_ticker, a_addr); l_semi = dap_chain_datum_emission_add_sign(a_cert->enc_key, l_semi); @@ -729,7 +729,7 @@ void dap_ledger_test_excess_supply(dap_ledger_t *a_ledger, dap_cert_t *a_cert, d dap_hash_fast(l_semi, dap_chain_datum_emission_get_size((byte_t*)l_semi), &l_semi_hash); int res =dap_ledger_token_emission_add(a_ledger, (byte_t*)l_semi, dap_chain_datum_emission_get_size((byte_t*)l_semi), - &l_semi_hash, false); + &l_semi_hash); if (!res){ dap_fail("The total supply test failed because the second emission exceeded the total supply."); } else { @@ -816,7 +816,7 @@ void dap_ledger_test_write_back_list(dap_ledger_t *a_ledger, dap_cert_t *a_cert, dap_chain_hash_fast_t l_emi_hash = {0}; dap_hash_fast(l_emi, dap_chain_datum_emission_get_size((uint8_t*)l_emi), &l_emi_hash); dap_assert(dap_ledger_token_emission_add(a_ledger, (byte_t*)l_emi, dap_chain_datum_emission_get_size((byte_t*)l_emi), - &l_emi_hash, false) != 0, + &l_emi_hash) != 0, "Checking the impossibility of emission to an address not from the white list."); //Emission in white list dap_chain_datum_token_emission_t *l_emi_whi = dap_chain_datum_emission_create( @@ -825,7 +825,7 @@ void dap_ledger_test_write_back_list(dap_ledger_t *a_ledger, dap_cert_t *a_cert, dap_chain_hash_fast_t l_emi_whi_hash = {0}; dap_hash_fast(l_emi_whi, dap_chain_datum_emission_get_size((uint8_t*)l_emi_whi), &l_emi_whi_hash); dap_assert_PIF(!dap_ledger_token_emission_add(a_ledger, (byte_t*)l_emi_whi, dap_chain_datum_emission_get_size((byte_t*)l_emi_whi), - &l_emi_whi_hash, false), + &l_emi_whi_hash), "Can't add emission in white address"); dap_chain_datum_tx_t *l_btx_addr1 = dap_ledger_test_create_datum_base_tx(l_emi_whi, &l_emi_whi_hash, *l_addr_1->addr, a_cert); @@ -930,7 +930,7 @@ void dap_ledger_test_write_back_list(dap_ledger_t *a_ledger, dap_cert_t *a_cert, dap_chain_hash_fast_t l_emi_block_hash = {0}; dap_hash_fast(l_emi_block, dap_chain_datum_emission_get_size((uint8_t*)l_emi_block), &l_emi_block_hash); dap_assert(dap_ledger_token_emission_add(a_ledger, (byte_t*)l_emi_block, dap_chain_datum_emission_get_size((byte_t*)l_emi_block), - &l_emi_block_hash, false), + &l_emi_block_hash), "Test for emission rejection to an address from the prohibited list."); //Check emission at addr dap_chain_datum_token_emission_t *l_emi = dap_chain_datum_emission_create( @@ -939,7 +939,7 @@ void dap_ledger_test_write_back_list(dap_ledger_t *a_ledger, dap_cert_t *a_cert, dap_chain_hash_fast_t l_emi_hash = {0}; dap_hash_fast(l_emi, dap_chain_datum_emission_get_size((uint8_t*)l_emi), &l_emi_hash); dap_assert(!dap_ledger_token_emission_add(a_ledger, (byte_t*)l_emi, dap_chain_datum_emission_get_size((byte_t*)l_emi), - &l_emi_hash, false), + &l_emi_hash), "Emission test for a non-blacklisted address."); dap_chain_datum_tx_t *l_btx_addr2 = dap_ledger_test_create_datum_base_tx(l_emi, &l_emi_hash, *l_addr_2->addr, a_cert); @@ -1020,7 +1020,7 @@ void dap_ledger_test_run(void){ dap_hash_fast(l_emi, l_emi_size, &l_emi_hash); int l_emi_check = dap_ledger_token_emission_add_check(l_ledger, (byte_t*)l_emi_sign, l_emi_size, &l_emi_hash); dap_assert_PIF(l_emi_check == 0, "check emission for add in ledger"); - dap_assert_PIF(!dap_ledger_token_emission_add(l_ledger, (byte_t*)l_emi_sign, l_emi_size, &l_emi_hash, false), "Added emission in ledger"); + dap_assert_PIF(!dap_ledger_token_emission_add(l_ledger, (byte_t*)l_emi_sign, l_emi_size, &l_emi_hash), "Added emission in ledger"); // Declarate delegated token dap_chain_datum_token_tsd_delegate_from_stake_lock_t l_tsd_section; diff --git a/modules/common/dap_chain_datum.c b/modules/common/dap_chain_datum.c index da5b9e9d81..d847a21cbe 100644 --- a/modules/common/dap_chain_datum.c +++ b/modules/common/dap_chain_datum.c @@ -970,7 +970,7 @@ void dap_chain_datum_dump_json(json_object *a_obj_out, dap_chain_datum_t *a_dat json_object_object_add(json_obj_datum,"coins", json_object_new_string(l_coins_str)); json_object_object_add(json_obj_datum,"value", json_object_new_string(l_value_str)); json_object_object_add(json_obj_datum,"ticker", json_object_new_string(l_emission->hdr.ticker)); - json_object_object_add(json_obj_datum,"type", json_object_new_string(c_dap_chain_datum_token_emission_type_str[l_emission->hdr.type])); + json_object_object_add(json_obj_datum,"type", json_object_new_string(dap_chain_datum_emission_type_str(l_emission->hdr.type))); json_object_object_add(json_obj_datum,"version", json_object_new_uint64(l_emission->hdr.version)); json_object_object_add(json_obj_datum,"to addr", json_object_new_string(dap_chain_addr_to_str(&(l_emission->hdr.address)))); @@ -988,7 +988,7 @@ void dap_chain_datum_dump_json(json_object *a_obj_out, dap_chain_datum_t *a_dat break; } dap_chain_datum_token_certs_dump_to_json(json_obj_datum, l_emission->tsd_n_signs + l_emission->data.type_auth.tsd_total_size, - l_emission->data.type_auth.size - l_emission->data.type_auth.tsd_total_size, a_hash_out_type); + l_emission->data.type_auth.tsd_n_signs_size - l_emission->data.type_auth.tsd_total_size, a_hash_out_type); break; case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ALGO: json_object_object_add(json_obj_datum,"codename",json_object_new_string(l_emission->data.type_algo.codename)); diff --git a/modules/common/dap_chain_datum_token.c b/modules/common/dap_chain_datum_token.c index 30a7eccab3..8be5bcfd4b 100644 --- a/modules/common/dap_chain_datum_token.c +++ b/modules/common/dap_chain_datum_token.c @@ -32,30 +32,31 @@ #define LOG_TAG "dap_chain_datum_token" -const char *c_dap_chain_datum_token_emission_type_str[]={ - [DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_UNDEFINED] = "UNDEFINED", - [DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_AUTH] = "AUTH", - [DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ALGO] = "ALGO", - [DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ATOM_OWNER] = "OWNER", - [DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_SMART_CONTRACT] = "SMART_CONTRACT" +struct datum_token_flag_struct { + const char *key; + uint32_t val; }; -const char *c_dap_chain_datum_token_flag_str[] = { - [DAP_CHAIN_DATUM_TOKEN_FLAG_NONE] = "NONE", - [DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_BLOCKED] = "ALL_SENDER_BLOCKED", - [DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_ALLOWED] = "ALL_SENDER_ALLOWED", - [DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_FROZEN] = "ALL_SENDER_FROZEN", - [DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_UNFROZEN] = "ALL_SENDER_UNFROZEN", - [DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_BLOCKED] = "ALL_RECEIVER_BLOCKED", - [DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_ALLOWED] = "ALL_RECEIVER_ALLOWED", - [DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_FROZEN] = "ALL_RECEIVER_FROZEN", - [DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_UNFROZEN] = "ALL_RECEIVER_UNFROZEN", - [DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_ALL] = "STATIC_ALL", - [DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_FLAGS] = "STATIC_FLAGS", - [DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_ALL] = "STATIC_PERMISSIONS_ALL", - [DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_DATUM_TYPE] = "STATIC_PERMISSIONS_DATUM_TYPE", - [DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_TX_SENDER] = "TATIC_PERMISSIONS_TX_SENDER", - [DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_TX_RECEIVER] = "STATIC_PERMISSIONS_TX_RECEIVER", +static const struct datum_token_flag_struct s_flags_table[] = { + { "NO_FLAGS", DAP_CHAIN_DATUM_TOKEN_FLAG_NONE }, + { "ALL_BLOCKED", DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_BLOCKED | DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_BLOCKED }, + { "ALL_FROZEN", DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_FROZEN | DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_FROZEN }, + { "ALL_ALLOWED", DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_ALLOWED | DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_ALLOWED }, + { "ALL_UNFROZEN", DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_UNFROZEN | DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_UNFROZEN }, + { "STATIC_ALL", DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_ALL }, + { "STATIC_FLAGS", DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_FLAGS }, + { "STATIC_PERMISSIONS_ALL", DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_ALL }, + { "STATIC_PERMISSIONS_DATUM_TYPE", DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_DATUM_TYPE }, + { "STATIC_PERMISSIONS_TX_SENDER", DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_TX_SENDER }, + { "STATIC_PERMISSIONS_TX_RECEIVER", DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_TX_RECEIVER }, + { "ALL_SENDER_BLOCKED", DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_BLOCKED }, + { "ALL_SENDER_FROZEN", DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_FROZEN }, + { "ALL_SENDER_ALLOWED", DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_ALLOWED }, + { "ALL_SENDER_UNFROZEN", DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_UNFROZEN }, + { "ALL_RECEIVER_BLOCKED", DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_BLOCKED }, + { "ALL_RECEIVER_FROZEN", DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_FROZEN }, + { "ALL_RECEIVER_ALLOWED", DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_ALLOWED }, + { "ALL_RECEIVER_UNFROZEN", DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_UNFROZEN } }; /** @@ -174,29 +175,18 @@ dap_chain_datum_token_t *dap_chain_datum_token_read(const byte_t *a_token_serial } /** - * @brief dap_chain_datum_token_flags_dump - * @param a_str_out - * @param a_flags + * @brief dap_chain_datum_token_flag_from_str + * @param a_str + * @return */ -void dap_chain_datum_token_flags_dump(dap_string_t * a_str_out, uint16_t a_flags) +uint32_t dap_chain_datum_token_flag_from_str(const char *a_str) { - if(!a_flags){ - dap_string_append_printf(a_str_out, "%s\n", - c_dap_chain_datum_token_flag_str[DAP_CHAIN_DATUM_TOKEN_FLAG_NONE]); - return; - } - bool is_first = true; - for ( uint16_t i = 0; BIT(i) <= DAP_CHAIN_DATUM_TOKEN_FLAG_MAX; i++){ - if( a_flags & (1 << i) ){ - if(is_first) - is_first = false; - else - dap_string_append_printf(a_str_out,", "); - dap_string_append_printf(a_str_out,"%s", c_dap_chain_datum_token_flag_str[BIT(i)]); - } - if(i == DAP_CHAIN_DATUM_TOKEN_FLAG_MAX) - dap_string_append_printf(a_str_out, "\n"); - } + if (a_str == NULL) + return DAP_CHAIN_DATUM_TOKEN_FLAG_NONE; + for (uint16_t i = 0; i < sizeof(s_flags_table) / sizeof(struct datum_token_flag_struct); i++) + if (strcmp(s_flags_table[i].key, a_str) == 0) + return s_flags_table[i].val; + return DAP_CHAIN_DATUM_TOKEN_FLAG_UNDEFINED; } /** @@ -206,23 +196,17 @@ void dap_chain_datum_token_flags_dump(dap_string_t * a_str_out, uint16_t a_flags */ void dap_chain_datum_token_flags_dump_to_json(json_object * json_obj_out, uint16_t a_flags) { - if(!a_flags){ - json_object_object_add(json_obj_out, "flags", json_object_new_string(c_dap_chain_datum_token_flag_str[DAP_CHAIN_DATUM_TOKEN_FLAG_NONE])); - + if (!a_flags) { + json_object_object_add(json_obj_out, "flags", json_object_new_string(dap_chain_datum_token_flag_to_str(DAP_CHAIN_DATUM_TOKEN_FLAG_NONE))); return; } json_object *l_array_flags = json_object_new_array(); - for ( uint16_t i = 0; BIT(i) <= DAP_CHAIN_DATUM_TOKEN_FLAG_MAX; i++){ - if( a_flags & (1 << i) ){ - json_object_array_add(l_array_flags, json_object_new_string(c_dap_chain_datum_token_flag_str[BIT(i)])); - - } - } + for (uint16_t i = 0; BIT(i) <= DAP_CHAIN_DATUM_TOKEN_FLAG_MAX; i++) + if (a_flags & BIT(i)) + json_object_array_add(l_array_flags, json_object_new_string(dap_chain_datum_token_flag_to_str(BIT(i)))); json_object_object_add(json_obj_out, "flags", l_array_flags); } - - /** * @brief dap_chain_datum_token_certs_dump * @param a_str_out @@ -357,16 +341,12 @@ size_t dap_chain_datum_emission_get_size(uint8_t *a_emission_serial) dap_chain_datum_token_emission_t *dap_chain_datum_emission_read(byte_t *a_emission_serial, size_t *a_emission_size) { - assert(a_emission_serial); - assert(a_emission_size); - if(!a_emission_serial || !a_emission_size || *a_emission_size < sizeof(struct dap_chain_emission_header_v0)) { - log_it(L_ERROR, "Invalid params in dap_chain_datum_emission_read"); - return NULL; - } + const size_t l_old_hdr_size = sizeof(struct dap_chain_emission_header_v0); + dap_return_val_if_fail(a_emission_serial && a_emission_size && *a_emission_size >= l_old_hdr_size, NULL); + dap_chain_datum_token_emission_t *l_emission = NULL; if (((dap_chain_datum_token_emission_t *)a_emission_serial)->hdr.version == 0) { size_t l_emission_size = *a_emission_size; - size_t l_old_hdr_size = sizeof(struct dap_chain_emission_header_v0); size_t l_add_size = sizeof(l_emission->hdr) - l_old_hdr_size; l_emission = DAP_NEW_Z_SIZE(dap_chain_datum_token_emission_t, l_emission_size + l_add_size); if (!l_emission) { @@ -381,16 +361,25 @@ dap_chain_datum_token_emission_t *dap_chain_datum_emission_read(byte_t *a_emissi l_emission->hdr.value = dap_chain_uint256_from( ((dap_chain_datum_token_emission_t *)a_emission_serial)->hdr.value64); l_emission_size += l_add_size; + if (l_emission->hdr.type == DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_AUTH) + l_emission->data.type_auth.tsd_n_signs_size = l_emission_size - sizeof(dap_chain_datum_token_emission_t); (*a_emission_size) = l_emission_size; } else { + if (((dap_chain_datum_token_emission_t *)a_emission_serial)->hdr.version == 1) { + l_emission->hdr.value = dap_chain_uint256_from( + ((dap_chain_datum_token_emission_t *)a_emission_serial)->hdr.value64); + l_emission->hdr.version = 2; + } + if (*a_emission_size < sizeof(dap_chain_datum_token_emission_t)) { + log_it(L_WARNING, "Size of emission is %zu, less than header size %zu", + *a_emission_size, sizeof(dap_chain_datum_token_emission_t)); + return NULL; + } l_emission = DAP_DUP_SIZE(a_emission_serial, *a_emission_size); if (!l_emission) { log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } - if (((dap_chain_datum_token_emission_t *)a_emission_serial)->hdr.version == 1) - l_emission->hdr.value = dap_chain_uint256_from( - ((dap_chain_datum_token_emission_t *)a_emission_serial)->hdr.value64); } return l_emission; } @@ -406,7 +395,7 @@ dap_chain_datum_token_emission_t *dap_chain_datum_emission_add_tsd(dap_chain_dat memcpy(l_emission->tsd_n_signs + l_emission->data.type_auth.tsd_total_size, l_tsd, l_tsd_size); DAP_DELETE(l_tsd); l_emission->data.type_auth.tsd_total_size += l_tsd_size; - l_emission->data.type_auth.size += l_tsd_size; + l_emission->data.type_auth.tsd_n_signs_size += l_tsd_size; return l_emission; } @@ -431,9 +420,9 @@ dap_chain_datum_token_emission_t *dap_chain_datum_emission_add_sign(dap_enc_key_ return NULL; size_t l_signs_count = a_emission->data.type_auth.signs_count; - size_t l_old_signs_size = a_emission->data.type_auth.size; + size_t l_old_signs_size = a_emission->data.type_auth.tsd_n_signs_size; - if (a_emission->data.type_auth.size > a_emission->data.type_auth.tsd_total_size) + if (a_emission->data.type_auth.tsd_n_signs_size > a_emission->data.type_auth.tsd_total_size) { size_t l_pub_key_size = 0; dap_sign_t *l_sign = (dap_sign_t *)(a_emission->tsd_n_signs + a_emission->data.type_auth.tsd_total_size); @@ -447,7 +436,7 @@ dap_chain_datum_token_emission_t *dap_chain_datum_emission_add_sign(dap_enc_key_ DAP_DELETE(l_pub_key); } a_emission->data.type_auth.signs_count = 0; - a_emission->data.type_auth.size = 0; + a_emission->data.type_auth.tsd_n_signs_size = 0; dap_sign_t *l_new_sign = dap_sign_create(a_sign_key, a_emission, sizeof(dap_chain_datum_token_emission_t) + a_emission->data.type_auth.tsd_total_size, 0); if (!l_new_sign) return NULL; @@ -458,7 +447,7 @@ dap_chain_datum_token_emission_t *dap_chain_datum_emission_add_sign(dap_enc_key_ DAP_DELETE(l_new_sign); l_old_signs_size += l_sign_size; l_signs_count++; - l_ret->data.type_auth.size = l_old_signs_size; + l_ret->data.type_auth.tsd_n_signs_size = l_old_signs_size; l_ret->data.type_auth.signs_count = l_signs_count; return l_ret; } @@ -471,7 +460,7 @@ dap_chain_datum_token_emission_t *dap_chain_datum_emission_append_sign(dap_sign_ if (!a_sign) return NULL; - if (a_emission->data.type_auth.size > a_emission->data.type_auth.tsd_total_size) + if (a_emission->data.type_auth.tsd_n_signs_size > a_emission->data.type_auth.tsd_total_size) { dap_sign_t *l_sign = (dap_sign_t *)(a_emission->tsd_n_signs + a_emission->data.type_auth.tsd_total_size); for (int i = 0; i < a_emission->data.type_auth.signs_count; i++) { @@ -488,9 +477,9 @@ dap_chain_datum_token_emission_t *dap_chain_datum_emission_append_sign(dap_sign_ size_t l_emission_size = dap_chain_datum_emission_get_size((uint8_t *)a_emission); dap_chain_datum_token_emission_t *l_ret = DAP_REALLOC(a_emission, l_emission_size + dap_sign_get_size(a_sign)); size_t l_sign_size = dap_sign_get_size(a_sign); - memcpy(l_ret->tsd_n_signs + l_ret->data.type_auth.size, a_sign, l_sign_size); + memcpy(l_ret->tsd_n_signs + l_ret->data.type_auth.tsd_n_signs_size, a_sign, l_sign_size); - l_ret->data.type_auth.size += l_sign_size; + l_ret->data.type_auth.tsd_n_signs_size += l_sign_size; l_ret->data.type_auth.signs_count++; return l_ret; } @@ -501,12 +490,12 @@ dap_sign_t *dap_chain_datum_emission_get_signs(dap_chain_datum_token_emission_t log_it(L_ERROR, "Parameters must be not-null!"); return NULL; } - if (!a_emission->data.type_auth.signs_count || a_emission->data.type_auth.size <= a_emission->data.type_auth.tsd_total_size) { + if (!a_emission->data.type_auth.signs_count || a_emission->data.type_auth.tsd_n_signs_size <= a_emission->data.type_auth.tsd_total_size) { *a_signs_count = 0; log_it(L_INFO, "No signes found"); return NULL; } - size_t l_expected_size = a_emission->data.type_auth.size - a_emission->data.type_auth.tsd_total_size, l_actual_size = 0; + size_t l_expected_size = a_emission->data.type_auth.tsd_n_signs_size - a_emission->data.type_auth.tsd_total_size, l_actual_size = 0; /* First sign */ dap_sign_t *l_sign = (dap_sign_t*)(a_emission->tsd_n_signs + a_emission->data.type_auth.tsd_total_size); size_t l_count, l_sign_size; diff --git a/modules/common/include/dap_chain_datum_token.h b/modules/common/include/dap_chain_datum_token.h index fbd34ed4db..04a4692615 100644 --- a/modules/common/include/dap_chain_datum_token.h +++ b/modules/common/include/dap_chain_datum_token.h @@ -169,70 +169,72 @@ typedef struct dap_chain_datum_token_tsd_delegate_from_stake_lock { // Macros for token flags /// ------- Global section flags -------- // No any flags -#define DAP_CHAIN_DATUM_TOKEN_FLAG_NONE 0x0000 +#define DAP_CHAIN_DATUM_TOKEN_FLAG_NONE 0x0000 // Blocked all permissions, usefull issue it by default and then allow what you want to allow -#define DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_BLOCKED BIT(1) +#define DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_BLOCKED BIT(1) // Allowed all permissions if not blocked them. Be careful with this mode -#define DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_ALLOWED BIT(2) +#define DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_ALLOWED BIT(2) // All permissions are temprorary frozen -#define DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_FROZEN BIT(3) +#define DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_FROZEN BIT(3) // Unfrozen permissions -#define DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_UNFROZEN BIT(4) +#define DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_UNFROZEN BIT(4) // Blocked all permissions, usefull issue it by default and then allow what you want to allow -#define DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_BLOCKED BIT(5) +#define DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_BLOCKED BIT(5) // Allowed all permissions if not blocked them. Be careful with this mode -#define DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_ALLOWED BIT(6) +#define DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_ALLOWED BIT(6) // All permissions are temprorary frozen -#define DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_FROZEN BIT(7) +#define DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_FROZEN BIT(7) // Unfrozen permissions -#define DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_UNFROZEN BIT(8) +#define DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_UNFROZEN BIT(8) /// ------ Static configured flags // No token manipulations after declarations at all. Token declares staticly and can't variabed after -#define DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_ALL BIT(9) +#define DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_ALL BIT(9) // No token manipulations after declarations with flags. -#define DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_FLAGS BIT(10) +#define DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_FLAGS BIT(10) // No all permissions lists manipulations after declarations -#define DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_ALL BIT(11) +#define DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_ALL BIT(11) // No datum type permissions lists manipulations after declarations -#define DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_DATUM_TYPE BIT(12) +#define DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_DATUM_TYPE BIT(12) // No tx sender permissions lists manipulations after declarations -#define DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_TX_SENDER BIT(13) +#define DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_TX_SENDER BIT(13) // No tx receiver permissions lists manipulations after declarations -#define DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_TX_RECEIVER BIT(14) +#define DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_TX_RECEIVER BIT(14) // Maximal flag -#define DAP_CHAIN_DATUM_TOKEN_FLAG_MAX BIT(15) +#define DAP_CHAIN_DATUM_TOKEN_FLAG_MAX BIT(15) -#define DAP_CHAIN_DATUM_TOKEN_FLAG_UNDEFINED 0xffff +#define DAP_CHAIN_DATUM_TOKEN_FLAG_UNDEFINED 0xffff -extern const char *c_dap_chain_datum_token_flag_str[]; - -#define dap_chain_datum_token_flag_to_str(a) ((a<=DAP_CHAIN_DATUM_TOKEN_FLAG_MAX) ? c_dap_chain_datum_token_flag_str[a] : "OUT_OF_RANGE") - - -// /** -// * @brief dap_chain_datum_token_flag_from_str -// * @param a_str -// * @return -// */ -// static inline uint16_t dap_chain_datum_token_flag_from_str(const char* a_str) -// { -// if (a_str == NULL) -// return DAP_CHAIN_DATUM_TOKEN_FLAG_NONE; +DAP_STATIC_INLINE const char *dap_chain_datum_token_flag_to_str(uint32_t a_flag) +{ + switch (a_flag) { + case DAP_CHAIN_DATUM_TOKEN_FLAG_NONE: return "NONE"; + case DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_BLOCKED: return "ALL_SENDER_BLOCKED"; + case DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_ALLOWED: return "ALL_SENDER_ALLOWED"; + case DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_FROZEN: return "ALL_SENDER_FROZEN"; + case DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_UNFROZEN: return "ALL_SENDER_UNFROZEN"; + case DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_BLOCKED: return "ALL_RECEIVER_BLOCKED"; + case DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_ALLOWED: return "ALL_RECEIVER_ALLOWED"; + case DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_FROZEN: return "ALL_RECEIVER_FROZEN"; + case DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_UNFROZEN: return "ALL_RECEIVER_UNFROZEN"; + case DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_ALL: return "STATIC_ALL"; + case DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_FLAGS: return "STATIC_FLAGS"; + case DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_ALL: return "STATIC_PERMISSIONS_ALL"; + case DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_DATUM_TYPE: return "STATIC_PERMISSIONS_DATUM_TYPE"; + case DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_TX_SENDER: return "TATIC_PERMISSIONS_TX_SENDER"; + case DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_TX_RECEIVER: return "STATIC_PERMISSIONS_TX_RECEIVER"; + default: return "UNKNOWN FLAG OR FLAGS GROUP"; + } +} -// for (uint16_t i = DAP_CHAIN_DATUM_TOKEN_FLAG_NONE; i <=DAP_CHAIN_DATUM_TOKEN_FLAG_MAX; i++ ){ -// if ( strcmp( a_str, c_dap_chain_datum_token_flag_str[i]) == 0 ) -// return i; -// } -// return DAP_CHAIN_DATUM_TOKEN_FLAG_UNDEFINED; -// } +uint32_t dap_chain_datum_token_flag_from_str(const char *a_str); /// -------- General tsd types ---- // Flags set/unsed @@ -257,142 +259,41 @@ extern const char *c_dap_chain_datum_token_flag_str[]; // Description token #define DAP_CHAIN_DATUM_TOKEN_TSD_TOKEN_DESCRIPTION 0x0028 - - - /// ------- Permissions list flags, grouped by update-remove-clear operations -------- // Blocked datum types list add, remove or clear -#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_BLOCKED_ADD 0x0007 -#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_BLOCKED_REMOVE 0x0008 -#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_BLOCKED_CLEAR 0x0009 +#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_BLOCKED_ADD 0x0007 +#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_BLOCKED_REMOVE 0x0008 +#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_BLOCKED_CLEAR 0x0009 // Allowed datum types list add, remove or clear -#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_ALLOWED_ADD 0x0010 -#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_ALLOWED_REMOVE 0x0011 -#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_ALLOWED_CLEAR 0x0012 +#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_ALLOWED_ADD 0x0010 +#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_ALLOWED_REMOVE 0x0011 +#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_ALLOWED_CLEAR 0x0012 //Allowed tx receiver addres list add, remove or clear -#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_ALLOWED_ADD 0x0014 -#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_ALLOWED_REMOVE 0x0015 -#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_ALLOWED_CLEAR 0x0016 +#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_ALLOWED_ADD 0x0014 +#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_ALLOWED_REMOVE 0x0015 +#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_ALLOWED_CLEAR 0x0016 //Blocked tx receiver addres list add, remove or clear -#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_BLOCKED_ADD 0x0017 -#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_BLOCKED_REMOVE 0x0018 -#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_BLOCKED_CLEAR 0x0019 +#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_BLOCKED_ADD 0x0017 +#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_BLOCKED_REMOVE 0x0018 +#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_BLOCKED_CLEAR 0x0019 //Allowed tx sender addres list add, remove or clear -#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_ALLOWED_ADD 0x0020 -#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_ALLOWED_REMOVE 0x0021 -#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_ALLOWED_CLEAR 0x0022 +#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_ALLOWED_ADD 0x0020 +#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_ALLOWED_REMOVE 0x0021 +#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_ALLOWED_CLEAR 0x0022 //Blocked tx sender addres list add, remove or clear -#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_BLOCKED_ADD 0x0023 -#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_BLOCKED_REMOVE 0x0024 -#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_BLOCKED_CLEAR 0x0025 - -#define DAP_CHAIN_DATUM_NONCE_SIZE 64 - -typedef struct { char *key; uint64_t val; } t_datum_token_flag_struct; - -// new__ -static t_datum_token_flag_struct s_flags_table[] = { - { "NO_FLAGS", DAP_CHAIN_DATUM_TOKEN_FLAG_NONE}, - { "ALL_BLOCKED", DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_BLOCKED | DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_BLOCKED}, - { "ALL_FROZEN", DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_FROZEN | DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_FROZEN }, - { "ALL_ALLOWED", DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_ALLOWED | DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_ALLOWED}, - { "ALL_UNFROZEN", DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_UNFROZEN | DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_UNFROZEN }, - { "STATIC_ALL", DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_ALL}, - { "STATIC_FLAGS", DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_FLAGS }, - { "STATIC_PERMISSIONS_ALL", DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_ALL }, - { "STATIC_PERMISSIONS_DATUM_TYPE", DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_DATUM_TYPE }, - { "STATIC_PERMISSIONS_TX_SENDER", DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_TX_SENDER }, - { "STATIC_PERMISSIONS_TX_RECEIVER", DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_TX_RECEIVER }, - { "ALL_SENDER_BLOCKED", DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_BLOCKED}, - { "ALL_SENDER_FROZEN", DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_FROZEN}, - { "ALL_SENDER_ALLOWED", DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_ALLOWED}, - { "ALL_SENDER_UNFROZEN", DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_UNFROZEN}, - { "ALL_RECEIVER_BLOCKED", DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_BLOCKED}, - { "ALL_RECEIVER_FROZEN", DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_FROZEN }, - { "ALL_RECEIVER_ALLOWED", DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_ALLOWED}, - { "ALL_RECEIVER_UNFROZEN", DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_UNFROZEN }, -}; - - -#define NKEYS (sizeof(s_flags_table)/sizeof(t_datum_token_flag_struct)) - -DAP_STATIC_INLINE int s_flag_code_from_str(const char *key) -{ - uint64_t i; - for (i=0; i < NKEYS; i++) { - t_datum_token_flag_struct sym = s_flags_table[i]; - if (strcmp(s_flags_table[i].key, key) == 0) - return s_flags_table[i].val; - } - - return DAP_CHAIN_DATUM_TOKEN_FLAG_UNDEFINED; -} - -DAP_STATIC_INLINE char* s_flag_str_from_code(uint64_t code) -{ - uint64_t i; - uint64_t flags_count = 0; +#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_BLOCKED_ADD 0x0023 +#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_BLOCKED_REMOVE 0x0024 +#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_BLOCKED_CLEAR 0x0025 - for (i=0; i < NKEYS; i++) { - t_datum_token_flag_struct sym = s_flags_table[i]; - if (s_flags_table[i].val == code) - return s_flags_table[i].key; - } - - // split multiple flags in string - - char* s_multiple_flag = ""; - - for (i=0; i < NKEYS; i++) { - t_datum_token_flag_struct sym = s_flags_table[i]; - if ((s_flags_table[i].val & code) > 0) - { - flags_count += 1; - if (flags_count > 1) - s_multiple_flag = dap_strjoin(";", s_multiple_flag, s_flags_table[i].key, (char*)NULL); - else - s_multiple_flag = dap_strjoin(NULL, s_multiple_flag, s_flags_table[i].key, (char*)NULL); - } - } - - char* s_no_flags = "NO FLAGS"; - - if (flags_count > 0) - return s_multiple_flag; - else - return s_no_flags; -} - -/** - * @brief dap_chain_datum_token_flag_from_str - * @param a_str - * @return - */ -DAP_STATIC_INLINE char *dap_chain_datum_str_token_flag_from_code(uint64_t code) -{ - return s_flag_str_from_code(code); -} - -/** - * @brief dap_chain_datum_token_flag_from_str - * @param a_str - * @return - */ -DAP_STATIC_INLINE uint16_t dap_chain_datum_token_flag_from_str(const char* a_str) -{ - if (a_str == NULL) - return DAP_CHAIN_DATUM_TOKEN_FLAG_NONE; - - return s_flag_code_from_str(a_str); -} +#define DAP_CHAIN_DATUM_NONCE_SIZE 64 // Get delegated ticker DAP_STATIC_INLINE int dap_chain_datum_token_get_delegated_ticker(char *a_buf, const char *a_ticker) @@ -451,7 +352,7 @@ typedef struct dap_chain_datum_token_emission { char codename[32]; } DAP_ALIGN_PACKED type_algo; struct { - uint64_t size; + uint64_t tsd_n_signs_size; uint64_t tsd_total_size; uint16_t signs_count; } DAP_ALIGN_PACKED type_auth; @@ -501,12 +402,20 @@ typedef struct dap_chain_datum_token_emission { #define DAP_CHAIN_DATUM_TOKEN_EMISSION_SOURCE_SUBTYPE_BRIDGE_COMMISSION "COMMISSION" #define DAP_CHAIN_DATUM_TOKEN_EMISSION_SOURCE_SUBTYPE_BRIDGE_CROSSCHAIN "CROSSCHAIN" - -extern const char *c_dap_chain_datum_token_emission_type_str[]; +DAP_STATIC_INLINE const char *dap_chain_datum_emission_type_str(uint8_t a_type) +{ + switch (a_type) { + case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_AUTH: return "AUTH"; + case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ALGO: return "ALGO"; + case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ATOM_OWNER: return "OWNER"; + case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_SMART_CONTRACT: return "SMART_CONTRACT"; + case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_UNDEFINED: + default: return "UNDEFINED"; + } +} /// TDS op funcs dap_tsd_t* dap_chain_datum_token_tsd_get(dap_chain_datum_token_t * a_token, size_t a_token_size); -void dap_chain_datum_token_flags_dump(dap_string_t * a_str_out, uint16_t a_flags); void dap_chain_datum_token_flags_dump_to_json(json_object * json_obj_out, uint16_t a_flags); void dap_chain_datum_token_certs_dump(dap_string_t * a_str_out, byte_t * a_tsd_n_signs, size_t a_certs_size, const char *a_hash_out_type); void dap_chain_datum_token_certs_dump_to_json(json_object *a_json_obj_out, byte_t * a_tsd_n_signs, size_t a_certs_size, const char *a_hash_out_type); diff --git a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c index 2fec03b932..a3e9354c0d 100644 --- a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c +++ b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c @@ -872,7 +872,7 @@ static int s_callback_event_round_sync(dap_chain_cs_dag_t * a_dag, const char a_ return -1; } if (l_event->header.round_id < a_dag->round_completed) { - struct round_timer_arg *l_round_active; + struct round_timer_arg *l_round_active = NULL; uint64_t l_round_id = l_event->header.round_id; pthread_rwlock_wrlock(&l_poa_pvt->rounds_rwlock); HASH_FIND(hh, l_poa_pvt->active_rounds, &l_round_id, sizeof(uint64_t), l_round_active); diff --git a/modules/consensus/esbocs/dap_chain_cs_esbocs.c b/modules/consensus/esbocs/dap_chain_cs_esbocs.c index 6f12359e70..4867bb7d90 100644 --- a/modules/consensus/esbocs/dap_chain_cs_esbocs.c +++ b/modules/consensus/esbocs/dap_chain_cs_esbocs.c @@ -1068,7 +1068,7 @@ static bool s_session_round_new(void *a_arg) a_session->cur_round.all_validators = dap_list_copy_deep(l_validators, s_callback_list_form, NULL); dap_list_free_full(l_validators, NULL); bool l_round_already_started = a_session->round_fast_forward; - dap_chain_esbocs_sync_item_t *l_item, *l_tmp; + dap_chain_esbocs_sync_item_t *l_item = NULL, *l_tmp; HASH_FIND(hh, a_session->sync_items, &a_session->cur_round.last_block_hash, sizeof(dap_hash_fast_t), l_item); if (l_item) { debug_if(PVT(a_session->esbocs)->debug, @@ -1307,7 +1307,7 @@ static void s_session_state_change(dap_chain_esbocs_session_t *a_session, enum s if (dap_hash_fast_is_blank(l_candidate_hash)) s_session_attempt_new(a_session); else { - dap_chain_esbocs_store_t *l_store; + dap_chain_esbocs_store_t *l_store = NULL; HASH_FIND(hh, a_session->cur_round.store_items, l_candidate_hash, sizeof(dap_chain_hash_fast_t), l_store); if (l_store) { a_session->cur_round.attempt_candidate_hash = *l_candidate_hash; @@ -1340,7 +1340,7 @@ static void s_session_state_change(dap_chain_esbocs_session_t *a_session, enum s } break; case DAP_CHAIN_ESBOCS_SESSION_STATE_WAIT_FINISH: { - dap_chain_esbocs_store_t *l_store; + dap_chain_esbocs_store_t *l_store = NULL; HASH_FIND(hh, a_session->cur_round.store_items, &a_session->cur_round.attempt_candidate_hash, sizeof(dap_hash_fast_t), l_store); if (!l_store) { log_it(L_ERROR, "No finish candidate found!"); @@ -1458,7 +1458,7 @@ static void s_session_proc_state(void *a_arg) break; case DAP_CHAIN_ESBOCS_SESSION_STATE_WAIT_SIGNS: if (l_time - l_session->ts_stage_entry >= PVT(l_session->esbocs)->round_attempt_timeout) { - dap_chain_esbocs_store_t *l_store; + dap_chain_esbocs_store_t *l_store = NULL; HASH_FIND(hh, l_session->cur_round.store_items, &l_session->cur_round.attempt_candidate_hash, sizeof(dap_hash_fast_t), l_store); if (!l_store) { log_it(L_ERROR, "No round candidate found!"); @@ -1634,7 +1634,7 @@ static void s_session_candidate_precommit(dap_chain_esbocs_session_t *a_session, uint16_t l_cs_level = PVT(a_session->esbocs)->min_validators_count; byte_t *l_message_data = a_message->msg_n_sign; dap_chain_hash_fast_t *l_candidate_hash = &a_message->hdr.candidate_hash; - dap_chain_esbocs_store_t *l_store; + dap_chain_esbocs_store_t *l_store = NULL; const char *l_candidate_hash_str = NULL; HASH_FIND(hh, a_session->cur_round.store_items, l_candidate_hash, sizeof(dap_chain_hash_fast_t), l_store); if (!l_store) { @@ -1779,7 +1779,7 @@ void s_session_sync_queue_add(dap_chain_esbocs_session_t *a_session, dap_chain_e log_it(L_CRITICAL, "%s", c_error_memory_alloc); return; } - dap_chain_esbocs_sync_item_t *l_sync_item; + dap_chain_esbocs_sync_item_t *l_sync_item = NULL; HASH_FIND(hh, a_session->sync_items, &a_message->hdr.candidate_hash, sizeof(dap_hash_fast_t), l_sync_item); if (!l_sync_item) { DAP_NEW_Z_RET(l_sync_item, dap_chain_esbocs_sync_item_t, l_message_copy); @@ -2396,7 +2396,7 @@ static void s_session_packet_in(dap_chain_esbocs_session_t *a_session, dap_chain l_message->hdr.attempt_num, l_candidate_hash_str, l_candidate_size); } - dap_chain_esbocs_store_t *l_store; + dap_chain_esbocs_store_t *l_store = NULL; HASH_FIND(hh, l_session->cur_round.store_items, l_candidate_hash, sizeof(dap_chain_hash_fast_t), l_store); if (l_store) { const char *l_candidate_hash_str = dap_chain_hash_fast_to_str_static(l_candidate_hash); @@ -2426,7 +2426,7 @@ static void s_session_packet_in(dap_chain_esbocs_session_t *a_session, dap_chain case DAP_CHAIN_ESBOCS_MSG_TYPE_APPROVE: case DAP_CHAIN_ESBOCS_MSG_TYPE_REJECT: { - dap_chain_esbocs_store_t *l_store; + dap_chain_esbocs_store_t *l_store = NULL; const char *l_candidate_hash_str = NULL; bool l_approve = l_message->hdr.type == DAP_CHAIN_ESBOCS_MSG_TYPE_APPROVE; HASH_FIND(hh, l_session->cur_round.store_items, l_candidate_hash, sizeof(dap_chain_hash_fast_t), l_store); @@ -2493,7 +2493,7 @@ static void s_session_packet_in(dap_chain_esbocs_session_t *a_session, dap_chain break; } - dap_chain_esbocs_store_t *l_store; + dap_chain_esbocs_store_t *l_store = NULL; const char *l_candidate_hash_str = NULL; HASH_FIND(hh, l_session->cur_round.store_items, l_candidate_hash, sizeof(dap_chain_hash_fast_t), l_store); if (!l_store) { diff --git a/modules/net/dap_chain_ledger.c b/modules/net/dap_chain_ledger.c index e5b41bacbf..8f01ec2503 100644 --- a/modules/net/dap_chain_ledger.c +++ b/modules/net/dap_chain_ledger.c @@ -158,7 +158,7 @@ typedef struct dap_ledger_tx_item { dap_chain_datum_tx_t *tx; dap_nanotime_t ts_added; struct { - dap_time_t ts_created; + dap_time_t ts_created; // Transation datum timestamp mirrored & cached uint32_t n_outs; uint32_t n_outs_used; char token_ticker[DAP_CHAIN_TICKER_SIZE_MAX]; @@ -239,61 +239,54 @@ typedef struct dap_ledger_bridged_tx_notifier { void *arg; } dap_ledger_bridged_tx_notifier_t; -// dap_ledget_t private section -typedef struct dap_ledger_private { - // List of ledger - unspent transactions cache - dap_ledger_tx_item_t *threshold_txs; - dap_ledger_token_emission_item_t * threshold_emissions; +typedef struct dap_ledger_hal_item { + dap_chain_hash_fast_t hash; + UT_hash_handle hh; +} dap_ledger_hal_item_t; +// dap_ledger_t private section +typedef struct dap_ledger_private { + // separate access to transactions + pthread_rwlock_t ledger_rwlock; dap_ledger_tx_item_t *ledger_items; + // separate access to tokens + pthread_rwlock_t tokens_rwlock; dap_ledger_token_item_t *tokens; + // separate acces to stake items + pthread_rwlock_t stake_lock_rwlock; dap_ledger_stake_lock_item_t *emissions_for_stake_lock; + // separate access to rewards + pthread_rwlock_t rewards_rwlock; dap_ledger_reward_item_t *rewards; + // separate access to balances + pthread_rwlock_t balance_accounts_rwlock; dap_ledger_wallet_balance_t *balance_accounts; - - // for separate access to transactions - pthread_rwlock_t ledger_rwlock; - // for separate access to tokens - pthread_rwlock_t tokens_rwlock; - pthread_rwlock_t stake_lock_rwlock; + // separate access to threshold + dap_ledger_tx_item_t *threshold_txs; pthread_rwlock_t threshold_txs_rwlock; - pthread_rwlock_t threshold_emissions_rwlock; - pthread_rwlock_t balance_accounts_rwlock; - pthread_rwlock_t rewards_rwlock; - + dap_interval_timer_t threshold_txs_free_timer; // Save/load operations condition pthread_mutex_t load_mutex; pthread_cond_t load_cond; bool load_end; - // Ledger flags - bool check_ds, check_cells_ds, check_token_emission, cached, mapped; - + bool check_ds, check_cells_ds, check_token_emission, cached, mapped, threshold_enabled; dap_chain_cell_id_t local_cell_id; - //notifiers dap_list_t *bridged_tx_notifiers; dap_list_t *tx_add_notifiers; - dap_ledger_cache_tx_check_callback_t cache_tx_check_callback; - // Threshold fee - dap_interval_timer_t threshold_txs_free_timer, threshold_emissions_free_timer; + // HAL + dap_ledger_hal_item_t *hal_items; } dap_ledger_private_t; -#define PVT(a) ( (dap_ledger_private_t* ) a->_internal ) - -typedef struct dap_ledger_hal_item { - dap_chain_hash_fast_t hash; - UT_hash_handle hh; -} dap_ledger_hal_item_t; -static dap_ledger_hal_item_t *s_hal_items = NULL; +#define PVT(a) ( (dap_ledger_private_t *) a->_internal ) static dap_ledger_tx_item_t* tx_item_find_by_addr(dap_ledger_t *a_ledger, const dap_chain_addr_t *a_addr, const char * a_token, dap_chain_hash_fast_t *a_tx_first_hash); static void s_threshold_emissions_proc( dap_ledger_t * a_ledger); static void s_threshold_txs_proc( dap_ledger_t * a_ledger); static void s_threshold_txs_free(dap_ledger_t *a_ledger); -static void s_threshold_emission_free(dap_ledger_t *a_ledger); static int s_sort_ledger_tx_item(dap_ledger_tx_item_t* a, dap_ledger_tx_item_t* b); static size_t s_threshold_emissions_max = 1000; @@ -386,14 +379,12 @@ static bool s_tag_check_transfer(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a } } - //regular transfers //have no other ins except regular in //have no OUT_COND except fee //have no vote //no TSD! - //have any of those -> not regular transfer if (a_items_grp->items_in_cond || a_items_grp->items_in_ems || @@ -423,7 +414,7 @@ static bool s_tag_check_transfer(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a int dap_ledger_service_add(dap_chain_net_srv_uid_t a_uid, char *tag_str, dap_ledger_tag_check_callback_t a_callback) { - dap_ledger_service_info_t *l_new_sinfo; + dap_ledger_service_info_t *l_new_sinfo = NULL; int l_tmp = a_uid.raw_ui64; @@ -507,14 +498,10 @@ static dap_ledger_t *dap_ledger_handle_new(void) pthread_rwlock_init(&l_ledger_pvt->ledger_rwlock, NULL); pthread_rwlock_init(&l_ledger_pvt->tokens_rwlock, NULL); pthread_rwlock_init(&l_ledger_pvt->threshold_txs_rwlock , NULL); - pthread_rwlock_init(&l_ledger_pvt->threshold_emissions_rwlock , NULL); pthread_rwlock_init(&l_ledger_pvt->balance_accounts_rwlock , NULL); pthread_rwlock_init(&l_ledger_pvt->stake_lock_rwlock, NULL); pthread_rwlock_init(&l_ledger_pvt->rewards_rwlock, NULL); - l_ledger_pvt->threshold_txs_free_timer = dap_interval_timer_create(s_threshold_free_timer_tick, - (dap_timer_callback_t)s_threshold_txs_free, l_ledger); - l_ledger_pvt->threshold_emissions_free_timer = dap_interval_timer_create(s_threshold_free_timer_tick, - (dap_timer_callback_t) s_threshold_emission_free, l_ledger); + return l_ledger; } @@ -532,7 +519,6 @@ void dap_ledger_handle_free(dap_ledger_t *a_ledger) pthread_rwlock_destroy(&PVT(a_ledger)->ledger_rwlock); pthread_rwlock_destroy(&PVT(a_ledger)->tokens_rwlock); pthread_rwlock_destroy(&PVT(a_ledger)->threshold_txs_rwlock); - pthread_rwlock_destroy(&PVT(a_ledger)->threshold_emissions_rwlock); pthread_rwlock_destroy(&PVT(a_ledger)->balance_accounts_rwlock); pthread_rwlock_destroy(&PVT(a_ledger)->stake_lock_rwlock); pthread_rwlock_destroy(&PVT(a_ledger)->rewards_rwlock); @@ -568,10 +554,18 @@ struct json_object *wallet_info_json_collect(dap_ledger_t *a_ledger, dap_ledger_ return l_json; } +inline static dap_ledger_hal_item_t *s_check_hal(dap_ledger_t *a_ledger, dap_hash_fast_t *a_hal_hash) +{ + dap_ledger_hal_item_t *ret = NULL; + HASH_FIND(hh, PVT(a_ledger)->hal_items, a_hal_hash, sizeof(dap_hash_fast_t), ret); + debug_if(s_debug_more && ret, L_MSG, "Datum %s is whitelisted", dap_hash_fast_to_str_static(a_hal_hash)); + return ret; +} + inline static dap_ledger_token_item_t *s_ledger_find_token(dap_ledger_t *a_ledger, const char *a_token_ticker) { dap_return_val_if_fail(a_ledger && a_token_ticker, NULL); - dap_ledger_token_item_t *l_token_item; + dap_ledger_token_item_t *l_token_item = NULL; pthread_rwlock_rdlock(&PVT(a_ledger)->tokens_rwlock); HASH_FIND_STR(PVT(a_ledger)->tokens, a_token_ticker, l_token_item); pthread_rwlock_unlock(&PVT(a_ledger)->tokens_rwlock); @@ -658,7 +652,7 @@ static int s_token_tsd_parse(dap_ledger_token_item_t *a_item_apply_to, dap_chain goto ret_n_clear; } if (!a_item_apply_to) { - log_it(L_WARNING, "Unexpected TOTAL_SUUPLY TSD section in datum token declaration"); + log_it(L_WARNING, "Unexpected TOTAL_SUPPLY TSD section in datum token declaration"); ret = DAP_LEDGER_TOKEN_ADD_CHECK_TSD_FORBIDDEN; goto ret_n_clear; } @@ -1361,6 +1355,12 @@ int s_token_add_check(dap_ledger_t *a_ledger, byte_t *a_token, size_t a_token_si dap_chain_datum_token_t *l_token = dap_chain_datum_token_read(a_token, &l_token_size); if (!l_token) return DAP_LEDGER_CHECK_INVALID_SIZE; + bool l_legacy_type = a_token_size != l_token_size; + if (l_legacy_type && !a_token_item) { // It's mempool check + log_it(L_WARNING, "Legacy token type %hu isn't supported for a new declaration", l_token->type); + DAP_DELETE(l_token); + return DAP_LEDGER_TOKEN_ADD_CHECK_LEGACY_FORBIDDEN; + } if (l_token->type != DAP_CHAIN_DATUM_TOKEN_TYPE_UPDATE && l_token->type != DAP_CHAIN_DATUM_TOKEN_TYPE_DECL) { log_it(L_WARNING, "Unknown token type %hu", l_token->type); DAP_DELETE(l_token); @@ -1400,7 +1400,7 @@ int s_token_add_check(dap_ledger_t *a_ledger, byte_t *a_token, size_t a_token_si return DAP_LEDGER_TOKEN_ADD_CHECK_NOT_ENOUGH_UNIQUE_SIGNS; } dap_hash_fast(l_token, l_token_size, &l_token_update_hash); - dap_ledger_token_update_item_t *l_token_update_item; + dap_ledger_token_update_item_t *l_token_update_item = NULL; pthread_rwlock_rdlock(&l_token_item->token_ts_updated_rwlock); HASH_FIND(hh, l_token_item->token_ts_updated, &l_token_update_hash, sizeof(dap_hash_fast_t), l_token_update_item); pthread_rwlock_unlock(&l_token_item->token_ts_updated_rwlock); @@ -1493,7 +1493,6 @@ int s_token_add_check(dap_ledger_t *a_ledger, byte_t *a_token, size_t a_token_si DAP_DELETE(l_token); return DAP_LEDGER_TOKEN_ADD_CHECK_NOT_ENOUGH_UNIQUE_SIGNS; } - bool l_legacy_type = a_token_size != l_token_size; size_t l_signs_approve = 0; size_t l_verify_size = 0; uint16_t l_tmp_auth_signs = 0; @@ -1533,14 +1532,13 @@ int s_token_add_check(dap_ledger_t *a_ledger, byte_t *a_token, size_t a_token_si pthread_rwlock_unlock(&PVT(a_ledger)->tokens_rwlock); dap_ledger_hal_item_t *l_hash_found = NULL; if (ret != DAP_LEDGER_CHECK_OK) { - if (s_hal_items) { + if (PVT(a_ledger)->hal_items) { dap_hash_fast_t l_token_hash; if (!dap_hash_fast_is_blank(&l_token_update_hash)) l_token_hash = l_token_update_hash; else dap_hash_fast(a_token, a_token_size, &l_token_hash); - HASH_FIND(hh, s_hal_items, &l_token_hash, sizeof(dap_hash_fast_t), l_hash_found); - debug_if(s_debug_more && l_hash_found, L_MSG, "Datum %s is whitelisted", dap_hash_fast_to_str_static(&l_token_hash)); + l_hash_found = s_check_hal(a_ledger, &l_token_hash); } if (!l_hash_found) { DAP_DELETE(l_token); @@ -1727,7 +1725,7 @@ int dap_ledger_token_add(dap_ledger_t *a_ledger, byte_t *a_token, size_t a_token } else { assert(l_token->type == DAP_CHAIN_DATUM_TOKEN_TYPE_UPDATE); pthread_rwlock_wrlock(&PVT(a_ledger)->tokens_rwlock); - dap_ledger_token_update_item_t *l_token_update_item; + dap_ledger_token_update_item_t *l_token_update_item = NULL; pthread_rwlock_wrlock(&l_token_item->token_ts_updated_rwlock); HASH_FIND(hh, l_token_item->token_ts_updated, &l_token_update_hash, sizeof(dap_hash_fast_t), l_token_update_item); if (l_token_update_item) { @@ -1779,8 +1777,6 @@ int dap_ledger_token_add(dap_ledger_t *a_ledger, byte_t *a_token, size_t a_token debug_if(s_debug_more, L_INFO, "%s token %s has been %s, total_supply: %s, signs_valid: %zu, signs_total: %zu", l_type_str, l_token_item->ticker, l_declare_update_str, l_balance_dbg, l_token_item->auth_signs_valid, l_token_item->auth_signs_total); - - s_threshold_emissions_proc(a_ledger); /* TODO process thresholds only for no-consensus chains */ s_ledger_token_cache_update(a_ledger, l_token_item); return ret; } @@ -1988,147 +1984,84 @@ json_object *dap_ledger_token_tx_item_list(dap_ledger_t * a_ledger, dap_chain_ad return json_arr_out; } -json_object *dap_ledger_threshold_info(dap_ledger_t *a_ledger, size_t a_limit, size_t a_offset) +json_object *dap_ledger_threshold_info(dap_ledger_t *a_ledger, size_t a_limit, size_t a_offset, dap_chain_hash_fast_t *a_threshold_hash) { dap_ledger_private_t *l_ledger_pvt = PVT(a_ledger); - dap_ledger_tx_item_t *l_tx_item, *l_tx_tmp; - json_object* json_arr_out = json_object_new_array(); + dap_ledger_tx_item_t *l_tx_item = NULL, *l_tx_tmp; + json_object *json_arr_out = json_object_new_array(); + if (!json_arr_out) + return NULL; uint32_t l_counter = 0; - pthread_rwlock_rdlock(&l_ledger_pvt->threshold_txs_rwlock); size_t l_arr_start = 0; if (a_offset > 0) { l_arr_start = a_offset; - json_object* json_obj_tx = json_object_new_object(); + json_object *json_obj_tx = json_object_new_object(); + if (!json_obj_tx) { + json_object_put(json_arr_out); + return NULL; + } json_object_object_add(json_obj_tx, "offset", json_object_new_int(l_arr_start)); json_object_array_add(json_arr_out, json_obj_tx); } - size_t l_arr_end = HASH_COUNT(l_ledger_pvt->threshold_txs); + pthread_rwlock_rdlock(&l_ledger_pvt->threshold_txs_rwlock); + size_t l_arr_end = l_arr_start + a_limit; if (a_limit) { - json_object* json_obj_tx = json_object_new_object(); - json_object_object_add(json_obj_tx, "limit", json_object_new_int(a_limit)); - json_object_array_add(json_arr_out, json_obj_tx); - l_arr_end = l_arr_start + a_limit; - if (l_arr_end > HASH_COUNT(l_ledger_pvt->threshold_txs)) { - l_arr_end = HASH_COUNT(l_ledger_pvt->threshold_txs); - } - } - size_t i_tmp = 0; - HASH_ITER(hh, l_ledger_pvt->threshold_txs, l_tx_item, l_tx_tmp){ - if (i_tmp < l_arr_start || i_tmp >= l_arr_end) { - i_tmp++; - continue; - } - i_tmp++; - json_object* json_obj_tx = json_object_new_object(); + json_object *json_obj_tx = json_object_new_object(); if (!json_obj_tx) { + pthread_rwlock_unlock(&l_ledger_pvt->threshold_txs_rwlock); + json_object_put(json_arr_out); return NULL; } - char l_tx_prev_hash_str[70]={0}; - char l_time[1024] = {0}; - dap_chain_hash_fast_to_str(&l_tx_item->tx_hash_fast,l_tx_prev_hash_str,sizeof(l_tx_prev_hash_str)); - dap_time_to_str_rfc822(l_time, sizeof(l_time), l_tx_item->tx->header.ts_created); - //log_it(L_DEBUG,"Ledger thresholded tx_hash_fast %s, time_created: %s, tx_item_size: %d", l_tx_prev_hash_str, l_time, l_tx_item->tx->header.tx_items_size); - json_object_object_add(json_obj_tx, "Ledger thresholded tx_hash_fast", json_object_new_string(l_tx_prev_hash_str)); - json_object_object_add(json_obj_tx, "time_created", json_object_new_string(l_time)); - json_object_object_add(json_obj_tx, "tx_item_size", json_object_new_int(l_tx_item->tx->header.tx_items_size)); - json_object_array_add(json_arr_out, json_obj_tx); - l_counter +=1; - } - if (!l_counter){ - json_object* json_obj_tx = json_object_new_object(); - json_object_object_add(json_obj_tx, "status", json_object_new_string("0 items in ledger tx threshold")); - json_object_array_add(json_arr_out, json_obj_tx); - } - pthread_rwlock_unlock(&l_ledger_pvt->threshold_txs_rwlock); - - pthread_rwlock_rdlock(&l_ledger_pvt->threshold_emissions_rwlock); - l_counter = 0; - dap_ledger_token_emission_item_t *l_emission_item, *l_emission_tmp; - HASH_ITER(hh, l_ledger_pvt->threshold_emissions, l_emission_item, l_emission_tmp){ - json_object* json_obj_tx = json_object_new_object(); - char l_emission_hash_str[70]={0}; - dap_chain_hash_fast_to_str(&l_emission_item->datum_token_emission_hash,l_emission_hash_str,sizeof(l_emission_hash_str)); - //log_it(L_DEBUG,"Ledger thresholded datum_token_emission_hash %s, emission_item_size: %lld", l_emission_hash_str, l_emission_item->datum_token_emission_size); - json_object_object_add(json_obj_tx, "Ledger thresholded datum_token_emission_hash", json_object_new_string(l_emission_hash_str)); - json_object_object_add(json_obj_tx, "tx_item_size", json_object_new_int(l_tx_item->tx->header.tx_items_size)); - json_object_array_add(json_arr_out, json_obj_tx); - l_counter +=1; - } - if (!l_counter){ - json_object* json_obj_tx = json_object_new_object(); - json_object_object_add(json_obj_tx, "status", json_object_new_string("0 items in ledger emission threshold")); + json_object_object_add(json_obj_tx, "limit", json_object_new_int(a_limit)); json_object_array_add(json_arr_out, json_obj_tx); } - pthread_rwlock_unlock(&l_ledger_pvt->threshold_emissions_rwlock); - - return json_arr_out; -} - -json_object *dap_ledger_threshold_hash_info(dap_ledger_t *a_ledger, dap_chain_hash_fast_t *l_threshold_hash, size_t a_limit, size_t a_offset) -{ - dap_ledger_private_t *l_ledger_pvt = PVT(a_ledger); - dap_ledger_tx_item_t *l_tx_item, *l_tx_tmp; - json_object * json_arr_out = json_object_new_array(); - json_object* json_obj_tx = json_object_new_object(); - if (!json_obj_tx) { - return NULL; - } - size_t l_arr_start = 0; - if (a_offset > 0) { - l_arr_start = a_offset; - json_object* json_obj_tx = json_object_new_object(); - json_object_object_add(json_obj_tx, "offset", json_object_new_int(l_arr_start)); - json_object_array_add(json_arr_out, json_obj_tx); + if (l_arr_end > HASH_COUNT(l_ledger_pvt->threshold_txs)) { + l_arr_end = HASH_COUNT(l_ledger_pvt->threshold_txs); } - size_t l_arr_end = HASH_COUNT(l_ledger_pvt->threshold_txs); - if (a_limit) { - json_object* json_obj_tx = json_object_new_object(); - json_object_object_add(json_obj_tx, "limit", json_object_new_int(l_arr_start)); - json_object_array_add(json_arr_out, json_obj_tx); - l_arr_end = l_arr_start + a_limit; - if (l_arr_end > HASH_COUNT(l_ledger_pvt->threshold_txs)) { - l_arr_end = HASH_COUNT(l_ledger_pvt->threshold_txs); + if (a_threshold_hash) { + json_object *json_obj_tx = json_object_new_object(); + if (!json_obj_tx) { + pthread_rwlock_unlock(&l_ledger_pvt->threshold_txs_rwlock); + json_object_put(json_arr_out); + return NULL; } - } - size_t i_tmp = 0; - pthread_rwlock_rdlock(&l_ledger_pvt->threshold_txs_rwlock); - HASH_ITER(hh, l_ledger_pvt->threshold_txs, l_tx_item, l_tx_tmp){ - if (!memcmp(l_threshold_hash, &l_tx_item->tx_hash_fast, sizeof(dap_chain_hash_fast_t))){ - if (i_tmp < l_arr_start || i_tmp >= l_arr_end) { - i_tmp++; - continue; - } - i_tmp++; - char l_tx_hash_str[70]={0}; - dap_chain_hash_fast_to_str(l_threshold_hash,l_tx_hash_str,sizeof(l_tx_hash_str)); - json_object_object_add(json_obj_tx, "Hash was found in ledger tx threshold", json_object_new_string(l_tx_hash_str)); + HASH_FIND(hh, l_ledger_pvt->threshold_txs, a_threshold_hash, sizeof(dap_hash_t), l_tx_item); + if (l_tx_item) { + json_object_object_add(json_obj_tx, "Hash was found in ledger tx threshold", json_object_new_string(dap_hash_fast_to_str_static(a_threshold_hash))); + json_object_array_add(json_arr_out, json_obj_tx); + } else { + json_object_object_add(json_obj_tx, "Hash wasn't found in ledger", json_object_new_string("empty")); json_object_array_add(json_arr_out, json_obj_tx); - pthread_rwlock_unlock(&l_ledger_pvt->threshold_txs_rwlock); - return json_arr_out; } - } - pthread_rwlock_unlock(&l_ledger_pvt->threshold_txs_rwlock); - - pthread_rwlock_rdlock(&l_ledger_pvt->threshold_emissions_rwlock); - dap_ledger_token_emission_item_t *l_emission_item, *l_emission_tmp; - HASH_ITER(hh, l_ledger_pvt->threshold_emissions, l_emission_item, l_emission_tmp){ - if (!memcmp(&l_emission_item->datum_token_emission_hash,l_threshold_hash, sizeof(dap_chain_hash_fast_t))){ - if (i_tmp < l_arr_start || i_tmp >= l_arr_end) { - i_tmp++; + } else { + size_t i_tmp = 0; + HASH_ITER(hh, l_ledger_pvt->threshold_txs, l_tx_item, l_tx_tmp) { + if (i_tmp < l_arr_start || i_tmp++ >= l_arr_end) continue; - } - i_tmp++; - char l_emission_hash_str[70]={0}; - dap_chain_hash_fast_to_str(l_threshold_hash,l_emission_hash_str,sizeof(l_emission_hash_str)); - json_object_object_add(json_obj_tx, "Hash was found in ledger emission threshold", json_object_new_string(l_emission_hash_str)); + json_object *json_obj_tx = json_object_new_object(); + if (!json_obj_tx) { + pthread_rwlock_unlock(&l_ledger_pvt->threshold_txs_rwlock); + json_object_put(json_arr_out); + return NULL; + } + char l_tx_prev_hash_str[DAP_HASH_FAST_STR_SIZE]={0}; + char l_time[DAP_TIME_STR_SIZE] = {0}; + dap_chain_hash_fast_to_str(&l_tx_item->tx_hash_fast,l_tx_prev_hash_str,sizeof(l_tx_prev_hash_str)); + dap_time_to_str_rfc822(l_time, sizeof(l_time), l_tx_item->cache_data.ts_created); + json_object_object_add(json_obj_tx, "Ledger thresholded tx_hash_fast", json_object_new_string(l_tx_prev_hash_str)); + json_object_object_add(json_obj_tx, "time_created", json_object_new_string(l_time)); + json_object_object_add(json_obj_tx, "tx_item_size", json_object_new_int(l_tx_item->tx->header.tx_items_size)); + json_object_array_add(json_arr_out, json_obj_tx); + l_counter++; + } + if (!l_counter) { + json_object* json_obj_tx = json_object_new_object(); + json_object_object_add(json_obj_tx, "status", json_object_new_string("0 items in ledger tx threshold")); json_object_array_add(json_arr_out, json_obj_tx); - pthread_rwlock_unlock(&l_ledger_pvt->threshold_txs_rwlock); - return json_arr_out; } + pthread_rwlock_unlock(&l_ledger_pvt->threshold_txs_rwlock); } - pthread_rwlock_unlock(&l_ledger_pvt->threshold_emissions_rwlock); - json_object_object_add(json_obj_tx, "Hash wasn't found in ledger", json_object_new_string("empty")); - json_object_array_add(json_arr_out, json_obj_tx); + return json_arr_out; } @@ -2253,7 +2186,7 @@ json_object *s_token_item_to_json(dap_ledger_token_item_t *a_token_item) json_object_object_add(json_obj_datum, "-->Token name", json_object_new_string(a_token_item->ticker)); json_object_object_add(json_obj_datum, "type", json_object_new_string(l_type_str)); if (a_token_item->subtype != DAP_CHAIN_DATUM_TOKEN_SUBTYPE_SIMPLE && a_token_item->subtype != DAP_CHAIN_DATUM_TOKEN_SUBTYPE_PUBLIC) { - json_object_object_add(json_obj_datum, "flags", json_object_new_string(s_flag_str_from_code(a_token_item->datum_token->header_native_decl.flags))); + dap_chain_datum_token_flags_dump_to_json(json_obj_datum, a_token_item->datum_token->header_native_decl.flags); json_object_object_add(json_obj_datum, "description", a_token_item->description ? json_object_new_string(a_token_item->description) : json_object_new_string("The token description is not set")); @@ -2272,7 +2205,7 @@ json_object *s_token_item_to_json(dap_ledger_token_item_t *a_token_item) json_object_object_add(l_json_obj_out, "bytes", json_object_new_int(a_token_item->auth_pkeys[i]->header.size)); json_object_array_add(l_json_arr_pkeys, l_json_obj_out); } - json_object_object_add(json_obj_datum, "Signature public keys", l_json_arr_pkeys); + json_object_object_add(json_obj_datum, "Signatures public keys", l_json_arr_pkeys); json_object_object_add(json_obj_datum, "Total emissions", json_object_new_int(HASH_COUNT(a_token_item->token_emissions))); return json_obj_datum; } @@ -2325,15 +2258,13 @@ json_object *dap_ledger_token_info(dap_ledger_t *a_ledger, size_t a_limit, size_ * @param a_token_ticker * @return */ -json_object *dap_ledger_token_info_by_name(dap_ledger_t *a_ledger, const char *a_token_ticker) { - json_object *l_jobj = NULL; +json_object *dap_ledger_token_info_by_name(dap_ledger_t *a_ledger, const char *a_token_ticker) +{ dap_ledger_token_item_t *l_token_item = NULL; HASH_FIND_STR(PVT(a_ledger)->tokens, a_token_ticker, l_token_item); - if (l_token_item) { + if (l_token_item) return s_token_item_to_json(l_token_item); - } else { - return json_object_new_null(); - } + return json_object_new_null(); } /** @@ -2356,34 +2287,6 @@ dap_list_t* dap_ledger_token_decl_all(dap_ledger_t *a_ledger) } -/** - * @brief s_threshold_emissions_proc - * @param a_ledger - */ -static void s_threshold_emissions_proc(dap_ledger_t * a_ledger) -{ - bool l_success; - do { - l_success = false; - dap_ledger_token_emission_item_t *l_emission_item, *l_emission_tmp; - pthread_rwlock_wrlock(&PVT(a_ledger)->threshold_emissions_rwlock); - HASH_ITER(hh, PVT(a_ledger)->threshold_emissions, l_emission_item, l_emission_tmp) { - int l_res = dap_ledger_token_emission_add(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_NO_DECREE) { - HASH_DEL(PVT(a_ledger)->threshold_emissions, l_emission_item); - if (l_res) - DAP_DELETE(l_emission_item->datum_token_emission); - DAP_DELETE(l_emission_item); - l_success = true; - } - - } - pthread_rwlock_unlock(&PVT(a_ledger)->threshold_emissions_rwlock); - } while (l_success); -} - /** * @brief s_threshold_txs_proc * @param a_ledger @@ -2415,7 +2318,8 @@ static void s_threshold_txs_proc( dap_ledger_t *a_ledger) * @breif s_treshold_txs_free * @param a_ledger */ -static void s_threshold_txs_free(dap_ledger_t *a_ledger){ +static void s_threshold_txs_free(dap_ledger_t *a_ledger) +{ log_it(L_DEBUG, "Start free threshold txs"); dap_ledger_private_t *l_pvt = PVT(a_ledger); dap_ledger_tx_item_t *l_current = NULL, *l_tmp = NULL; @@ -2435,29 +2339,6 @@ static void s_threshold_txs_free(dap_ledger_t *a_ledger){ pthread_rwlock_unlock(&l_pvt->threshold_txs_rwlock); } -/** - * @breif s_treshold_emission_free - * @param a_ledger - */ -static void s_threshold_emission_free(dap_ledger_t *a_ledger){ - log_it(L_DEBUG, "Start free threshold emission"); - dap_ledger_private_t *l_pvt = PVT(a_ledger); - dap_ledger_token_emission_item_t *l_current = NULL, *l_tmp = NULL; - dap_nanotime_t l_time_cut_off = dap_nanotime_now() - dap_nanotime_from_sec(7200); //7200 sec = 2 hours. - pthread_rwlock_wrlock(&l_pvt->threshold_emissions_rwlock); - HASH_ITER(hh, l_pvt->threshold_emissions, l_current, l_tmp) { - if (l_current->ts_added < l_time_cut_off) { - char l_token_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; - dap_chain_hash_fast_to_str(&l_current->datum_token_emission_hash, l_token_hash_str, sizeof(l_token_hash_str)); - HASH_DEL(l_pvt->threshold_emissions, l_current); - DAP_DELETE(l_current->datum_token_emission); - log_it(L_NOTICE, "Removed token emission %s form threshold ledger", l_token_hash_str); - } - } - pthread_rwlock_unlock(&l_pvt->threshold_emissions_rwlock); -} - - /** * @brief s_load_cache_gdb_loaded_balances_callback * @param a_global_db_context @@ -2722,6 +2603,10 @@ dap_ledger_t *dap_ledger_create(dap_chain_net_t *a_net, uint16_t a_flags) l_ledger_pvt->check_token_emission = a_flags & DAP_LEDGER_CHECK_TOKEN_EMISSION; l_ledger_pvt->cached = a_flags & DAP_LEDGER_CACHE_ENABLED; l_ledger_pvt->mapped = a_flags & DAP_LEDGER_MAPPED; + l_ledger_pvt->threshold_enabled = a_flags & DAP_LEDGER_THRESHOLD_ENABLED; + if (l_ledger_pvt->threshold_enabled) + l_ledger_pvt->threshold_txs_free_timer = dap_interval_timer_create(s_threshold_free_timer_tick, + (dap_timer_callback_t)s_threshold_txs_free, l_ledger); pthread_cond_init(&l_ledger_pvt->load_cond, NULL); pthread_mutex_init(&l_ledger_pvt->load_mutex, NULL); @@ -2755,7 +2640,7 @@ dap_ledger_t *dap_ledger_create(dap_chain_net_t *a_net, uint16_t a_flags) return NULL; } dap_chain_hash_fast_from_str(l_whitelist[i], &l_hal_item->hash); - HASH_ADD(hh, s_hal_items, hash, sizeof(l_hal_item->hash), l_hal_item); + HASH_ADD(hh, l_ledger_pvt->hal_items, hash, sizeof(l_hal_item->hash), l_hal_item); } dap_config_close(l_cfg); log_it(L_DEBUG, "HAL items count for chain %s : %d", l_entry_name, l_whitelist_size); @@ -2816,7 +2701,7 @@ static bool s_ledger_permissions_check(dap_ledger_token_item_t *a_token_item, en return false; } -int s_ledger_addr_check(dap_ledger_token_item_t *a_token_item, dap_chain_addr_t *a_addr, bool a_receive) +dap_ledger_check_error_t s_ledger_addr_check(dap_ledger_token_item_t *a_token_item, dap_chain_addr_t *a_addr, bool a_receive) { dap_return_val_if_fail(a_token_item && a_addr, DAP_LEDGER_CHECK_INVALID_ARGS); if (dap_chain_addr_is_blank(a_addr)) @@ -2849,134 +2734,148 @@ int s_ledger_addr_check(dap_ledger_token_item_t *a_token_item, dap_chain_addr_t return DAP_LEDGER_CHECK_OK; } -int dap_ledger_token_emission_add_check(dap_ledger_t *a_ledger, byte_t *a_token_emission, size_t a_token_emission_size, dap_chain_hash_fast_t *a_emission_hash) +int s_emission_add_check(dap_ledger_t *a_ledger, byte_t *a_token_emission, size_t a_token_emission_size, dap_chain_hash_fast_t *a_emission_hash, + dap_chain_datum_token_emission_t **a_emission, dap_ledger_token_item_t **a_token_item) { dap_return_val_if_fail(a_token_emission && a_token_emission_size, DAP_LEDGER_CHECK_INVALID_ARGS); - - int l_ret = DAP_LEDGER_CHECK_OK; - dap_ledger_private_t *l_ledger_pvt = PVT(a_ledger); - const char *l_token_ticker = ((dap_chain_datum_token_emission_t *)a_token_emission)->hdr.ticker; - dap_ledger_token_item_t *l_token_item = s_ledger_find_token(a_ledger, l_token_ticker); + size_t l_emission_size = a_token_emission_size; + dap_chain_datum_token_emission_t *l_emission = dap_chain_datum_emission_read(a_token_emission, &l_emission_size); + if (!l_emission) + return DAP_LEDGER_CHECK_INVALID_SIZE; + if (l_emission->hdr.version < 3 && !a_token_item) { // It's mempool check + log_it(L_WARNING, "Legacy emission version %hhu isn't supported for a new emissions", l_emission->hdr.version); + DAP_DELETE(l_emission); + return DAP_LEDGER_EMISSION_CHECK_LEGACY_FORBIDDEN; + } + dap_ledger_token_item_t *l_token_item = s_ledger_find_token(a_ledger, l_emission->hdr.ticker); if (!l_token_item) { - log_it(L_ERROR, "Check emission: token %s was not found", l_token_ticker); + log_it(L_ERROR, "Check emission: token %s was not found", l_emission->hdr.ticker); + DAP_DELETE(l_emission); return DAP_LEDGER_CHECK_TICKER_NOT_FOUND; } - - dap_ledger_token_emission_item_t * l_token_emission_item = NULL; + dap_ledger_token_emission_item_t *l_token_emission_item = NULL; // check if such emission is already present in table - pthread_rwlock_rdlock(l_token_item ? &l_token_item->token_emissions_rwlock - : &l_ledger_pvt->threshold_emissions_rwlock); - HASH_FIND(hh,l_token_item ? l_token_item->token_emissions : l_ledger_pvt->threshold_emissions, - a_emission_hash, sizeof(*a_emission_hash), l_token_emission_item); - unsigned long long l_threshold_emissions_count = HASH_COUNT( l_ledger_pvt->threshold_emissions); - pthread_rwlock_unlock(l_token_item ? &l_token_item->token_emissions_rwlock - : &l_ledger_pvt->threshold_emissions_rwlock); + pthread_rwlock_rdlock(&l_token_item->token_emissions_rwlock); + HASH_FIND(hh, l_token_item->token_emissions, a_emission_hash, sizeof(*a_emission_hash), l_token_emission_item); + pthread_rwlock_unlock(&l_token_item->token_emissions_rwlock); if (l_token_emission_item) { - debug_if(s_debug_more, L_ERROR, "Can't add token emission datum of %s %s ( %s ): already present in cache", - dap_uint256_to_char(l_token_emission_item->datum_token_emission->hdr.version >= 2 - ? l_token_emission_item->datum_token_emission->hdr.value - : GET_256_FROM_64(l_token_emission_item->datum_token_emission->hdr.value64), - NULL), - l_token_ticker, dap_chain_hash_fast_to_str_static(a_emission_hash)); - l_ret = DAP_LEDGER_CHECK_ALREADY_CACHED; - } else if ( (! l_token_item) && ( l_threshold_emissions_count >= s_threshold_emissions_max)) { - debug_if(s_debug_more, L_WARNING, "Emissions threshold overflow, max %zu items", s_threshold_emissions_max); - l_ret = DAP_LEDGER_EMISSION_CHECK_THRESHOLD_OVERFLOW; - } - if (l_ret || !PVT(a_ledger)->check_token_emission) - return l_ret; - - if (s_hal_items) { - dap_ledger_hal_item_t *l_hash_found = NULL; - HASH_FIND(hh, s_hal_items, a_emission_hash, sizeof(*a_emission_hash), l_hash_found); - if (l_hash_found) { - char l_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE] = { '\0' }; - dap_chain_hash_fast_to_str(a_emission_hash, l_hash_str, sizeof(l_hash_str)); - debug_if(s_debug_more, L_MSG, "Datum %s is whitelisted", l_hash_str); - return l_ret; - } + debug_if(s_debug_more, L_WARNING, "Can't add token emission datum of %s %s ( %s ): already present in cache", + dap_uint256_to_char(l_emission->hdr.value, NULL), l_emission->hdr.ticker, dap_chain_hash_fast_to_str_static(a_emission_hash)); + DAP_DELETE(l_emission); + return DAP_LEDGER_CHECK_ALREADY_CACHED; } - // Check emission correctness - size_t l_emission_size = a_token_emission_size; - dap_chain_datum_token_emission_t *l_emission = dap_chain_datum_emission_read(a_token_emission, &l_emission_size); + if (!PVT(a_ledger)->check_token_emission) + goto ret_success; + // Check emission correctness if (IS_ZERO_256((l_emission->hdr.value))) { log_it(L_ERROR, "Emission check: zero %s emission value", l_token_item->ticker); DAP_DELETE(l_emission); return DAP_LEDGER_CHECK_ZERO_VALUE; } - if (!s_ledger_token_supply_check(l_token_item, l_emission->hdr.value)) + if (!s_ledger_token_supply_check(l_token_item, l_emission->hdr.value)) { + DAP_DELETE(l_emission); return DAP_LEDGER_EMISSION_CHECK_VALUE_EXCEEDS_CURRENT_SUPPLY; + } //additional check for private tokens if((l_token_item->subtype == DAP_CHAIN_DATUM_TOKEN_SUBTYPE_PRIVATE) || (l_token_item->subtype == DAP_CHAIN_DATUM_TOKEN_SUBTYPE_NATIVE)) { - if ((l_ret = s_ledger_addr_check(l_token_item, &((dap_chain_datum_token_emission_t *)a_token_emission)->hdr.address, true))) { + dap_ledger_check_error_t ret = s_ledger_addr_check(l_token_item, &l_emission->hdr.address, true); + if (ret == DAP_LEDGER_CHECK_ADDR_FORBIDDEN) { log_it(L_WARNING, "Address %s is not in allowed to receive for emission of token %s", - dap_chain_addr_to_str(&((dap_chain_datum_token_emission_t *)a_token_emission)->hdr.address), l_token_item->ticker); + dap_chain_addr_to_str(&l_emission->hdr.address), l_token_item->ticker); DAP_DELETE(l_emission); - return l_ret; - } - } - switch (l_emission->hdr.type){ - case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_AUTH:{ - dap_ledger_token_item_t *l_token_item = s_ledger_find_token(a_ledger, l_emission->hdr.ticker); - if (l_token_item) { - dap_sign_t *l_sign = (dap_sign_t *)(l_emission->tsd_n_signs + l_emission->data.type_auth.tsd_total_size); - size_t l_offset = (byte_t *)l_sign - (byte_t *)l_emission; - uint16_t l_aproves = 0, l_aproves_valid = l_token_item->auth_signs_valid; - size_t l_sign_data_check_size = sizeof(l_emission->hdr); - size_t l_sign_auth_count = l_emission->data.type_auth.signs_count; - size_t l_sign_auth_size = l_emission->data.type_auth.size; - void *l_emi_ptr_check_size = &l_emission->hdr; - if (l_emission->hdr.version == 3) { - l_sign_data_check_size = sizeof(dap_chain_datum_token_emission_t) + l_emission->data.type_auth.tsd_total_size; - l_emission->data.type_auth.signs_count = 0; - l_emission->data.type_auth.size = 0; - l_emi_ptr_check_size = l_emission; - } - for (uint16_t i = 0; i < l_sign_auth_count && l_offset < l_emission_size; i++) { - if (dap_sign_verify_size(l_sign, l_emission_size - l_offset)) { - // Find pkey in auth pkeys - for (uint16_t k = 0; k < l_token_item->auth_signs_total; k++) { - if (dap_pkey_compare_with_sign(l_token_item->auth_pkeys[k], l_sign)) { - // Verify if token emission is signed - if (!dap_sign_verify(l_sign, l_emi_ptr_check_size, l_sign_data_check_size)) - l_aproves++; - break; - } - } - size_t l_sign_size = dap_sign_get_size(l_sign); - l_offset += l_sign_size; - l_sign = (dap_sign_t *)((byte_t *)l_emission + l_offset); - } else - break; - } - if (l_emission->hdr.version == 3) { - l_emission->data.type_auth.signs_count = l_sign_auth_count; - l_emission->data.type_auth.size = l_sign_auth_size; - } - if (l_aproves < l_aproves_valid ){ - debug_if(s_debug_more, L_WARNING, "Emission of %s datoshi of %s:%s is wrong: only %u valid aproves when %u need", - dap_uint256_to_char(l_emission->hdr.value, NULL), a_ledger->net->pub.name, l_emission->hdr.ticker, - l_aproves, l_aproves_valid); - l_ret = DAP_LEDGER_CHECK_NOT_ENOUGH_VALID_SIGNS; - char l_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE] = { '\0' }; - dap_chain_hash_fast_to_str(a_emission_hash, l_hash_str, sizeof(l_hash_str)); - log_it(L_MSG, "!!! Datum hash for HAL: %s", l_hash_str); + return ret; + } + } + switch (l_emission->hdr.type) { + + case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_AUTH: { + size_t l_sign_data_check_size = sizeof(dap_chain_datum_token_emission_t) + l_emission->data.type_auth.tsd_total_size; + if (l_sign_data_check_size > l_emission_size) { + if (!s_check_hal(a_ledger, a_emission_hash)) { + log_it(L_WARNING, "Incorrect size %zu of datum emission, expected at least %zu", l_emission_size, l_sign_data_check_size); + DAP_DELETE(l_emission); + return DAP_LEDGER_CHECK_INVALID_SIZE; + } + goto ret_success; + } + size_t l_emission_check_size = sizeof(dap_chain_datum_token_emission_t) + l_emission->data.type_auth.tsd_n_signs_size; + if (l_emission_check_size != l_emission_size) { + log_it(L_WARNING, "Incorrect size %zu of datum emission, must be %zu", l_emission_size, l_emission_check_size); + DAP_DELETE(l_emission); + return DAP_LEDGER_CHECK_INVALID_SIZE; + } + size_t l_signs_unique = l_emission->data.type_auth.signs_count; + dap_sign_t **l_signs = dap_sign_get_unique_signs(l_emission->tsd_n_signs + l_emission->data.type_auth.tsd_total_size, + l_emission->data.type_auth.tsd_n_signs_size, &l_signs_unique); + if (l_signs_unique < l_token_item->auth_signs_valid) { + if (!s_check_hal(a_ledger, a_emission_hash)) { + DAP_DEL_Z(l_signs); + log_it(L_WARNING, "The number of unique token signs %zu is less than total token signs set to %zu", + l_signs_unique, l_token_item->auth_signs_total); + DAP_DELETE(l_emission); + return DAP_LEDGER_CHECK_NOT_ENOUGH_VALID_SIGNS; + } + goto ret_success; + } + size_t l_sign_auth_count = l_emission->data.type_auth.signs_count; + size_t l_sign_auth_size = l_emission->data.type_auth.tsd_n_signs_size; + if (l_emission->hdr.version < 3) { + l_sign_data_check_size = sizeof(l_emission->hdr); + } else { + l_emission->data.type_auth.signs_count = 0; + l_emission->data.type_auth.tsd_n_signs_size = 0; + } + size_t l_aproves = 0; + for (uint16_t i = 0; i < l_signs_unique; i++) { + for (uint16_t k = 0; k < l_token_item->auth_signs_total; k++) { + if (dap_pkey_compare_with_sign(l_token_item->auth_pkeys[k], l_signs[i])) { + // Verify if token emission is signed + if (!dap_sign_verify(l_signs[i], l_emission, l_sign_data_check_size)) + l_aproves++; + break; } - }else{ - debug_if(s_debug_more, L_WARNING, "Can't find token declaration %s:%s thats pointed in token emission datum", - a_ledger->net->pub.name, l_emission->hdr.ticker); - l_ret = DAP_LEDGER_CHECK_TICKER_NOT_FOUND; } - }break; - default:{} + } + if (l_emission->hdr.version >= 3) { + l_emission->data.type_auth.signs_count = l_sign_auth_count; + l_emission->data.type_auth.tsd_n_signs_size = l_sign_auth_size; + } + DAP_DELETE(l_signs); + if (l_aproves < l_token_item->auth_signs_valid && + !s_check_hal(a_ledger, a_emission_hash)) { + log_it(L_WARNING, "Emission of %s datoshi of %s:%s is wrong: only %zu valid aproves when %zu need", + dap_uint256_to_char(l_emission->hdr.value, NULL), a_ledger->net->pub.name, l_emission->hdr.ticker, + l_aproves, l_token_item->auth_signs_valid); + debug_if(s_debug_more, L_ATT, "!!! Datum hash for HAL: %s", dap_chain_hash_fast_to_str_static(a_emission_hash)); + DAP_DELETE(l_emission); + return DAP_LEDGER_CHECK_NOT_ENOUGH_VALID_SIGNS; + } + } break; + + default: + log_it(L_ERROR, "Checking emission of type %s not implemented", dap_chain_datum_emission_type_str(l_emission->hdr.type)); + DAP_DELETE(l_emission); + return DAP_LEDGER_CHECK_PARSE_ERROR; } - DAP_DELETE(l_emission); - return l_ret; + +ret_success: + if (a_token_item) + *a_token_item = l_token_item; + if (a_emission) + *a_emission = l_emission; + else + DAP_DELETE(l_emission); + return DAP_LEDGER_CHECK_OK; +} + +int dap_ledger_token_emission_add_check(dap_ledger_t *a_ledger, byte_t *a_token_emission, size_t a_token_emission_size, dap_chain_hash_fast_t *a_emission_hash) +{ + return s_emission_add_check(a_ledger, a_token_emission, a_token_emission_size, a_emission_hash, NULL, NULL); } static void s_ledger_emission_cache_update(dap_ledger_t *a_ledger, dap_ledger_token_emission_item_t *a_emission_item) @@ -3003,132 +2902,54 @@ static void s_ledger_emission_cache_update(dap_ledger_t *a_ledger, dap_ledger_to * @return */ -int dap_ledger_token_emission_add(dap_ledger_t *a_ledger, byte_t *a_token_emission, size_t a_token_emission_size, - dap_hash_fast_t *a_emission_hash, bool a_from_threshold) +int dap_ledger_token_emission_add(dap_ledger_t *a_ledger, byte_t *a_token_emission, size_t a_token_emission_size, dap_hash_fast_t *a_emission_hash) { - dap_ledger_private_t *l_ledger_pvt = PVT(a_ledger); - dap_ledger_token_emission_item_t * l_token_emission_item = NULL; - int l_ret = dap_ledger_token_emission_add_check(a_ledger, a_token_emission, a_token_emission_size, a_emission_hash); - if (l_ret) { - 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_ledger_token_emission_item_t); - if ( !l_token_emission_item ) { - log_it(L_CRITICAL, "%s", c_error_memory_alloc); - return DAP_LEDGER_CHECK_NOT_ENOUGH_MEMORY; - } - l_token_emission_item->datum_token_emission = DAP_DUP_SIZE(a_token_emission, a_token_emission_size); - if ( !l_token_emission_item->datum_token_emission ) { - DAP_DELETE(l_token_emission_item); - log_it(L_CRITICAL, "%s", c_error_memory_alloc); - return DAP_LEDGER_CHECK_NOT_ENOUGH_MEMORY; - } - l_token_emission_item->datum_token_emission_size = a_token_emission_size; - dap_hash_fast_t l_emi_hash = {0}; - dap_hash_fast(a_token_emission, a_token_emission_size, &l_emi_hash); - pthread_rwlock_wrlock(&l_ledger_pvt->threshold_emissions_rwlock); - l_token_emission_item->datum_token_emission_hash = l_emi_hash; - l_token_emission_item->ts_added = dap_nanotime_now(); - HASH_ADD(hh, l_ledger_pvt->threshold_emissions, datum_token_emission_hash, - sizeof(*a_emission_hash), l_token_emission_item); - pthread_rwlock_unlock(&l_ledger_pvt->threshold_emissions_rwlock); - } else { - if(s_debug_more) - log_it(L_WARNING,"threshold for emissions is overfulled (%zu max), dropping down new data, added nothing", - s_threshold_emissions_max); - } - } + dap_ledger_token_item_t *l_token_item = NULL; + dap_chain_datum_token_emission_t *l_emission = NULL; + int l_ret = s_emission_add_check(a_ledger, a_token_emission, a_token_emission_size, a_emission_hash, &l_emission, &l_token_item); + if (l_ret != DAP_LEDGER_CHECK_OK) return l_ret; - } - const char *c_token_ticker = ((dap_chain_datum_token_emission_t *)a_token_emission)->hdr.ticker; - dap_ledger_token_item_t *l_token_item = s_ledger_find_token(a_ledger, c_token_ticker); - if (!l_token_item && a_from_threshold) - return DAP_LEDGER_CHECK_TICKER_NOT_FOUND; - + dap_ledger_token_emission_item_t *l_token_emission_item = NULL; // check if such emission is already present in table - pthread_rwlock_rdlock( l_token_item ? &l_token_item->token_emissions_rwlock - : &l_ledger_pvt->threshold_emissions_rwlock); - HASH_FIND(hh,l_token_item ? l_token_item->token_emissions : l_ledger_pvt->threshold_emissions, - a_emission_hash, sizeof(*a_emission_hash), l_token_emission_item); - pthread_rwlock_unlock(l_token_item ? &l_token_item->token_emissions_rwlock - : &l_ledger_pvt->threshold_emissions_rwlock); + pthread_rwlock_wrlock(&l_token_item->token_emissions_rwlock); + HASH_FIND(hh, l_token_item->token_emissions, a_emission_hash, sizeof(*a_emission_hash), l_token_emission_item); + if (l_token_emission_item) { + pthread_rwlock_unlock(&l_token_item->token_emissions_rwlock); + log_it(L_ERROR, "Duplicate token emission datum of %s %s ( %s )", + dap_uint256_to_char(l_emission->hdr.value, NULL), l_emission->hdr.ticker, dap_hash_fast_to_str_static(a_emission_hash)); + DAP_DELETE(l_emission); + return DAP_LEDGER_CHECK_APPLY_ERROR; + } + l_token_emission_item = DAP_NEW_Z(dap_ledger_token_emission_item_t); if (!l_token_emission_item) { - l_token_emission_item = DAP_NEW_Z(dap_ledger_token_emission_item_t); - if ( !l_token_emission_item ) { - log_it(L_CRITICAL, "%s", c_error_memory_alloc); - return DAP_LEDGER_CHECK_NOT_ENOUGH_MEMORY; - } - l_token_emission_item->datum_token_emission_size = a_token_emission_size; - l_token_emission_item->datum_token_emission_hash = *a_emission_hash; - if (l_token_item) { - l_token_emission_item->datum_token_emission = dap_chain_datum_emission_read(a_token_emission, - &l_token_emission_item->datum_token_emission_size); - //Update value in ledger memory object - if (!s_ledger_token_supply_check_update(a_ledger, l_token_item, - l_token_emission_item->datum_token_emission->hdr.value, false)) { - DAP_DELETE(l_token_emission_item->datum_token_emission); - DAP_DELETE(l_token_emission_item); - return DAP_LEDGER_EMISSION_CHECK_VALUE_EXCEEDS_CURRENT_SUPPLY; - } - - pthread_rwlock_wrlock(&l_token_item->token_emissions_rwlock); - HASH_ADD(hh, l_token_item->token_emissions, datum_token_emission_hash, - sizeof(*a_emission_hash), l_token_emission_item); - pthread_rwlock_unlock(&l_token_item->token_emissions_rwlock); - // Add it to cache - s_ledger_emission_cache_update(a_ledger, l_token_emission_item); - if (s_debug_more) { - const char *l_balance; dap_uint256_to_char(l_token_emission_item->datum_token_emission->hdr.value, &l_balance); - log_it(L_NOTICE, "Added token emission datum to emissions cache: type=%s value=%s token=%s to_addr=%s ", - c_dap_chain_datum_token_emission_type_str[l_token_emission_item->datum_token_emission->hdr.type], - l_balance, c_token_ticker, - dap_chain_addr_to_str(&(l_token_emission_item->datum_token_emission->hdr.address))); - } - s_threshold_txs_proc(a_ledger); - } else if (HASH_COUNT(l_ledger_pvt->threshold_emissions) < s_threshold_emissions_max) { - l_token_emission_item->datum_token_emission = DAP_DUP_SIZE(a_token_emission, a_token_emission_size); - l_token_emission_item->datum_token_emission_size = a_token_emission_size; - pthread_rwlock_wrlock(&l_ledger_pvt->threshold_emissions_rwlock); - l_token_emission_item->ts_added = dap_nanotime_now(); - dap_chain_hash_fast_t l_emi_hash = {0}; - dap_hash_fast(a_token_emission, a_token_emission_size, &l_emi_hash); - l_token_emission_item->datum_token_emission_hash = l_emi_hash; - HASH_ADD(hh, l_ledger_pvt->threshold_emissions, datum_token_emission_hash, - sizeof(*a_emission_hash), l_token_emission_item); - pthread_rwlock_unlock(&l_ledger_pvt->threshold_emissions_rwlock); - l_ret = DAP_LEDGER_EMISSION_CHECK_THRESHOLDED; - if (s_debug_more) { - const char *l_balance; dap_uint256_to_char(l_token_emission_item->datum_token_emission->hdr.value, &l_balance); - log_it(L_NOTICE, "Added token emission datum to emissions threshold: type=%s value=%s token=%s to_addr=%s ", - c_dap_chain_datum_token_emission_type_str[l_token_emission_item->datum_token_emission->hdr.type], - l_balance, c_token_ticker, - dap_chain_addr_to_str(&(l_token_emission_item->datum_token_emission->hdr.address))); - } - } else { - DAP_DELETE(l_token_emission_item->datum_token_emission); - DAP_DELETE(l_token_emission_item); - if(s_debug_more) - log_it(L_WARNING,"threshold for emissions is overfulled (%zu max), dropping down new data, added nothing", - s_threshold_emissions_max); - l_ret = DAP_LEDGER_EMISSION_CHECK_THRESHOLD_OVERFLOW; - } - } else { - if (l_token_item) { - if(s_debug_more) { - char l_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; - dap_chain_hash_fast_to_str(a_emission_hash, l_hash_str, sizeof(l_hash_str)); - if ( ((dap_chain_datum_token_emission_t *)a_token_emission)->hdr.version == 2 ) { - log_it(L_ERROR, "Duplicate token emission datum of %s %s ( %s )", - dap_uint256_to_char(((dap_chain_datum_token_emission_t *)a_token_emission)->hdr.value, NULL), - c_token_ticker, l_hash_str); - } else - log_it(L_ERROR, "Duplicate token emission datum of %"DAP_UINT64_FORMAT_U" %s ( %s )", - ((dap_chain_datum_token_emission_t *)a_token_emission)->hdr.value64, c_token_ticker, l_hash_str); - } - } - l_ret = DAP_LEDGER_CHECK_ALREADY_CACHED; + pthread_rwlock_unlock(&l_token_item->token_emissions_rwlock); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); + return DAP_LEDGER_CHECK_NOT_ENOUGH_MEMORY; + } + l_token_emission_item->datum_token_emission = l_emission; + l_token_emission_item->datum_token_emission_hash = *a_emission_hash; + HASH_ADD(hh, l_token_item->token_emissions, datum_token_emission_hash, sizeof(*a_emission_hash), l_token_emission_item); + //Update value in ledger memory object + if (!s_ledger_token_supply_check_update(a_ledger, l_token_item, l_emission->hdr.value, false)) { + HASH_DEL(l_token_item->token_emissions, l_token_emission_item); + pthread_rwlock_unlock(&l_token_item->token_emissions_rwlock); + DAP_DELETE(l_emission); + DAP_DELETE(l_token_emission_item); + return DAP_LEDGER_CHECK_APPLY_ERROR; } - return l_ret; + pthread_rwlock_unlock(&l_token_item->token_emissions_rwlock); + // Add it to cache + s_ledger_emission_cache_update(a_ledger, l_token_emission_item); + if (s_debug_more) { + const char *l_balance; dap_uint256_to_char(l_token_emission_item->datum_token_emission->hdr.value, &l_balance); + log_it(L_NOTICE, "Added token emission datum to emissions cache: type=%s value=%s token=%s to_addr=%s", + dap_chain_datum_emission_type_str(l_emission->hdr.type), + l_balance, l_emission->hdr.ticker, + dap_chain_addr_to_str(&(l_emission->hdr.address))); + } + if (PVT(a_ledger)->threshold_enabled) + s_threshold_txs_proc(a_ledger); + return DAP_LEDGER_CHECK_OK; } void s_ledger_stake_lock_cache_update(dap_ledger_t *a_ledger, dap_ledger_stake_lock_item_t *a_stake_lock_item) @@ -3146,7 +2967,7 @@ void s_ledger_stake_lock_cache_update(dap_ledger_t *a_ledger, dap_ledger_stake_l int dap_ledger_emission_for_stake_lock_item_add(dap_ledger_t *a_ledger, const dap_chain_hash_fast_t *a_tx_hash) { dap_ledger_private_t *l_ledger_pvt = PVT(a_ledger); - dap_ledger_stake_lock_item_t *l_new_stake_lock_emission; + dap_ledger_stake_lock_item_t *l_new_stake_lock_emission = NULL; pthread_rwlock_rdlock(&l_ledger_pvt->stake_lock_rwlock); HASH_FIND(hh, l_ledger_pvt->emissions_for_stake_lock, a_tx_hash, sizeof(dap_hash_fast_t), l_new_stake_lock_emission); @@ -3175,7 +2996,7 @@ int dap_ledger_emission_for_stake_lock_item_add(dap_ledger_t *a_ledger, const da dap_ledger_stake_lock_item_t *s_emissions_for_stake_lock_item_find(dap_ledger_t *a_ledger, const dap_chain_hash_fast_t *a_token_emission_hash) { dap_ledger_private_t *l_ledger_pvt = PVT(a_ledger); - dap_ledger_stake_lock_item_t *l_new_stake_lock_emission; + dap_ledger_stake_lock_item_t *l_new_stake_lock_emission = NULL; pthread_rwlock_rdlock(&l_ledger_pvt->stake_lock_rwlock); HASH_FIND(hh, l_ledger_pvt->emissions_for_stake_lock, a_token_emission_hash, sizeof(dap_chain_hash_fast_t), l_new_stake_lock_emission); @@ -3188,7 +3009,7 @@ int dap_ledger_token_emission_load(dap_ledger_t *a_ledger, byte_t *a_token_emiss size_t a_token_emission_size, dap_hash_fast_t *a_token_emission_hash) { if (dap_chain_net_get_load_mode(a_ledger->net)) { - dap_ledger_token_emission_item_t *l_token_emission_item; + dap_ledger_token_emission_item_t *l_token_emission_item = NULL; dap_ledger_token_item_t *l_token_item, *l_item_tmp; pthread_rwlock_rdlock(&PVT(a_ledger)->tokens_rwlock); HASH_ITER(hh, PVT(a_ledger)->tokens, l_token_item, l_item_tmp) { @@ -3202,15 +3023,8 @@ int dap_ledger_token_emission_load(dap_ledger_t *a_ledger, byte_t *a_token_emiss } } pthread_rwlock_unlock(&PVT(a_ledger)->tokens_rwlock); - pthread_rwlock_rdlock(&PVT(a_ledger)->threshold_emissions_rwlock); - HASH_FIND(hh, PVT(a_ledger)->threshold_emissions, a_token_emission_hash, sizeof(*a_token_emission_hash), - l_token_emission_item); - pthread_rwlock_unlock(&PVT(a_ledger)->threshold_emissions_rwlock); - if (l_token_emission_item) { - return -5; - } } - return dap_ledger_token_emission_add(a_ledger, a_token_emission, a_token_emission_size, a_token_emission_hash, false); + return dap_ledger_token_emission_add(a_ledger, a_token_emission, a_token_emission_size, a_token_emission_hash); } dap_ledger_token_emission_item_t *s_emission_item_find(dap_ledger_t *a_ledger, @@ -3271,7 +3085,7 @@ const char* dap_ledger_tx_get_token_ticker_by_hash(dap_ledger_t *a_ledger,dap_ch if ( dap_hash_fast_is_blank(a_tx_hash) ) return NULL; - dap_ledger_tx_item_t *l_item; + dap_ledger_tx_item_t *l_item = NULL; unsigned l_hash_value; HASH_VALUE(a_tx_hash, sizeof(*a_tx_hash), l_hash_value); pthread_rwlock_rdlock(&l_ledger_pvt->ledger_rwlock); @@ -3361,7 +3175,7 @@ static dap_chain_datum_tx_t* s_find_datum_tx_by_hash(dap_ledger_t *a_ledger, con dap_ledger_private_t *l_ledger_pvt = PVT(a_ledger); dap_chain_datum_tx_t *l_tx_ret = NULL; - dap_ledger_tx_item_t *l_tx_item; + dap_ledger_tx_item_t *l_tx_item = NULL; pthread_rwlock_rdlock(&l_ledger_pvt->ledger_rwlock); HASH_FIND(hh, l_ledger_pvt->ledger_items, a_tx_hash, sizeof(dap_chain_hash_fast_t), l_tx_item); pthread_rwlock_unlock(&l_ledger_pvt->ledger_rwlock); @@ -3395,7 +3209,7 @@ dap_hash_fast_t *dap_ledger_get_final_chain_tx_hash(dap_ledger_t *a_ledger, dap_ if (!a_ledger || !a_tx_hash || dap_hash_fast_is_blank(a_tx_hash)) return NULL; dap_ledger_private_t *l_ledger_pvt = PVT(a_ledger); - dap_ledger_tx_item_t *l_item; + dap_ledger_tx_item_t *l_item = NULL; unsigned l_hash_value; dap_chain_hash_fast_t *l_tx_hash = a_tx_hash; pthread_rwlock_rdlock(&l_ledger_pvt->ledger_rwlock); @@ -3571,14 +3385,14 @@ bool dap_ledger_tx_service_info(dap_ledger_t *a_ledger, dap_hash_fast_t *a_tx_ha { //find tx dap_ledger_private_t *l_ledger_pvt = PVT(a_ledger); - dap_ledger_tx_item_t *l_tx_item; + dap_ledger_tx_item_t *l_tx_item = NULL; pthread_rwlock_rdlock(&l_ledger_pvt->ledger_rwlock); HASH_FIND(hh, l_ledger_pvt->ledger_items, a_tx_hash, sizeof(dap_chain_hash_fast_t), l_tx_item); pthread_rwlock_unlock(&l_ledger_pvt->ledger_rwlock); if(l_tx_item) { - dap_ledger_service_info_t *l_sinfo; + dap_ledger_service_info_t *l_sinfo = NULL; pthread_rwlock_rdlock(&s_services_rwlock); HASH_FIND_INT(s_services, &l_tx_item->cache_data.tag, l_sinfo); pthread_rwlock_unlock(&s_services_rwlock); @@ -3664,15 +3478,13 @@ static int s_tx_cache_check(dap_ledger_t *a_ledger, { dap_return_val_if_fail(a_ledger && a_tx && a_tx_hash, DAP_LEDGER_CHECK_INVALID_ARGS); if (!dap_chain_net_get_load_mode(a_ledger->net) && !a_from_threshold && !a_check_for_removing) { - dap_ledger_tx_item_t *l_ledger_item; + dap_ledger_tx_item_t *l_ledger_item = NULL; pthread_rwlock_rdlock(&PVT(a_ledger)->ledger_rwlock); HASH_FIND(hh, PVT(a_ledger)->ledger_items, a_tx_hash, sizeof(dap_chain_hash_fast_t), l_ledger_item); pthread_rwlock_unlock(&PVT(a_ledger)->ledger_rwlock); if (l_ledger_item) { // transaction already present in the cache list if (s_debug_more) { - char l_tx_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; - dap_chain_hash_fast_to_str(a_tx_hash, l_tx_hash_str, sizeof(l_tx_hash_str)); - log_it(L_WARNING, "Transaction %s already present in the cache", l_tx_hash_str); + log_it(L_WARNING, "Transaction %s already present in the cache", dap_chain_hash_fast_to_str_static(a_tx_hash)); if (a_tag) *a_tag = l_ledger_item->cache_data.tag; if (a_action) *a_action = l_ledger_item->cache_data.action; } @@ -3695,7 +3507,6 @@ static int s_tx_cache_check(dap_ledger_t *a_ledger, * && * 7. valid(fee) */ - dap_list_t *l_list_bound_items = NULL; dap_list_t *l_list_tx_out = NULL; @@ -4160,7 +3971,7 @@ static int s_tx_cache_check(dap_ledger_t *a_ledger, l_owner = dap_sign_compare_pkeys(l_owner_sign, l_sign); // 5b. Call verificator for conditional output - dap_ledger_verificator_t *l_verificator; + dap_ledger_verificator_t *l_verificator = NULL; int l_sub_tmp = l_tx_prev_out_cond->header.subtype; pthread_rwlock_rdlock(&s_verificators_rwlock); @@ -4438,30 +4249,36 @@ static int s_tx_cache_check(dap_ledger_t *a_ledger, } } - - dap_list_t *l_items_voting; - if ((l_items_voting = dap_chain_datum_tx_items_get((dap_chain_datum_tx_t*) a_tx, TX_ITEM_TYPE_VOTING, NULL))) { - if (s_voting_callbacks.voting_callback){ - if (!s_voting_callbacks.voting_callback(a_ledger, TX_ITEM_TYPE_VOTING, a_tx, false)){ - debug_if(s_debug_more, L_WARNING, "Verificator check error for voting."); - l_err_num = DAP_LEDGER_TX_CHECK_VERIFICATOR_CHECK_FAILURE; - } - } else { - debug_if(s_debug_more, L_WARNING, "Verificator check error for voting item"); - l_err_num = DAP_LEDGER_TX_CHECK_NO_VERIFICATOR_SET; - } - dap_list_free(l_items_voting); - }else if ((l_items_voting = dap_chain_datum_tx_items_get((dap_chain_datum_tx_t*) a_tx, TX_ITEM_TYPE_VOTE, NULL))) { - if (s_voting_callbacks.voting_callback){ - if (!s_voting_callbacks.voting_callback(a_ledger, TX_ITEM_TYPE_VOTE, a_tx, false)){ - debug_if(s_debug_more, L_WARNING, "Verificator check error for vote."); - l_err_num = DAP_LEDGER_TX_CHECK_VERIFICATOR_CHECK_FAILURE; + if (!l_err_num) { + // TODO move it to service tag deduction + dap_list_t *l_items_voting; + if ((l_items_voting = dap_chain_datum_tx_items_get((dap_chain_datum_tx_t*) a_tx, TX_ITEM_TYPE_VOTING, NULL))) { + if (s_voting_callbacks.voting_callback){ + if (!s_voting_callbacks.voting_callback(a_ledger, TX_ITEM_TYPE_VOTING, a_tx, false)){ + debug_if(s_debug_more, L_WARNING, "Verificator check error for voting."); + l_err_num = DAP_LEDGER_TX_CHECK_VERIFICATOR_CHECK_FAILURE; + } + } else { + debug_if(s_debug_more, L_WARNING, "Verificator check error for voting item"); + l_err_num = DAP_LEDGER_TX_CHECK_NO_VERIFICATOR_SET; + } + dap_list_free(l_items_voting); + if (a_tag) + a_tag->uint64 = DAP_CHAIN_TX_TAG_ACTION_VOTING; + }else if ((l_items_voting = dap_chain_datum_tx_items_get((dap_chain_datum_tx_t*) a_tx, TX_ITEM_TYPE_VOTE, NULL))) { + if (s_voting_callbacks.voting_callback){ + if (!s_voting_callbacks.voting_callback(a_ledger, TX_ITEM_TYPE_VOTE, a_tx, false)){ + debug_if(s_debug_more, L_WARNING, "Verificator check error for vote."); + l_err_num = DAP_LEDGER_TX_CHECK_VERIFICATOR_CHECK_FAILURE; + } + } else { + debug_if(s_debug_more, L_WARNING, "Verificator check error for vote item"); + l_err_num = DAP_LEDGER_TX_CHECK_NO_VERIFICATOR_SET; } - } else { - debug_if(s_debug_more, L_WARNING, "Verificator check error for vote item"); - l_err_num = DAP_LEDGER_TX_CHECK_NO_VERIFICATOR_SET; - } - dap_list_free(l_items_voting); + dap_list_free(l_items_voting); + if (a_tag) + a_tag->uint64 = DAP_CHAIN_TX_TAG_ACTION_VOTE; + } } if (a_main_ticker && !l_err_num) @@ -4542,10 +4359,13 @@ static int s_balance_cache_update(dap_ledger_t *a_ledger, dap_ledger_wallet_bala return 0; } -static int s_sort_ledger_tx_item(dap_ledger_tx_item_t* a, dap_ledger_tx_item_t* b) +static int s_sort_ledger_tx_item(dap_ledger_tx_item_t *a, dap_ledger_tx_item_t *b) { - return a->tx->header.ts_created == b->tx->header.ts_created ? 0 : - a->tx->header.ts_created < b->tx->header.ts_created ? -1 : 1; + if (a->cache_data.ts_created < b->cache_data.ts_created) + return -1; + if (a->cache_data.ts_created == b->cache_data.ts_created) + return 0; + return 1; } /** @@ -4574,15 +4394,15 @@ int dap_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_ha dap_chain_hash_fast_to_str(a_tx_hash, l_tx_hash_str, sizeof(l_tx_hash_str)); int l_ret_check; - l_item_tmp = NULL; dap_chain_net_srv_uid_t l_tag = { .uint64 = 0 }; dap_chain_tx_tag_action_type_t l_action = DAP_CHAIN_TX_TAG_ACTION_UNKNOWN; if( (l_ret_check = s_tx_cache_check(a_ledger, a_tx, a_tx_hash, a_from_threshold, &l_list_bound_items, &l_list_tx_out, l_main_token_ticker, &l_tag, &l_action, false))) { - if (l_ret_check == DAP_CHAIN_CS_VERIFY_CODE_TX_NO_PREVIOUS || - l_ret_check == DAP_CHAIN_CS_VERIFY_CODE_TX_NO_EMISSION) { + if ((l_ret_check == DAP_CHAIN_CS_VERIFY_CODE_TX_NO_PREVIOUS || + l_ret_check == DAP_CHAIN_CS_VERIFY_CODE_TX_NO_EMISSION) && + l_ledger_pvt->threshold_enabled && !dap_chain_net_get_load_mode(a_ledger->net)) { if (!l_from_threshold) { unsigned l_hash_value = 0; HASH_VALUE(a_tx_hash, sizeof(*a_tx_hash), l_hash_value); @@ -4608,6 +4428,7 @@ int dap_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_ha return -1; } l_item_tmp->ts_added = dap_nanotime_now(); + l_item_tmp->cache_data.ts_created = a_tx->header.ts_created; HASH_ADD_BYHASHVALUE(hh, l_ledger_pvt->threshold_txs, tx_hash_fast, sizeof(dap_chain_hash_fast_t), l_hash_value, l_item_tmp); if(s_debug_more) log_it (L_DEBUG, "Tx %s added to threshold", l_tx_hash_str); @@ -4720,7 +4541,7 @@ int dap_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_ha case TX_ITEM_TYPE_IN_COND: { // all balance deducts performed with previous conditional transaction // Update service items if any - dap_ledger_verificator_t *l_verificator; + dap_ledger_verificator_t *l_verificator = NULL; int l_tmp = l_bound_item->cond->header.subtype; pthread_rwlock_rdlock(&s_verificators_rwlock); HASH_FIND_INT(s_verificators, &l_tmp, l_verificator); @@ -4755,7 +4576,7 @@ int dap_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_ha l_cache_used_outs[l_spent_idx].timestamp = dap_nanotime_now(); } // mark previous transactions as used with the extra timestamp - if(l_prev_item_out->cache_data.n_outs_used == l_prev_item_out->cache_data.n_outs) + if (l_prev_item_out->cache_data.n_outs_used == l_prev_item_out->cache_data.n_outs) l_prev_item_out->cache_data.ts_spent = a_tx->header.ts_created; } @@ -4763,16 +4584,17 @@ int dap_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_ha //Update balance : raise bool l_multichannel = false; bool l_cross_network = false; - for (dap_list_t *l_tx_out = l_list_tx_out; l_tx_out; l_tx_out = dap_list_next(l_tx_out)) { + uint32_t l_outs_count = 0; + for (dap_list_t *l_tx_out = l_list_tx_out; l_tx_out; l_tx_out = l_tx_out->next, l_outs_count++) { if (!l_tx_out->data) { - debug_if(s_debug_more, L_WARNING, "Can't detect tx ticker or matching output, can't append balances cache"); + log_it(L_ERROR, "Can't detect tx ticker or matching output, can't append balances cache"); continue; } dap_chain_tx_item_type_t l_type = *(uint8_t *)l_tx_out->data; if (l_type == TX_ITEM_TYPE_OUT_COND) { // Update service items if any dap_chain_tx_out_cond_t *l_cond = (dap_chain_tx_out_cond_t *)l_tx_out->data; - dap_ledger_verificator_t *l_verificator; + dap_ledger_verificator_t *l_verificator = NULL; int l_tmp = l_cond->header.subtype; pthread_rwlock_rdlock(&s_verificators_rwlock); HASH_FIND_INT(s_verificators, &l_tmp, l_verificator); @@ -4805,7 +4627,7 @@ int dap_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_ha l_multichannel = true; } break; default: - log_it(L_DEBUG, "Unknown item type %d", l_type); + log_it(L_ERROR, "Unknown item type %d", l_type); break; } if (!l_addr) @@ -4848,14 +4670,11 @@ int dap_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_ha s_balance_cache_update(a_ledger, wallet_balance); } } - dap_list_t *l_items_voting; - if ((l_items_voting = dap_chain_datum_tx_items_get((dap_chain_datum_tx_t*) a_tx, TX_ITEM_TYPE_VOTING, NULL)) && s_voting_callbacks.voting_callback) { - dap_list_free(l_items_voting); - s_voting_callbacks.voting_callback(a_ledger, TX_ITEM_TYPE_VOTING, a_tx, true); - } - else if ((l_items_voting = dap_chain_datum_tx_items_get((dap_chain_datum_tx_t*) a_tx, TX_ITEM_TYPE_VOTE, NULL)) && s_voting_callbacks.voting_callback) { - dap_list_free(l_items_voting); - s_voting_callbacks.voting_callback(a_ledger, TX_ITEM_TYPE_VOTE, a_tx, true); + if (s_voting_callbacks.voting_callback) { + if (l_tag.uint64 == DAP_CHAIN_TX_TAG_ACTION_VOTING) + s_voting_callbacks.voting_callback(a_ledger, TX_ITEM_TYPE_VOTING, a_tx, true); + else if (l_tag.uint64 == DAP_CHAIN_TX_TAG_ACTION_VOTE) + s_voting_callbacks.voting_callback(a_ledger, TX_ITEM_TYPE_VOTE, a_tx, true); } // add transaction to the cache list @@ -4868,22 +4687,18 @@ int dap_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_ha l_tx_item->tx_hash_fast = *a_tx_hash; size_t l_tx_size = dap_chain_datum_tx_get_size(a_tx); l_tx_item->tx = l_ledger_pvt->mapped ? a_tx : DAP_DUP_SIZE(a_tx, l_tx_size); - l_tx_item->cache_data.ts_created = dap_time_now(); // Time of transasction added to ledger - int l_outs_count = 0; - dap_list_t *l_list_tmp = dap_chain_datum_tx_items_get(a_tx, TX_ITEM_TYPE_OUT_ALL, &l_outs_count); l_tx_item->cache_data.n_outs = l_outs_count; l_tx_item->cache_data.tag = l_tag; l_tx_item->cache_data.action = l_action; - // TODO: dump the UTXO in debug mode if need - - if(l_list_tmp) - dap_list_free(l_list_tmp); dap_stpcpy(l_tx_item->cache_data.token_ticker, l_main_token_ticker); l_tx_item->cache_data.multichannel = l_multichannel; - pthread_rwlock_wrlock(&l_ledger_pvt->ledger_rwlock); l_tx_item->ts_added = dap_nanotime_now(); - HASH_ADD_INORDER(hh, l_ledger_pvt->ledger_items, tx_hash_fast, sizeof(dap_chain_hash_fast_t), + pthread_rwlock_wrlock(&l_ledger_pvt->ledger_rwlock); + if (dap_chain_net_get_load_mode(a_ledger->net)) + HASH_ADD(hh, l_ledger_pvt->ledger_items, tx_hash_fast, sizeof(dap_chain_hash_fast_t), l_tx_item); + else + HASH_ADD_INORDER(hh, l_ledger_pvt->ledger_items, tx_hash_fast, sizeof(dap_chain_hash_fast_t), l_tx_item, s_sort_ledger_tx_item); // tx_hash_fast: name of key field pthread_rwlock_unlock(&l_ledger_pvt->ledger_rwlock); // Callable callback @@ -4916,7 +4731,7 @@ int dap_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_ha if (dap_global_db_set_raw(l_cache_used_outs, l_outs_used + 1, NULL, NULL)) debug_if(s_debug_more, L_WARNING, "Ledger cache mismatch"); } - if (!a_from_threshold) + if (!a_from_threshold && l_ledger_pvt->threshold_enabled) s_threshold_txs_proc(a_ledger); FIN: if (l_list_bound_items) @@ -4936,6 +4751,13 @@ FIN: return l_ret; } +void dap_leger_load_end(dap_ledger_t *a_ledger) +{ + pthread_rwlock_wrlock(&PVT(a_ledger)->ledger_rwlock); + HASH_SORT(PVT(a_ledger)->ledger_items, s_sort_ledger_tx_item); + pthread_rwlock_unlock(&PVT(a_ledger)->ledger_rwlock); +} + /** * @brief Remove transaction from the cache list * @param a_ledger @@ -4950,6 +4772,7 @@ int dap_ledger_tx_remove(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap dap_ledger_private_t *l_ledger_pvt = PVT(a_ledger); dap_list_t *l_list_bound_items = NULL; dap_list_t *l_list_tx_out = NULL; + dap_chain_net_srv_uid_t l_tag = { .uint64 = 0 }; char l_main_token_ticker[DAP_CHAIN_TICKER_SIZE_MAX] = { '\0' }; char l_tx_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; @@ -4960,13 +4783,13 @@ int dap_ledger_tx_remove(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap int l_ret_check; if( (l_ret_check = s_tx_cache_check(a_ledger, a_tx, a_tx_hash, false, &l_list_bound_items, &l_list_tx_out, - l_main_token_ticker, NULL, NULL, true))) { + l_main_token_ticker, &l_tag, NULL, true))) { debug_if(s_debug_more, L_WARNING, "dap_ledger_tx_remove() tx %s not passed the check: %s ", l_tx_hash_str, dap_ledger_check_error_str(l_ret_check)); return l_ret_check; } - dap_ledger_tx_item_t *l_ledger_item; + dap_ledger_tx_item_t *l_ledger_item = NULL; pthread_rwlock_rdlock(&PVT(a_ledger)->ledger_rwlock); HASH_FIND(hh, PVT(a_ledger)->ledger_items, a_tx_hash, sizeof(dap_chain_hash_fast_t), l_ledger_item); pthread_rwlock_unlock(&PVT(a_ledger)->ledger_rwlock); @@ -5055,7 +4878,7 @@ int dap_ledger_tx_remove(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap case TX_ITEM_TYPE_IN_COND: { // all balance deducts performed with previous conditional transaction // Update service items if any - dap_ledger_verificator_t *l_verificator; + dap_ledger_verificator_t *l_verificator = NULL; int l_tmp = l_bound_item->cond->header.subtype; pthread_rwlock_rdlock(&s_verificators_rwlock); HASH_FIND_INT(s_verificators, &l_tmp, l_verificator); @@ -5109,7 +4932,7 @@ int dap_ledger_tx_remove(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap if (l_type == TX_ITEM_TYPE_OUT_COND) { // Update service items if any dap_chain_tx_out_cond_t *l_cond = (dap_chain_tx_out_cond_t *)l_tx_out->data; - dap_ledger_verificator_t *l_verificator; + dap_ledger_verificator_t *l_verificator = NULL; int l_tmp = l_cond->header.subtype; pthread_rwlock_rdlock(&s_verificators_rwlock); HASH_FIND_INT(s_verificators, &l_tmp, l_verificator); @@ -5172,11 +4995,12 @@ int dap_ledger_tx_remove(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap } } - if (dap_chain_datum_tx_items_get((dap_chain_datum_tx_t*) a_tx, TX_ITEM_TYPE_VOTING, NULL) && s_voting_callbacks.voting_delete_callback) - s_voting_callbacks.voting_delete_callback(a_ledger, TX_ITEM_TYPE_VOTING, a_tx); - else if (dap_chain_datum_tx_items_get((dap_chain_datum_tx_t*) a_tx, TX_ITEM_TYPE_VOTE, NULL) && s_voting_callbacks.voting_delete_callback) - s_voting_callbacks.voting_delete_callback(a_ledger, TX_ITEM_TYPE_VOTE, a_tx); - + if (s_voting_callbacks.voting_delete_callback) { + if (l_tag.uint64 == DAP_CHAIN_TX_TAG_ACTION_VOTING) + s_voting_callbacks.voting_delete_callback(a_ledger, TX_ITEM_TYPE_VOTING, a_tx); + else if (l_tag.uint64 == DAP_CHAIN_TX_TAG_ACTION_VOTE) + s_voting_callbacks.voting_delete_callback(a_ledger, TX_ITEM_TYPE_VOTE, a_tx); + } // remove transaction from ledger dap_ledger_tx_item_t *l_tx_item = NULL; @@ -5231,19 +5055,14 @@ int dap_ledger_tx_load(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_c if (dap_chain_net_get_load_mode(a_ledger->net)) { if (PVT(a_ledger)->cache_tx_check_callback) PVT(a_ledger)->cache_tx_check_callback(a_ledger, a_tx_hash); - dap_ledger_tx_item_t *l_tx_item; + dap_ledger_tx_item_t *l_tx_item = NULL; unsigned l_hash_value; HASH_VALUE(a_tx_hash, sizeof(dap_chain_hash_fast_t), l_hash_value); pthread_rwlock_rdlock(&PVT(a_ledger)->ledger_rwlock); HASH_FIND_BYHASHVALUE(hh, PVT(a_ledger)->ledger_items, a_tx_hash, sizeof(dap_chain_hash_fast_t), l_hash_value, l_tx_item); - if (l_tx_item) { - pthread_rwlock_unlock(&PVT(a_ledger)->ledger_rwlock); - return DAP_LEDGER_CHECK_ALREADY_CACHED; - } - HASH_FIND_BYHASHVALUE(hh, PVT(a_ledger)->threshold_txs, a_tx_hash, sizeof(dap_chain_hash_fast_t), l_hash_value, l_tx_item); pthread_rwlock_unlock(&PVT(a_ledger)->ledger_rwlock); if (l_tx_item) - return DAP_CHAIN_CS_VERIFY_CODE_TX_NO_PREVIOUS; + return DAP_LEDGER_CHECK_ALREADY_CACHED; } #endif return dap_ledger_tx_add(a_ledger, a_tx, a_tx_hash, false); @@ -5259,7 +5078,6 @@ void dap_ledger_purge(dap_ledger_t *a_ledger, bool a_preserve_db) pthread_rwlock_wrlock(&l_ledger_pvt->ledger_rwlock); pthread_rwlock_wrlock(&l_ledger_pvt->tokens_rwlock); - pthread_rwlock_wrlock(&l_ledger_pvt->threshold_emissions_rwlock); pthread_rwlock_wrlock(&l_ledger_pvt->threshold_txs_rwlock); pthread_rwlock_wrlock(&l_ledger_pvt->balance_accounts_rwlock); pthread_rwlock_wrlock(&l_ledger_pvt->stake_lock_rwlock); @@ -5341,12 +5159,6 @@ void dap_ledger_purge(dap_ledger_t *a_ledger, bool a_preserve_db) DAP_DELETE(l_gdb_group); } - /* Delete threshold emissions */ - HASH_ITER(hh, l_ledger_pvt->threshold_emissions, l_emission_current, l_emission_tmp) { - HASH_DEL(l_ledger_pvt->threshold_emissions, l_emission_current); - DAP_DELETE(l_emission_current->datum_token_emission); - DAP_DEL_Z(l_emission_current); - } /* Delete threshold transactions */ HASH_ITER(hh, l_ledger_pvt->threshold_txs, l_item_current, l_item_tmp) { HASH_DEL(l_ledger_pvt->threshold_txs, l_item_current); @@ -5358,12 +5170,10 @@ void dap_ledger_purge(dap_ledger_t *a_ledger, bool a_preserve_db) l_ledger_pvt->ledger_items = NULL; l_ledger_pvt->balance_accounts = NULL; l_ledger_pvt->tokens = NULL; - l_ledger_pvt->threshold_emissions = NULL; l_ledger_pvt->threshold_txs = NULL; pthread_rwlock_unlock(&l_ledger_pvt->ledger_rwlock); pthread_rwlock_unlock(&l_ledger_pvt->tokens_rwlock); - pthread_rwlock_unlock(&l_ledger_pvt->threshold_emissions_rwlock); pthread_rwlock_unlock(&l_ledger_pvt->threshold_txs_rwlock); pthread_rwlock_unlock(&l_ledger_pvt->balance_accounts_rwlock); pthread_rwlock_unlock(&l_ledger_pvt->stake_lock_rwlock); @@ -6003,7 +5813,7 @@ dap_list_t *dap_ledger_get_list_tx_outs(dap_ledger_t *a_ledger, const char *a_to // Add new verificator callback with associated subtype. Returns 1 if callback replaced, -1 error, overwise returns 0 int dap_ledger_verificator_add(dap_chain_tx_out_cond_subtype_t a_subtype, dap_ledger_verificator_callback_t a_callback, dap_ledger_updater_callback_t a_callback_added, dap_ledger_updater_callback_t a_callback_deleted) { - dap_ledger_verificator_t *l_new_verificator; + dap_ledger_verificator_t *l_new_verificator = NULL; int l_tmp = (int)a_subtype; pthread_rwlock_rdlock(&s_verificators_rwlock); HASH_FIND_INT(s_verificators, &l_tmp, l_new_verificator); diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index f6e2b57797..c6db751330 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -1795,7 +1795,7 @@ void dap_chain_net_delete(dap_chain_net_t *a_net) // Synchronously going to offline state PVT(a_net)->state = PVT(a_net)->state_target = NET_STATE_OFFLINE; s_net_states_proc(a_net); - dap_chain_net_item_t *l_net_item; + dap_chain_net_item_t *l_net_item = NULL; HASH_FIND(hh, s_net_items, a_net->pub.name, strlen(a_net->pub.name), l_net_item); if (l_net_item) { HASH_DEL(s_net_items, l_net_item); @@ -2133,6 +2133,7 @@ int s_net_init(const char *a_net_name, uint16_t a_acl_idx) for (dap_chain_t *l_chain = l_net->pub.chains; l_chain; l_chain = l_chain->next) { if (l_chain->callback_load_from_gdb) { l_ledger_flags &= ~DAP_LEDGER_MAPPED; + l_ledger_flags |= DAP_LEDGER_THRESHOLD_ENABLED; continue; } if (!l_chain->callback_get_poa_certs) @@ -2199,6 +2200,10 @@ bool s_net_load(void *a_arg) } else log_it(L_WARNING, "No purge callback for chain %s, can't reload it with correct order", l_chain->name); } + if (l_chain->callback_atom_add_from_treshold) { + while (l_chain->callback_atom_add_from_treshold(l_chain, NULL)) + log_it(L_DEBUG, "Added atom from treshold"); + } } else { //dap_chain_save_all( l_chain ); log_it (L_NOTICE, "Initialized chain files"); @@ -2206,23 +2211,11 @@ bool s_net_load(void *a_arg) l_chain->atom_num_last = 0; l_chain = l_chain->next; } - // Process thresholds if any - bool l_processed; - do { - l_processed = false; - DL_FOREACH(l_net->pub.chains, l_chain) { - if (l_chain->callback_atom_add_from_treshold) { - while (l_chain->callback_atom_add_from_treshold(l_chain, NULL)) { - log_it(L_DEBUG, "Added atom from treshold"); - l_processed = true; - } - } - } - } while (l_processed); + l_net_pvt->load_mode = false; + dap_leger_load_end(l_net->pub.ledger); // Do specific role actions post-chain created l_net_pvt->state_target = NET_STATE_OFFLINE; - switch ( l_net_pvt->node_role.enums ) { case NODE_ROLE_ROOT_MASTER:{ // Set to process everything in datum pool @@ -2263,8 +2256,6 @@ bool s_net_load(void *a_arg) log_it(L_INFO,"Light node role established"); } - - l_net_pvt->load_mode = false; l_net_pvt->balancer_type = dap_config_get_item_bool_default(l_net->pub.config, "general", "use_dns_links", false); diff --git a/modules/net/dap_chain_net_decree.c b/modules/net/dap_chain_net_decree.c index f8ae4a95ce..7dc38736df 100644 --- a/modules/net/dap_chain_net_decree.c +++ b/modules/net/dap_chain_net_decree.c @@ -131,7 +131,7 @@ static int s_decree_verify(dap_chain_net_t *a_net, dap_chain_datum_decree_t *a_d return -122; } - decree_table_t **l_decrees = dap_chain_net_get_decrees(a_net), *l_sought_decree; + decree_table_t **l_decrees = dap_chain_net_get_decrees(a_net), *l_sought_decree = NULL; HASH_FIND(hh, *l_decrees, a_decree_hash, sizeof(dap_hash_fast_t), l_sought_decree); if (l_sought_decree && l_sought_decree->decree) { log_it(L_WARNING, "Decree with hash %s is already present", dap_hash_fast_to_str_static(a_decree_hash)); @@ -243,7 +243,7 @@ int dap_chain_net_decree_apply(dap_hash_fast_t *a_decree_hash, dap_chain_datum_d return -108; } - decree_table_t **l_decrees = dap_chain_net_get_decrees(l_net), *l_new_decree; + decree_table_t **l_decrees = dap_chain_net_get_decrees(l_net), *l_new_decree = NULL; HASH_FIND(hh, *l_decrees, a_decree_hash, sizeof(dap_hash_fast_t), l_new_decree); if (!l_new_decree) { l_new_decree = DAP_NEW_Z(decree_table_t); @@ -327,7 +327,7 @@ int dap_chain_net_decree_reset_applied(dap_chain_net_t *a_net, dap_chain_hash_fa { if (!a_net || !a_decree_hash) return -1; - decree_table_t **l_decrees = dap_chain_net_get_decrees(a_net), *l_sought_decree; + decree_table_t **l_decrees = dap_chain_net_get_decrees(a_net), *l_sought_decree = NULL; HASH_FIND(hh, *l_decrees, a_decree_hash, sizeof(dap_hash_fast_t), l_sought_decree); if (!l_sought_decree) return -2; @@ -337,7 +337,7 @@ int dap_chain_net_decree_reset_applied(dap_chain_net_t *a_net, dap_chain_hash_fa dap_chain_datum_decree_t *dap_chain_net_decree_get_by_hash(dap_chain_net_t *a_net, dap_hash_fast_t *a_hash, bool *is_applied) { - decree_table_t **l_decrees = dap_chain_net_get_decrees(a_net), *l_sought_decree; + decree_table_t **l_decrees = dap_chain_net_get_decrees(a_net), *l_sought_decree = NULL; HASH_FIND(hh, *l_decrees, a_hash, sizeof(dap_hash_fast_t), l_sought_decree); return ( !l_sought_decree || !l_sought_decree->decree ) ? NULL diff --git a/modules/net/dap_chain_node.c b/modules/net/dap_chain_node.c index 1603d8fdbf..eebf0a96a1 100644 --- a/modules/net/dap_chain_node.c +++ b/modules/net/dap_chain_node.c @@ -268,12 +268,6 @@ bool dap_chain_node_mempool_process(dap_chain_t *a_chain, dap_chain_datum_t *a_d return false; } int l_verify_datum = dap_chain_net_verify_datum_for_add(a_chain, a_datum, &l_datum_hash); - 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_NOT_ENOUGH_SIGNS && - l_verify_datum != DAP_CHAIN_CS_VERIFY_CODE_NO_DECREE) - return true; if (!l_verify_datum #ifdef DAP_TPS_TEST || l_verify_datum == DAP_CHAIN_CS_VERIFY_CODE_TX_NO_PREVIOUS @@ -282,6 +276,12 @@ bool dap_chain_node_mempool_process(dap_chain_t *a_chain, dap_chain_datum_t *a_d { a_chain->callback_add_datums(a_chain, &a_datum, 1); } + 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_NOT_ENOUGH_SIGNS && + l_verify_datum != DAP_CHAIN_CS_VERIFY_CODE_NO_DECREE) + return true; return false; } diff --git a/modules/net/dap_chain_node_cli_cmd_tx.c b/modules/net/dap_chain_node_cli_cmd_tx.c index e988cb3ed5..adca25fca8 100644 --- a/modules/net/dap_chain_node_cli_cmd_tx.c +++ b/modules/net/dap_chain_node_cli_cmd_tx.c @@ -943,7 +943,7 @@ int com_ledger(int a_argc, char ** a_argv, void **reply) if(l_cmd == CMD_LIST){ enum {SUBCMD_NONE, SUBCMD_LIST_COIN, SUB_CMD_LIST_LEDGER_THRESHOLD, SUB_CMD_LIST_LEDGER_BALANCE, SUB_CMD_LIST_LEDGER_THRESHOLD_WITH_HASH}; int l_sub_cmd = SUBCMD_NONE; - dap_chain_hash_fast_t l_tx_threshold_hash; + dap_chain_hash_fast_t l_tx_threshold_hash = {}; const char *l_limit_str = NULL; const char *l_offset_str = NULL; if (dap_cli_server_cmd_find_option_val(a_argv, 2, 3, "coins", NULL )) @@ -981,21 +981,21 @@ int com_ledger(int a_argc, char ** a_argv, void **reply) dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_LEDGER_LACK_ERR, "Can't get ledger for net %s", l_net_str); return DAP_CHAIN_NODE_CLI_COM_LEDGER_LACK_ERR; } - if (l_sub_cmd == SUB_CMD_LIST_LEDGER_THRESHOLD){ - json_object* json_obj_out = dap_ledger_threshold_info(l_ledger, l_limit, l_offset); + if (l_sub_cmd == SUB_CMD_LIST_LEDGER_THRESHOLD) { + json_object* json_obj_out = dap_ledger_threshold_info(l_ledger, l_limit, l_offset, NULL); if (json_obj_out){ json_object_array_add(*json_arr_reply, json_obj_out); } return 0; } - if (l_sub_cmd == SUB_CMD_LIST_LEDGER_THRESHOLD_WITH_HASH){ - json_object *json_obj_out = dap_ledger_threshold_hash_info(l_ledger, &l_tx_threshold_hash, l_limit, l_offset); + if (l_sub_cmd == SUB_CMD_LIST_LEDGER_THRESHOLD_WITH_HASH) { + json_object *json_obj_out = dap_ledger_threshold_info(l_ledger, 0, 0, &l_tx_threshold_hash); if (json_obj_out){ json_object_array_add(*json_arr_reply, json_obj_out); } return 0; } - if (l_sub_cmd == SUB_CMD_LIST_LEDGER_BALANCE){ + if (l_sub_cmd == SUB_CMD_LIST_LEDGER_BALANCE) { json_object *json_obj_out = dap_ledger_balance_info(l_ledger, l_limit, l_offset); if (json_obj_out){ json_object_array_add(*json_arr_reply, json_obj_out); diff --git a/modules/net/dap_chain_node_dns_server.c b/modules/net/dap_chain_node_dns_server.c index 3a14319538..9b70440eb0 100644 --- a/modules/net/dap_chain_node_dns_server.c +++ b/modules/net/dap_chain_node_dns_server.c @@ -49,7 +49,7 @@ static char s_root_alias[] = "dnsroot"; * @return 0 if success, else return error code */ int dap_dns_zone_register(char *zone, dap_dns_zone_callback_t callback) { - dap_dns_zone_hash_t *new_zone; + dap_dns_zone_hash_t *new_zone = NULL; HASH_FIND_STR(s_dns_server->hash_table, zone, new_zone); if (new_zone == NULL) { // zone is not present DAP_NEW_Z_RET_VAL(new_zone, dap_dns_zone_hash_t, DNS_ERROR_FAILURE, NULL); @@ -66,7 +66,7 @@ int dap_dns_zone_register(char *zone, dap_dns_zone_callback_t callback) { * @return 0 if success, else return error code */ int dap_dns_zone_unregister(char *zone) { - dap_dns_zone_hash_t *asked_zone; + dap_dns_zone_hash_t *asked_zone = NULL; HASH_FIND_STR(s_dns_server->hash_table, zone, asked_zone); if (asked_zone == NULL) { return DNS_ERROR_NAME; @@ -83,7 +83,7 @@ int dap_dns_zone_unregister(char *zone) { * @return Callback for registered DNS zone, else return NULL */ dap_dns_zone_callback_t dap_dns_zone_find(char *hostname) { - dap_dns_zone_hash_t *asked_zone; + dap_dns_zone_hash_t *asked_zone = NULL; HASH_FIND_STR(s_dns_server->hash_table, hostname, asked_zone); if (asked_zone == NULL) { if (!strcmp(hostname, &s_root_alias[0])) { diff --git a/modules/net/include/dap_chain_ledger.h b/modules/net/include/dap_chain_ledger.h index b54200afe3..c81920485e 100644 --- a/modules/net/include/dap_chain_ledger.h +++ b/modules/net/include/dap_chain_ledger.h @@ -89,11 +89,11 @@ typedef enum dap_ledger_check_error { DAP_LEDGER_TX_CHECK_NOT_ENOUGH_FEE, DAP_LEDGER_TX_CHECK_NOT_ENOUGH_TAX, /* Emisssion check return codes */ - DAP_LEDGER_EMISSION_CHECK_THRESHOLDED, - DAP_LEDGER_EMISSION_CHECK_THRESHOLD_OVERFLOW, DAP_LEDGER_EMISSION_CHECK_VALUE_EXCEEDS_CURRENT_SUPPLY, + DAP_LEDGER_EMISSION_CHECK_LEGACY_FORBIDDEN, /* Token declaration/update return codes */ DAP_LEDGER_TOKEN_ADD_CHECK_NOT_ENOUGH_UNIQUE_SIGNS, + DAP_LEDGER_TOKEN_ADD_CHECK_LEGACY_FORBIDDEN, DAP_LEDGER_TOKEN_ADD_CHECK_TSD_INVALID_SUPPLY, DAP_LEDGER_TOKEN_ADD_CHECK_TSD_INVALID_ADDR, DAP_LEDGER_TOKEN_ADD_CHECK_TSD_ADDR_MISMATCH, @@ -145,11 +145,11 @@ DAP_STATIC_INLINE const char *dap_ledger_check_error_str(dap_ledger_check_error_ case DAP_LEDGER_TX_CHECK_NOT_ENOUGH_FEE: return "Not enough network fee for transaction processing"; case DAP_LEDGER_TX_CHECK_NOT_ENOUGH_TAX: return "Not enough sovereign tax provided with current transaction"; /* Emisssion check return codes */ - case DAP_LEDGER_EMISSION_CHECK_THRESHOLDED: return "No token ticker found for emission, move it to the threshold"; - case DAP_LEDGER_EMISSION_CHECK_THRESHOLD_OVERFLOW: return "Emissions threshold overfulled"; case DAP_LEDGER_EMISSION_CHECK_VALUE_EXCEEDS_CURRENT_SUPPLY: return "Value of emission execeeds current token supply"; + case DAP_LEDGER_EMISSION_CHECK_LEGACY_FORBIDDEN: return "Legacy type of emissions are present for old chains comliance only"; /* Token declaration/update return codes */ case DAP_LEDGER_TOKEN_ADD_CHECK_NOT_ENOUGH_UNIQUE_SIGNS: return "Not all token signs is unique"; + case DAP_LEDGER_TOKEN_ADD_CHECK_LEGACY_FORBIDDEN: return "Legacy type of tokens are present for old chains comliance only"; case DAP_LEDGER_TOKEN_ADD_CHECK_TSD_INVALID_SUPPLY: return "Specified supply must be greater than current one"; case DAP_LEDGER_TOKEN_ADD_CHECK_TSD_INVALID_ADDR: return "Specified address has invalid format"; case DAP_LEDGER_TOKEN_ADD_CHECK_TSD_ADDR_MISMATCH: return "Specified address can't be processed cause double (for adding) or absent (for removing)"; @@ -179,6 +179,9 @@ typedef enum dap_chain_tx_tag_action_type { DAP_CHAIN_TX_TAG_ACTION_EXTEND = 1 << 8, DAP_CHAIN_TX_TAG_ACTION_CHANGE = 1 << 9, DAP_CHAIN_TX_TAG_ACTION_CLOSE = 1 << 10, + + DAP_CHAIN_TX_TAG_ACTION_VOTING = 1 << 11, + DAP_CHAIN_TX_TAG_ACTION_VOTE = 1 << 12, DAP_CHAIN_TX_TAG_ACTION_ALL = ~0, @@ -221,6 +224,8 @@ typedef bool (*dap_ledger_tag_check_callback_t)(dap_ledger_t *a_ledger, dap_chai #define DAP_LEDGER_MAPPED 0x0400 +#define DAP_LEDGER_THRESHOLD_ENABLED 0x0800 + // Error code for no previous transaction (for stay in mempool) #define DAP_CHAIN_CS_VERIFY_CODE_TX_NO_PREVIOUS DAP_LEDGER_TX_CHECK_PREV_TX_NOT_FOUND // Error code for no emission for a transaction (for stay in mempool) @@ -296,8 +301,7 @@ json_object *dap_ledger_token_info_by_name(dap_ledger_t *a_ledger, const char *a // Get all token-declarations dap_list_t* dap_ledger_token_decl_all(dap_ledger_t *a_ledger); -json_object *dap_ledger_threshold_info(dap_ledger_t *a_ledger, size_t a_limit, size_t a_offset); -json_object *dap_ledger_threshold_hash_info(dap_ledger_t *a_ledger, dap_chain_hash_fast_t *l_tx_treshold_hash, size_t a_limit, size_t a_offset); +json_object *dap_ledger_threshold_info(dap_ledger_t *a_ledger, size_t a_limit, size_t a_offset, dap_hash_fast_t *a_threshold_hash); json_object *dap_ledger_balance_info(dap_ledger_t *a_ledger, size_t a_limit, size_t a_offset); size_t dap_ledger_token_get_auth_signs_valid(dap_ledger_t *a_ledger, const char *a_token_ticker); @@ -308,8 +312,7 @@ uint256_t dap_ledger_token_get_emission_rate(dap_ledger_t *a_ledger, const char /** * Add token emission datum */ -int dap_ledger_token_emission_add(dap_ledger_t *a_ledger, byte_t *a_token_emission, size_t a_token_emission_size, - dap_hash_fast_t *a_emission_hash, bool a_from_threshold); +int dap_ledger_token_emission_add(dap_ledger_t *a_ledger, byte_t *a_token_emission, size_t a_token_emission_size, dap_hash_fast_t *a_emission_hash); int dap_ledger_token_emission_load(dap_ledger_t *a_ledger, byte_t *a_token_emission, size_t a_token_emission_size, dap_hash_fast_t *a_token_emission_hash); // Checking a new transaction before adding to the cache @@ -443,3 +446,4 @@ void dap_ledger_bridged_tx_notify_add(dap_ledger_t *a_ledger, dap_ledger_bridged bool dap_ledger_cache_enabled(dap_ledger_t *a_ledger); void dap_ledger_set_cache_tx_check_callback(dap_ledger_t *a_ledger, dap_ledger_cache_tx_check_callback_t a_callback); dap_chain_tx_out_cond_t* dap_chain_ledger_get_tx_out_cond_linked_to_tx_in_cond(dap_ledger_t *a_ledger, dap_chain_tx_in_cond_t *a_in_cond); +void dap_leger_load_end(dap_ledger_t *a_ledger); diff --git a/modules/net/srv/dap_chain_net_srv.c b/modules/net/srv/dap_chain_net_srv.c index 8e55f3f317..af936ef8a2 100644 --- a/modules/net/srv/dap_chain_net_srv.c +++ b/modules/net/srv/dap_chain_net_srv.c @@ -1019,7 +1019,7 @@ void dap_chain_net_srv_del(dap_chain_net_srv_t *a_srv) // sanity check dap_return_if_pass(!a_srv); // func work - service_list_t *l_sdata; + service_list_t *l_sdata = NULL; // delete srv from hash table pthread_mutex_lock(&s_srv_list_mutex); HASH_FIND(hh, s_srv_list, a_srv, sizeof(dap_chain_net_srv_uid_t), l_sdata); diff --git a/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c b/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c index cd25bbb34f..f432b73eee 100644 --- a/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c +++ b/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c @@ -274,7 +274,7 @@ static int s_stake_verificator_callback(dap_ledger_t *a_ledger, dap_chain_tx_out } if (a_tx_in->header.ts_created < 1706227200) // Jan 26 2024 00:00:00 GMT, old policy rules return 0; - dap_chain_net_srv_stake_item_t *l_stake; + dap_chain_net_srv_stake_item_t *l_stake = NULL; HASH_FIND(ht, l_srv_stake->tx_itemlist, l_prev_hash, sizeof(dap_hash_t), l_stake); if (l_stake) { log_it(L_WARNING, "Key is active with delegation decree, need to revoke it first"); @@ -576,7 +576,7 @@ static bool s_stake_cache_check_tx(dap_ledger_t *a_ledger, dap_hash_fast_t *a_tx { dap_chain_net_srv_stake_t *l_srv_stake = s_srv_stake_by_net_id(a_ledger->net->pub.id); dap_return_val_if_fail(l_srv_stake, false); - dap_chain_net_srv_stake_cache_item_t *l_stake; + dap_chain_net_srv_stake_cache_item_t *l_stake = NULL; HASH_FIND(hh, l_srv_stake->cache, a_tx_hash, sizeof(*a_tx_hash), l_stake); if (l_stake) { dap_chain_net_srv_stake_key_invalidate(&l_stake->signing_addr); @@ -2043,7 +2043,7 @@ static int s_cli_srv_stake_invalidate(int a_argc, char **a_argv, int a_arg_index dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified net have no stake service activated"); return -25; } - dap_chain_net_srv_stake_item_t *l_stake; + dap_chain_net_srv_stake_item_t *l_stake = NULL; HASH_FIND(hh, l_srv_stake->itemlist, &l_signing_addr.data.hash_fast, sizeof(dap_hash_fast_t), l_stake); if (!l_stake) { dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified certificate/pkey hash is not delegated nor this delegating is approved." @@ -2080,7 +2080,7 @@ static int s_cli_srv_stake_invalidate(int a_argc, char **a_argv, int a_arg_index dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified net have no stake service activated"); return -25; } - dap_chain_net_srv_stake_item_t *l_stake; + dap_chain_net_srv_stake_item_t *l_stake = NULL; HASH_FIND(ht, l_srv_stake->tx_itemlist, &l_tx_hash, sizeof(dap_hash_t), l_stake); if (l_stake) { char l_pkey_hash_str[DAP_HASH_FAST_STR_SIZE]; diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c index d2fc935816..b35ce03bed 100644 --- a/modules/type/blocks/dap_chain_cs_blocks.c +++ b/modules/type/blocks/dap_chain_cs_blocks.c @@ -2354,7 +2354,7 @@ static uint256_t s_callback_calc_reward(dap_chain_t *a_chain, dap_hash_fast_t *a { uint256_t l_ret = uint256_0; dap_chain_cs_blocks_t *l_blocks = DAP_CHAIN_CS_BLOCKS(a_chain); - dap_chain_block_cache_t *l_block_cache; + dap_chain_block_cache_t *l_block_cache = NULL; HASH_FIND(hh, PVT(l_blocks)->blocks, a_block_hash, sizeof(*a_block_hash), l_block_cache); if (!l_block_cache) return l_ret; @@ -2379,6 +2379,7 @@ static uint256_t s_callback_calc_reward(dap_chain_t *a_chain, dap_hash_fast_t *a return l_ret; } dap_hash_fast_t l_prev_block_hash = l_block_cache->prev_hash; + l_block_cache = NULL; HASH_FIND(hh, PVT(l_blocks)->blocks, &l_prev_block_hash, sizeof(l_prev_block_hash), l_block_cache); if (!l_block_cache) { log_it(L_ERROR, "l_block_cache is NULL"); @@ -2390,8 +2391,12 @@ static uint256_t s_callback_calc_reward(dap_chain_t *a_chain, dap_hash_fast_t *a return l_ret; } assert(l_block); - dap_time_t l_time_diff = l_block_time - dap_max(l_block->hdr.ts_created, DAP_REWARD_INIT_TIMESTAMP); - MULT_256_256(l_ret, GET_256_FROM_64(l_time_diff), &l_ret); + dap_time_t l_cur_time = dap_max(l_block->hdr.ts_created, DAP_REWARD_INIT_TIMESTAMP); + dap_time_t l_time_diff = l_block_time > l_cur_time ? l_block_time - l_cur_time : 1; + if (MULT_256_256(l_ret, GET_256_FROM_64(l_time_diff), &l_ret)) { + log_it(L_ERROR, "Integer overflow while multiplication execution to calculate final reward"); + return uint256_0; + } DIV_256(l_ret, GET_256_FROM_64(s_block_timediff_unit_size * l_signs_count), &l_ret); return l_ret; } diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c index 81c8c3552e..707c3a9a1a 100644 --- a/modules/type/dag/dap_chain_cs_dag.c +++ b/modules/type/dag/dap_chain_cs_dag.c @@ -529,10 +529,6 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha case 0: debug_if(s_debug_more, L_DEBUG, "... added"); break; - case DAP_CHAIN_CS_VERIFY_CODE_TX_NO_PREVIOUS: - case DAP_CHAIN_CS_VERIFY_CODE_TX_NO_EMISSION: - debug_if(s_debug_more, L_DEBUG, "... ledger tresholded"); - break; case DAP_CHAIN_DATUM_CA: debug_if(s_debug_more, L_DEBUG, "... DATUM_CA"); break; diff --git a/modules/wallet/dap_chain_wallet.c b/modules/wallet/dap_chain_wallet.c index 12f8fd9ac1..0336838aeb 100644 --- a/modules/wallet/dap_chain_wallet.c +++ b/modules/wallet/dap_chain_wallet.c @@ -107,7 +107,7 @@ int dap_chain_wallet_activate ( ) { int l_rc, l_rc2; -dap_chain_wallet_n_pass_t l_rec = {0}, *l_prec; +dap_chain_wallet_n_pass_t l_rec = {0}, *l_prec = NULL; dap_chain_wallet_t *l_wallet; char *c_wallets_path; @@ -204,7 +204,7 @@ int s_dap_chain_wallet_pass ( ) { int l_rc; -dap_chain_wallet_n_pass_t *l_prec; +dap_chain_wallet_n_pass_t *l_prec = NULL; struct timespec l_now; /* Sanity checks ... */ @@ -263,7 +263,7 @@ struct timespec l_now; int dap_chain_wallet_deactivate (const char *a_name, ssize_t a_name_len) { int l_rc, l_rc2; -dap_chain_wallet_n_pass_t *l_prec; +dap_chain_wallet_n_pass_t *l_prec = NULL; if ( a_name_len > DAP_WALLET$SZ_NAME ) return log_it(L_ERROR, "Wallet's name is too long (%d > %d)", (int) a_name_len, DAP_WALLET$SZ_NAME), -EINVAL; -- GitLab