diff --git a/modules/chain/tests/dap_chain_ledger_tests.c b/modules/chain/tests/dap_chain_ledger_tests.c index ac6ec1a215dfd49513b18386a5a47bc71ffa9100..cd4af7d8949c17728aa13e13706b83b3b6880e23 100644 --- a/modules/chain/tests/dap_chain_ledger_tests.c +++ b/modules/chain/tests/dap_chain_ledger_tests.c @@ -491,7 +491,7 @@ int dap_ledger_test_add_new_datum (uint16_t a_datum_type, void* a_datum, size_t { dap_chain_datum_t* l_new_datum = dap_chain_datum_create(a_datum_type, a_datum, a_datum_size); size_t l_new_datum_size = a_datum_size + sizeof(l_new_datum->header); - int status = dap_chain_datum_add(a_chain, l_new_datum, l_new_datum_size, a_datum_hash); + int status = dap_chain_datum_add(a_chain, l_new_datum, l_new_datum_size, a_datum_hash, NULL); dap_assert(status == 0, "Test of transaction adding to ledger:"); return status; } @@ -531,7 +531,7 @@ void dap_ledger_test_datums_removing(dap_ledger_t *a_ledger, dap_hash_fast_t *a_ dap_assert(l_second_tx, "Test of creating second tx:"); dap_chain_hash_fast_t l_second_tx_hash = {0}; dap_hash_fast(l_second_tx, dap_chain_datum_tx_get_size(l_second_tx), &l_second_tx_hash); - dap_assert(!dap_ledger_tx_add(a_ledger, l_second_tx, &l_second_tx_hash, false), "Test of second transaction adding to ledger:"); + dap_assert(!dap_ledger_tx_add(a_ledger, l_second_tx, &l_second_tx_hash, false, NULL), "Test of second transaction adding to ledger:"); dap_ledger_test_print_balance(a_ledger, &l_addr); // try to remove spent tx @@ -548,7 +548,7 @@ void dap_ledger_test_datums_removing(dap_ledger_t *a_ledger, dap_hash_fast_t *a_ dap_assert_PIF(l_cond_tx, "Test of creating conditional transaction:"); dap_chain_hash_fast_t l_cond_tx_hash = {0}; dap_hash_fast(l_cond_tx, dap_chain_datum_tx_get_size(l_first_tx), &l_cond_tx_hash); - dap_assert(!dap_ledger_tx_add(a_ledger, l_cond_tx, &l_cond_tx_hash, false), "Test of conditional transaction adding to ledger:"); + dap_assert(!dap_ledger_tx_add(a_ledger, l_cond_tx, &l_cond_tx_hash, false, NULL), "Test of conditional transaction adding to ledger:"); dap_ledger_test_print_balance(a_ledger, &l_addr); dap_assert(!dap_ledger_tx_remove(a_ledger, l_cond_tx, &l_cond_tx_hash), "Test of conditional transaction removing from ledger:"); l_balance_after = dap_ledger_test_print_balance(a_ledger, &l_addr); @@ -561,7 +561,7 @@ void dap_ledger_test_datums_removing(dap_ledger_t *a_ledger, dap_hash_fast_t *a_ dap_assert_PIF(l_cond_tx, "Test of creating conditional transaction:"); dap_hash_fast_t l_cond_tx_hash = {}; dap_hash_fast(l_cond_tx, dap_chain_datum_tx_get_size(l_cond_tx), &l_cond_tx_hash); - dap_assert(!dap_ledger_tx_add(a_ledger, l_cond_tx, &l_cond_tx_hash, false), "Test of conditional transaction adding to ledger:"); + dap_assert(!dap_ledger_tx_add(a_ledger, l_cond_tx, &l_cond_tx_hash, false, NULL), "Test of conditional transaction adding to ledger:"); dap_ledger_test_print_balance(a_ledger, &l_addr); dap_cert_t *l_cond_spender_cert = dap_cert_generate_mem_with_seed("newCert", DAP_ENC_KEY_TYPE_SIG_PICNIC, "FMknbirh8*^#$RYU*q", 18); @@ -571,7 +571,7 @@ void dap_ledger_test_datums_removing(dap_ledger_t *a_ledger, dap_hash_fast_t *a_ dap_chain_datum_tx_t *l_cond_spendind_tx = dap_ledger_test_create_spend_tx_cond(a_from_key, &l_cond_tx_hash, l_cond_spender_cert->enc_key, dap_chain_uint256_from(1U),a_ledger); dap_chain_hash_fast_t l_spend_cond_tx_hash = {0}; dap_hash_fast(l_cond_spendind_tx, dap_chain_datum_tx_get_size(l_cond_spendind_tx), &l_spend_cond_tx_hash); - dap_assert(!dap_ledger_tx_add(a_ledger, l_cond_spendind_tx, &l_spend_cond_tx_hash, false), "Test adding of transaction spending to a conditional transaction to ledger:"); + dap_assert(!dap_ledger_tx_add(a_ledger, l_cond_spendind_tx, &l_spend_cond_tx_hash, false, NULL), "Test adding of transaction spending to a conditional transaction to ledger:"); uint256_t l_cond_spending_balance_after = dap_ledger_test_print_balance(a_ledger, &l_cond_spender_addr); dap_assert(!compare256(l_cond_spending_balance_after, dap_chain_uint256_from(1U)), "Check balance after spending:"); dap_ledger_test_print_balance(a_ledger, &l_cond_spender_addr); @@ -588,7 +588,7 @@ void dap_ledger_test_datums_removing(dap_ledger_t *a_ledger, dap_hash_fast_t *a_ dap_chain_datum_tx_t *l_cond_tx = dap_ledger_test_create_tx_cond(a_from_key, a_prev_hash, &l_addr_first, dap_chain_uint256_from(2U),a_ledger); dap_hash_fast_t l_cond_tx_hash = {}; dap_hash_fast(l_cond_tx, dap_chain_datum_tx_get_size(l_cond_tx), &l_cond_tx_hash); - dap_assert(!dap_ledger_tx_add(a_ledger, l_cond_tx, &l_cond_tx_hash, false), "Adding of cond transaction to ledger is"); + dap_assert(!dap_ledger_tx_add(a_ledger, l_cond_tx, &l_cond_tx_hash, false, NULL), "Adding of cond transaction to ledger is"); dap_cert_t *l_cond_spending_cert = dap_cert_generate_mem_with_seed("newCert", DAP_ENC_KEY_TYPE_SIG_PICNIC, "FMknbirh8*^#$RYU*q", 18); dap_chain_addr_t l_cond_spending_addr = {0}; @@ -597,7 +597,7 @@ void dap_ledger_test_datums_removing(dap_ledger_t *a_ledger, dap_hash_fast_t *a_ dap_chain_datum_tx_t *l_cond_returning_tx = dap_ledger_test_create_return_from_tx_cond(&l_cond_tx_hash, a_from_key ,a_ledger); dap_chain_hash_fast_t l_cond_returning_tx_hash = {0}; dap_hash_fast(l_cond_returning_tx, dap_chain_datum_tx_get_size(l_cond_returning_tx), &l_cond_returning_tx_hash); - int err_code = dap_ledger_tx_add(a_ledger, l_cond_returning_tx, &l_cond_returning_tx_hash, false); + int err_code = dap_ledger_tx_add(a_ledger, l_cond_returning_tx, &l_cond_returning_tx_hash, false, NULL); printf("err_code = %s\n", dap_ledger_check_error_str(err_code)); dap_assert(!err_code, "Returning of funds from cond transaction is"); uint256_t l_cond_spending_balance_after = dap_ledger_test_print_balance(a_ledger, &l_cond_spending_addr); @@ -617,7 +617,7 @@ void dap_ledger_test_datums_removing(dap_ledger_t *a_ledger, dap_hash_fast_t *a_ dap_chain_datum_tx_t *l_cond_tx = dap_ledger_test_create_stake_tx_cond(a_from_key, a_prev_hash, dap_chain_uint256_from(20U), a_ledger); dap_hash_fast_t l_cond_tx_hash = {}; dap_hash_fast(l_cond_tx, dap_chain_datum_tx_get_size(l_cond_tx), &l_cond_tx_hash); - int err_code = dap_ledger_tx_add(a_ledger, l_cond_tx, &l_cond_tx_hash, false); + int err_code = dap_ledger_tx_add(a_ledger, l_cond_tx, &l_cond_tx_hash, false, NULL); printf("err_code = %s\n", dap_ledger_check_error_str(err_code)); dap_assert(!err_code, "Adding of stake cond transaction to ledger is"); @@ -632,7 +632,7 @@ void dap_ledger_test_datums_removing(dap_ledger_t *a_ledger, dap_hash_fast_t *a_ dap_chain_datum_tx_t *l_stake_cond_tx = dap_ledger_test_create_stake_tx_cond(a_from_key, a_prev_hash, dap_chain_uint256_from(20U), a_ledger); dap_hash_fast_t l_stake_cond_tx_hash = {}; dap_hash_fast(l_stake_cond_tx, dap_chain_datum_tx_get_size(l_stake_cond_tx), &l_stake_cond_tx_hash); - int err_code = dap_ledger_tx_add(a_ledger, l_stake_cond_tx, &l_stake_cond_tx_hash, false); + int err_code = dap_ledger_tx_add(a_ledger, l_stake_cond_tx, &l_stake_cond_tx_hash, false, NULL); printf("err_code = %s\n", dap_ledger_check_error_str(err_code)); dap_assert(!err_code, "Adding of stake cond transaction to ledger is"); sleep(3); @@ -644,7 +644,7 @@ void dap_ledger_test_datums_removing(dap_ledger_t *a_ledger, dap_hash_fast_t *a_ dap_chain_datum_tx_t *l_unstake_cond_tx = dap_ledger_test_create_unstake_tx_cond(a_from_key, &l_stake_cond_tx_hash, dap_chain_uint256_from(20U), a_ledger); dap_hash_fast_t l_unstake_cond_tx_hash = {}; dap_hash_fast(l_unstake_cond_tx, dap_chain_datum_tx_get_size(l_unstake_cond_tx), &l_unstake_cond_tx_hash); - err_code = dap_ledger_tx_add(a_ledger, l_unstake_cond_tx, &l_unstake_cond_tx_hash, false); + err_code = dap_ledger_tx_add(a_ledger, l_unstake_cond_tx, &l_unstake_cond_tx_hash, false, NULL); printf("err_code = %s\n", dap_ledger_check_error_str(err_code)); dap_assert(!err_code, "Adding of unstake cond transaction to ledger is"); uint256_t l_balance_delegated_after_unstaking = dap_ledger_test_print_delegate_balance(a_ledger, &l_addr); @@ -694,14 +694,14 @@ dap_hash_fast_t dap_ledger_test_double_spending( dap_assert_PIF(l_first_tx, "Can't creating base transaction."); dap_chain_hash_fast_t l_first_tx_hash = {0}; dap_hash_fast(l_first_tx, dap_chain_datum_tx_get_size(l_first_tx), &l_first_tx_hash); - dap_assert_PIF(!dap_ledger_tx_add(a_ledger, l_first_tx, &l_first_tx_hash, false), "Can't add first transaction on ledger"); + dap_assert_PIF(!dap_ledger_tx_add(a_ledger, l_first_tx, &l_first_tx_hash, false, NULL), "Can't add first transaction on ledger"); //uint256_t l_balance = dap_ledger_calc_balance(a_ledger, &l_addr_first, s_token_ticker); // Second tx dap_chain_datum_tx_t *l_second_tx = dap_ledger_test_create_tx(a_from_key, a_prev_hash, &a_addr_to, dap_chain_uint256_from(s_standard_value_tx - s_fee)); dap_chain_hash_fast_t l_second_tx_hash = {0}; dap_hash_fast(l_second_tx, dap_chain_datum_tx_get_size(l_second_tx), &l_second_tx_hash); - dap_assert_PIF(dap_ledger_tx_add(a_ledger, l_second_tx, &l_second_tx_hash, false), "Added second transaction on ledger"); + dap_assert_PIF(dap_ledger_tx_add(a_ledger, l_second_tx, &l_second_tx_hash, false, NULL), "Added second transaction on ledger"); dap_pass_msg("The verification test is not able to make two normal transactions per one basic transaction."); return l_first_tx_hash; } @@ -831,7 +831,7 @@ void dap_ledger_test_write_back_list(dap_ledger_t *a_ledger, dap_cert_t *a_cert, *l_addr_1->addr, a_cert); dap_hash_fast_t l_btx_addr1_hash = {0}; dap_hash_fast(l_btx_addr1, dap_chain_datum_tx_get_size(l_btx_addr1), &l_btx_addr1_hash); - int l_ledger_add_code = dap_ledger_tx_add(a_ledger, l_btx_addr1, &l_btx_addr1_hash, false); + int l_ledger_add_code = dap_ledger_tx_add(a_ledger, l_btx_addr1, &l_btx_addr1_hash, false, NULL); char *l_ledger_tx_add_str = dap_strdup_printf("Can't add base tx in white address. Code: %d", l_ledger_add_code); dap_assert_PIF(!l_ledger_add_code, l_ledger_tx_add_str); DAP_DELETE(l_ledger_tx_add_str); @@ -839,13 +839,13 @@ void dap_ledger_test_write_back_list(dap_ledger_t *a_ledger, dap_cert_t *a_cert, dap_chain_datum_tx_t *l_tx_to_addr4 = dap_ledger_test_create_tx(l_addr_1->enc_key, &l_btx_addr1_hash, l_addr_4->addr, dap_chain_uint256_from(s_total_supply-s_fee)); dap_hash_fast(l_tx_to_addr4, dap_chain_datum_tx_get_size(l_tx_to_addr4), &l_tx_addr4_hash); - dap_assert_PIF(!dap_ledger_tx_add(a_ledger, l_tx_to_addr4, &l_tx_addr4_hash, false), + dap_assert_PIF(!dap_ledger_tx_add(a_ledger, l_tx_to_addr4, &l_tx_addr4_hash, false, NULL), "Can't add transaction to address from white list in ledger"); dap_chain_datum_tx_t *l_tx_to_addr3 = dap_ledger_test_create_tx(l_addr_4->enc_key, &l_tx_addr4_hash, l_addr_3->addr, dap_chain_uint256_from(s_total_supply-s_fee)); dap_hash_fast_t l_tx_addr3_hash = {0}; dap_hash_fast(l_tx_to_addr3, dap_chain_datum_tx_get_size(l_tx_to_addr3), &l_tx_addr3_hash); - int res_add_tx = dap_ledger_tx_add(a_ledger, l_tx_to_addr3, &l_tx_addr3_hash, false); + int res_add_tx = dap_ledger_tx_add(a_ledger, l_tx_to_addr3, &l_tx_addr3_hash, false, NULL); if (!res_add_tx) { dap_fail("It was possible to carry out a transaction to a forbidden address"); } else { @@ -945,20 +945,20 @@ void dap_ledger_test_write_back_list(dap_ledger_t *a_ledger, dap_cert_t *a_cert, *l_addr_2->addr, a_cert); dap_hash_fast_t l_btx_addr2_hash = {0}; dap_hash_fast(l_btx_addr2, dap_chain_datum_tx_get_size(l_btx_addr2), &l_btx_addr2_hash); - dap_assert_PIF(!dap_ledger_tx_add(a_ledger, l_btx_addr2, &l_btx_addr2_hash, false), + dap_assert_PIF(!dap_ledger_tx_add(a_ledger, l_btx_addr2, &l_btx_addr2_hash, false, NULL), "Can't add base tx in white address"); //Check tx in addr from block list dap_chain_datum_tx_t *l_tx_to_addr1 = dap_ledger_test_create_tx(l_addr_4->enc_key, &l_btx_addr2_hash, l_addr_1->addr, dap_chain_uint256_from(s_total_supply)); dap_hash_fast_t l_tx_addr1_hash = {0}; dap_hash_fast(l_tx_to_addr1, dap_chain_datum_tx_get_size(l_tx_to_addr1), &l_tx_addr1_hash); - dap_assert(dap_ledger_tx_add(a_ledger, l_tx_to_addr1, &l_tx_addr1_hash, false), "Transfer test to a forbidden address."); + dap_assert(dap_ledger_tx_add(a_ledger, l_tx_to_addr1, &l_tx_addr1_hash, false, NULL), "Transfer test to a forbidden address."); //Check tx in addr from list dap_chain_datum_tx_t *l_tx_to_addr3 = dap_ledger_test_create_tx(l_addr_4->enc_key, &l_tx_addr1_hash, l_addr_3->addr, dap_chain_uint256_from(s_total_supply)); dap_hash_fast_t l_tx_addr3_hash = {0}; dap_hash_fast(l_tx_to_addr3, dap_chain_datum_tx_get_size(l_tx_to_addr3), &l_tx_addr3_hash); - dap_assert(dap_ledger_tx_add(a_ledger, l_tx_to_addr3, &l_tx_addr3_hash, false), "Transfer test to a not forbidden address."); + dap_assert(dap_ledger_tx_add(a_ledger, l_tx_to_addr3, &l_tx_addr3_hash, false, NULL), "Transfer test to a not forbidden address."); } } @@ -1041,7 +1041,7 @@ void dap_ledger_test_run(void){ dap_hash_fast_t l_hash_btx = {0}; dap_hash_fast(l_base_tx, l_base_tx_size, &l_hash_btx); dap_assert_PIF(!dap_ledger_tx_add_check(l_ledger, l_base_tx, l_base_tx_size, &l_hash_btx), "Check can added base tx in ledger"); - dap_assert_PIF(!dap_ledger_tx_add(l_ledger, l_base_tx, &l_hash_btx, false), "Added base tx in ledger."); + dap_assert_PIF(!dap_ledger_tx_add(l_ledger, l_base_tx, &l_hash_btx, false, NULL), "Added base tx in ledger."); uint256_t l_balance_example = dap_chain_uint256_from(s_standard_value_tx); uint256_t l_balance = dap_ledger_calc_balance(l_ledger, &l_addr, s_token_ticker); uint256_t l_fee = dap_chain_uint256_from(s_fee); @@ -1057,7 +1057,7 @@ void dap_ledger_test_run(void){ if (dap_ledger_tx_add_check(l_ledger, l_base_tx_second, l_base_tx_size2, &l_hash_btx_second)) { dap_pass_msg("Checking can added second base tx in ledger"); } - if (dap_ledger_tx_add(l_ledger, l_base_tx_second, &l_hash_btx_second, false)){ + if (dap_ledger_tx_add(l_ledger, l_base_tx_second, &l_hash_btx_second, false, NULL)){ dap_pass_msg("Checking for a failure to add a second base transaction for the same issue to the ledger."); } else { dap_fail("Checking for a failure to add a second base transaction for the same issue to the ledger."); diff --git a/modules/net/dap_chain_ledger.c b/modules/net/dap_chain_ledger.c index 1175e39508913ef9da5a303c96b276dbc9f3737d..1518ef3e1a8278fdaae29fa429b075b99b85e1cc 100644 --- a/modules/net/dap_chain_ledger.c +++ b/modules/net/dap_chain_ledger.c @@ -2305,7 +2305,7 @@ static void s_threshold_txs_proc( dap_ledger_t *a_ledger) l_success = false; dap_ledger_tx_item_t *l_tx_item, *l_tx_tmp; HASH_ITER(hh, l_ledger_pvt->threshold_txs, l_tx_item, l_tx_tmp) { - int l_res = dap_ledger_tx_add(a_ledger, l_tx_item->tx, &l_tx_item->tx_hash_fast, true); + int l_res = dap_ledger_tx_add(a_ledger, l_tx_item->tx, &l_tx_item->tx_hash_fast, true, NULL); if (l_res != DAP_CHAIN_CS_VERIFY_CODE_TX_NO_EMISSION && l_res != DAP_CHAIN_CS_VERIFY_CODE_TX_NO_PREVIOUS) { HASH_DEL(l_ledger_pvt->threshold_txs, l_tx_item); @@ -4386,7 +4386,7 @@ static int s_sort_ledger_tx_item(dap_ledger_tx_item_t *a, dap_ledger_tx_item_t * * @param a_from_threshold * @return return 1 OK, -1 error */ -int dap_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_hash_fast_t *a_tx_hash, bool a_from_threshold) +int dap_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_hash_fast_t *a_tx_hash, bool a_from_threshold, dap_ledger_datum_iter_data_t *a_datum_index_data) { if(!a_tx) { debug_if(s_debug_more, L_ERROR, "NULL tx detected"); @@ -5059,7 +5059,7 @@ FIN: return l_ret; } -int dap_ledger_tx_load(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_chain_hash_fast_t *a_tx_hash) +int dap_ledger_tx_load(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_chain_hash_fast_t *a_tx_hash, dap_ledger_datum_iter_data_t *a_datum_index_data) { #ifndef DAP_LEDGER_TEST if (dap_chain_net_get_load_mode(a_ledger->net)) { @@ -5075,7 +5075,7 @@ int dap_ledger_tx_load(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_c return DAP_LEDGER_CHECK_ALREADY_CACHED; } #endif - return dap_ledger_tx_add(a_ledger, a_tx, a_tx_hash, false); + return dap_ledger_tx_add(a_ledger, a_tx, a_tx_hash, false, a_datum_index_data); } /** diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index 4ba06647b8635c3beddbc5125ae6ab692884ab2c..41091303e8cc6ac0d55cd35872c2374293187ba6 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -3225,7 +3225,7 @@ dap_list_t* dap_chain_datum_list(dap_chain_net_t *a_net, dap_chain_t *a_chain, d * @param a_datum_size * @return */ -int dap_chain_datum_add(dap_chain_t *a_chain, dap_chain_datum_t *a_datum, size_t a_datum_size, dap_hash_fast_t *a_datum_hash) +int dap_chain_datum_add(dap_chain_t *a_chain, dap_chain_datum_t *a_datum, size_t a_datum_size, dap_hash_fast_t *a_datum_hash, void *a_datum_index_data) { size_t l_datum_data_size = a_datum->header.data_size; if (a_datum_size < l_datum_data_size + sizeof(a_datum->header)) { @@ -3266,7 +3266,7 @@ int dap_chain_datum_add(dap_chain_t *a_chain, dap_chain_datum_t *a_datum, size_t log_it(L_WARNING, "Corrupted transaction, datum size %zd is not equal to size of TX %zd", l_datum_data_size, l_tx_size); return -102; } - return dap_ledger_tx_load(l_ledger, l_tx, a_datum_hash); + return dap_ledger_tx_load(l_ledger, l_tx, a_datum_hash, a_datum_index_data); } case DAP_CHAIN_DATUM_CA: return dap_cert_chain_file_save(a_datum, a_chain->net_name); diff --git a/modules/net/dap_chain_node_cli_cmd_tx.c b/modules/net/dap_chain_node_cli_cmd_tx.c index d0ad9632d17829d73fbf4b568af56dc9e4d4c944..b5bf902d29b1c84946b00f0721c34176bc41f005 100644 --- a/modules/net/dap_chain_node_cli_cmd_tx.c +++ b/modules/net/dap_chain_node_cli_cmd_tx.c @@ -754,7 +754,7 @@ json_object *dap_db_history_tx_all(dap_chain_t *a_chain, dap_chain_net_t *a_net, l_tx_ledger_accepted = 0, l_tx_ledger_rejected = 0, l_count = 0, - l_count_tx = 0; + i_tmp = 0; int res = 0; dap_chain_cell_t *l_cell = NULL, *l_cell_tmp = NULL; @@ -766,81 +766,44 @@ json_object *dap_db_history_tx_all(dap_chain_t *a_chain, dap_chain_net_t *a_net, s_set_offset_limit_json(json_arr_out, &l_arr_start, &l_arr_end, a_limit, a_offset, a_chain->callback_count_atom(a_chain)); bool look_for_unknown_service = (a_srv && strcmp(a_srv,"unknown") == 0); - if(a_head) - HASH_ITER(hh, a_chain->cells, l_cell, l_cell_tmp) { - if ((l_count_tx >= l_arr_end)&&(l_arr_end)) - break; - l_iter = a_chain->callback_atom_iter_create(a_chain, l_cell->id, NULL); - size_t l_atom_size = 0; - dap_chain_atom_ptr_t l_ptr = a_chain->callback_atom_iter_get(l_iter, DAP_CHAIN_ITER_OP_FIRST, &l_atom_size); - while (l_ptr && l_atom_size && ((l_count_tx < l_arr_end)||(!l_arr_end))) { - size_t l_datums_count = 0; - dap_chain_datum_t **l_datums = l_cell->chain->callback_atom_get_datums(l_ptr, l_atom_size, &l_datums_count); - for (size_t i = 0; i < l_datums_count && ((l_count_tx < l_arr_end)||(!l_arr_end)); i++) { - if (l_datums[i]->header.type_id == DAP_CHAIN_DATUM_TX) { - if (l_count_tx < l_arr_start) { - l_count_tx++; - continue; - } - res = s_json_tx_history_pack(&json_tx_history, l_datums[i], a_net, a_chain, a_action, a_hash_out_type, out_brief, - &l_tx_ledger_accepted, &l_tx_ledger_rejected, look_for_unknown_service, a_srv); - if (res == 1) - continue; - else if (res == 2) - { - json_object_put(json_arr_out); - return NULL; - } - json_object_object_add(json_tx_history, "tx number", json_object_new_uint64(l_count+1)); - json_object_array_add(json_arr_out, json_tx_history); - ++l_count_tx; - l_count++; - } - } - DAP_DEL_Z(l_datums); - l_ptr = a_chain->callback_atom_iter_get(l_iter, DAP_CHAIN_ITER_OP_NEXT, &l_atom_size); - } - l_cell->chain->callback_atom_iter_delete(l_iter); - } - else + // load transactions + dap_chain_datum_iter_t *l_datum_iter = a_chain->callback_datum_iter_create(a_chain); + + dap_chain_datum_callback_iters iter_begin; + dap_chain_datum_callback_iters iter_direc; + iter_begin = a_head ? a_chain->callback_datum_iter_get_first + : a_chain->callback_datum_iter_get_last; + iter_direc = a_head ? a_chain->callback_datum_iter_get_next + : a_chain->callback_datum_iter_get_prev; + + for (dap_chain_datum_t *l_datum = iter_begin(l_datum_iter); + l_datum; + l_datum = iter_direc(l_datum_iter)) { - l_cell_tmp = HASH_LAST(a_chain->cells); - for(; l_cell_tmp; l_cell_tmp = l_cell_tmp->hh.prev){ - if ((l_count_tx >= l_arr_end)&&(l_arr_end)) - break; - l_iter = a_chain->callback_atom_iter_create(a_chain, l_cell_tmp->id, NULL); - size_t l_atom_size = 0; - dap_chain_atom_ptr_t l_ptr = a_chain->callback_atom_iter_get(l_iter, DAP_CHAIN_ITER_OP_LAST, &l_atom_size); - while (l_ptr && l_atom_size && ((l_count_tx < l_arr_end)||(!l_arr_end))) { - size_t l_datums_count = 0; - dap_chain_datum_t **l_datums = l_cell_tmp->chain->callback_atom_get_datums(l_ptr, l_atom_size, &l_datums_count); - for (size_t i = l_datums_count; i && ((l_count_tx < l_arr_end)||(!l_arr_end)); i--) { - if (l_datums[i-1]->header.type_id == DAP_CHAIN_DATUM_TX) { - if (l_count_tx < l_arr_start) { - l_count_tx++; - continue; - } - res = s_json_tx_history_pack(&json_tx_history, l_datums[i-1], a_net, a_chain, a_action, a_hash_out_type, out_brief, - &l_tx_ledger_accepted, &l_tx_ledger_rejected, look_for_unknown_service, a_srv); - if (res == 1) - continue; - else if (res == 2) - { - json_object_put(json_arr_out); - return NULL; - } - json_object_object_add(json_tx_history, "tx number", json_object_new_uint64(l_count+1)); - json_object_array_add(json_arr_out, json_tx_history); - ++l_count_tx; - l_count++; - } - } - DAP_DEL_Z(l_datums); - l_ptr = a_chain->callback_atom_iter_get(l_iter, DAP_CHAIN_ITER_OP_PREV, &l_atom_size); - } - l_cell_tmp->chain->callback_atom_iter_delete(l_iter); + if (i_tmp >= l_arr_end) + break; + if (l_datum->header.type_id != DAP_CHAIN_DATUM_TX) + // go to next datum + continue; + + if (i_tmp < l_arr_start) { + i_tmp++; + continue; } - } + res = s_json_tx_history_pack(&json_tx_history, l_datum, a_net, a_chain, a_action, a_hash_out_type, out_brief, + &l_tx_ledger_accepted, &l_tx_ledger_rejected, look_for_unknown_service, a_srv); + if (res == 1) + continue; + else if (res == 2) + { + json_object_put(json_arr_out); + return NULL; + } + json_object_object_add(json_tx_history, "tx number", json_object_new_uint64(l_count+1)); + json_object_array_add(json_arr_out, json_tx_history); + ++i_tmp; + l_count++; + } log_it(L_DEBUG, "END getting tx from chain"); json_object_object_add(json_obj_summary, "network", json_object_new_string(a_net->pub.name)); diff --git a/modules/net/include/dap_chain_ledger.h b/modules/net/include/dap_chain_ledger.h index b536f7572f8d4c928eec6138f2d95aef8a2fcedd..7a43c2dafe5c3a5c9faefc52e67d758666b1335a 100644 --- a/modules/net/include/dap_chain_ledger.h +++ b/modules/net/include/dap_chain_ledger.h @@ -197,6 +197,11 @@ typedef struct dap_ledger_datum_iter { void *cur_ledger_tx_item; } dap_ledger_datum_iter_t; +typedef struct dap_ledger_datum_iter_data { + char * token_ticker; + dap_chain_tx_tag_action_type_t action_tag; +} dap_ledger_datum_iter_data_t; + typedef int (*dap_ledger_verificator_callback_t)(dap_ledger_t *a_ledger, dap_chain_tx_out_cond_t *a_tx_out_cond, dap_chain_datum_tx_t *a_tx_in, bool a_owner); typedef void (*dap_ledger_updater_callback_t)(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_chain_tx_out_cond_t *a_prev_cond); typedef void (* dap_ledger_tx_add_notify_t)(void *a_arg, dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_chan_ledger_notify_opcodes_t a_opcode); @@ -267,8 +272,8 @@ DAP_STATIC_INLINE char *dap_ledger_get_gdb_group(dap_ledger_t *a_ledger, const c * * return 1 OK, -1 error */ -int dap_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_hash_fast_t *a_tx_hash, bool a_from_threshold); -int dap_ledger_tx_load(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_chain_hash_fast_t *a_tx_hash); +int dap_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_hash_fast_t *a_tx_hash, bool a_from_threshold, dap_ledger_datum_iter_data_t *a_datum_index_data); +int dap_ledger_tx_load(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_chain_hash_fast_t *a_tx_hash, dap_ledger_datum_iter_data_t *a_datum_index_data); int dap_ledger_tx_remove(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_hash_fast_t *a_tx_hash); int dap_ledger_tx_add_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, size_t a_datum_size, dap_hash_fast_t *a_datum_hash); diff --git a/modules/net/include/dap_chain_net.h b/modules/net/include/dap_chain_net.h index 5cfa52d7c014c2f8aa05af933eedc7ddd03c112a..bbd9ec8e1a133c82aaa5758b29b0a022c1432736 100644 --- a/modules/net/include/dap_chain_net.h +++ b/modules/net/include/dap_chain_net.h @@ -197,7 +197,7 @@ void dap_chain_net_srv_order_add_notify_callback(dap_chain_net_t *a_net, dap_sto */ dap_list_t *dap_chain_datum_list(dap_chain_net_t *a_net, dap_chain_t *a_chain, dap_chain_datum_filter_func_t *a_filter_func, void *a_filter_func_param); -int dap_chain_datum_add(dap_chain_t * a_chain, dap_chain_datum_t *a_datum, size_t a_datum_size, dap_hash_fast_t *a_datum_hash); +int dap_chain_datum_add(dap_chain_t * a_chain, dap_chain_datum_t *a_datum, size_t a_datum_size, dap_hash_fast_t *a_datum_hash, void *a_datum_index_data); int dap_chain_datum_remove(dap_chain_t *a_chain, dap_chain_datum_t *a_datum, size_t a_datum_size, dap_hash_fast_t *a_datum_hash); bool dap_chain_net_get_load_mode(dap_chain_net_t * a_net); diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c index c65edd5891e6f91bd794138ce533a9fd504d3970..7804ca3cfd81362725e846e8aaf23294ae5f5159 100644 --- a/modules/type/blocks/dap_chain_cs_blocks.c +++ b/modules/type/blocks/dap_chain_cs_blocks.c @@ -1478,7 +1478,7 @@ static int s_add_atom_datums(dap_chain_cs_blocks_t *a_blocks, dap_chain_block_ca break; } dap_hash_fast_t *l_datum_hash = a_block_cache->datum_hash + i; - int l_res = dap_chain_datum_add(a_blocks->chain, l_datum, l_datum_size, l_datum_hash); + int l_res = dap_chain_datum_add(a_blocks->chain, l_datum, l_datum_size, l_datum_hash, NULL); l_ret++; if (l_datum->header.type_id == DAP_CHAIN_DATUM_TX) { diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c index 5beadec7de20f69f010e920f88a26f96de70839a..f362d38949fd0187cc82372108d29ac2902a96e0 100644 --- a/modules/type/dag/dap_chain_cs_dag.c +++ b/modules/type/dag/dap_chain_cs_dag.c @@ -407,7 +407,7 @@ static int s_dap_chain_add_atom_to_events_table(dap_chain_cs_dag_t *a_dag, dap_c } dap_hash_fast_t l_datum_hash; dap_chain_datum_calc_hash(l_datum, &l_datum_hash); - int l_ret = dap_chain_datum_add(a_dag->chain, l_datum, l_datum_size, &l_datum_hash); + int l_ret = dap_chain_datum_add(a_dag->chain, l_datum, l_datum_size, &l_datum_hash, NULL); if (l_datum->header.type_id == DAP_CHAIN_DATUM_TX) // && l_ret == 0 PVT(a_dag)->tx_count++; a_event_item->datum_hash = l_datum_hash; diff --git a/modules/type/none/dap_chain_cs_none.c b/modules/type/none/dap_chain_cs_none.c index 65b7dc8771afa0cedf4492b89bbdaf9a8a429719..c3a486f18156205a2c151eaaa7c516cb8cc7590f 100644 --- a/modules/type/none/dap_chain_cs_none.c +++ b/modules/type/none/dap_chain_cs_none.c @@ -318,7 +318,7 @@ static dap_chain_atom_verify_res_t s_nonconsensus_callback_atom_add(dap_chain_t dap_nonconsensus_private_t *l_nochain_priv = PVT(l_nochain); dap_chain_datum_t *l_datum = (dap_chain_datum_t*) a_atom; dap_hash_fast_t l_datum_hash = *a_atom_hash; - if(dap_chain_datum_add(a_chain, l_datum, a_atom_size, &l_datum_hash)) + if(dap_chain_datum_add(a_chain, l_datum, a_atom_size, &l_datum_hash, NULL)) return ATOM_REJECT; dap_nonconsensus_datum_hash_item_t * l_hash_item = DAP_NEW_Z(dap_nonconsensus_datum_hash_item_t);