From ee46625e37570f59ba4c26202a78332d45be63be Mon Sep 17 00:00:00 2001 From: Roman Khlopkov <roman.khlopkov@demlabs.net> Date: Wed, 5 Mar 2025 13:42:14 +0700 Subject: [PATCH] [*] Cond out list compound fix --- dap-sdk | 2 +- .../consensus/esbocs/dap_chain_cs_esbocs.c | 2 +- modules/net/dap_chain_ledger.c | 5 ++-- .../service/voting/dap_chain_net_srv_voting.c | 30 ++++++++++++------- .../voting/include/dap_chain_net_srv_voting.h | 1 + 5 files changed, 24 insertions(+), 16 deletions(-) diff --git a/dap-sdk b/dap-sdk index 3491640b76..a7b6da64ee 160000 --- a/dap-sdk +++ b/dap-sdk @@ -1 +1 @@ -Subproject commit 3491640b76de5715eb3936ccd377abd51d88b99e +Subproject commit a7b6da64ee24a3aba64dcbbd5f3f356069d853ad diff --git a/modules/consensus/esbocs/dap_chain_cs_esbocs.c b/modules/consensus/esbocs/dap_chain_cs_esbocs.c index dea80a38fd..c54ba27b9f 100644 --- a/modules/consensus/esbocs/dap_chain_cs_esbocs.c +++ b/modules/consensus/esbocs/dap_chain_cs_esbocs.c @@ -837,7 +837,7 @@ static dap_list_t *s_get_validators_list(dap_chain_esbocs_t *a_esbocs, dap_hash_ dap_chain_esbocs_pvt_t *l_esbocs_pvt = PVT(a_esbocs); dap_list_t *l_ret = NULL; dap_list_t *l_validators = NULL; - if (!l_esbocs_pvt->poa_mode) { + if (l_esbocs_pvt->poa_mode) { if (a_excluded_list_size) { l_validators = dap_chain_net_srv_stake_get_validators(a_esbocs->chain->net_id, false, NULL); uint16_t l_excluded_num = *a_excluded_list; diff --git a/modules/net/dap_chain_ledger.c b/modules/net/dap_chain_ledger.c index deaac956e7..49b6f840a8 100644 --- a/modules/net/dap_chain_ledger.c +++ b/modules/net/dap_chain_ledger.c @@ -5670,11 +5670,10 @@ dap_chain_tx_out_cond_t *dap_ledger_out_cond_unspent_find_by_addr(dap_ledger_t * l_iter_start = l_iter_start->hh.next; } else l_iter_start = l_ledger_pvt->ledger_items; - for (it = l_iter_start; it; it = it->hh.next) { + for (it = l_iter_start; it; it = it->hh.next, ret = NULL) { // If a_token is setup we check if its not our token - miss it if (*it->cache_data.token_ticker && dap_strcmp(it->cache_data.token_ticker, a_token)) continue; - ret = NULL; // Get 'out_cond' item from transaction byte_t *l_item; size_t l_size; int i, l_out_idx = 0; TX_ITEM_ITER_TX_TYPE(l_item, TX_ITEM_TYPE_OUT_ALL, l_size, i, it->tx) { @@ -5699,7 +5698,7 @@ dap_chain_tx_out_cond_t *dap_ledger_out_cond_unspent_find_by_addr(dap_ledger_t * continue; } // Get sign item from transaction - dap_chain_tx_sig_t *l_tx_sig = (dap_chain_tx_sig_t*) dap_chain_datum_tx_item_get(l_tx, NULL, NULL, TX_ITEM_TYPE_SIG, NULL); + dap_chain_tx_sig_t *l_tx_sig = (dap_chain_tx_sig_t *)dap_chain_datum_tx_item_get(l_tx, NULL, NULL, TX_ITEM_TYPE_SIG, NULL); // Get dap_sign_t from item dap_sign_t *l_sign = dap_chain_datum_tx_item_sign_get_sig(l_tx_sig); // compare public key in transaction with a_public_key diff --git a/modules/service/voting/dap_chain_net_srv_voting.c b/modules/service/voting/dap_chain_net_srv_voting.c index bc69703081..3e057d8856 100644 --- a/modules/service/voting/dap_chain_net_srv_voting.c +++ b/modules/service/voting/dap_chain_net_srv_voting.c @@ -394,7 +394,8 @@ static int s_vote_verificator(dap_ledger_t *a_ledger, dap_chain_tx_item_type_t a if (dap_strcmp(l_ticker_in, l_voting->voting_params.token_ticker)) continue; if (s_datum_tx_voting_coin_check_spent(a_ledger->net, l_vote_tx_item->voting_hash, - l_tx_in->header.tx_prev_hash, l_tx_in->header.tx_out_prev_idx, &l_pkey_hash)) { + l_tx_in->header.tx_prev_hash, l_tx_in->header.tx_out_prev_idx, + l_old_vote ? &l_pkey_hash : NULL)) { log_it(L_WARNING, "Coin with out number %u for tx %s is spent for votnig %s", l_tx_in->header.tx_out_prev_idx, dap_hash_fast_to_str_static(a_tx_hash), dap_hash_fast_to_str_static(&l_vote_tx_item->voting_hash)); return -20; @@ -426,7 +427,8 @@ static int s_vote_verificator(dap_ledger_t *a_ledger, dap_chain_tx_item_type_t a return -16; if (!dap_ledger_check_condition_owner(a_ledger, &l_hash, l_prev_out->header.subtype, l_out_idx, l_pkey_sign)) return -17; - if (s_datum_tx_voting_coin_check_cond_out(a_ledger->net, l_vote_tx_item->voting_hash, l_hash, l_out_idx, &l_pkey_hash)) + if (s_datum_tx_voting_coin_check_cond_out(a_ledger->net, l_vote_tx_item->voting_hash, l_hash, l_out_idx, + l_old_vote ? &l_pkey_hash : NULL)) return -15; if (SUM_256_256(l_weight, l_prev_out->header.value, &l_weight)) { log_it(L_WARNING, "Integer overflow while parsing vote tx %s", dap_chain_hash_fast_to_str_static(a_tx_hash)); @@ -830,10 +832,11 @@ static int s_cli_voting(int a_argc, char **a_argv, void **a_str_reply) } dap_hash_fast_t l_voting_hash = {}; - dap_chain_hash_fast_from_str(l_hash_str, &l_voting_hash); - + if (dap_chain_hash_fast_from_str(l_hash_str, &l_voting_hash)) { + dap_json_rpc_error_add(*json_arr_reply, DAP_CHAIN_NET_VOTE_VOTING_HASH_INVALID, "Hash string is not recognozed as hex of base58 hash"); + return -DAP_CHAIN_NET_VOTE_VOTING_HASH_INVALID; + } - dap_chain_hash_fast_t l_pkey_hash; dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-cert", &l_cert_name); dap_cert_t * l_cert = dap_cert_find_by_name(l_cert_name); if (l_cert_name){ @@ -1067,7 +1070,6 @@ static int s_cli_voting(int a_argc, char **a_argv, void **a_str_reply) const char *l_tw_coins, *l_tw_datoshi = dap_uint256_to_char(l_total_weight, &l_tw_coins); json_object_object_add(json_vote_out, "total_sum", json_object_new_string(l_tw_coins)); json_object_object_add(json_vote_out, "total_sum_datoshi", json_object_new_string(l_tw_datoshi)); - json_object_object_add(json_vote_out, "ticker", json_object_new_string(l_net->pub.native_ticker)); json_object_array_add(*json_arr_reply, json_vote_out); } break; default: @@ -1470,10 +1472,14 @@ int dap_chain_net_vote_voting(dap_cert_t *a_cert, uint256_t a_fee, dap_chain_wal } else l_pkey_hash = l_addr_from->data.hash_fast; + bool l_vote_changed = false; for (dap_list_t *it = l_voting->votes; it; it = it->next) - if (dap_hash_fast_compare(&((dap_chain_net_vote_t *)it->data)->pkey_hash, &l_pkey_hash) && - !l_voting->voting_params.vote_changing_allowed) - return DAP_CHAIN_NET_VOTE_VOTING_DOES_NOT_ALLOW_CHANGE_YOUR_VOTE; + if (dap_hash_fast_compare(&((dap_chain_net_vote_t *)it->data)->pkey_hash, &l_pkey_hash)) { + if (!l_voting->voting_params.vote_changing_allowed) + return DAP_CHAIN_NET_VOTE_VOTING_DOES_NOT_ALLOW_CHANGE_YOUR_VOTE; + l_vote_changed = true; + break; + } const char *l_token_ticker = l_voting->voting_params.token_ticker; uint256_t l_net_fee = {}, l_total_fee = a_fee, l_value_transfer, l_fee_transfer; @@ -1495,7 +1501,8 @@ int dap_chain_net_vote_voting(dap_cert_t *a_cert, uint256_t a_fee, dap_chain_wal dap_list_t *it, *tmp; DL_FOREACH_SAFE(l_list_used_out, it, tmp) { dap_chain_tx_used_out_item_t *l_out = (dap_chain_tx_used_out_item_t *)it->data; - if (s_datum_tx_voting_coin_check_spent(a_net, a_hash, l_out->tx_hash_fast, l_out->num_idx_out, &l_pkey_hash)) { + if (s_datum_tx_voting_coin_check_spent(a_net, a_hash, l_out->tx_hash_fast, l_out->num_idx_out, + l_vote_changed ? &l_pkey_hash : NULL)) { l_list_used_out = dap_list_delete_link(l_list_used_out, it); continue; } @@ -1547,7 +1554,8 @@ int dap_chain_net_vote_voting(dap_cert_t *a_cert, uint256_t a_fee, dap_chain_wal dap_list_t *l_outs = dap_ledger_get_list_tx_cond_outs(l_ledger, DAP_CHAIN_TX_OUT_COND_SUBTYPE_ALL, l_token_ticker, l_addr_from); for (dap_list_t *it = l_outs; it; it = it->next) { dap_chain_tx_used_out_item_t *l_out_item = (dap_chain_tx_used_out_item_t *)it->data; - if (s_datum_tx_voting_coin_check_cond_out(a_net, a_hash, l_out_item->tx_hash_fast, l_out_item->num_idx_out, &l_pkey_hash) != 0) + if (s_datum_tx_voting_coin_check_cond_out(a_net, a_hash, l_out_item->tx_hash_fast, l_out_item->num_idx_out, + l_vote_changed ? &l_pkey_hash : NULL) != 0) continue; dap_chain_tx_tsd_t *l_item = dap_chain_datum_voting_vote_tx_cond_tsd_create(l_out_item->tx_hash_fast, l_out_item->num_idx_out); if(!l_item){ diff --git a/modules/service/voting/include/dap_chain_net_srv_voting.h b/modules/service/voting/include/dap_chain_net_srv_voting.h index 8c61bc51d1..7efdd2d656 100644 --- a/modules/service/voting/include/dap_chain_net_srv_voting.h +++ b/modules/service/voting/include/dap_chain_net_srv_voting.h @@ -125,6 +125,7 @@ enum DAP_CHAIN_NET_VOTE_VOTING_ERROR{ DAP_CHAIN_NET_VOTE_VOTING_NET_PARAM_MISSING, DAP_CHAIN_NET_VOTE_VOTING_NET_PARAM_NOT_VALID, DAP_CHAIN_NET_VOTE_VOTING_HASH_NOT_FOUND, + DAP_CHAIN_NET_VOTE_VOTING_HASH_INVALID, DAP_CHAIN_NET_VOTE_VOTING_CAN_NOT_FIND_CERT, DAP_CHAIN_NET_VOTE_VOTING_FEE_PARAM_NOT_VALID, DAP_CHAIN_NET_VOTE_VOTING_FEE_PARAM_BAD_TYPE, -- GitLab