From e74453ceb2fd057b80c6a9e85e764aa3fe773a75 Mon Sep 17 00:00:00 2001
From: Roman Khlopkov <roman.khlopkov@demlabs.net>
Date: Mon, 20 Sep 2021 10:37:30 +0300
Subject: [PATCH] [*] Chains sync reanimated

---
 dap-sdk/crypto/include/dap_sign.h   |  2 +-
 dap-sdk/crypto/src/dap_sign.c       |  6 +++---
 modules/chain/dap_chain.c           |  2 +-
 modules/chain/dap_chain_cell.c      |  3 ++-
 modules/type/dag/dap_chain_cs_dag.c | 16 +++++++++-------
 5 files changed, 16 insertions(+), 13 deletions(-)

diff --git a/dap-sdk/crypto/include/dap_sign.h b/dap-sdk/crypto/include/dap_sign.h
index 1de33fe7bb..0c01cfb7c6 100755
--- a/dap-sdk/crypto/include/dap_sign.h
+++ b/dap-sdk/crypto/include/dap_sign.h
@@ -127,7 +127,7 @@ uint8_t* dap_sign_get_sign(dap_sign_t *a_sign, size_t *a_sign_out);
 uint8_t* dap_sign_get_pkey(dap_sign_t *a_sign, size_t *a_pub_key_out);
 bool dap_sign_get_pkey_hash(dap_sign_t *a_sign, dap_chain_hash_fast_t * a_sign_hash);
 
-bool dap_sign_verify_size(dap_sign_t *a_sign, size_t a_key_size_max);
+bool dap_sign_verify_size(dap_sign_t *a_sign);
 dap_enc_key_t *dap_sign_to_enc_key(dap_sign_t * a_chain_sign);
 const char * dap_sign_type_to_str(dap_sign_type_t a_chain_sign_type);
 dap_sign_type_t dap_sign_type_from_str(const char * a_type_str);
diff --git a/dap-sdk/crypto/src/dap_sign.c b/dap-sdk/crypto/src/dap_sign.c
index 3700b9c3f0..c518366970 100755
--- a/dap-sdk/crypto/src/dap_sign.c
+++ b/dap-sdk/crypto/src/dap_sign.c
@@ -315,9 +315,9 @@ bool dap_sign_get_pkey_hash(dap_sign_t *a_sign, dap_chain_hash_fast_t * a_sign_h
 }
 
 
-bool dap_sign_verify_size(dap_sign_t *a_sign, size_t a_key_size_max)
+bool dap_sign_verify_size(dap_sign_t *a_sign)
 {
-    if (a_sign->header.sign_pkey_size > a_key_size_max)
+    if (a_sign->header.sign_pkey_size > a_sign->header.sign_size)
         return false;
     return true;
 }
@@ -349,7 +349,7 @@ dap_enc_key_t *dap_sign_to_enc_key(dap_sign_t * a_chain_sign)
  */
 int dap_sign_verify(dap_sign_t * a_chain_sign, const void * a_data, const size_t a_data_size)
 {
-    if (!a_chain_sign || !a_data || !dap_sign_verify_size(a_chain_sign, a_data_size))
+    if (!a_chain_sign || !a_data || !dap_sign_verify_size(a_chain_sign))
         return -2;
 
     dap_enc_key_t * l_key = dap_sign_to_enc_key(a_chain_sign);
diff --git a/modules/chain/dap_chain.c b/modules/chain/dap_chain.c
index d2877bcc0a..cda76b3195 100644
--- a/modules/chain/dap_chain.c
+++ b/modules/chain/dap_chain.c
@@ -342,7 +342,7 @@ dap_chain_t * dap_chain_load_from_cfg(dap_ledger_t* a_ledger, const char * a_cha
                                 log_it(L_DEBUG, "Added atom from treshold");
                             }
                         }
-                        dap_chain_save_all( l_chain );
+                        //dap_chain_save_all( l_chain );
                         log_it (L_NOTICE, "Loaded chain files");
                     } else {
                         dap_chain_save_all( l_chain );
diff --git a/modules/chain/dap_chain_cell.c b/modules/chain/dap_chain_cell.c
index 7102fb648e..e4b10ca85a 100644
--- a/modules/chain/dap_chain_cell.c
+++ b/modules/chain/dap_chain_cell.c
@@ -297,7 +297,8 @@ int dap_chain_cell_file_append( dap_chain_cell_t * a_cell, const void* a_atom, s
     }
     if (l_total_wrote_bytes > 0) {
         fflush(a_cell->file_storage);
-        ftruncate(fileno(a_cell->file_storage), l_total_wrote_bytes + sizeof(dap_chain_cell_file_header_t));
+        if (!a_atom)
+            ftruncate(fileno(a_cell->file_storage), l_total_wrote_bytes + sizeof(dap_chain_cell_file_header_t));
     }
     if (l_atom_iter) {
         a_cell->chain->callback_atom_iter_delete(l_atom_iter);
diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c
index d26336f278..015eb3fe86 100644
--- a/modules/type/dag/dap_chain_cs_dag.c
+++ b/modules/type/dag/dap_chain_cs_dag.c
@@ -24,6 +24,7 @@
 #include <stdlib.h>
 #include <time.h>
 #include <pthread.h>
+#include "errno.h"
 #include "uthash.h"
 
 #ifdef _WIN32
@@ -300,12 +301,12 @@ static int s_dap_chain_add_atom_to_ledger(dap_chain_cs_dag_t * a_dag, dap_ledger
         case DAP_CHAIN_DATUM_TOKEN_DECL: {
             dap_chain_datum_token_t *l_token = (dap_chain_datum_token_t*) l_datum->data;
             return dap_chain_ledger_token_load(a_ledger, l_token, l_datum->header.data_size);
-            }
+        }
         break;
         case DAP_CHAIN_DATUM_TOKEN_EMISSION: {
             dap_chain_datum_token_emission_t *l_token_emission = (dap_chain_datum_token_emission_t*) l_datum->data;
             return dap_chain_ledger_token_emission_load(a_ledger, l_token_emission, l_datum->header.data_size);
-            }
+        }
         break;
         case DAP_CHAIN_DATUM_TX: {
             dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t*) l_datum->data;
@@ -319,10 +320,12 @@ static int s_dap_chain_add_atom_to_ledger(dap_chain_cs_dag_t * a_dag, dap_ledger
             l_tx_event->event = a_event_item->event;
             l_tx_event->event_size = a_event_item->event_size;
             memcpy(&l_tx_event->hash, &a_event_item->hash, sizeof (l_tx_event->hash) );
-            pthread_rwlock_wrlock(l_events_rwlock);
+            int l_err = pthread_rwlock_wrlock(l_events_rwlock);
             HASH_ADD(hh,PVT(a_dag)->tx_events, hash, sizeof (l_tx_event->hash), l_tx_event);
-            pthread_rwlock_unlock(l_events_rwlock);
+            if (l_err != EDEADLK) {
+                pthread_rwlock_unlock(l_events_rwlock);
             }
+        }
         break;
         default:
             return -1;
@@ -421,10 +424,10 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha
     case ATOM_ACCEPT: {
         int l_consensus_check = s_dap_chain_add_atom_to_events_table(l_dag, a_chain->ledger, l_event_item);
         //All correct, no matter for result
-        pthread_rwlock_wrlock(&PVT(l_dag)->events_rwlock);
+        pthread_rwlock_wrlock(l_events_rwlock);
         HASH_ADD(hh, PVT(l_dag)->events,hash,sizeof (l_event_item->hash), l_event_item);
         s_dag_events_lasts_process_new_last_event(l_dag, l_event_item);
-        pthread_rwlock_unlock(&PVT(l_dag)->events_rwlock);
+        pthread_rwlock_unlock(l_events_rwlock);
         switch (l_consensus_check) {
         case 0:
             if(s_debug_more)
@@ -881,7 +884,6 @@ dap_chain_cs_dag_event_item_t* dap_chain_cs_dag_proc_treshold(dap_chain_cs_dag_t
                 char * l_event_hash_str = dap_chain_hash_fast_to_str_new(&l_event_item->hash);
                 if(s_debug_more)
                     log_it(L_DEBUG, "Processing event (threshold): %s...", l_event_hash_str);
-
                 int l_add_res = s_dap_chain_add_atom_to_events_table(a_dag, a_ledger, l_event_item);
                 HASH_ADD(hh, PVT(a_dag)->events,hash,sizeof (l_event_item->hash), l_event_item);
                 s_dag_events_lasts_process_new_last_event(a_dag, l_event_item);
-- 
GitLab