diff --git a/dap-sdk b/dap-sdk index c5e865f2c9bfbc6a8770525d40bd1834c142e190..648afd3a17e1f0705740641d007e396a72f24cc0 160000 --- a/dap-sdk +++ b/dap-sdk @@ -1 +1 @@ -Subproject commit c5e865f2c9bfbc6a8770525d40bd1834c142e190 +Subproject commit 648afd3a17e1f0705740641d007e396a72f24cc0 diff --git a/modules/chain/include/dap_chain_srv.h b/modules/chain/include/dap_chain_srv.h index 0586bef145df59b680eb0e617eb202890632e1d6..beff7340011130ff7347372d5ab6f9a9008d0998 100644 --- a/modules/chain/include/dap_chain_srv.h +++ b/modules/chain/include/dap_chain_srv.h @@ -29,9 +29,9 @@ along with any CellFrame SDK based project. If not, see <http://www.gnu.org/lic #include "dap_tsd.h" // System services literlas -#define DAP_CHAIN_NET_SRV_STAKE_POS_DELEGATE_LITERAL "PoS-delegate" -#define DAP_CHAIN_NET_SRV_XCHANGE_LITERAL "eXchange" -#define DAP_CHAIN_NET_SRV_VOTING_LITERAL "voting" +#define DAP_CHAIN_SRV_STAKE_POS_DELEGATE_LITERAL "PoS-delegate" +#define DAP_CHAIN_SRV_XCHANGE_LITERAL "eXchange" +#define DAP_CHAIN_SRV_VOTING_LITERAL "voting" // Start service callback typedef void * (*dap_chain_srv_callback_start_t)(dap_chain_net_id_t a_net_id, dap_config_t *a_config); diff --git a/modules/consensus/esbocs/dap_chain_cs_esbocs.c b/modules/consensus/esbocs/dap_chain_cs_esbocs.c index 2a3f3dc54942cbd6a0eb82a4d6c3487bd44fe349..611790de845589be9857ab5be6d0027be41dedb5 100644 --- a/modules/consensus/esbocs/dap_chain_cs_esbocs.c +++ b/modules/consensus/esbocs/dap_chain_cs_esbocs.c @@ -886,7 +886,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) { // UNDO after debug 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; @@ -1345,6 +1345,7 @@ static int s_signs_sort_callback(dap_list_t *a_sign1, dap_list_t *a_sign2) static bool s_session_directive_ready(dap_chain_esbocs_session_t *a_session, bool *a_kick, dap_chain_addr_t *a_signing_addr) { + bool l_ready = false, l_kick = false; dap_chain_esbocs_penalty_item_t *l_item, *l_tmp; HASH_ITER(hh, a_session->penalty, l_item, l_tmp) { int l_key_state = dap_chain_net_srv_stake_key_delegated(&l_item->signing_addr); @@ -1354,17 +1355,15 @@ static bool s_session_directive_ready(dap_chain_esbocs_session_t *a_session, boo continue; } if (l_item->miss_count >= DAP_CHAIN_ESBOCS_PENALTY_KICK && l_key_state == 1) { - *a_kick = true; - *a_signing_addr = l_item->signing_addr; - return true; + l_ready = l_kick = true; + break; } if (l_item->miss_count == 0 && l_key_state == -1) { - *a_kick = false; - *a_signing_addr = l_item->signing_addr; - return true; + l_ready = true; + break; } } - if (l_item) { + if (l_ready) { size_t l_list_length = dap_list_length(a_session->cur_round.all_validators); if (a_session->cur_round.total_validators_synced * 3 < l_list_length * 2) { log_it(L_INFO, "Not enough validators online for directive, %u * 3 < %zu * 2", @@ -1374,6 +1373,7 @@ static bool s_session_directive_ready(dap_chain_esbocs_session_t *a_session, boo debug_if(PVT(a_session->esbocs)->debug, L_MSG, "Current consensus online %hu from %zu is acceptable, so issue the directive", a_session->cur_round.total_validators_synced, l_list_length); *a_signing_addr = l_item->signing_addr; + *a_kick = l_kick; return true; } else return false; diff --git a/modules/ledger/dap_chain_ledger_decree.c b/modules/ledger/dap_chain_ledger_decree.c index 3b47512e2563a2daa175bbea0a7aeced91e9b3f7..1e692d3beb198cdc5d79a1df4776317133563a73 100644 --- a/modules/ledger/dap_chain_ledger_decree.c +++ b/modules/ledger/dap_chain_ledger_decree.c @@ -404,7 +404,8 @@ const char *l_ban_addr; break; dap_chain_net_srv_stake_key_delegate(a_net, &l_addr, a_decree, l_value, &l_node_addr, dap_chain_datum_decree_get_pkey(a_decree)); - dap_chain_net_srv_stake_add_approving_decree_info(a_decree, a_net); + if (!dap_chain_net_get_load_mode(a_net)) + dap_chain_net_srv_stake_add_approving_decree_info(a_decree, a_net); break; case DAP_CHAIN_DATUM_DECREE_COMMON_SUBTYPE_STAKE_PKEY_UPDATE: if (!a_anchored) diff --git a/modules/ledger/dap_chain_ledger_tx.c b/modules/ledger/dap_chain_ledger_tx.c index 631a9690f34d1a3f858059f26abad811bc6abc20..461f3dd75a6e3738658cae54cc1febba9f9ea8a3 100644 --- a/modules/ledger/dap_chain_ledger_tx.c +++ b/modules/ledger/dap_chain_ledger_tx.c @@ -106,7 +106,7 @@ typedef struct dap_ledger_cache_gdb_record { } DAP_ALIGN_PACKED dap_ledger_cache_gdb_record_t; static dap_ledger_tx_item_t *s_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 bool s_ledger_tx_hash_is_used_out_item(dap_ledger_tx_item_t *a_item, int a_idx_out, dap_hash_fast_t *a_out_spender_hash); +static bool s_ledger_tx_hash_is_used_out_item(dap_ledger_tx_item_t *a_item, uint32_t a_idx_out, dap_hash_fast_t *a_out_spender_hash); static 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); static dap_chain_datum_tx_t *s_tx_find_by_hash(dap_ledger_t *a_ledger, const dap_chain_hash_fast_t *a_tx_hash, dap_ledger_tx_item_t **a_item_out, bool a_unspent_only); @@ -1156,28 +1156,33 @@ int s_compare_trackers(dap_list_t *a_tracker1, dap_list_t *a_tracker2) return memcmp(&l_tracker1->voting_hash, &l_tracker2->voting_hash, sizeof(dap_hash_fast_t)); } -dap_list_t *s_trackers_aggregate(dap_ledger_t *a_ledger, dap_list_t *a_trackers, dap_list_t *a_added, dap_time_t a_ts_creation_time) +dap_list_t *s_trackers_aggregate(dap_ledger_t *a_ledger, dap_list_t *a_trackers, dap_list_t **a_added, dap_time_t a_ts_creation_time) { - if (!s_voting_callbacks.voting_expire_callback) - return a_trackers; - for (dap_list_t *it = a_added; it; it = it->next) { + dap_return_val_if_fail(s_voting_callbacks.voting_expire_callback, a_trackers); + dap_list_t *it, *tmp; + DL_FOREACH_SAFE(*a_added, it, tmp) { dap_ledger_tracker_t *l_new_tracker = it->data; dap_time_t l_exp_time = s_voting_callbacks.voting_expire_callback(a_ledger, &l_new_tracker->voting_hash); - if (a_ts_creation_time > l_exp_time) - continue; // Do not move expired colour - dap_list_t *l_exists = dap_list_find(a_trackers, &l_new_tracker->voting_hash, s_compare_trackers); + if (a_ts_creation_time > l_exp_time) { + DL_DELETE(*a_added, it); + DAP_DEL_MULTY(it->data, it); + continue; // Remove expired colour + } + dap_list_t *l_exists = dap_list_find(a_trackers, &l_new_tracker->voting_hash, s_compare_trackers); struct tracker_mover *l_exists_tracker = NULL; if (l_exists) l_exists_tracker = l_exists->data; else { l_exists_tracker = DAP_NEW_Z_RET_VAL_IF_FAIL(struct tracker_mover, a_trackers); - a_trackers = dap_list_append(a_trackers, l_exists_tracker); + l_exists_tracker->voting_hash = l_new_tracker->voting_hash; } if (SUM_256_256(l_exists_tracker->colored_value, l_new_tracker->colored_value, &l_exists_tracker->colored_value)) { log_it(L_ERROR, "Tracking value overflow, can't track voting %s anymore", dap_hash_fast_to_str_static(&l_new_tracker->voting_hash)); return a_trackers; } l_exists_tracker->cur_value = l_exists_tracker->colored_value; + if (!l_exists) + a_trackers = dap_list_append(a_trackers, l_exists_tracker); } return a_trackers; } @@ -1280,9 +1285,18 @@ int dap_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_ha } l_ledger_cache_group = dap_ledger_get_gdb_group(a_ledger, DAP_LEDGER_TXS_STR); } - const char *l_cur_token_ticker = NULL; + + int l_err_num = 0; + if (s_voting_callbacks.voting_callback) { + if (l_action == DAP_CHAIN_TX_TAG_ACTION_VOTING) + l_err_num = s_voting_callbacks.voting_callback(a_ledger, TX_ITEM_TYPE_VOTING, a_tx, &l_tx_hash, true); + else if (l_action == DAP_CHAIN_TX_TAG_ACTION_VOTE) + l_err_num = s_voting_callbacks.voting_callback(a_ledger, TX_ITEM_TYPE_VOTE, a_tx, &l_tx_hash, true); + } + assert(!l_err_num); // Update balance: deducts + const char *l_cur_token_ticker = NULL; int l_spent_idx = 0; for (dap_list_t *it = l_list_bound_items; it; it = it->next) { dap_ledger_tx_bound_t *l_bound_item = it->data; @@ -1376,7 +1390,9 @@ int dap_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_ha dap_ledger_tx_item_t *l_prev_item_out = l_bound_item->prev_item; l_prev_item_out->out_metadata[l_bound_item->prev_out_idx].tx_spent_hash_fast = l_tx_hash; l_trackers_mover = s_trackers_aggregate(a_ledger, l_trackers_mover, - l_prev_item_out->out_metadata[l_bound_item->prev_out_idx].trackers, a_tx->header.ts_created); + &l_prev_item_out->out_metadata[l_bound_item->prev_out_idx].trackers, a_tx->header.ts_created); + if (l_prev_item_out->cache_data.flags & LEDGER_PVT_TX_META_FLAG_IMMUTABLE) // Clear trackers info for immutable tx's + dap_list_free_full(l_prev_item_out->out_metadata[l_bound_item->prev_out_idx].trackers, NULL); // add a used output l_prev_item_out->cache_data.n_outs_used++; if ( is_ledger_cached(l_ledger_pvt) ) { @@ -1402,22 +1418,7 @@ int dap_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_ha l_prev_item_out->cache_data.ts_spent = a_tx->header.ts_created; } - if (l_action == DAP_CHAIN_TX_TAG_ACTION_VOTE) { - dap_ledger_tracker_t *l_new_tracker = DAP_NEW_Z(dap_ledger_tracker_t); - if (!l_new_tracker) { - log_it(L_CRITICAL, "%s", c_error_memory_alloc); - l_ret = DAP_LEDGER_CHECK_NOT_ENOUGH_MEMORY; - goto FIN; - } - dap_chain_tx_vote_t *l_vote_tx_item = (dap_chain_tx_vote_t *)dap_chain_datum_tx_item_get(a_tx, NULL, NULL, TX_ITEM_TYPE_VOTE, NULL); - assert(l_vote_tx_item); - l_new_tracker->voting_hash = l_vote_tx_item->voting_hash; - dap_list_t *l_new_vote = dap_list_append(NULL, l_new_tracker); - l_trackers_mover = s_trackers_aggregate(a_ledger, l_trackers_mover, l_new_vote, a_tx->header.ts_created); - } - //Update balance : raise - bool l_multichannel = false; bool l_cross_network = false; uint32_t l_outs_count = 0; uint256_t l_native_value = {}; @@ -1434,7 +1435,8 @@ int dap_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_ha pthread_rwlock_unlock(&s_verificators_rwlock); if (l_verificator && l_verificator->callback_out_add) l_verificator->callback_out_add(a_ledger, a_tx, &l_tx_hash, l_cond); - SUM_256_256(l_native_value, l_cond->header.value, &l_native_value); + if (!dap_strcmp(l_main_token_ticker, a_ledger->net->pub.native_ticker)) + SUM_256_256(l_native_value, l_cond->header.value, &l_native_value); continue; // balance raise will be with next conditional transaction } @@ -1458,7 +1460,6 @@ int dap_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_ha l_addr = &l_out_item_ext_256->addr; l_value = l_out_item_ext_256->header.value; l_cur_token_ticker = l_out_item_ext_256->token; - l_multichannel = true; } break; default: log_it(L_ERROR, "Unknown item type %d", l_type); @@ -1479,8 +1480,6 @@ int dap_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_ha HASH_FIND_STR(PVT(a_ledger)->balance_accounts, l_wallet_balance_key, wallet_balance); pthread_rwlock_unlock(&l_ledger_pvt->balance_accounts_rwlock); if (wallet_balance) { - //if(g_debug_ledger) - // log_it(L_DEBUG, "Balance item is present in cache"); SUM_256_256(wallet_balance->balance, l_value, &wallet_balance->balance); DAP_DELETE (l_wallet_balance_key); // Update the cache @@ -1505,14 +1504,6 @@ 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); } } - int l_err_num = 0; - if (s_voting_callbacks.voting_callback) { - if (l_action == DAP_CHAIN_TX_TAG_ACTION_VOTING) - l_err_num = s_voting_callbacks.voting_callback(a_ledger, TX_ITEM_TYPE_VOTING, a_tx, &l_tx_hash, true); - else if (l_action == DAP_CHAIN_TX_TAG_ACTION_VOTE) - l_err_num = s_voting_callbacks.voting_callback(a_ledger, TX_ITEM_TYPE_VOTE, a_tx, &l_tx_hash, true); - } - assert(!l_err_num); // add transaction to the cache list dap_ledger_tx_item_t *l_tx_item = DAP_NEW_Z_SIZE(dap_ledger_tx_item_t, sizeof(dap_ledger_tx_item_t) + l_outs_count * sizeof(dap_ledger_tx_out_metadata_t)); @@ -1530,6 +1521,12 @@ int dap_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_ha dap_strncpy(l_tx_item->cache_data.token_ticker, l_main_token_ticker, sizeof(l_tx_item->cache_data.token_ticker)); // Moving colour to new outputs + dap_chain_tx_vote_t *l_vote_tx_item; + if (l_action == DAP_CHAIN_TX_TAG_ACTION_VOTE) { + l_vote_tx_item = (dap_chain_tx_vote_t *)dap_chain_datum_tx_item_get(a_tx, NULL, NULL, TX_ITEM_TYPE_VOTE, NULL); + assert(l_vote_tx_item); + } + bool l_multichannel = false; size_t i = 0; for (dap_list_t *it = l_list_tx_out; it; it = it->next, i++) { dap_chain_tx_item_type_t l_type = *(uint8_t *)it->data; @@ -1549,7 +1546,6 @@ int dap_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_ha dap_chain_tx_out_ext_t *l_out_item_ext_256 = (dap_chain_tx_out_ext_t *)it->data; l_value = l_out_item_ext_256->header.value; l_cur_token_ticker = l_out_item_ext_256->token; - l_multichannel = true; } break; case TX_ITEM_TYPE_OUT_COND: { // Update service items if any @@ -1561,12 +1557,31 @@ int dap_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_ha log_it(L_ERROR, "Unknown item type %d", l_type); break; } + if (!l_multichannel && dap_strcmp(l_main_token_ticker, l_cur_token_ticker)) + l_multichannel = true; if (dap_strcmp(a_ledger->net->pub.native_ticker, l_cur_token_ticker)) continue; + if (l_action == DAP_CHAIN_TX_TAG_ACTION_VOTE) { + dap_ledger_tracker_t *l_new_tracker = DAP_NEW_Z(dap_ledger_tracker_t); + if (!l_new_tracker) { + log_it(L_CRITICAL, "%s", c_error_memory_alloc); + l_ret = DAP_LEDGER_CHECK_NOT_ENOUGH_MEMORY; + goto FIN; + } + l_new_tracker->voting_hash = l_vote_tx_item->voting_hash; + l_new_tracker->colored_value = l_value; + l_tx_item->out_metadata[i].trackers = dap_list_append(l_tx_item->out_metadata[i].trackers, l_new_tracker); + } for (dap_list_t *mv = l_trackers_mover; mv; mv = mv->next) { struct tracker_mover *l_mover = mv->data; - if (IS_ZERO_256(l_mover->cur_value)) + if (IS_ZERO_256(l_mover->cur_value) || dap_hash_fast_is_blank(&l_mover->voting_hash)) { + log_it(L_ERROR, "Illegal tracker mover item detected"); continue; + } + if (l_action == DAP_CHAIN_TX_TAG_ACTION_VOTE && + dap_hash_fast_compare(&l_vote_tx_item->voting_hash, &l_mover->voting_hash)) + continue; // Don't move trackers for current vote voting + dap_ledger_tracker_t *l_tracker = DAP_NEW_Z(dap_ledger_tracker_t); if (!l_tracker) { log_it(L_CRITICAL, "%s", c_error_memory_alloc); @@ -1601,8 +1616,8 @@ int dap_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_ha l_tx_item->out_metadata[0].trackers = dap_list_append(l_tx_item->out_metadata[0].trackers, l_tsd->data); } } - - l_tx_item->cache_data.multichannel = l_multichannel; + if (l_multichannel) + l_tx_item->cache_data.flags |= LEDGER_PVT_TX_META_FLAG_MULTICHANNEL; l_tx_item->ts_added = dap_nanotime_now(); pthread_rwlock_wrlock(&l_ledger_pvt->ledger_rwlock); if (dap_chain_net_get_load_mode(a_ledger->net) || dap_chain_net_get_state(a_ledger->net) == NET_STATE_SYNC_CHAINS) @@ -1888,8 +1903,6 @@ int dap_ledger_tx_remove(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap HASH_FIND_STR(PVT(a_ledger)->balance_accounts, l_wallet_balance_key, wallet_balance); pthread_rwlock_unlock(&l_ledger_pvt->balance_accounts_rwlock); if (wallet_balance) { - //if(g_debug_ledger) - // log_it(L_DEBUG, "Balance item is present in cache"); SUBTRACT_256_256(wallet_balance->balance, l_value, &wallet_balance->balance); DAP_DELETE (l_wallet_balance_key); // Update the cache @@ -2061,7 +2074,7 @@ static dap_ledger_tx_item_t *s_tx_item_find_by_addr(dap_ledger_t *a_ledger, cons // If a_token is setup we check if its not our token - miss it if (a_token && *l_iter_current->cache_data.token_ticker && dap_strcmp(l_iter_current->cache_data.token_ticker, a_token) && - !l_iter_current->cache_data.multichannel) + !(l_iter_current->cache_data.flags & LEDGER_PVT_TX_META_FLAG_MULTICHANNEL)) continue; // Now work with it dap_chain_datum_tx_t *l_tx = l_iter_current->tx; @@ -2212,14 +2225,11 @@ dap_hash_fast_t dap_ledger_get_final_chain_tx_hash(dap_ledger_t *a_ledger, dap_c /** * Check whether used 'out' items (local function) */ -static bool s_ledger_tx_hash_is_used_out_item(dap_ledger_tx_item_t *a_item, int a_idx_out, dap_hash_fast_t *a_out_spender_hash) +static bool s_ledger_tx_hash_is_used_out_item(dap_ledger_tx_item_t *a_item, uint32_t a_idx_out, dap_hash_fast_t *a_out_spender_hash) { - if (!a_item || !a_item->cache_data.n_outs) { - //log_it(L_DEBUG, "list_cached_item is NULL"); - return true; - } + dap_return_val_if_fail(a_item && a_item->cache_data.n_outs, true); // if there are used 'out' items - if ((a_item->cache_data.n_outs_used > 0) && !dap_hash_fast_is_blank(&(a_item->out_metadata[a_idx_out].tx_spent_hash_fast))) { + if ((a_item->cache_data.n_outs_used >= a_idx_out) && !dap_hash_fast_is_blank(&(a_item->out_metadata[a_idx_out].tx_spent_hash_fast))) { if (a_out_spender_hash) *a_out_spender_hash = a_item->out_metadata[a_idx_out].tx_spent_hash_fast; return true; @@ -2237,11 +2247,21 @@ bool dap_ledger_tx_hash_is_used_out_item(dap_ledger_t *a_ledger, dap_chain_hash_ return l_item_out ? s_ledger_tx_hash_is_used_out_item(l_item_out, a_idx_out, a_out_spender) : true; } -uint256_t dap_ledger_coin_get_uncoloured_value(dap_ledger_t *a_ledger, dap_hash_fast_t *a_voting_hash, dap_hash_fast_t *a_tx_prev_hash, int a_out_idx) +dap_list_t *dap_ledger_tx_get_trackers(dap_ledger_t *a_ledger, dap_chain_hash_fast_t *a_tx_hash, uint32_t a_out_idx) { - dap_return_val_if_fail(a_ledger && a_voting_hash && a_tx_prev_hash, uint256_0); + dap_list_t *ret = NULL; dap_ledger_tx_item_t *l_item_out = NULL; - dap_chain_datum_tx_t *l_tx = s_tx_find_by_hash(a_ledger, a_tx_prev_hash, &l_item_out, false); + s_tx_find_by_hash(a_ledger, a_tx_hash, &l_item_out, false); + if (!l_item_out || l_item_out->cache_data.n_outs < a_out_idx) + return ret; + return l_item_out->out_metadata[a_out_idx].trackers; +} + +uint256_t dap_ledger_coin_get_uncoloured_value(dap_ledger_t *a_ledger, dap_hash_fast_t *a_voting_hash, dap_hash_fast_t *a_tx_hash, int a_out_idx) +{ + dap_return_val_if_fail(a_ledger && a_voting_hash && a_tx_hash, uint256_0); + dap_ledger_tx_item_t *l_item_out = NULL; + dap_chain_datum_tx_t *l_tx = s_tx_find_by_hash(a_ledger, a_tx_hash, &l_item_out, false); if (!l_item_out || l_item_out->cache_data.n_outs <= (uint32_t)a_out_idx || !dap_hash_fast_is_blank(&(l_item_out->out_metadata[a_out_idx].tx_spent_hash_fast))) return uint256_0; @@ -2281,8 +2301,11 @@ void dap_ledger_tx_clear_colour(dap_ledger_t *a_ledger, dap_hash_fast_t *a_tx_ha dap_return_if_fail(a_ledger && a_tx_hash); dap_ledger_tx_item_t *l_item_out = NULL; dap_chain_datum_tx_t *l_tx = s_tx_find_by_hash(a_ledger, a_tx_hash, &l_item_out, false); - if (!l_item_out) + if (!l_item_out) { + log_it(L_ERROR, "Cna't find ledger tx item for hash %s", dap_hash_fast_to_str_static(a_tx_hash)); return; + } + l_item_out->cache_data.flags |= LEDGER_PVT_TX_META_FLAG_IMMUTABLE; for (uint32_t i = 0; i < l_item_out->cache_data.n_outs; i++) { if (!dap_hash_fast_is_blank(&l_item_out->out_metadata[i].tx_spent_hash_fast)) { dap_list_free_full(l_item_out->out_metadata[i].trackers, NULL); @@ -2427,6 +2450,36 @@ static int s_compare_balances(dap_ledger_hardfork_balances_t *a_list1, dap_ledge return ret ? ret : memcmp(a_list1->ticker, a_list2->ticker, DAP_CHAIN_TICKER_SIZE_MAX); } + +int s_compare_trackers_hardfork(dap_list_t *a_tracker1, dap_list_t *a_tracker2) +{ + dap_ledger_tracker_t *l_tracker1 = a_tracker1->data, *l_tracker2 = a_tracker2->data; + return memcmp(&l_tracker1->voting_hash, &l_tracker2->voting_hash, sizeof(dap_hash_fast_t)); +} + +dap_list_t *s_trackers_aggregate_hardfork(dap_ledger_t *a_ledger, dap_list_t *a_trackers, dap_list_t *a_added, dap_time_t a_ts_creation_time) +{ + dap_return_val_if_fail(s_voting_callbacks.voting_expire_callback, a_trackers); + for (dap_list_t *it = a_added; it; it = it->next) { + dap_ledger_tracker_t *l_new_tracker = it->data; + dap_list_t *l_exists = dap_list_find(a_trackers, &l_new_tracker->voting_hash, s_compare_trackers_hardfork); + dap_ledger_tracker_t *l_exists_tracker = NULL; + if (l_exists) + l_exists_tracker = l_exists->data; + else { + l_exists_tracker = DAP_NEW_Z_RET_VAL_IF_FAIL(dap_ledger_tracker_t, a_trackers); + l_exists_tracker->voting_hash = l_new_tracker->voting_hash; + } + if (SUM_256_256(l_exists_tracker->colored_value, l_new_tracker->colored_value, &l_exists_tracker->colored_value)) { + log_it(L_ERROR, "Tracking value overflow, can't track voting %s anymore", dap_hash_fast_to_str_static(&l_new_tracker->voting_hash)); + return a_trackers; + } + if (!l_exists) + a_trackers = dap_list_append(a_trackers, l_exists_tracker); + } + return a_trackers; +} + static int s_aggregate_out(dap_ledger_hardfork_balances_t **a_out_list, dap_ledger_t *a_ledger, const char *a_ticker, dap_chain_addr_t *a_addr, uint256_t a_value, dap_time_t a_hardfork_start_time, @@ -2448,7 +2501,7 @@ static int s_aggregate_out(dap_ledger_hardfork_balances_t **a_out_list, dap_ledg dap_chain_addr_to_str_static(a_addr), a_ticker, dap_uint256_to_char(a_value, NULL)); return -2; } - l_exist->trackers = s_trackers_aggregate(a_ledger, l_exist->trackers, a_trackers, a_hardfork_start_time); + l_exist->trackers = s_trackers_aggregate_hardfork(a_ledger, l_exist->trackers, a_trackers, a_hardfork_start_time); return 0; } @@ -2463,7 +2516,7 @@ static int s_aggregate_out_cond(dap_ledger_hardfork_condouts_t **a_ret_list, dap return -1; } *l_new_condout = (dap_ledger_hardfork_condouts_t) { .hash = *a_tx_hash, .cond = a_out_cond, .sign = a_sign, .ticker = a_token_ticker }; - l_new_condout->trackers = s_trackers_aggregate(a_ledger, NULL, a_trackers, a_hardfork_start_time); + l_new_condout->trackers = s_trackers_aggregate_hardfork(a_ledger, NULL, a_trackers, a_hardfork_start_time); DL_APPEND(*a_ret_list, l_new_condout); return 0; } diff --git a/modules/ledger/include/dap_chain_ledger.h b/modules/ledger/include/dap_chain_ledger.h index 933b2486214ebca88d2d0760fe349d0789896788..771792c27298ee3e6b56c61283500aad1d19d995 100644 --- a/modules/ledger/include/dap_chain_ledger.h +++ b/modules/ledger/include/dap_chain_ledger.h @@ -516,7 +516,8 @@ dap_chain_datum_anchor_t *dap_ledger_anchor_find(dap_ledger_t *a_ledger, dap_has dap_ledger_hardfork_balances_t *dap_ledger_states_aggregate(dap_ledger_t *a_ledger, dap_time_t a_hardfork_decree_creation_time, dap_ledger_hardfork_condouts_t **l_cond_outs_list, json_object* a_changed_addrs); dap_ledger_hardfork_anchors_t *dap_ledger_anchors_aggregate(dap_ledger_t *a_ledger); -uint256_t dap_ledger_coin_get_uncoloured_value(dap_ledger_t *a_ledger, dap_hash_fast_t *a_voting_hash, dap_hash_fast_t *a_tx_prev_hash, int a_out_idx); +uint256_t dap_ledger_coin_get_uncoloured_value(dap_ledger_t *a_ledger, dap_hash_fast_t *a_voting_hash, dap_hash_fast_t *a_tx_hash, int a_out_idx); +dap_list_t *dap_ledger_tx_get_trackers(dap_ledger_t *a_ledger, dap_chain_hash_fast_t *a_tx_hash, uint32_t a_out_idx); void dap_ledger_tx_clear_colour(dap_ledger_t *a_ledger, dap_hash_fast_t *a_tx_hash); dap_pkey_t *dap_ledger_find_pkey_by_hash(dap_ledger_t *a_ledger, dap_chain_hash_fast_t *a_pkey_hash); dap_list_t *dap_ledger_decrees_get_by_type(dap_ledger_t *a_ledger, int a_type); diff --git a/modules/ledger/include/dap_chain_ledger_pvt.h b/modules/ledger/include/dap_chain_ledger_pvt.h index b94a9fb3ac0a2d822748a7c84b56660b3f328437..5932e43064a235eb73b436ba10536b4bcba967a4 100644 --- a/modules/ledger/include/dap_chain_ledger_pvt.h +++ b/modules/ledger/include/dap_chain_ledger_pvt.h @@ -23,7 +23,8 @@ #include "dap_chain_ledger.h" -#define MAX_OUT_ITEMS 10 +#define LEDGER_PVT_TX_META_FLAG_MULTICHANNEL BIT(1) +#define LEDGER_PVT_TX_META_FLAG_IMMUTABLE BIT(2) enum ledger_permissions { LEDGER_PERMISSION_RECEIVER_ALLOWED, @@ -104,7 +105,7 @@ typedef struct dap_ledger_tx_item { uint32_t n_outs; uint32_t n_outs_used; char token_ticker[DAP_CHAIN_TICKER_SIZE_MAX]; - byte_t multichannel; + byte_t flags; dap_time_t ts_spent; dap_chain_srv_uid_t tag; //tag (or service this tx is belong to) dap_chain_tx_tag_action_type_t action; diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index 0755a1b8688b34b3c92b03fe76d1fa33eac2392e..1cce569acc254d1938839639e282bd40c8ac8689 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -1920,33 +1920,10 @@ static int s_chains_init_all(dap_chain_net_t *a_net, const char *a_path, uint16_ return 0; } -int s_chain_net_preload(dap_chain_net_t *a_net) { - // Services register & configure - dap_chain_srv_start(a_net->pub.id, DAP_CHAIN_NET_SRV_XCHANGE_LITERAL, NULL); // Harcoded core service starting for exchange capability - dap_chain_srv_start(a_net->pub.id, DAP_CHAIN_NET_SRV_STAKE_POS_DELEGATE_LITERAL, NULL); // Harcoded core service starting for delegated keys storage - char *l_services_path = dap_strdup_printf("%s/network/%s/services", dap_config_path(), a_net->pub.name); - DIR *l_service_cfg_dir = opendir(l_services_path); - DAP_DELETE(l_services_path); - if (l_service_cfg_dir) { - for ( struct dirent *l_dir_entry; ( l_dir_entry = readdir(l_service_cfg_dir) ); ) { - const char *l_entry_name = l_dir_entry->d_name; - size_t l_entry_len = strlen(l_entry_name); - if (l_entry_len < 4 || // It has non zero name excluding file extension - strncmp(l_entry_name + l_entry_len - 4, ".cfg", 4) != 0) // its not a .cfg file - continue; - log_it(L_DEBUG, "Opening service config \"%s\"...", l_entry_name); - char *l_service_cfg_path = dap_strdup_printf("network/%s/services/%s", a_net->pub.name, l_entry_name); - dap_config_t *l_cfg_new = dap_config_open(l_service_cfg_path); - if (l_cfg_new) { - char l_service_name[l_entry_len - 3]; - dap_strncpy(l_service_name, l_entry_name, l_entry_len - 4); - dap_chain_srv_start(a_net->pub.id, l_service_name, l_cfg_new); - dap_config_close(l_cfg_new); - } - DAP_DELETE(l_service_cfg_path); - } - closedir(l_service_cfg_dir); - } +int s_chain_net_preload(dap_chain_net_t *a_net) +{ + dap_chain_srv_start(a_net->pub.id, DAP_CHAIN_SRV_STAKE_POS_DELEGATE_LITERAL, NULL); // Harcoded core service starting for delegated keys storage + uint16_t l_ledger_flags = 0; switch ( PVT( a_net )->node_role.enums ) { case NODE_ROLE_LIGHT: @@ -2035,6 +2012,33 @@ static void *s_net_load(void *a_arg) dap_chain_net_t *l_net = a_arg; dap_return_val_if_fail_err(l_net->pub.config, NULL, "Can't open network %s config", l_net->pub.name); + // Services register & configure + dap_chain_srv_start(l_net->pub.id, DAP_CHAIN_SRV_VOTING_LITERAL, NULL); // Harcoded core service starting for voting capability + dap_chain_srv_start(l_net->pub.id, DAP_CHAIN_SRV_XCHANGE_LITERAL, NULL); // Harcoded core service starting for exchange capability + char *l_services_path = dap_strdup_printf("%s/network/%s/services", dap_config_path(), l_net->pub.name); + DIR *l_service_cfg_dir = opendir(l_services_path); + DAP_DELETE(l_services_path); + if (l_service_cfg_dir) { + for ( struct dirent *l_dir_entry; ( l_dir_entry = readdir(l_service_cfg_dir) ); ) { + const char *l_entry_name = l_dir_entry->d_name; + size_t l_entry_len = strlen(l_entry_name); + if (l_entry_len < 4 || // It has non zero name excluding file extension + strncmp(l_entry_name + l_entry_len - 4, ".cfg", 4) != 0) // its not a .cfg file + continue; + log_it(L_DEBUG, "Opening service config \"%s\"...", l_entry_name); + char *l_service_cfg_path = dap_strdup_printf("network/%s/services/%s", l_net->pub.name, l_entry_name); + dap_config_t *l_cfg_new = dap_config_open(l_service_cfg_path); + if (l_cfg_new) { + char l_service_name[l_entry_len - 3]; + dap_strncpy(l_service_name, l_entry_name, l_entry_len - 4); + dap_chain_srv_start(l_net->pub.id, l_service_name, l_cfg_new); + dap_config_close(l_cfg_new); + } + DAP_DELETE(l_service_cfg_path); + } + closedir(l_service_cfg_dir); + } + dap_chain_net_pvt_t *l_net_pvt = PVT(l_net); l_net_pvt->balancer_type = dap_config_get_item_bool_default(l_net->pub.config, "general", "use_dns_links", false); char l_gdb_groups_mask[DAP_GLOBAL_DB_GROUP_NAME_SIZE_MAX]; @@ -2094,7 +2098,7 @@ static void *s_net_load(void *a_arg) l_net->pub.name, -3); dap_chain_net_add_auth_nodes_to_cluster(l_net, l_net_pvt->orders_cluster); // Common orders cluster - snprintf(l_gdb_groups_mask, sizeof(l_gdb_groups_mask), "%s.orders", l_net->pub.gdb_groups_prefix); + snprintf(l_gdb_groups_mask, sizeof(l_gdb_groups_mask), "%s.orders*", l_net->pub.gdb_groups_prefix); l_net_pvt->common_orders = dap_global_db_cluster_add(dap_global_db_instance_get_default(), l_net->pub.name, dap_guuid_compose(l_net->pub.id.uint64, 0), l_gdb_groups_mask, 0, true, diff --git a/modules/node-cli/dap_chain_node_cli.c b/modules/node-cli/dap_chain_node_cli.c index 39ad25015805e7e7e8571a04f5b4c61900b6a935..5d63e388b8dda05e75acaa38a7b9a8abbc18f0a5 100644 --- a/modules/node-cli/dap_chain_node_cli.c +++ b/modules/node-cli/dap_chain_node_cli.c @@ -340,7 +340,7 @@ int dap_chain_node_cli_init(dap_config_t * g_config) "\t -hardfork_from <atom_number>: start hardfork routine from specified block number\n" "\t -trusted_addrs <node_addr1,node_add2,...>: addresses of nodes who can provide service state datums for hardfork routine\n" "\t -addr_pairs <\"old_addr:new_addr\",\"old_addr1:new_addr1\"...>: blockchain addresses of wallets pairs moving balances from old_addr to new_addr with hardfork routine\n" - "\t -hardfork_complete: try to retry unsucsessful hardfork routine immediately\n" + "\t -hardfork_retry: try to retry unsucsessful hardfork routine immediately\n" "\t -hardfork_complete: finilize hardfork routine immediately\n" "\t -new_certs <certs_list>: sets new owners set for net\n" "\t -signs_verify <value>: sets minimum number of owners needed to sign decree\n\n" diff --git a/modules/node-cli/dap_chain_node_cli_cmd_tx.c b/modules/node-cli/dap_chain_node_cli_cmd_tx.c index 535e5608e879df63d789a91451d94f8c7a021087..023785c05e0501092fcb498fed1a3464a1eefc93 100644 --- a/modules/node-cli/dap_chain_node_cli_cmd_tx.c +++ b/modules/node-cli/dap_chain_node_cli_cmd_tx.c @@ -98,30 +98,51 @@ bool s_dap_chain_datum_tx_out_data(json_object* a_json_arr_reply, const char *l_description = dap_ledger_get_description_by_ticker(a_ledger, l_ticker); dap_time_to_str_rfc822(l_tmp_buf, DAP_TIME_STR_SIZE, a_datum->header.ts_created); dap_chain_hash_fast_to_str(a_tx_hash,l_tx_hash_str,sizeof(l_tx_hash_str)); - json_object_object_add(json_obj_out, "Datum_tx_hash", json_object_new_string(l_tx_hash_str)); - json_object_object_add(json_obj_out, "TS_Created", json_object_new_string(l_tmp_buf)); - json_object_object_add(json_obj_out, "Token_ticker", json_object_new_string(l_ticker)); - json_object_object_add(json_obj_out, "Token_description", l_description ? json_object_new_string(l_description) + json_object_object_add(json_obj_out, "datum_tx_hash", json_object_new_string(l_tx_hash_str)); + json_object_object_add(json_obj_out, "ts_created", json_object_new_string(l_tmp_buf)); + json_object_object_add(json_obj_out, "token_ticker", json_object_new_string(l_ticker)); + json_object_object_add(json_obj_out, "token_description", l_description ? json_object_new_string(l_description) : json_object_new_null()); dap_chain_datum_dump_tx_json(a_json_arr_reply, a_datum, l_ticker, json_obj_out, a_hash_out_type, a_tx_hash, a_ledger->net->pub.id); - json_object* json_arr_items = json_object_new_array(); + json_object *json_arr_items = json_object_new_array(); bool l_spent = false; byte_t *l_item; size_t l_size; int i, l_out_idx = -1; TX_ITEM_ITER_TX_TYPE(l_item, TX_ITEM_TYPE_OUT_ALL, l_size, i, a_datum) { ++l_out_idx; dap_hash_fast_t l_spender = { }; + json_object *l_json_obj_out = NULL, *json_arr_colours = NULL; if ( dap_ledger_tx_hash_is_used_out_item(a_ledger, a_tx_hash, l_out_idx, &l_spender) ) { char l_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE] = { '\0' }; dap_hash_fast_to_str(&l_spender, l_hash_str, sizeof(l_hash_str)); - json_object * l_json_obj_datum = json_object_new_object(); - json_object_object_add(l_json_obj_datum, "OUT - ", json_object_new_int(l_out_idx)); - json_object_object_add(l_json_obj_datum, "is spent by tx", json_object_new_string(l_hash_str)); - json_object_array_add(json_arr_items, l_json_obj_datum); + l_json_obj_out = json_object_new_object(); + json_object_object_add(l_json_obj_out, "out_number", json_object_new_int(l_out_idx)); + json_object_object_add(l_json_obj_out, "is_spent_by_tx", json_object_new_string(l_hash_str)); l_spent = true; } - } - json_object_object_add(json_obj_out, "Spent OUTs", json_arr_items); - json_object_object_add(json_obj_out, "all OUTs yet unspent", l_spent ? json_object_new_string("no") : json_object_new_string("yes")); + dap_list_t *l_trackers = dap_ledger_tx_get_trackers(a_ledger, a_tx_hash, l_out_idx); + if (l_trackers) { + if (!l_json_obj_out) { + l_json_obj_out = json_object_new_object(); + json_object_object_add(l_json_obj_out, "out_number", json_object_new_int(l_out_idx)); + } + json_arr_colours = json_object_new_array(); + json_object_object_add(l_json_obj_out, "trackers", json_arr_colours); + } + for (dap_list_t *it = l_trackers; it; it = it->next) { + dap_ledger_tracker_t *l_tracker = it->data; + json_object *l_json_obj_tracker = json_object_new_object(); + const char *l_voling_hash_str = dap_hash_fast_to_str_static(&l_tracker->voting_hash); + json_object_object_add(l_json_obj_tracker, "voting_hash", json_object_new_string(l_voling_hash_str)); + const char *l_coloured_coins, *l_coloured_value = dap_uint256_to_char(l_tracker->colored_value, &l_coloured_coins); + json_object_object_add(l_json_obj_tracker, "coloured_coins", json_object_new_string(l_coloured_coins)); + json_object_object_add(l_json_obj_tracker, "coloured_value", json_object_new_string(l_coloured_coins)); + json_object_array_add(json_arr_colours, l_json_obj_tracker); + } + if (l_json_obj_out) + json_object_array_add(json_arr_items, l_json_obj_out); + } + json_object_object_add(json_obj_out, "spent_or_coloured_outs", json_arr_items); + json_object_object_add(json_obj_out, "all_outs_yet_unspent", l_spent ? json_object_new_string("no") : json_object_new_string("yes")); return true; } 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 5986354159a9d377a8b79db1ab1a41ce31666497..0ecbbd43cecd43dc58adc649b1c87472a55c654f 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 @@ -251,8 +251,8 @@ int dap_chain_net_srv_stake_pos_delegate_init() .purge = s_pos_delegate_purge, .get_fee_descr = s_pos_delegate_get_fee_validators_json }; dap_chain_srv_uid_t l_uid = { .uint64 = DAP_CHAIN_NET_SRV_STAKE_POS_DELEGATE_ID }; - dap_chain_srv_add(l_uid, DAP_CHAIN_NET_SRV_STAKE_POS_DELEGATE_LITERAL, &l_callbacks); - dap_ledger_service_add(l_uid, DAP_CHAIN_NET_SRV_STAKE_POS_DELEGATE_LITERAL, s_tag_check_key_delegation); + dap_chain_srv_add(l_uid, DAP_CHAIN_SRV_STAKE_POS_DELEGATE_LITERAL, &l_callbacks); + dap_ledger_service_add(l_uid, DAP_CHAIN_SRV_STAKE_POS_DELEGATE_LITERAL, s_tag_check_key_delegation); dap_ledger_tax_callback_set(s_tax_callback); return 0; } @@ -1612,7 +1612,7 @@ void dap_chain_net_srv_stake_add_approving_decree_info(dap_chain_datum_decree_t char *l_decree_hash_str = NULL; if (dap_global_db_driver_is(l_approved_group, l_tx_hash_str)) { l_decree_hash_str = (char *)dap_global_db_get_sync(l_approved_group, l_tx_hash_str, NULL, NULL, NULL); - log_it(L_WARNING, "Caution, tx %s already approved, decree %s", l_tx_hash_str, l_decree_hash_str); + log_it(L_DEBUG, "Tx %s already approved, decree %s", l_tx_hash_str, l_decree_hash_str); DAP_DELETE(l_decree_hash_str); } dap_hash_fast(a_decree, dap_chain_datum_decree_get_size(a_decree), &l_hash); diff --git a/modules/service/voting/dap_chain_net_srv_voting.c b/modules/service/voting/dap_chain_net_srv_voting.c index c64211062d051d410c40dfbb3e0d7f98caf4d8ca..d2c2ad09d5e861b075a654b71a473033b396536c 100644 --- a/modules/service/voting/dap_chain_net_srv_voting.c +++ b/modules/service/voting/dap_chain_net_srv_voting.c @@ -103,12 +103,12 @@ int dap_chain_net_srv_voting_init() dap_chain_srv_uid_t l_uid = { .uint64 = DAP_CHAIN_NET_SRV_VOTING_ID }; dap_chain_static_srv_callbacks_t l_srv_callbacks = { .start = s_callback_start, .delete = s_callback_delete, .hardfork_prepare = s_votings_backup, .hardfork_load = s_votings_restore }; - int ret = dap_chain_srv_add(l_uid, "voting", &l_srv_callbacks); + int ret = dap_chain_srv_add(l_uid, DAP_CHAIN_SRV_VOTING_LITERAL, &l_srv_callbacks); if (ret) { log_it(L_ERROR, "Can't register voting service"); return ret; } - dap_ledger_service_add(l_uid, "voting", s_tag_check_voting); + dap_ledger_service_add(l_uid, DAP_CHAIN_SRV_VOTING_LITERAL, s_tag_check_voting); return 0; } @@ -240,14 +240,14 @@ static int s_voting_verificator(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_ dap_tsd_t *l_tsd = (dap_tsd_t *)((dap_chain_tx_tsd_t *)l_item)->tsd; switch(l_tsd->type) { case VOTING_TSD_TYPE_QUESTION: - if (!l_tsd->size || !memchr(l_tsd->data, '\0', l_tsd->size || *l_tsd->data == '\0')) { + if (!l_tsd->size || *l_tsd->data == '\0') { log_it(L_WARNING, "Invalid content for string TSD section QUESTION of voting %s", dap_hash_fast_to_str_static(a_tx_hash)); return -DAP_LEDGER_CHECK_PARSE_ERROR; } l_question_present = true; break; case VOTING_TSD_TYPE_OPTION: - if (!l_tsd->size || !memchr(l_tsd->data, '\0', l_tsd->size || *l_tsd->data == '\0')) { + if (!l_tsd->size || *l_tsd->data == '\0') { log_it(L_WARNING, "Invalid content for string TSD section ANSWER of voting %s", dap_hash_fast_to_str_static(a_tx_hash)); return -DAP_LEDGER_CHECK_PARSE_ERROR; } @@ -345,9 +345,8 @@ static int s_vote_verificator(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx log_it(L_WARNING, "Voting %s required a delegated key", dap_chain_hash_fast_to_str_static(&l_voting->hash)); return -10; } - - } + dap_list_t *l_vote_overwrited = NULL; for (dap_list_t *it = l_voting->votes; it; it = it->next) { if (dap_hash_fast_compare(&((struct vote *)it->data)->pkey_hash, &pkey_hash)) { @@ -367,7 +366,7 @@ static int s_vote_verificator(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx byte_t *l_item; size_t l_tx_item_size; TX_ITEM_ITER_TX(l_item, l_tx_item_size, a_tx_in) { dap_hash_fast_t l_tx_hash; - int l_out_idx; + int l_out_idx = 0; switch (*l_item) { case TX_ITEM_TYPE_IN: // check inputs l_tx_hash = ((dap_chain_tx_in_t *)l_item)->header.tx_prev_hash; @@ -419,7 +418,7 @@ static int s_vote_verificator(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx char l_vote_hash_str[DAP_HASH_FAST_STR_SIZE]; dap_hash_fast_to_str(a_tx_hash, l_vote_hash_str, DAP_HASH_FAST_STR_SIZE); log_it(L_INFO, "Vote %s of voting %s has been %s", l_vote_hash_str, dap_hash_fast_to_str_static(&l_voting->hash), - l_vote_overwrited ? "accepted" : "changed"); + l_vote_overwrited ? "changed" : "accepted"); } return DAP_LEDGER_CHECK_OK; } diff --git a/modules/service/xchange/dap_chain_net_srv_xchange.c b/modules/service/xchange/dap_chain_net_srv_xchange.c index 3536a202c22e12892f535def1cb3cf7b4ba8fcd5..bdaf28d69d446c1529bd5f138cfd2ae67eaca637 100644 --- a/modules/service/xchange/dap_chain_net_srv_xchange.c +++ b/modules/service/xchange/dap_chain_net_srv_xchange.c @@ -254,7 +254,7 @@ int dap_chain_net_srv_xchange_init() ); dap_chain_static_srv_callbacks_t l_srv_callbacks = { .start = s_callback_start, .decree = s_callback_decree, .get_fee_descr = s_print_fee_json }; - int ret = dap_chain_srv_add(c_dap_chain_net_srv_xchange_uid, DAP_CHAIN_NET_SRV_XCHANGE_LITERAL, &l_srv_callbacks); + int ret = dap_chain_srv_add(c_dap_chain_net_srv_xchange_uid, DAP_CHAIN_SRV_XCHANGE_LITERAL, &l_srv_callbacks); if (ret) { log_it(L_ERROR, "Can't register eXchange service"); return ret; @@ -3443,7 +3443,7 @@ json_object *s_print_fee_json(dap_chain_net_id_t a_net_id) if (dap_chain_net_srv_xchange_get_fee(a_net_id, &l_fee, &l_addr, &l_type)) { const char *l_fee_coins, *l_fee_balance = dap_uint256_to_char(l_fee, &l_fee_coins); json_object *l_jobj_xchange = json_object_new_object(); - json_object_object_add(l_jobj_xchange, "service", json_object_new_string(DAP_CHAIN_NET_SRV_XCHANGE_LITERAL)); + json_object_object_add(l_jobj_xchange, "service", json_object_new_string(DAP_CHAIN_SRV_XCHANGE_LITERAL)); json_object_object_add(l_jobj_xchange, "coin", json_object_new_string(l_fee_coins)); json_object_object_add(l_jobj_xchange, "balance", json_object_new_string(l_fee_balance)); json_object_object_add(l_jobj_xchange, "addr", json_object_new_string(dap_chain_addr_to_str_static(&l_addr)));