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