From b593b3c247e98acbaad5dd64ad52af0e919e0ed3 Mon Sep 17 00:00:00 2001 From: Aleksey Feoktistov <aleksey@synestproject.com> Date: Fri, 1 Apr 2022 14:29:26 +0500 Subject: [PATCH] [*] fix blocks; (ton) block load to ledger --- dap-sdk/core/src/dap_file_utils.c | 2 +- .../block-ton/dap_chain_cs_block_ton.c | 99 ++++--------------- modules/net/dap_chain_node_cli_cmd.c | 4 +- modules/type/blocks/dap_chain_cs_blocks.c | 32 ++++-- 4 files changed, 44 insertions(+), 93 deletions(-) diff --git a/dap-sdk/core/src/dap_file_utils.c b/dap-sdk/core/src/dap_file_utils.c index 0547a7e853..fea3cf97ac 100755 --- a/dap-sdk/core/src/dap_file_utils.c +++ b/dap-sdk/core/src/dap_file_utils.c @@ -1257,7 +1257,7 @@ char* dap_get_current_dir(void) const char *pwd; char *buffer = NULL; char *dir = NULL; - static ulong max_len = 0; + static u_long max_len = 0; struct stat pwdbuf, dotbuf; pwd = getenv("PWD"); diff --git a/modules/consensus/block-ton/dap_chain_cs_block_ton.c b/modules/consensus/block-ton/dap_chain_cs_block_ton.c index 968758a52b..dc9b1f8cf6 100644 --- a/modules/consensus/block-ton/dap_chain_cs_block_ton.c +++ b/modules/consensus/block-ton/dap_chain_cs_block_ton.c @@ -601,16 +601,20 @@ static void s_session_candidate_to_chain( } if ( ((float)l_signs_count/a_session->old_round.validators_count) >= ((float)2/3) ) { - // delete my new block if it passed consensus - char *l_candidate_hash_str = dap_chain_hash_fast_to_str_new(a_candidate_hash); - // block save to chain - if (dap_chain_atom_save(a_session->chain, (uint8_t *)l_candidate, a_candidate_size, a_session->chain->cells->id) < 0) { - log_it(L_ERROR, "TON: Can't add block %s to the file", l_candidate_hash_str); - } - else { - log_it(L_NOTICE, "TON: Block %s added in chain successfully", l_candidate_hash_str); - } - DAP_DELETE(l_candidate_hash_str); + dap_chain_t *l_chain = a_session->chain; + dap_chain_cs_blocks_t *l_blocks = DAP_CHAIN_CS_BLOCKS(l_chain); + dap_chain_atom_verify_res_t l_res = a_session->chain->callback_atom_add(a_session->chain, l_candidate, a_candidate_size); + if (l_res == ATOM_ACCEPT) { + char *l_candidate_hash_str = dap_chain_hash_fast_to_str_new(a_candidate_hash); + // block save to chain + if (dap_chain_atom_save(a_session->chain, (uint8_t *)l_candidate, a_candidate_size, a_session->chain->cells->id) < 0) { + log_it(L_ERROR, "TON: Can't add block %s to the file", l_candidate_hash_str); + } + else { + log_it(L_NOTICE, "TON: Block %s added in chain successfully", l_candidate_hash_str); + } + DAP_DELETE(l_candidate_hash_str); + } } DAP_DELETE(l_candidate); } @@ -681,8 +685,7 @@ static int s_session_datums_validation(dap_chain_cs_blocks_t *a_blocks, dap_chai } } } - // it's temporary (reject other datums type) - return -3; + return 0; } static void s_session_block_new_delete(dap_chain_cs_block_ton_items_t *a_session) { @@ -1766,83 +1769,19 @@ static size_t s_callback_block_sign(dap_chain_cs_blocks_t *a_blocks, dap_chain_b return dap_chain_block_sign_add(a_block_ptr, a_block_size, l_ton_pvt->blocks_sign_key); } -// not used static int s_callback_block_verify(dap_chain_cs_blocks_t *a_blocks, dap_chain_block_t *a_block, size_t a_block_size) { - dap_chain_cs_block_ton_t *l_ton = DAP_CHAIN_CS_BLOCK_TON(a_blocks); - dap_chain_cs_block_ton_pvt_t *l_ton_pvt = PVT(l_ton); - + // dap_chain_cs_block_ton_t *l_ton = DAP_CHAIN_CS_BLOCK_TON(a_blocks); + // dap_chain_cs_block_ton_pvt_t *l_ton_pvt = PVT(l_ton); if (a_blocks->chain->ledger == NULL) { - log_it(L_CRITICAL,"Ledger is NULL can't check PoS on this chain %s", a_blocks->chain->name); + log_it(L_CRITICAL,"Ledger is NULL can't check TON on this chain %s", a_blocks->chain->name); return -3; } - if (sizeof(a_block->hdr) >= a_block_size) { log_it(L_WARNING,"Incorrect size with block %p on chain %s", a_block, a_blocks->chain->name); return -7; } - - size_t l_signs_count = dap_chain_block_get_signs_count(a_block, a_block_size); - if (l_signs_count < l_ton_pvt->confirmations_minimum) { - log_it(L_WARNING,"Wrong signature number with block %p on chain %s", a_block, a_blocks->chain->name); - return -2; // Wrong signatures number - } - - uint16_t l_verified_num = 0; - for (size_t l_sig_ton = 0; l_sig_ton < l_signs_count; l_sig_ton++) { - dap_sign_t *l_sign = dap_chain_block_sign_get(a_block, a_block_size, l_sig_ton); - if (l_sign == NULL) { - log_it(L_WARNING, "Block isn't signed with anything: sig ton %zu, event size %zu", l_sig_ton, a_block_size); - return -4; - } - - bool l_sign_size_correct = dap_sign_verify_size(l_sign, a_block_size); - if (!l_sign_size_correct) { - log_it(L_WARNING, "Block's sign #%zu size is incorrect", l_sig_ton); - return -44; - } - size_t l_block_data_size = dap_chain_block_get_sign_offset(a_block, a_block_size)+sizeof(a_block->hdr); - if (l_block_data_size == a_block_size) { - log_it(L_WARNING,"Block has nothing except sign, nothing to verify so I pass it (who knows why we have it?)"); - return 0; - } - - int l_sign_verified = dap_sign_verify(l_sign, a_block, l_block_data_size); - if (l_sign_verified != 1) { - log_it(L_WARNING, "Block's sign is incorrect: code %d", l_sign_verified); - return -41; - } - - if (l_sig_ton == 0) { - dap_chain_addr_t l_addr = {}; - dap_chain_hash_fast_t l_pkey_hash; - dap_sign_get_pkey_hash(l_sign, &l_pkey_hash); - dap_chain_addr_fill(&l_addr, l_sign->header.type, &l_pkey_hash, a_blocks->chain->net_id); - 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); - if (!l_datums || !l_datums_count) { - log_it(L_WARNING, "No datums in block %p on chain %s", a_block, a_blocks->chain->name); - return -7; - } - for (size_t i = 0; i < l_datums_count; i++) { - if (!dap_chain_net_srv_stake_validator(&l_addr, l_datums[i])) { - log_it(L_WARNING, "Not passed stake validator datum %zu with block %p on chain %s", i, a_block, a_blocks->chain->name); - DAP_DELETE(l_datums); - return -6; - } - } - DAP_DELETE(l_datums); - } - } - - // Check number - if (l_verified_num >= l_ton_pvt->confirmations_minimum) { - // Passed all checks - return 0; - } else { - log_it(L_WARNING, "Wrong block: only %hu/%hu signs are valid", l_verified_num, l_ton_pvt->confirmations_minimum); - return -2; - } + return 0; } diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c index 359901a30b..123a33667d 100644 --- a/modules/net/dap_chain_node_cli_cmd.c +++ b/modules/net/dap_chain_node_cli_cmd.c @@ -3467,7 +3467,7 @@ int com_token_emit(int a_argc, char ** a_argv, char ** a_str_reply) return -3; } - dap_chain_addr_t *l_addr = dap_chain_addr_from_str(l_addr_str); + l_addr = dap_chain_addr_from_str(l_addr_str); if(!l_addr) { dap_chain_node_cli_set_reply_text(a_str_reply, "address \"%s\" is invalid", l_addr_str); @@ -3540,7 +3540,7 @@ int com_token_emit(int a_argc, char ** a_argv, char ** a_str_reply) // Calc datum emission's hash dap_hash_fast(l_datum_emission, l_datum_emission_size, &l_datum_emission_hash); - bool l_hex_format = dap_strcmp(l_hash_out_type, "hex"); + bool l_hex_format = !dap_strcmp(l_hash_out_type, "hex"); l_emission_hash_str = l_hex_format ? dap_chain_hash_fast_to_str_new(&l_datum_emission_hash) : dap_enc_base58_encode_hash_to_str(&l_datum_emission_hash); // Add token emission datum to mempool diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c index 1d03a0911f..75a435d2b7 100644 --- a/modules/type/blocks/dap_chain_cs_blocks.c +++ b/modules/type/blocks/dap_chain_cs_blocks.c @@ -607,7 +607,7 @@ static void s_callback_delete(dap_chain_t * a_chain) * @param a_block_cache * @return */ -static int s_add_atom_to_ledger(dap_chain_cs_blocks_t * a_blocks, dap_ledger_t * a_ledger, dap_chain_block_cache_t * a_block_cache) +static int s_add_atom_to_ledger(dap_chain_cs_blocks_t * a_blocks, dap_ledger_t * a_ledger, dap_chain_block_cache_t * a_block_cache) { if (! a_block_cache->datum_count){ log_it(L_WARNING,"Block %s has no datums at all, can't add anything to ledger", a_block_cache->block_hash_str); @@ -635,7 +635,7 @@ static int s_add_atom_to_ledger(dap_chain_cs_blocks_t * a_blocks, dap_ledger_t break; } // don't save bad transactions to base - int l_ret = dap_chain_ledger_tx_load(a_ledger, l_tx, NULL); + l_ret = dap_chain_ledger_tx_load(a_ledger, l_tx, NULL); if( l_ret != 1 ) break; @@ -651,7 +651,7 @@ static int s_add_atom_to_ledger(dap_chain_cs_blocks_t * a_blocks, dap_ledger_t default: l_ret=-1; } - if (l_ret != 0 ){ + if (l_ret != 1 ){ log_it(L_WARNING, "Can't load datum #%zu (%s) from block %s to ledger: code %d", i, dap_chain_datum_type_id_to_str(l_datum->header.type_id), a_block_cache->block_hash_str, l_ret); @@ -679,7 +679,7 @@ static int s_add_atom_to_blocks(dap_chain_cs_blocks_t * a_blocks, dap_ledger_t * log_it(L_DEBUG,"Block %s checked, add it to ledger", a_block_cache->block_hash_str ); pthread_rwlock_unlock( &PVT(a_blocks)->rwlock ); res = s_add_atom_to_ledger(a_blocks, a_ledger, a_block_cache); - if (res) { + if (res != 1) { log_it(L_INFO,"Block %s checked, but ledger declined", a_block_cache->block_hash_str ); return res; } @@ -800,7 +800,7 @@ static dap_chain_atom_verify_res_t s_callback_atom_add(dap_chain_t * a_chain, da if( ret == ATOM_ACCEPT){ int l_consensus_check = s_add_atom_to_blocks(l_blocks, a_chain->ledger, l_block_cache); - if(!l_consensus_check){ + if(l_consensus_check == 1){ log_it(L_DEBUG, "... added"); }else if (l_consensus_check == DAP_CHAIN_CS_VERIFY_CODE_TX_NO_PREVIOUS){ pthread_rwlock_wrlock( &PVT(l_blocks)->rwlock ); @@ -1010,9 +1010,15 @@ static dap_chain_atom_ptr_t s_callback_atom_iter_get_first( dap_chain_atom_iter_ dap_chain_cs_blocks_t * l_blocks = DAP_CHAIN_CS_BLOCKS(a_atom_iter->chain); dap_chain_cs_blocks_pvt_t *l_blocks_pvt = l_blocks ? PVT(l_blocks) : NULL; assert(l_blocks_pvt); - a_atom_iter->cur_item = l_blocks_pvt->block_cache_last ; - a_atom_iter->cur = l_blocks_pvt->block_cache_last ? l_blocks_pvt->block_cache_last->block : NULL ; + // a_atom_iter->cur_item = l_blocks_pvt->block_cache_last ; + // a_atom_iter->cur = l_blocks_pvt->block_cache_last ? l_blocks_pvt->block_cache_last->block : NULL ; + // a_atom_iter->cur_size = l_blocks_pvt->block_cache_last ? l_blocks_pvt->block_cache_last->block_size : 0; + // a_atom_iter->cur_hash = l_blocks_pvt->block_cache_last ? &l_blocks_pvt->block_cache_last->block_hash : NULL; + + a_atom_iter->cur_item = l_blocks_pvt->block_cache_first; + a_atom_iter->cur = l_blocks_pvt->block_cache_first ? l_blocks_pvt->block_cache_first->block : NULL; a_atom_iter->cur_size = l_blocks_pvt->block_cache_first ? l_blocks_pvt->block_cache_first->block_size : 0; + a_atom_iter->cur_hash = l_blocks_pvt->block_cache_first ? &l_blocks_pvt->block_cache_first->block_hash : NULL; // a_atom_iter->cur = a_atom_iter->cur ? // (dap_chain_cs_dag_event_t*) PVT (DAP_CHAIN_CS_DAG( a_atom_iter->chain) )->events->event : NULL; @@ -1031,16 +1037,22 @@ static dap_chain_atom_ptr_t s_callback_atom_iter_get_first( dap_chain_atom_iter_ static dap_chain_atom_ptr_t s_callback_atom_iter_get_next( dap_chain_atom_iter_t * a_atom_iter,size_t *a_atom_size ) { assert(a_atom_iter); - assert(a_atom_size); + // assert(a_atom_size); assert(a_atom_iter->cur_item); dap_chain_block_cache_t * l_cur_cache =(dap_chain_block_cache_t *) a_atom_iter->cur_item; a_atom_iter->cur_item = l_cur_cache = l_cur_cache->next; if (l_cur_cache){ a_atom_iter->cur = l_cur_cache->block; - *a_atom_size=a_atom_iter->cur_size = l_cur_cache->block_size; + if(a_atom_size) + *a_atom_size=a_atom_iter->cur_size = l_cur_cache->block_size; return l_cur_cache->block; - }else + } + else { + a_atom_iter->cur = NULL; + a_atom_iter->cur_size = 0; + a_atom_iter->cur_hash = NULL; return NULL; + } } /** -- GitLab