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