From a40d9b39870302b32dd6017e7bf4d7db1f89f2d2 Mon Sep 17 00:00:00 2001 From: "roman.khlopkov" <roman.khlopkov@demlabs.net> Date: Thu, 6 Feb 2025 18:25:53 +0300 Subject: [PATCH 1/2] [*] Chain generation labeling --- modules/chain/tests/dap_chain_ledger_tests.c | 40 ++++++------- .../consensus/esbocs/dap_chain_cs_esbocs.c | 57 +++++++++++++------ .../esbocs/include/dap_chain_cs_esbocs.h | 1 + .../datum/include/dap_chain_datum_decree.h | 3 +- modules/ledger/dap_chain_ledger.c | 2 +- modules/ledger/dap_chain_ledger_decree.c | 19 ++++++- modules/ledger/dap_chain_ledger_tx.c | 10 ++-- modules/ledger/include/dap_chain_ledger.h | 4 +- modules/net/dap_chain_net.c | 6 +- modules/net/dap_chain_node.c | 2 +- modules/net/include/dap_chain_net.h | 2 +- modules/node-cli/dap_chain_node_cli.c | 4 ++ modules/node-cli/dap_chain_node_cli_cmd.c | 2 + .../dap_chain_net_srv_stake_pos_delegate.c | 11 ++-- .../dap_chain_net_srv_stake_pos_delegate.h | 2 +- modules/type/blocks/dap_chain_cs_blocks.c | 28 +++++++-- .../type/blocks/include/dap_chain_cs_blocks.h | 1 - modules/type/dag/dap_chain_cs_dag.c | 2 +- modules/type/none/dap_chain_cs_none.c | 2 +- 19 files changed, 130 insertions(+), 68 deletions(-) diff --git a/modules/chain/tests/dap_chain_ledger_tests.c b/modules/chain/tests/dap_chain_ledger_tests.c index 47440a27df..bccf77f99e 100644 --- a/modules/chain/tests/dap_chain_ledger_tests.c +++ b/modules/chain/tests/dap_chain_ledger_tests.c @@ -525,7 +525,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, NULL, false); + 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; } @@ -565,7 +565,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, NULL, 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 @@ -582,7 +582,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, NULL, 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); @@ -595,7 +595,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, NULL, 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); @@ -605,7 +605,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, NULL, 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); @@ -622,7 +622,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, NULL, 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}; @@ -631,7 +631,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, NULL, 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); @@ -651,7 +651,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, NULL, 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"); @@ -666,7 +666,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, NULL, 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); @@ -678,7 +678,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, NULL, 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); @@ -728,14 +728,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, NULL, 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, NULL, 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; } @@ -865,7 +865,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, NULL, 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); @@ -873,13 +873,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, NULL, 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, NULL, 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 { @@ -979,20 +979,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, NULL, 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, NULL, 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, NULL, 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."); } } @@ -1075,7 +1075,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, NULL, 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); @@ -1091,7 +1091,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, NULL, 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/consensus/esbocs/dap_chain_cs_esbocs.c b/modules/consensus/esbocs/dap_chain_cs_esbocs.c index 9cf394d968..b512eb7616 100644 --- a/modules/consensus/esbocs/dap_chain_cs_esbocs.c +++ b/modules/consensus/esbocs/dap_chain_cs_esbocs.c @@ -451,7 +451,7 @@ static void s_new_atom_notifier(void *a_arg, dap_chain_t *a_chain, dap_chain_cel !l_session->new_round_enqueued) { l_session->new_round_enqueued = true; s_session_round_new(l_session); - if (DAP_CHAIN_CS_BLOCKS(a_chain)->is_hardfork_state) { + if (l_session->is_hardfork) { size_t l_datums_count = 0; dap_chain_datum_t **l_datums = dap_chain_block_get_datums(a_atom, a_atom_size, &l_datums_count); for (size_t i = 0; i < l_datums_count; i++) @@ -753,6 +753,16 @@ int dap_chain_esbocs_set_hardfork_prepare(dap_chain_t *a_chain, uint64_t a_block return a_block_num && a_block_num < l_last_num ? 1 : 0; } +int dap_chain_esbocs_set_hardfork_complete(dap_chain_t *a_chain) +{ + dap_chain_cs_blocks_t *l_blocks = DAP_CHAIN_CS_BLOCKS(a_chain); + dap_chain_esbocs_t *l_esbocs = DAP_CHAIN_ESBOCS(l_blocks); + dap_chain_net_t *l_net = dap_chain_net_by_id(a_chain->net_id); + l_esbocs->session->is_hardfork = false; + l_net->pub.ledger->is_hardfork_state = false; + return 0; +} + static int s_callback_purge(dap_chain_t *a_chain) { dap_return_val_if_fail(a_chain && !strcmp(dap_chain_get_cs_type(a_chain), DAP_CHAIN_ESBOCS_CS_TYPE_STR), -1); @@ -1689,10 +1699,13 @@ static void s_session_candidate_submit(dap_chain_esbocs_session_t *a_session) l_candidate_size = dap_chain_block_meta_add(&l_candidate, l_candidate_size, DAP_CHAIN_BLOCK_META_EXCLUDED_KEYS, a_session->cur_round.excluded_list, (*a_session->cur_round.excluded_list + 1) * sizeof(uint16_t)); } - if (a_session->is_hardfork && dap_chain_block_meta_get(l_candidate, l_candidate_size, DAP_CHAIN_BLOCK_META_GENESIS)) { - if (l_candidate_size) + if (a_session->is_hardfork) { + if (dap_chain_block_meta_get(l_candidate, l_candidate_size, DAP_CHAIN_BLOCK_META_GENESIS) && l_candidate_size) l_candidate_size = dap_chain_block_meta_add(&l_candidate, l_candidate_size, DAP_CHAIN_BLOCK_META_LINK, &l_chain->hardfork_decree_hash, sizeof(l_chain->hardfork_decree_hash)); + if (l_candidate_size) + l_candidate_size = dap_chain_block_meta_add(&l_candidate, l_candidate_size, DAP_CHAIN_BLOCK_META_GENERATION, + &l_blocks->generation, sizeof(uint16_t)); } if (l_candidate_size) { dap_hash_fast(l_candidate, l_candidate_size, &l_candidate_hash); @@ -2873,31 +2886,39 @@ static int s_callback_block_verify(dap_chain_cs_blocks_t *a_blocks, dap_chain_bl log_it(L_WARNING, "Illegal block version %d", a_block->hdr.version); return -3; } - if (a_blocks->is_hardfork_state) { + if (l_esbocs->session->is_hardfork) { + uint8_t *l_generation = dap_chain_block_meta_get(a_block, a_block_size, DAP_CHAIN_BLOCK_META_GENERATION); + if (!l_generation || *(uint16_t *)l_generation != a_blocks->generation) { + log_it(L_WARNING, "Can't process hardfork block %s with incorrect generation meta", dap_hash_fast_to_str_static(a_block_hash)); + return -302; + } // Addtionally verify datums vs internal states size_t l_datums_count = 0; dap_chain_datum_t **l_datums = dap_chain_block_get_datums(a_block, a_block_size, &l_datums_count); for (size_t i = 0; i < l_datums_count; i++) { int ret = dap_chain_node_hardfork_check(a_blocks->chain, l_datums[i]); if (ret) { - log_it(L_WARNING, "Can't process hardfork block %s", dap_hash_fast_to_str_static(a_block_hash)); + log_it(L_WARNING, "Can't process hardfork block %s with datums verification error", dap_hash_fast_to_str_static(a_block_hash)); return ret; } } - } - // compare hardfork decree hashes - if (dap_chain_block_meta_get(a_block, a_block_size, DAP_CHAIN_BLOCK_META_GENESIS)) { - dap_hash_fast_t *l_hardfork_decree_hash = (dap_hash_fast_t *)dap_chain_block_meta_get(a_block, a_block_size, DAP_CHAIN_BLOCK_META_LINK); - if (!l_hardfork_decree_hash) { - log_it(L_ERROR, "Can't find hardfork decree hash in candidate block meta"); - return -300; - } else if (memcmp(l_hardfork_decree_hash, &a_blocks->chain->hardfork_decree_hash, sizeof(a_blocks->chain->hardfork_decree_hash))) { - char *l_candidate_hash_str = dap_hash_fast_to_str_new(l_hardfork_decree_hash); - log_it(L_ERROR, "Can't verify hardfork decree hash in atom candidate, expected %s, got %s", - dap_hash_fast_to_str_static(&a_blocks->chain->hardfork_decree_hash), l_candidate_hash_str); - DAP_DELETE(l_candidate_hash_str); - return -301; + // compare hardfork decree hashes + if (dap_chain_block_meta_get(a_block, a_block_size, DAP_CHAIN_BLOCK_META_GENESIS)) { + dap_hash_fast_t *l_hardfork_decree_hash = (dap_hash_fast_t *)dap_chain_block_meta_get(a_block, a_block_size, DAP_CHAIN_BLOCK_META_LINK); + if (!l_hardfork_decree_hash) { + log_it(L_ERROR, "Can't find hardfork decree hash in candidate block meta"); + return -300; + } else if (memcmp(l_hardfork_decree_hash, &a_blocks->chain->hardfork_decree_hash, sizeof(a_blocks->chain->hardfork_decree_hash))) { + char *l_candidate_hash_str = dap_hash_fast_to_str_new(l_hardfork_decree_hash); + log_it(L_ERROR, "Can't verify hardfork decree hash in atom candidate, expected %s, got %s", + dap_hash_fast_to_str_static(&a_blocks->chain->hardfork_decree_hash), l_candidate_hash_str); + DAP_DELETE(l_candidate_hash_str); + return -301; + } } + } else if (dap_chain_block_meta_get(a_block, a_block_size, DAP_CHAIN_BLOCK_META_GENERATION)) { + log_it(L_WARNING, "Can't process non-hardfork block %s with generation meta", dap_hash_fast_to_str_static(a_block_hash)); + return -303; } } diff --git a/modules/consensus/esbocs/include/dap_chain_cs_esbocs.h b/modules/consensus/esbocs/include/dap_chain_cs_esbocs.h index c86591e1b4..d20028d139 100644 --- a/modules/consensus/esbocs/include/dap_chain_cs_esbocs.h +++ b/modules/consensus/esbocs/include/dap_chain_cs_esbocs.h @@ -269,4 +269,5 @@ uint16_t dap_chain_esbocs_get_min_validators_count(dap_chain_net_id_t a_net_id); int dap_chain_esbocs_set_emergency_validator(dap_chain_t *a_chain, bool a_add, uint32_t a_sign_type, dap_hash_fast_t *a_validator_hash); int dap_chain_esbocs_set_signs_struct_check(dap_chain_t *a_chain, bool a_enable); int dap_chain_esbocs_set_hardfork_prepare(dap_chain_t *a_chain, uint64_t a_block_num, dap_list_t *a_trusted_addrs); +int dap_chain_esbocs_set_hardfork_complete(dap_chain_t *a_chain); void dap_chain_esbocs_change_debug_mode(dap_chain_t *a_chain, bool a_enable); diff --git a/modules/datum/include/dap_chain_datum_decree.h b/modules/datum/include/dap_chain_datum_decree.h index 8215c8109b..2858447886 100644 --- a/modules/datum/include/dap_chain_datum_decree.h +++ b/modules/datum/include/dap_chain_datum_decree.h @@ -76,7 +76,8 @@ DAP_STATIC_INLINE size_t dap_chain_datum_decree_get_size(dap_chain_datum_decree_ #define DAP_CHAIN_DATUM_DECREE_COMMON_SUBTYPE_EMERGENCY_VALIDATORS 0x000D #define DAP_CHAIN_DATUM_DECREE_COMMON_SUBTYPE_CHECK_SIGNS_STRUCTURE 0x000E #define DAP_CHAIN_DATUM_DECREE_COMMON_SUBTYPE_HARDFORK 0x000F -#define DAP_CHAIN_DATUM_DECREE_COMMON_SUBTYPE_STAKE_PKEY_UPDATE 0x0010 +#define DAP_CHAIN_DATUM_DECREE_COMMON_SUBTYPE_STAKE_PKEY_UPDATE 0x0010 +#define DAP_CHAIN_DATUM_DECREE_COMMON_SUBTYPE_HARDFORK_COMPLETE 0x0011 // DECREE TSD types #define DAP_CHAIN_DATUM_DECREE_TSD_TYPE_VALUE 0x0100 diff --git a/modules/ledger/dap_chain_ledger.c b/modules/ledger/dap_chain_ledger.c index 569634b55a..c99d32f9d9 100644 --- a/modules/ledger/dap_chain_ledger.c +++ b/modules/ledger/dap_chain_ledger.c @@ -649,7 +649,7 @@ void dap_ledger_pvt_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, NULL, false); + 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); diff --git a/modules/ledger/dap_chain_ledger_decree.c b/modules/ledger/dap_chain_ledger_decree.c index cbc6910639..8c445092b3 100644 --- a/modules/ledger/dap_chain_ledger_decree.c +++ b/modules/ledger/dap_chain_ledger_decree.c @@ -602,7 +602,7 @@ const char *l_ban_addr; break; return dap_chain_esbocs_set_emergency_validator(l_chain, l_action, l_sign_type, &l_hash); } - case DAP_CHAIN_DATUM_DECREE_COMMON_SUBTYPE_HARDFORK: + case DAP_CHAIN_DATUM_DECREE_COMMON_SUBTYPE_HARDFORK: { if (dap_chain_datum_decree_get_atom_num(a_decree, &l_block_num)) { log_it(L_WARNING, "Can't get atom number from hardfork prepare decree"); return -103; @@ -622,6 +622,21 @@ const char *l_ban_addr; DAP_CHAIN_DATUM_DECREE_TSD_TYPE_NODE_ADDR, sizeof(dap_stream_node_addr_t)); dap_hash_fast(a_decree, dap_chain_datum_decree_get_size(a_decree), &l_chain->hardfork_decree_hash); return dap_chain_esbocs_set_hardfork_prepare(l_chain, l_block_num, l_addrs); + } + case DAP_CHAIN_DATUM_DECREE_COMMON_SUBTYPE_HARDFORK_COMPLETE: { + dap_chain_t *l_chain = dap_chain_find_by_id(a_net->pub.id, a_decree->header.common_decree_params.chain_id); + if (!l_chain) { + log_it(L_WARNING, "Specified chain not found"); + return -106; + } + if (dap_strcmp(dap_chain_get_cs_type(l_chain), "esbocs")) { + log_it(L_WARNING, "Can't apply this decree to specified chain"); + return -115; + } + if (!a_apply) + break; + return dap_chain_esbocs_set_hardfork_complete(l_chain); + } default: return -1; } @@ -780,4 +795,4 @@ dap_list_t *dap_ledger_decrees_get_by_type(dap_ledger_t *a_ledger, int a_type) } pthread_rwlock_unlock(&l_ledger_pvt->decrees_rwlock); return l_ret; -} \ No newline at end of file +} diff --git a/modules/ledger/dap_chain_ledger_tx.c b/modules/ledger/dap_chain_ledger_tx.c index 38e05df59f..e9d37f38c6 100644 --- a/modules/ledger/dap_chain_ledger_tx.c +++ b/modules/ledger/dap_chain_ledger_tx.c @@ -1213,7 +1213,7 @@ dap_list_t *s_trackers_aggregate(dap_ledger_t *a_ledger, dap_list_t *a_trackers, * @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, dap_ledger_datum_iter_data_t *a_datum_index_data, bool a_hardfork_related) +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(g_debug_ledger, L_ERROR, "NULL tx detected"); @@ -1230,7 +1230,7 @@ int dap_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_ha byte_t *l_item = NULL; size_t l_tx_item_size = 0; - if (a_hardfork_related) { + if (a_ledger->is_hardfork_state) { TX_ITEM_ITER_TX(l_item, l_tx_item_size, a_tx) { if (*l_item != TX_ITEM_TYPE_TSD) continue; @@ -1610,7 +1610,7 @@ int dap_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_ha } } - if (a_hardfork_related) { + if (a_ledger->is_hardfork_state) { TX_ITEM_ITER_TX(l_item, l_tx_item_size, a_tx) { if (*l_item != TX_ITEM_TYPE_TSD) continue; @@ -1982,7 +1982,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, dap_ledger_datum_iter_data_t *a_datum_index_data, bool a_hardfork_related) +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)) { @@ -1998,7 +1998,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, a_datum_index_data, a_hardfork_related); + return dap_ledger_tx_add(a_ledger, a_tx, a_tx_hash, false, a_datum_index_data); } static void s_ledger_stake_lock_cache_update(dap_ledger_t *a_ledger, dap_ledger_stake_lock_item_t *a_stake_lock_item) diff --git a/modules/ledger/include/dap_chain_ledger.h b/modules/ledger/include/dap_chain_ledger.h index 0f4df48320..332d42d84a 100644 --- a/modules/ledger/include/dap_chain_ledger.h +++ b/modules/ledger/include/dap_chain_ledger.h @@ -310,8 +310,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, dap_ledger_datum_iter_data_t *a_datum_index_data, bool a_hardfork_related); -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, bool a_hardfork_related); +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/dap_chain_net.c b/modules/net/dap_chain_net.c index 937a7abe47..36fb75c86f 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -2758,7 +2758,7 @@ static int s_load_state_from_datum(dap_chain_net_id_t a_net_id, dap_chain_datum_ * @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, void *a_datum_index_data, bool a_hardfork_related) +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)) { @@ -2801,12 +2801,12 @@ 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, (dap_ledger_datum_iter_data_t*)a_datum_index_data, a_hardfork_related); + return dap_ledger_tx_load(l_ledger, l_tx, a_datum_hash, (dap_ledger_datum_iter_data_t*)a_datum_index_data); } case DAP_CHAIN_DATUM_CA: return dap_cert_chain_file_save(a_datum, a_chain->net_name); case DAP_CHAIN_DATUM_SERVICE_STATE: - return a_hardfork_related ? s_load_state_from_datum(a_chain->net_id, a_datum, a_datum_hash) : -601; + return l_ledger->is_hardfork_state ? s_load_state_from_datum(a_chain->net_id, a_datum, a_datum_hash) : -601; case DAP_CHAIN_DATUM_SIGNER: case DAP_CHAIN_DATUM_CUSTOM: break; diff --git a/modules/net/dap_chain_node.c b/modules/net/dap_chain_node.c index c4a4bd070b..61bb9a6187 100644 --- a/modules/net/dap_chain_node.c +++ b/modules/net/dap_chain_node.c @@ -562,7 +562,7 @@ int dap_chain_node_hardfork_prepare(dap_chain_t *a_chain, dap_time_t a_last_bloc } l_states->trusted_addrs = a_trusted_addrs; a_chain->hardfork_data = l_states; - DAP_CHAIN_CS_BLOCKS(a_chain)->is_hardfork_state = true; + DAP_CHAIN_CS_BLOCKS(a_chain)->generation++; l_net->pub.ledger->is_hardfork_state = true; return 0; } diff --git a/modules/net/include/dap_chain_net.h b/modules/net/include/dap_chain_net.h index 04a60cc6ee..8dd926f725 100644 --- a/modules/net/include/dap_chain_net.h +++ b/modules/net/include/dap_chain_net.h @@ -205,7 +205,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, void *a_datum_index_data, bool a_hardfork_related); +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/node-cli/dap_chain_node_cli.c b/modules/node-cli/dap_chain_node_cli.c index dbccf955b4..534554e1a5 100644 --- a/modules/node-cli/dap_chain_node_cli.c +++ b/modules/node-cli/dap_chain_node_cli.c @@ -381,12 +381,16 @@ int dap_chain_node_cli_init(dap_config_t * g_config) dap_cli_server_cmd_add ("decree", cmd_decree, "Work with decree", "decree create [common] -net <net_name> [-chain <chain_name>] -decree_chain <chain_name> -certs <certs_list> {-fee <net_fee_value> -to_addr <net_fee_wallet_addr> |" " -hardfork_from <atom_number> [-trusted_addrs <node_addresses>] |" + " -hardfork_complete |" " -new_certs <new_owners_certs_list> |" " -signs_verify <value>}\n" "Creates common network decree in net <net_name>. Decree adds to chain -chain and applies to chain -decree_chain. If -chain and -decree_chain is different you must create anchor in -decree_chain that is connected to this decree." "\nCommon decree parameters:\n" "\t -fee <value>: sets network fee\n" "\t -to_addr <wallet_addr>: sets wallet addr for network fee\n" + "\t -hardfork_from <atom_number>: start hardfork routine from specified block number\n" + "\t -trusted_addrs <node_addresses>: addresses of nodes who can provide service state datums for hardfork routine\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" "decree sign -net <net_name> [-chain <chain_name>] -datum <datum_hash> -certs <certs_list>\n" diff --git a/modules/node-cli/dap_chain_node_cli_cmd.c b/modules/node-cli/dap_chain_node_cli_cmd.c index ce18161fc7..cdf16e00c9 100644 --- a/modules/node-cli/dap_chain_node_cli_cmd.c +++ b/modules/node-cli/dap_chain_node_cli_cmd.c @@ -4142,6 +4142,8 @@ int cmd_decree(int a_argc, char **a_argv, void **a_str_reply) } dap_strfreev(l_addrs); } + } else if (dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-hardfork_complete", &l_param_value_str)) { + l_subtype = DAP_CHAIN_DATUM_DECREE_COMMON_SUBTYPE_HARDFORK_COMPLETE; } else if (dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-new_certs", &l_param_value_str)){ l_subtype = DAP_CHAIN_DATUM_DECREE_COMMON_SUBTYPE_OWNERS; dap_cert_parse_str_list(l_param_value_str, &l_new_certs, &l_new_certs_count); 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 23d1291b54..49605579e2 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 @@ -4288,7 +4288,7 @@ int dap_chain_net_srv_stake_hardfork_data_export(dap_chain_net_t *a_net, dap_lis * @param a_hardfork_decree_hash pointer to decree hash to restore data * @return if OK - 0, other if error */ -int dap_chain_net_srv_stake_hardfork_data_import(dap_chain_net_id_t a_net_id, dap_hash_fast_t *a_hardfork_decree_hash) +int dap_chain_net_srv_stake_hardfork_data_import(dap_chain_net_id_t a_net_id, dap_hash_fast_t *a_hardfork_decree_hash, bool a_verify_mode) { dap_chain_net_t *l_net = dap_chain_net_by_id(a_net_id); dap_chain_datum_decree_t *l_decree = dap_ledger_decree_get_by_hash(l_net, a_hardfork_decree_hash, NULL); @@ -4341,10 +4341,11 @@ int dap_chain_net_srv_stake_hardfork_data_import(dap_chain_net_id_t a_net_id, da dap_list_free_full(l_current_list, NULL); return -4; } - - dap_chain_net_srv_stake_key_delegate(l_net, &l_addr, l_current_decree, l_value, &l_node_addr, dap_chain_datum_decree_get_pkey(l_current_decree)); - dap_chain_net_srv_stake_add_approving_decree_info(l_current_decree, l_net); + if (!a_verify_mode) { + dap_chain_net_srv_stake_key_delegate(l_net, &l_addr, l_current_decree, l_value, &l_node_addr, dap_chain_datum_decree_get_pkey(l_current_decree)); + dap_chain_net_srv_stake_add_approving_decree_info(l_current_decree, l_net); + } } dap_list_free_full(l_current_list, NULL); return 0; -} \ No newline at end of file +} diff --git a/modules/service/stake/include/dap_chain_net_srv_stake_pos_delegate.h b/modules/service/stake/include/dap_chain_net_srv_stake_pos_delegate.h index 550ea8d8fa..168a32b278 100644 --- a/modules/service/stake/include/dap_chain_net_srv_stake_pos_delegate.h +++ b/modules/service/stake/include/dap_chain_net_srv_stake_pos_delegate.h @@ -81,4 +81,4 @@ size_t dap_chain_net_srv_stake_get_total_keys(dap_chain_net_id_t a_net_id, size_ void dap_chain_net_srv_stake_add_approving_decree_info(dap_chain_datum_decree_t *a_decree, dap_chain_net_t *a_net); void dap_chain_net_srv_stake_remove_approving_decree_info(dap_chain_net_t *a_net, dap_chain_addr_t *a_signing_addr); int dap_chain_net_srv_stake_hardfork_data_export(dap_chain_net_t *a_net, dap_list_t **a_out); -int dap_chain_net_srv_stake_hardfork_data_import(dap_chain_net_id_t a_net_id, dap_hash_fast_t *a_hardfork_decree_hash); \ No newline at end of file +int dap_chain_net_srv_stake_hardfork_data_import(dap_chain_net_id_t a_net_id, dap_hash_fast_t *a_hardfork_decree_hash, bool a_verify_mode); diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c index 5cf639f773..0227658009 100644 --- a/modules/type/blocks/dap_chain_cs_blocks.c +++ b/modules/type/blocks/dap_chain_cs_blocks.c @@ -1540,7 +1540,7 @@ static int s_add_atom_datums(dap_chain_cs_blocks_t *a_blocks, dap_chain_block_ca dap_hash_fast_t *l_datum_hash = a_block_cache->datum_hash + i; dap_ledger_datum_iter_data_t l_datum_index_data = { .token_ticker = "0", .action = DAP_CHAIN_TX_TAG_ACTION_UNKNOWN , .uid.uint64 = 0 }; bool is_hardfork_related_block = a_block_cache->generation && a_block_cache->generation == a_blocks->generation; - int l_res = dap_chain_datum_add(a_blocks->chain, l_datum, l_datum_size, l_datum_hash, &l_datum_index_data, is_hardfork_related_block); + int l_res = dap_chain_datum_add(a_blocks->chain, l_datum, l_datum_size, l_datum_hash, &l_datum_index_data); if (l_datum->header.type_id != DAP_CHAIN_DATUM_TX || l_res != DAP_LEDGER_CHECK_ALREADY_CACHED) { // If this is any datum other than a already cached transaction l_ret++; if (l_datum->header.type_id == DAP_CHAIN_DATUM_TX) @@ -1814,9 +1814,20 @@ static dap_chain_atom_verify_res_t s_callback_atom_add(dap_chain_t * a_chain, da } } else { + dap_hash_fast_t *l_hardfork_decree_hash = (dap_hash_fast_t *)dap_chain_block_meta_get(l_block, a_atom_size, DAP_CHAIN_BLOCK_META_LINK); + if (!l_hardfork_decree_hash) { + log_it(L_ERROR, "Can't find hardfork decree hash in candidate block meta"); + return ATOM_REJECT; + } + if (dap_chain_net_srv_stake_hardfork_data_import(a_chain->net_id, l_hardfork_decree_hash, false)) { + log_it(L_ERROR, "Can't accept hardfork genesis block %s: error in hardfork data restoring", dap_hash_fast_to_str_static(a_atom_hash)); + return ATOM_REJECT; + } + uint8_t *l_generation_meta = dap_chain_block_meta_get(l_block, a_atom_size, DAP_CHAIN_BLOCK_META_GENERATION); + l_blocks->generation = l_generation_meta ? *(uint16_t *)l_generation_meta : 0; HASH_ADD(hh, PVT(l_blocks)->blocks, block_hash, sizeof(l_block_cache->block_hash), l_block_cache); ++PVT(l_blocks)->blocks_count; - debug_if(s_debug_more, L_DEBUG, "Verified atom %p: ACCEPTED", a_atom); + debug_if(s_debug_more, L_DEBUG, "Verified genesis atom %p: ACCEPTED", a_atom); s_add_atom_datums(l_blocks, l_block_cache); dap_chain_atom_notify(l_cell, &l_block_cache->block_hash, (byte_t*)l_block, a_atom_size); dap_chain_atom_add_from_threshold(a_chain); @@ -1962,6 +1973,8 @@ static dap_chain_atom_verify_res_t s_callback_atom_verify(dap_chain_t *a_chain, int ret = ATOM_MOVE_TO_THRESHOLD; // Parse metadata bool l_is_genesis = dap_chain_block_meta_get(l_block, a_atom_size, DAP_CHAIN_BLOCK_META_GENESIS); + uint8_t *l_generation_meta = dap_chain_block_meta_get(l_block, a_atom_size, DAP_CHAIN_BLOCK_META_GENERATION); + uint16_t l_generation = l_generation_meta ? *(uint16_t *)l_generation_meta : 0; // genesis or seed mode if (l_is_genesis) { #ifndef DAP_CHAIN_BLOCKS_TEST @@ -1970,9 +1983,14 @@ static dap_chain_atom_verify_res_t s_callback_atom_verify(dap_chain_t *a_chain, else if(dap_hash_fast_compare(&l_block_hash, &PVT(l_blocks)->static_genesis_block_hash) && !dap_hash_fast_is_blank(&l_block_hash)) log_it(L_NOTICE, "Accepting static genesis block %s", dap_hash_fast_to_str_static(a_atom_hash)); - else if (l_blocks->is_hardfork_state) { + else if (l_generation) { log_it(L_NOTICE, "Accepting hardfork genesis block %s and restore data", dap_hash_fast_to_str_static(a_atom_hash)); - if (dap_chain_net_srv_stake_hardfork_data_import(a_chain->net_id, &a_chain->hardfork_decree_hash)) { + dap_hash_fast_t *l_hardfork_decree_hash = (dap_hash_fast_t *)dap_chain_block_meta_get(l_block, a_atom_size, DAP_CHAIN_BLOCK_META_LINK); + if (!l_hardfork_decree_hash) { + log_it(L_ERROR, "Can't find hardfork decree hash in candidate block meta"); + return ATOM_REJECT; + } + if (dap_chain_net_srv_stake_hardfork_data_import(a_chain->net_id, l_hardfork_decree_hash, true)) { log_it(L_ERROR, "Can't accept hardfork genesis block %s: error in hardfork data restoring", dap_hash_fast_to_str_static(a_atom_hash)); return ATOM_REJECT; } @@ -2055,7 +2073,7 @@ static dap_chain_atom_verify_res_t s_callback_atom_verify(dap_chain_t *a_chain, } } - if (ret == ATOM_ACCEPT || (!l_blocks->is_hardfork_state && ret == ATOM_FORK)) { + if (ret == ATOM_ACCEPT || (!l_generation && ret == ATOM_FORK)) { // 2nd level consensus if (l_blocks->callback_block_verify && l_blocks->callback_block_verify(l_blocks, l_block, a_atom_hash, /* Old bug, crutch for it */ a_atom_size)) { // Hard accept list diff --git a/modules/type/blocks/include/dap_chain_cs_blocks.h b/modules/type/blocks/include/dap_chain_cs_blocks.h index d260fdcfa3..04c5aa8ac2 100644 --- a/modules/type/blocks/include/dap_chain_cs_blocks.h +++ b/modules/type/blocks/include/dap_chain_cs_blocks.h @@ -44,7 +44,6 @@ typedef struct dap_chain_cs_blocks { dap_chain_block_t *block_new; // For new block creating size_t block_new_size; - bool is_hardfork_state; uint16_t generation; dap_chain_cs_blocks_callback_t callback_delete; diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c index 7378cc49c4..bef0bb74de 100644 --- a/modules/type/dag/dap_chain_cs_dag.c +++ b/modules/type/dag/dap_chain_cs_dag.c @@ -416,7 +416,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, NULL, false); + 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 3137e4f230..30e1301127 100644 --- a/modules/type/none/dap_chain_cs_none.c +++ b/modules/type/none/dap_chain_cs_none.c @@ -327,7 +327,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, NULL, false)) + 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); -- GitLab From 2a566508812d41bd16dc2cc4694ffa84e9dba092 Mon Sep 17 00:00:00 2001 From: "roman.khlopkov" <roman.khlopkov@demlabs.net> Date: Thu, 6 Feb 2025 23:40:11 +0300 Subject: [PATCH 2/2] [*] Blocks tests repair --- .../dap_chain_net_srv_stake_pos_delegate.c | 8 ++---- .../dap_chain_net_srv_stake_pos_delegate.h | 2 +- modules/type/blocks/dap_chain_cs_blocks.c | 28 +++++++++++-------- 3 files changed, 20 insertions(+), 18 deletions(-) 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 49605579e2..7bf277cea4 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 @@ -4288,7 +4288,7 @@ int dap_chain_net_srv_stake_hardfork_data_export(dap_chain_net_t *a_net, dap_lis * @param a_hardfork_decree_hash pointer to decree hash to restore data * @return if OK - 0, other if error */ -int dap_chain_net_srv_stake_hardfork_data_import(dap_chain_net_id_t a_net_id, dap_hash_fast_t *a_hardfork_decree_hash, bool a_verify_mode) +int dap_chain_net_srv_stake_hardfork_data_import(dap_chain_net_id_t a_net_id, dap_hash_fast_t *a_hardfork_decree_hash) { dap_chain_net_t *l_net = dap_chain_net_by_id(a_net_id); dap_chain_datum_decree_t *l_decree = dap_ledger_decree_get_by_hash(l_net, a_hardfork_decree_hash, NULL); @@ -4341,10 +4341,8 @@ int dap_chain_net_srv_stake_hardfork_data_import(dap_chain_net_id_t a_net_id, da dap_list_free_full(l_current_list, NULL); return -4; } - if (!a_verify_mode) { - dap_chain_net_srv_stake_key_delegate(l_net, &l_addr, l_current_decree, l_value, &l_node_addr, dap_chain_datum_decree_get_pkey(l_current_decree)); - dap_chain_net_srv_stake_add_approving_decree_info(l_current_decree, l_net); - } + dap_chain_net_srv_stake_key_delegate(l_net, &l_addr, l_current_decree, l_value, &l_node_addr, dap_chain_datum_decree_get_pkey(l_current_decree)); + dap_chain_net_srv_stake_add_approving_decree_info(l_current_decree, l_net); } dap_list_free_full(l_current_list, NULL); return 0; diff --git a/modules/service/stake/include/dap_chain_net_srv_stake_pos_delegate.h b/modules/service/stake/include/dap_chain_net_srv_stake_pos_delegate.h index 168a32b278..d8d3ba9785 100644 --- a/modules/service/stake/include/dap_chain_net_srv_stake_pos_delegate.h +++ b/modules/service/stake/include/dap_chain_net_srv_stake_pos_delegate.h @@ -81,4 +81,4 @@ size_t dap_chain_net_srv_stake_get_total_keys(dap_chain_net_id_t a_net_id, size_ void dap_chain_net_srv_stake_add_approving_decree_info(dap_chain_datum_decree_t *a_decree, dap_chain_net_t *a_net); void dap_chain_net_srv_stake_remove_approving_decree_info(dap_chain_net_t *a_net, dap_chain_addr_t *a_signing_addr); int dap_chain_net_srv_stake_hardfork_data_export(dap_chain_net_t *a_net, dap_list_t **a_out); -int dap_chain_net_srv_stake_hardfork_data_import(dap_chain_net_id_t a_net_id, dap_hash_fast_t *a_hardfork_decree_hash, bool a_verify_mode); +int dap_chain_net_srv_stake_hardfork_data_import(dap_chain_net_id_t a_net_id, dap_hash_fast_t *a_hardfork_decree_hash); diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c index 0227658009..a5494724b9 100644 --- a/modules/type/blocks/dap_chain_cs_blocks.c +++ b/modules/type/blocks/dap_chain_cs_blocks.c @@ -1716,10 +1716,10 @@ static dap_chain_atom_verify_res_t s_callback_atom_add(dap_chain_t * a_chain, da switch (ret) { case ATOM_ACCEPT:{ - dap_chain_net_t *l_net = dap_chain_net_by_id(a_chain->net_id); - assert(l_net); dap_chain_cell_t *l_cell = dap_chain_cell_find_by_id(a_chain, l_block->hdr.cell_id); #ifndef DAP_CHAIN_BLOCKS_TEST + dap_chain_net_t *l_net = dap_chain_net_by_id(a_chain->net_id); + assert(l_net); if ( !dap_chain_net_get_load_mode(l_net) ) { if ( (ret = dap_chain_atom_save(l_cell, a_atom, a_atom_size, a_atom_new ? &l_block_hash : NULL)) < 0 ) { log_it(L_ERROR, "Can't save atom to file, code %d", ret); @@ -1763,8 +1763,10 @@ static dap_chain_atom_verify_res_t s_callback_atom_add(dap_chain_t * a_chain, da for (; l_tmp && l_checked_atoms_cnt; l_tmp = l_tmp->hh.prev, l_checked_atoms_cnt--); if (l_checked_atoms_cnt == 0 && l_tmp) { l_notifier->callback(l_notifier->arg, a_chain, a_chain->active_cell_id, &l_tmp->block_hash, (void*)l_tmp->block, l_tmp->block_size); +#ifndef DAP_CHAIN_BLOCKS_TEST for (size_t i = 0; i < l_tmp->datum_count; i++) dap_ledger_tx_clear_colour(l_net->pub.ledger, l_tmp->datum_hash + i); +#endif } } #ifndef DAP_CHAIN_BLOCKS_TEST @@ -1814,17 +1816,19 @@ static dap_chain_atom_verify_res_t s_callback_atom_add(dap_chain_t * a_chain, da } } else { - dap_hash_fast_t *l_hardfork_decree_hash = (dap_hash_fast_t *)dap_chain_block_meta_get(l_block, a_atom_size, DAP_CHAIN_BLOCK_META_LINK); - if (!l_hardfork_decree_hash) { - log_it(L_ERROR, "Can't find hardfork decree hash in candidate block meta"); - return ATOM_REJECT; - } - if (dap_chain_net_srv_stake_hardfork_data_import(a_chain->net_id, l_hardfork_decree_hash, false)) { - log_it(L_ERROR, "Can't accept hardfork genesis block %s: error in hardfork data restoring", dap_hash_fast_to_str_static(a_atom_hash)); - return ATOM_REJECT; - } uint8_t *l_generation_meta = dap_chain_block_meta_get(l_block, a_atom_size, DAP_CHAIN_BLOCK_META_GENERATION); l_blocks->generation = l_generation_meta ? *(uint16_t *)l_generation_meta : 0; + if (l_blocks->generation) { + dap_hash_fast_t *l_hardfork_decree_hash = (dap_hash_fast_t *)dap_chain_block_meta_get(l_block, a_atom_size, DAP_CHAIN_BLOCK_META_LINK); + if (!l_hardfork_decree_hash) { + log_it(L_ERROR, "Can't find hardfork decree hash in candidate block meta"); + return ATOM_REJECT; + } + if (dap_chain_net_srv_stake_hardfork_data_import(a_chain->net_id, l_hardfork_decree_hash)) { // True import + log_it(L_ERROR, "Can't accept hardfork genesis block %s: error in hardfork data restoring", dap_hash_fast_to_str_static(a_atom_hash)); + return ATOM_REJECT; + } + } HASH_ADD(hh, PVT(l_blocks)->blocks, block_hash, sizeof(l_block_cache->block_hash), l_block_cache); ++PVT(l_blocks)->blocks_count; debug_if(s_debug_more, L_DEBUG, "Verified genesis atom %p: ACCEPTED", a_atom); @@ -1990,7 +1994,7 @@ static dap_chain_atom_verify_res_t s_callback_atom_verify(dap_chain_t *a_chain, log_it(L_ERROR, "Can't find hardfork decree hash in candidate block meta"); return ATOM_REJECT; } - if (dap_chain_net_srv_stake_hardfork_data_import(a_chain->net_id, l_hardfork_decree_hash, true)) { + if (dap_chain_net_srv_stake_hardfork_data_import(a_chain->net_id, l_hardfork_decree_hash)) { // Sandbox log_it(L_ERROR, "Can't accept hardfork genesis block %s: error in hardfork data restoring", dap_hash_fast_to_str_static(a_atom_hash)); return ATOM_REJECT; } -- GitLab