From 4b72bdcca506b50062248cf541f432c6059a31e2 Mon Sep 17 00:00:00 2001
From: Dmitry Gerasimov <dmitriy.gerasimov@demlabs.net>
Date: Mon, 27 Jun 2022 18:02:25 +0700
Subject: [PATCH] [!] Refactoring

---
 modules/chain/dap_chain_ledger.c              |   4 +-
 modules/chain/include/dap_chain.h             |   3 +-
 .../chain-net/dap_stream_ch_chain_net.c       |   2 +-
 modules/channel/chain/dap_stream_ch_chain.c   |   2 +-
 .../block-poa/dap_chain_cs_block_poa.c        |   2 +-
 .../block-ton/dap_chain_cs_block_ton.c        | 616 ++++++++++++------
 .../consensus/dag-poa/dap_chain_cs_dag_poa.c  |   5 +-
 modules/consensus/none/dap_chain_cs_none.c    |   2 +-
 modules/global-db/CMakeLists.txt              |   2 +-
 .../global-db/dap_chain_global_db_driver.c    |   2 +-
 .../dap_chain_global_db_driver_cdb.c          |   2 +-
 .../dap_chain_global_db_driver_mdbx.c         |   3 +-
 .../dap_chain_global_db_driver_sqlite.c       |   2 +-
 .../global-db/dap_chain_global_db_remote.c    |   2 +-
 modules/global-db/dap_global_db.c             |   2 +-
 .../global-db/include/dap_chain_global_db.h   |  10 -
 modules/global-db/include/dap_global_db.h     |   8 +
 modules/mempool/dap_chain_mempool.c           |   2 +-
 modules/net/dap_chain_net.c                   |   2 +-
 modules/net/dap_chain_node.c                  |   2 +-
 modules/net/dap_chain_node_cli_cmd.c          |   4 +-
 modules/net/dap_chain_node_dns_server.c       |   2 +-
 modules/net/include/dap_chain_node.h          |   2 +-
 modules/net/srv/dap_chain_net_srv_order.c     |   2 +-
 modules/type/blocks/dap_chain_block_chunk.c   |   2 +-
 modules/type/dag/dap_chain_cs_dag.c           |   3 +-
 26 files changed, 468 insertions(+), 222 deletions(-)

diff --git a/modules/chain/dap_chain_ledger.c b/modules/chain/dap_chain_ledger.c
index 5f6c1041c0..3a919cd8c0 100644
--- a/modules/chain/dap_chain_ledger.c
+++ b/modules/chain/dap_chain_ledger.c
@@ -54,7 +54,7 @@
 #include "dap_chain_datum_tx_token.h"
 #include "dap_chain_datum_token.h"
 #include "dap_chain_mempool.h"
-#include "dap_chain_global_db.h"
+#include "dap_global_db.h"
 #include "dap_chain_ledger.h"
 #include "dap_chain_pvt.h"
 #include "json-c/json.h"
@@ -3135,7 +3135,7 @@ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx,
             .group      = l_gdb_group
     };
     // Apply it with single DB transaction
-    if (dap_chain_global_db_driver_add(l_cache_used_outs, l_outs_used + 1)) {
+    if ( dap_global_db_set_raw(l_cache_used_outs, l_outs_used + 1,NULL,NULL) != 0) {
         if(s_debug_more)
             log_it(L_WARNING, "Ledger cache mismatch");
     }
diff --git a/modules/chain/include/dap_chain.h b/modules/chain/include/dap_chain.h
index 334db70dbf..e3d369ff22 100644
--- a/modules/chain/include/dap_chain.h
+++ b/modules/chain/include/dap_chain.h
@@ -26,7 +26,8 @@
 #pragma once
 #include <stdbool.h>
 #include <pthread.h>
-#include "dap_chain_global_db.h"
+#include "dap_global_db.h"
+#include "dap_global_db_sync.h"
 #include "dap_config.h"
 #include "dap_chain_common.h"
 #include "dap_chain_datum.h"
diff --git a/modules/channel/chain-net/dap_stream_ch_chain_net.c b/modules/channel/chain-net/dap_stream_ch_chain_net.c
index ba6325f455..745a4157eb 100644
--- a/modules/channel/chain-net/dap_stream_ch_chain_net.c
+++ b/modules/channel/chain-net/dap_stream_ch_chain_net.c
@@ -46,7 +46,7 @@
 #include "dap_cert.h"
 #include "uthash.h"
 #include "dap_http_client.h"
-#include "dap_chain_global_db.h"
+#include "dap_global_db.h"
 #include "dap_chain_global_db_remote.h"
 #include "dap_stream.h"
 #include "dap_stream_ch_pkt.h"
diff --git a/modules/channel/chain/dap_stream_ch_chain.c b/modules/channel/chain/dap_stream_ch_chain.c
index 47eb1f0fe6..2290c9224b 100644
--- a/modules/channel/chain/dap_stream_ch_chain.c
+++ b/modules/channel/chain/dap_stream_ch_chain.c
@@ -56,7 +56,7 @@
 #include "dap_chain_cs.h"
 #include "dap_chain_cell.h"
 
-#include "dap_chain_global_db.h"
+#include "dap_global_db.h"
 
 #include "dap_stream.h"
 #include "dap_stream_pkt.h"
diff --git a/modules/consensus/block-poa/dap_chain_cs_block_poa.c b/modules/consensus/block-poa/dap_chain_cs_block_poa.c
index 3c9424f31c..5487d268a6 100644
--- a/modules/consensus/block-poa/dap_chain_cs_block_poa.c
+++ b/modules/consensus/block-poa/dap_chain_cs_block_poa.c
@@ -35,7 +35,7 @@
 #include "dap_chain_cs_block_poa.h"
 #include "dap_chain_node_cli.h"
 #include "dap_chain_node_cli_cmd.h"
-#include "dap_chain_global_db.h"
+#include "dap_global_db.h"
 #include "dap_chain_cs.h"
 #include "dap_chain_cs_blocks.h"
 #include "dap_chain_net_srv_stake.h"
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 6514720a8a..9986f70d75 100644
--- a/modules/consensus/block-ton/dap_chain_cs_block_ton.c
+++ b/modules/consensus/block-ton/dap_chain_cs_block_ton.c
@@ -1325,10 +1325,307 @@ static void s_session_packet_in_handler_finish_save(dap_chain_cs_block_ton_sessi
     }
 }
 
-struct proc_msg_type_submit{
+/**
+ * @brief The proc_msg_type_commit_sign struct
+ */
+struct proc_msg_type_commit_sign{
     dap_chain_cs_block_ton_session_t *session;
+    dap_chain_hash_fast_t candidate_hash;
+    dap_sign_t *candidate_sign;
+    char * candidate_hash_str;
+
+    dap_chain_cs_block_ton_round_t * round;
+    dap_chain_cs_block_ton_round_id_t round_id;
+
     dap_chain_cs_block_ton_message_t * message;
     size_t message_size;
+    dap_chain_node_addr_t sender_node_addr;
+};
+
+/**
+ * @brief s_callback_get_candidate_block_and_commit_sign
+ * @param a_global_db_context
+ * @param a_rc
+ * @param a_group
+ * @param a_key
+ * @param a_value
+ * @param a_value_size
+ * @param a_value_ts
+ * @param a_is_pinned
+ * @param a_arg
+ */
+static void s_callback_get_candidate_block_and_commit_sign (dap_global_db_context_t * a_global_db_context,int a_rc, const char * a_group, const char * a_key, const void * a_value, const size_t a_value_size, dap_nanotime_t a_value_ts, bool a_is_pinned, void * a_arg)
+{
+    struct proc_msg_type_commit_sign * l_args = (struct proc_msg_type_commit_sign *) a_arg;
+    dap_chain_cs_block_ton_session_t *l_session = l_args->session;
+    dap_chain_hash_fast_t l_candidate_hash = l_args->candidate_hash;
+    dap_sign_t *l_candidate_sign = l_args->candidate_sign;
+    char * l_candidate_hash_str = l_args->candidate_hash_str;
+    dap_chain_cs_block_ton_message_t * l_message = l_args->message;
+    size_t l_message_size = l_args->message_size;
+    dap_chain_node_addr_t l_sender_node_addr = l_args->sender_node_addr;
+    dap_chain_cs_block_ton_round_t * l_round = l_args->round; // Part of session, rwlock need to be locked properly with it
+    dap_chain_cs_block_ton_round_id_t l_round_id = l_args->round_id;
+
+    DAP_DELETE(l_args);
+
+    size_t l_store_size = a_value_size;
+    dap_chain_cs_block_ton_store_t *l_store = (dap_chain_cs_block_ton_store_t *) a_value;
+    bool l_finalize_consensus = false;
+
+    pthread_rwlock_rdlock(&l_session->rwlock);
+
+    if (l_store) {
+        size_t l_candidate_size = l_store->hdr.candidate_size;
+        dap_chain_block_t *l_candidate =
+                (dap_chain_block_t *)DAP_DUP_SIZE(&l_store->candidate_n_signs, l_candidate_size);
+        size_t l_offset = dap_chain_block_get_sign_offset(l_candidate, l_candidate_size);
+
+        int l_sign_verified=0;
+        // check candidate hash sign
+        if ( (l_sign_verified=dap_sign_verify(l_candidate_sign,
+                                        l_candidate, l_offset+sizeof(l_candidate->hdr))) == 1 ) {
+            l_message->hdr.is_verified = true;
+            l_store->hdr.sign_collected = true;
+            if (dap_global_db_set(l_session->gdb_group_store, l_candidate_hash_str, l_store,
+                            l_store_size, true, NULL, NULL) == 0 ) {
+                uint16_t l_commitsign_count = s_session_message_count(
+                    l_session, DAP_TON$ROUND_CUR, DAP_STREAM_CH_CHAIN_MESSAGE_TYPE_COMMIT_SIGN,
+                                &l_candidate_hash, NULL);
+                l_commitsign_count++;
+                if ( 3* l_commitsign_count >= 2*l_round->validators_count ) {
+                    // s_session_round_finish(l_session,false);
+                    if (l_round_id.uint64 == l_session->cur_round.id.uint64) {
+                        l_finalize_consensus = true;
+                    }
+                    if (PVT(l_session->ton)->debug)
+                        log_it(L_MSG, "TON: net:%s, chain:%s, round:%"DAP_UINT64_FORMAT_U", attempt:%hu Candidate:%s collected COMMIT_SIGN more than 2/3 of the validators, so to finished this round",
+                                l_session->chain->net_name, l_session->chain->name, l_round->id.uint64,
+                                    l_session->attempt_current_number, l_candidate_hash_str);
+                }
+            }
+        }
+        else {
+            log_it(L_WARNING, "Candidate:%s sign is incorrect: code %d", l_candidate_hash_str, l_sign_verified);
+        }
+    }
+    pthread_rwlock_unlock(&l_session->rwlock);
+    DAP_DELETE(l_store);
+    DAP_DELETE(l_candidate_hash_str);
+    s_session_packet_in_handler_finish_save(l_session, &l_sender_node_addr,l_message, l_message_size, l_finalize_consensus);
+
+}
+
+
+/**
+ * @brief The proc_msg_type_pre_commit struct
+ */
+struct proc_msg_type_pre_commit{
+    dap_chain_cs_block_ton_session_t *session;
+    dap_chain_hash_fast_t candidate_hash;
+    char * candidate_hash_str;
+};
+
+/**
+ * @brief s_callback_get_candidate_block_and_pre_commit
+ * @param a_global_db_context
+ * @param a_rc
+ * @param a_group
+ * @param a_key
+ * @param a_value
+ * @param a_value_size
+ * @param a_value_ts
+ * @param a_is_pinned
+ * @param a_arg
+ */
+static void s_callback_get_candidate_block_and_pre_commit (dap_global_db_context_t * a_global_db_context,int a_rc, const char * a_group, const char * a_key, const void * a_value, const size_t a_value_size, dap_nanotime_t a_value_ts, bool a_is_pinned, void * a_arg)
+{
+    struct proc_msg_type_pre_commit * l_args = (struct proc_msg_type_pre_commit *) a_arg;
+    dap_chain_cs_block_ton_session_t *l_session = l_args->session;
+    dap_chain_hash_fast_t l_candidate_hash = l_args->candidate_hash;
+    char * l_candidate_hash_str = l_args->candidate_hash_str;
+    DAP_DELETE(l_args);
+
+    size_t l_store_size = a_value_size;
+    dap_chain_cs_block_ton_store_t *l_store = (dap_chain_cs_block_ton_store_t *) a_value;
+
+    pthread_rwlock_rdlock(&l_session->rwlock);
+
+    // event CommitSign
+    if (l_store) {
+        if (PVT(l_session->ton)->blocks_sign_key) {
+            l_store->hdr.precommit_collected = true;
+
+            if (dap_global_db_set_unsafe(a_global_db_context, l_session->gdb_group_store,l_candidate_hash_str, l_store,
+                                  l_store_size, true ) == 0 ) {
+                size_t l_candidate_size = l_store->hdr.candidate_size;
+                dap_chain_block_t *l_candidate =
+                        (dap_chain_block_t *)DAP_DUP_SIZE(&l_store->candidate_n_signs, l_candidate_size);
+                size_t l_offset = dap_chain_block_get_sign_offset(l_candidate, l_candidate_size);
+                dap_sign_t *l_candidate_sign = dap_sign_create(PVT(l_session->ton)->blocks_sign_key,
+                                                l_candidate, l_offset + sizeof(l_candidate->hdr), 0);
+                size_t l_candidate_sign_size = dap_sign_get_size(l_candidate_sign);
+
+                size_t l_commitsign_size = sizeof(dap_chain_cs_block_ton_message_commitsign_t)+l_candidate_sign_size;
+                dap_chain_cs_block_ton_message_commitsign_t *l_commitsign =
+                                        DAP_NEW_SIZE(dap_chain_cs_block_ton_message_commitsign_t, l_commitsign_size);
+                l_commitsign->round_id.uint64 = l_session->cur_round.id.uint64;
+                memcpy(&l_commitsign->candidate_hash, &l_candidate_hash, sizeof(dap_chain_hash_fast_t));
+                memcpy(l_commitsign->candidate_sign, l_candidate_sign, l_candidate_sign_size);
+                s_message_send(l_session, DAP_STREAM_CH_CHAIN_MESSAGE_TYPE_COMMIT_SIGN, (uint8_t*)l_commitsign,
+                                    l_commitsign_size, l_session->cur_round.validators_start);
+                DAP_DELETE(l_commitsign);
+                DAP_DELETE(l_candidate);
+                DAP_DELETE(l_candidate_sign);
+                pthread_rwlock_unlock(&l_session->rwlock);
+
+                pthread_rwlock_wrlock(&l_session->rwlock);
+                l_session->state = DAP_STREAM_CH_CHAIN_SESSION_STATE_WAIT_SIGNS;
+                l_session->ts_round_state_commit = dap_time_now();
+
+                if (PVT(l_session->ton)->debug)
+                    log_it(L_MSG, "TON: net:%s, chain:%s, round:%"DAP_UINT64_FORMAT_U" attempt:%hu Candidate:%s collected PRE_COMMIT more than 2/3 of the validators, so to sent a COMMIT_SIGN",
+                            l_session->chain->net_name, l_session->chain->name, l_session->cur_round.id.uint64,
+                                l_session->attempt_current_number, l_candidate_hash_str);
+            }
+        }
+        else {
+            log_it(L_WARNING, "Can't sign block with blocks-sign-cert in [block-ton] section");
+        }
+        DAP_DELETE(l_store);
+    }
+    pthread_rwlock_unlock(&l_session->rwlock);
+
+    DAP_DELETE(l_candidate_hash_str);
+
+}
+
+/**
+ * @brief The proc_msg_type_vote struct
+ */
+struct proc_msg_type_vote{
+    dap_chain_cs_block_ton_session_t *session;
+    dap_chain_hash_fast_t candidate_hash;
+    char * candidate_hash_str;
+};
+
+/**
+ * @brief s_callback_get_candidate_block_and_vote
+ * @param a_global_db_context
+ * @param a_rc
+ * @param a_group
+ * @param a_key
+ * @param a_value
+ * @param a_value_size
+ * @param a_value_ts
+ * @param a_is_pinned
+ * @param a_arg
+ */
+static void s_callback_get_candidate_block_and_vote (dap_global_db_context_t * a_global_db_context,int a_rc, const char * a_group, const char * a_key, const void * a_value, const size_t a_value_size, dap_nanotime_t a_value_ts, bool a_is_pinned, void * a_arg)
+{
+    struct proc_msg_type_vote * l_args = (struct proc_msg_type_vote *) a_arg;
+    dap_chain_cs_block_ton_session_t *l_session = l_args->session;
+    dap_chain_hash_fast_t l_candidate_hash = l_args->candidate_hash;
+    char * l_candidate_hash_str = l_args->candidate_hash_str;
+    DAP_DELETE(l_args);
+    size_t l_store_size = a_value_size;
+    dap_chain_cs_block_ton_store_t *l_store = (dap_chain_cs_block_ton_store_t *) a_value;
+    if (l_store) {
+        l_store->hdr.vote_collected = true;
+        if (dap_global_db_set_unsafe(a_global_db_context, l_session->gdb_group_store, l_candidate_hash_str,
+                              l_store,	l_store_size, true ) == 0 ) {
+            // Send PreCommit
+            dap_chain_cs_block_ton_message_precommit_t *l_precommit =
+                                        DAP_NEW_Z(dap_chain_cs_block_ton_message_precommit_t);
+            l_precommit->round_id.uint64 = l_session->cur_round.id.uint64;
+            memcpy(&l_precommit->candidate_hash, &l_candidate_hash, sizeof(dap_chain_hash_fast_t));
+            l_precommit->attempt_number = l_session->attempt_current_number;
+            s_message_send(l_session, DAP_STREAM_CH_CHAIN_MESSAGE_TYPE_PRE_COMMIT, (uint8_t*)l_precommit,
+                            sizeof(dap_chain_cs_block_ton_message_precommit_t), l_session->cur_round.validators_start);
+            DAP_DELETE(l_precommit);
+            if (PVT(l_session->ton)->debug)
+                log_it(L_MSG, "TON: net:%s, chain:%s, round:%"DAP_UINT64_FORMAT_U", attempt:%hu Candidate:%s collected VOTE more than 2/3 of the validators, so to sent a PRE_COMMIT",
+                        l_session->chain->net_name, l_session->chain->name, l_session->cur_round.id.uint64,
+                            l_session->attempt_current_number, l_candidate_hash_str);
+        }
+        DAP_DELETE(l_store);
+    }
+    DAP_DELETE(l_candidate_hash_str);
+
+}
+
+
+/**
+ * @brief The proc_msg_type_approve struct
+ */
+struct proc_msg_type_approve{
+    dap_chain_cs_block_ton_session_t *session;
+    dap_chain_hash_fast_t candidate_hash;
+    char * candidate_hash_str;
+};
+
+/**
+ * @brief s_callback_get_candidate_block_and_approve
+ * @param a_global_db_context
+ * @param a_rc
+ * @param a_group
+ * @param a_key
+ * @param a_value
+ * @param a_value_size
+ * @param a_value_ts
+ * @param a_is_pinned
+ * @param a_arg
+ */
+static void s_callback_get_candidate_block_and_approve (dap_global_db_context_t * a_global_db_context,int a_rc, const char * a_group, const char * a_key, const void * a_value, const size_t a_value_size, dap_nanotime_t a_value_ts, bool a_is_pinned, void * a_arg)
+{
+    struct proc_msg_type_approve * l_args = (struct proc_msg_type_approve *) a_arg;
+    dap_chain_cs_block_ton_session_t *l_session = l_args->session;
+    dap_chain_hash_fast_t l_candidate_hash = l_args->candidate_hash;
+    char * l_candidate_hash_str = l_args->candidate_hash_str;
+
+    DAP_DELETE(l_args);
+
+    dap_chain_cs_block_ton_store_t *l_store = (dap_chain_cs_block_ton_store_t *) a_value;
+    size_t l_store_size = a_value_size;
+
+    pthread_rwlock_rdlock(&l_session->rwlock);
+
+    if (l_store && !l_store->hdr.approve_collected) {
+        if (PVT(l_session->ton)->debug)
+            log_it(L_MSG, "TON: APPROVE: candidate found in store:%s & !approve_collected", l_candidate_hash_str);
+        l_store->hdr.approve_collected = true;
+        if (dap_global_db_set_unsafe( a_global_db_context, l_session->gdb_group_store,l_candidate_hash_str,
+                                       l_store,l_store_size, true) == 0 ) {
+            if (PVT(l_session->ton)->debug)
+                log_it(L_MSG, "TON: APPROVE: candidate update:%s approve_collected=true", l_candidate_hash_str);
+        } else
+            if (PVT(l_session->ton)->debug)
+                log_it(L_MSG, "TON: APPROVE: can`t update candidate:%s", l_candidate_hash_str);
+
+        // event Vote
+        dap_chain_cs_block_ton_message_vote_t *l_vote =
+                                            DAP_NEW_Z(dap_chain_cs_block_ton_message_vote_t);
+        l_vote->round_id.uint64 = l_session->cur_round.id.uint64;
+        memcpy(&l_vote->candidate_hash, &l_candidate_hash, sizeof(dap_chain_hash_fast_t));
+        l_vote->attempt_number = l_session->attempt_current_number;
+        s_message_send(l_session, DAP_STREAM_CH_CHAIN_MESSAGE_TYPE_VOTE, (uint8_t*)l_vote,
+            sizeof(dap_chain_cs_block_ton_message_vote_t), l_session->cur_round.validators_start);
+        DAP_DELETE(l_vote);
+        if (PVT(l_session->ton)->debug)
+            log_it(L_MSG, "TON: net:%s, chain:%s, round:%"DAP_UINT64_FORMAT_U", attempt:%hu This is first attempt, so to sent a VOTE for candidate:%s",
+                    l_session->chain->net_name, l_session->chain->name, l_session->cur_round.id.uint64,
+                        l_session->attempt_current_number, l_candidate_hash_str );
+        DAP_DELETE(l_store);
+    }
+    pthread_rwlock_unlock(&l_session->rwlock);
+    DAP_DELETE(l_candidate_hash_str);
+}
+
+/**
+ * @brief The proc_msg_type_submit struct
+ */
+struct proc_msg_type_submit{
+    dap_chain_cs_block_ton_session_t *session;
     dap_chain_hash_fast_t candidate_hash;
     char * candidate_hash_str;
     dap_chain_block_t * candidate;
@@ -1468,7 +1765,8 @@ static void s_session_packet_in(void *a_arg, dap_chain_node_addr_t *a_sender_nod
                l_message->hdr.sign_size, a_data_size, sizeof(*l_message));
         goto handler_finish;
     }
-    size_t l_message_data_size = a_data_size - l_message->hdr.sign_size - l_message->hdr.sign_size ;
+    size_t l_message_data_size = a_data_size - sizeof(*l_message) - l_message->hdr.sign_size ;
+    byte_t * l_message_data = l_message->sign_n_message + l_message->hdr.sign_size;
 
 	if ( !PVT(l_session->ton)->validators_list_by_stake ) {
 		size_t l_data_size = 0;
@@ -1788,17 +2086,15 @@ static void s_session_packet_in(void *a_arg, dap_chain_node_addr_t *a_sender_nod
 	switch (l_message->hdr.type) {
 		case DAP_STREAM_CH_CHAIN_MESSAGE_TYPE_SUBMIT: {
             if( sizeof(dap_chain_cs_block_ton_message_submit_t) > l_message_data_size){
-                log_it(L_CRITICAL, "Wrong submit message size,have %zu bytes for data section when only a header requires %zu bytes",
+                log_it(L_WARNING, "Wrong submit message size,have %zu bytes for data section when only a header requires %zu bytes",
                        l_message_data_size,sizeof(dap_chain_cs_block_ton_message_submit_t));
                 goto handler_finish;
             }
-			dap_chain_cs_block_ton_message_submit_t *l_submit =
-							(dap_chain_cs_block_ton_message_submit_t *)
-								(l_message->sign_n_message+l_message->hdr.sign_size);
+            dap_chain_cs_block_ton_message_submit_t *l_submit = (dap_chain_cs_block_ton_message_submit_t *)l_message_data;
 
 			size_t l_candidate_size = l_submit->candidate_size;
             if( l_message_data_size < l_candidate_size + sizeof(*l_submit) ){
-                log_it(L_CRITICAL, "Wrong submit message size %zu when maximum is %zu for received message", l_candidate_size,
+                log_it(L_WARNING, "Wrong submit message size %zu when maximum is %zu for received message", l_candidate_size,
                        l_message_data_size - sizeof(*l_submit));
                 goto handler_finish;
             }
@@ -1843,9 +2139,14 @@ static void s_session_packet_in(void *a_arg, dap_chain_node_addr_t *a_sender_nod
             }
 		} break;
 		case DAP_STREAM_CH_CHAIN_MESSAGE_TYPE_REJECT: {
-			dap_chain_cs_block_ton_message_reject_t *l_reject =
-							(dap_chain_cs_block_ton_message_reject_t *)
-								(l_message->sign_n_message+l_message->hdr.sign_size);
+            if  ( sizeof(dap_chain_cs_block_ton_message_reject_t) >l_message_data_size  ){
+                log_it(L_WARNING, "Wrong reject message size,have %zu bytes for data section when requires %zu bytes",
+                       l_message_data_size,sizeof(dap_chain_cs_block_ton_message_reject_t));
+                goto handler_finish;
+            }
+            dap_chain_cs_block_ton_message_reject_t *l_reject = (dap_chain_cs_block_ton_message_reject_t *) l_message_data;
+
+
 			dap_chain_hash_fast_t *l_candidate_hash = &l_reject->candidate_hash;
 
             pthread_rwlock_rdlock(&l_session->rwlock);
@@ -1887,9 +2188,20 @@ static void s_session_packet_in(void *a_arg, dap_chain_node_addr_t *a_sender_nod
 			DAP_DELETE(l_candidate_hash_str);
 		} break;
 		case DAP_STREAM_CH_CHAIN_MESSAGE_TYPE_APPROVE: {
-			dap_chain_cs_block_ton_message_approve_t *l_approve =
-								(dap_chain_cs_block_ton_message_approve_t *)
-										(l_message->sign_n_message+l_message->hdr.sign_size);
+            if  ( sizeof(dap_chain_cs_block_ton_message_approve_t) >l_message_data_size  ){
+                log_it(L_WARNING, "Wrong reject message size,have %zu bytes for data section when requires %zu bytes",
+                       l_message_data_size,sizeof(dap_chain_cs_block_ton_message_approve_t));
+                goto handler_finish;
+            }
+            dap_chain_cs_block_ton_message_approve_t *l_approve = (dap_chain_cs_block_ton_message_approve_t *) l_message_data;
+            dap_sign_t * l_candidate_sign = (dap_sign_t *) l_approve->candidate_hash_sign;
+            size_t l_candidate_hash_sign_size = l_message_data_size - sizeof(dap_chain_cs_block_ton_message_approve_t);
+            if (l_candidate_hash_sign_size || dap_sign_get_size(l_candidate_sign) > l_candidate_hash_sign_size ){
+                log_it(L_WARNING, "Wrong reject message size,have %zu bytes for candidate sign section when requires  maximum %zu bytes",
+                       dap_sign_get_size(l_candidate_sign),l_candidate_hash_sign_size);
+                goto handler_finish;
+            }
+
 			dap_chain_hash_fast_t *l_candidate_hash = &l_approve->candidate_hash;
 			
 			if ( s_hash_is_null(l_candidate_hash) ) {
@@ -1901,7 +2213,8 @@ static void s_session_packet_in(void *a_arg, dap_chain_node_addr_t *a_sender_nod
 			}
 			char *l_candidate_hash_str = dap_chain_hash_fast_to_str_new(l_candidate_hash);
 
-			if (PVT(l_session->ton)->debug)
+            pthread_rwlock_rdlock(&l_session->rwlock);
+            if (PVT(l_session->ton)->debug)
                 log_it(L_MSG, "TON: net:%s, chain:%s, round:%"DAP_UINT64_FORMAT_U", attempt:%hu Receive APPROVE: candidate:%s",
 						l_session->chain->net_name, l_session->chain->name, l_session->cur_round.id.uint64,
 							l_session->attempt_current_number, l_candidate_hash_str);
@@ -1911,7 +2224,6 @@ static void s_session_packet_in(void *a_arg, dap_chain_node_addr_t *a_sender_nod
 			if ( (l_sign_verified=dap_sign_verify( (dap_sign_t*)l_approve->candidate_hash_sign, 
 													l_candidate_hash, sizeof(dap_chain_hash_fast_t))) == 1 ) {
 				l_message->hdr.is_verified=true;
-				pthread_rwlock_rdlock(&l_session->rwlock);
 
 				if ( l_session->attempt_current_number == 1 ) { // if this first attempt then send Vote event
 					uint16_t l_approve_count = s_session_message_count(
@@ -1924,54 +2236,40 @@ static void s_session_packet_in(void *a_arg, dap_chain_node_addr_t *a_sender_nod
 									l_session->chain->net_name, l_session->chain->name, l_session->cur_round.id.uint64,
 										l_session->attempt_current_number, l_candidate_hash_str);
 
-						size_t l_store_size = 0;
-						dap_chain_cs_block_ton_store_t *l_store = 
-												(dap_chain_cs_block_ton_store_t *)dap_chain_global_db_gr_get(
-														l_candidate_hash_str, &l_store_size, l_session->gdb_group_store);
-						if (l_store && !l_store->hdr.approve_collected) {
-							if (PVT(l_session->ton)->debug)
-								log_it(L_MSG, "TON: APPROVE: candidate found in store:%s & !approve_collected", l_candidate_hash_str);
-							l_store->hdr.approve_collected = true;
-                            if (dap_global_db_set(l_session->gdb_group_store,l_candidate_hash_str,
-                                                           l_store,l_store_size, true, NULL, NULL) == 0 ) {
-								if (PVT(l_session->ton)->debug)
-									log_it(L_MSG, "TON: APPROVE: candidate update:%s approve_collected=true", l_candidate_hash_str);
-                            } else
-								if (PVT(l_session->ton)->debug)
-									log_it(L_MSG, "TON: APPROVE: can`t update candidate:%s", l_candidate_hash_str);
-
-							// event Vote
-							dap_chain_cs_block_ton_message_vote_t *l_vote =
-																DAP_NEW_Z(dap_chain_cs_block_ton_message_vote_t);
-							l_vote->round_id.uint64 = l_session->cur_round.id.uint64;
-							memcpy(&l_vote->candidate_hash, l_candidate_hash, sizeof(dap_chain_hash_fast_t));
-							l_vote->attempt_number = l_session->attempt_current_number;
-							s_message_send(l_session, DAP_STREAM_CH_CHAIN_MESSAGE_TYPE_VOTE, (uint8_t*)l_vote,
-								sizeof(dap_chain_cs_block_ton_message_vote_t), l_session->cur_round.validators_start);
-							DAP_DELETE(l_vote);
-							if (PVT(l_session->ton)->debug)
-                                log_it(L_MSG, "TON: net:%s, chain:%s, round:%"DAP_UINT64_FORMAT_U", attempt:%hu This is first attempt, so to sent a VOTE for candidate:%s",
-										l_session->chain->net_name, l_session->chain->name, l_session->cur_round.id.uint64,
-											l_session->attempt_current_number, l_candidate_hash_str );
-
-							DAP_DELETE(l_store);
-						}
-					}
-				}
-				pthread_rwlock_unlock(&l_session->rwlock);
+                        struct proc_msg_type_approve * l_args = DAP_NEW_Z(struct proc_msg_type_approve);
+                        l_args->session = l_session;
+                        l_args->candidate_hash_str = l_candidate_hash_str;
+                        l_args->candidate_hash = *l_candidate_hash;
+
+                        if ( dap_global_db_get(l_session->gdb_group_store,l_candidate_hash_str,s_callback_get_candidate_block_and_approve, l_args) != 0 ){
+                            log_it(L_ERROR, "Can't get candidate block for approvement");
+                            DAP_DELETE(l_args);
+                            DAP_DELETE(l_candidate_hash_str);
+                        }
+                    }else{
+                        DAP_DELETE(l_candidate_hash_str);
+                    }
+                }else{
+                    DAP_DELETE(l_candidate_hash_str);
+                }
 			} else {
 				log_it(L_WARNING, "Candidate hash sign is incorrect: code %d", l_sign_verified);
-			}
-			DAP_DELETE(l_candidate_hash_str);
-		} break;
+                DAP_DELETE(l_candidate_hash_str);
+            }
+            pthread_rwlock_unlock(&l_session->rwlock);
+        } break;
 		case DAP_STREAM_CH_CHAIN_MESSAGE_TYPE_VOTE_FOR: {
-            pthread_rwlock_rdlock(&l_session->rwlock);
+            if  ( sizeof(dap_chain_cs_block_ton_message_votefor_t) >l_message_data_size  ){
+                log_it(L_WARNING, "Wrong vote_for message size,have %zu bytes for data section when requires %zu bytes",
+                       l_message_data_size,sizeof(dap_chain_cs_block_ton_message_votefor_t));
+                goto handler_finish;
+            }
 
-			dap_chain_cs_block_ton_message_votefor_t *l_votefor =
-								(dap_chain_cs_block_ton_message_votefor_t *)
-										(l_message->sign_n_message+l_message->hdr.sign_size);
+            dap_chain_cs_block_ton_message_votefor_t *l_votefor = (dap_chain_cs_block_ton_message_votefor_t *) l_message_data;
 			dap_chain_hash_fast_t *l_candidate_hash = &l_votefor->candidate_hash;
-			
+
+            pthread_rwlock_rdlock(&l_session->rwlock);
+
 			uint16_t l_attempt_current = l_session->attempt_current_number;
 			if ( l_votefor->attempt_number != l_attempt_current) {
                 pthread_rwlock_unlock(&l_session->rwlock);
@@ -2016,9 +2314,12 @@ static void s_session_packet_in(void *a_arg, dap_chain_node_addr_t *a_sender_nod
             pthread_rwlock_unlock(&l_session->rwlock);
         } break;
 		case DAP_STREAM_CH_CHAIN_MESSAGE_TYPE_VOTE: {
-			dap_chain_cs_block_ton_message_vote_t *l_vote =
-								(dap_chain_cs_block_ton_message_vote_t *)
-										(l_message->sign_n_message+l_message->hdr.sign_size);
+            if  ( sizeof(dap_chain_cs_block_ton_message_vote_t) >l_message_data_size  ){
+                log_it(L_WARNING, "Wrong vote_for message size,have %zu bytes for data section when requires %zu bytes",
+                       l_message_data_size,sizeof(dap_chain_cs_block_ton_message_vote_t));
+                goto handler_finish;
+            }
+            dap_chain_cs_block_ton_message_vote_t *l_vote =	(dap_chain_cs_block_ton_message_vote_t *) l_message_data;
 			dap_chain_hash_fast_t *l_candidate_hash = &l_vote->candidate_hash;
 
 			if ( l_vote->attempt_number != l_session->attempt_current_number) {
@@ -2046,38 +2347,26 @@ static void s_session_packet_in(void *a_arg, dap_chain_node_addr_t *a_sender_nod
 									l_candidate_hash, &l_attempt_number);
 			l_vote_count++;
             if (l_vote_count * 3 >= l_session->cur_round.validators_count * 2){
-				size_t l_store_size = 0;
-				dap_chain_cs_block_ton_store_t *l_store = 
-									(dap_chain_cs_block_ton_store_t *)dap_chain_global_db_gr_get(
-												l_candidate_hash_str, &l_store_size, l_session->gdb_group_store);
-				if (l_store) {
-					l_store->hdr.vote_collected = true;
-                    if (dap_global_db_set(l_session->gdb_group_store, l_candidate_hash_str,
-                                          l_store,	l_store_size, true, NULL,NULL ) == 0 ) {
-		                // Send PreCommit
-						dap_chain_cs_block_ton_message_precommit_t *l_precommit =
-													DAP_NEW_Z(dap_chain_cs_block_ton_message_precommit_t);
-						l_precommit->round_id.uint64 = l_session->cur_round.id.uint64;
-						memcpy(&l_precommit->candidate_hash, l_candidate_hash, sizeof(dap_chain_hash_fast_t));
-						l_precommit->attempt_number = l_session->attempt_current_number;
-						s_message_send(l_session, DAP_STREAM_CH_CHAIN_MESSAGE_TYPE_PRE_COMMIT, (uint8_t*)l_precommit,
-										sizeof(dap_chain_cs_block_ton_message_precommit_t), l_session->cur_round.validators_start);
-						DAP_DELETE(l_precommit);
-						if (PVT(l_session->ton)->debug)
-                            log_it(L_MSG, "TON: net:%s, chain:%s, round:%"DAP_UINT64_FORMAT_U", attempt:%hu Candidate:%s collected VOTE more than 2/3 of the validators, so to sent a PRE_COMMIT",
-									l_session->chain->net_name, l_session->chain->name, l_session->cur_round.id.uint64, 
-										l_session->attempt_current_number, l_candidate_hash_str);
-					}
-					DAP_DELETE(l_store);
-				}
+                struct proc_msg_type_vote * l_args = DAP_NEW_Z(struct proc_msg_type_vote);
+                l_args->session = l_session;
+                l_args->candidate_hash_str = l_candidate_hash_str;
+                l_args->candidate_hash = *l_candidate_hash;
+                if (dap_global_db_get(l_session->gdb_group_store,l_candidate_hash_str,s_callback_get_candidate_block_and_vote, l_args ) != 0 ){
+                    log_it (L_ERROR, "Can't process get request for s_callback_get_candidate_block_and_vote()");
+                    DAP_DELETE(l_candidate_hash_str);
+                    DAP_DELETE(l_args);
+                }
 			}
-			DAP_DELETE(l_candidate_hash_str);
 			pthread_rwlock_unlock(&l_session->rwlock);
 		} break;
 		case DAP_STREAM_CH_CHAIN_MESSAGE_TYPE_PRE_COMMIT: {
-			dap_chain_cs_block_ton_message_precommit_t *l_precommit =
-							(dap_chain_cs_block_ton_message_precommit_t *)
-									(l_message->sign_n_message+l_message->hdr.sign_size);
+            if  ( sizeof(dap_chain_cs_block_ton_message_precommit_t) >l_message_data_size  ){
+                log_it(L_WARNING, "Wrong pre_commit message size,have %zu bytes for data section when requires %zu bytes",
+                       l_message_data_size,sizeof(dap_chain_cs_block_ton_message_precommit_t));
+                goto handler_finish;
+            }
+
+            dap_chain_cs_block_ton_message_precommit_t *l_precommit = (dap_chain_cs_block_ton_message_precommit_t *) l_message_data;
 			dap_chain_hash_fast_t *l_candidate_hash = &l_precommit->candidate_hash;
 
             pthread_rwlock_rdlock(&l_session->rwlock);
@@ -2101,69 +2390,45 @@ static void s_session_packet_in(void *a_arg, dap_chain_node_addr_t *a_sender_nod
 						l_session->chain->net_name, l_session->chain->name, l_session->cur_round.id.uint64,
 							l_session->attempt_current_number, l_candidate_hash_str);
 
-            pthread_rwlock_wrlock(&l_session->rwlock);
 			uint16_t l_attempt_number = l_session->attempt_current_number;
 			uint16_t l_precommit_count = s_session_message_count(
 						l_session, DAP_TON$ROUND_CUR, DAP_STREAM_CH_CHAIN_MESSAGE_TYPE_PRE_COMMIT,
 									l_candidate_hash, &l_attempt_number);
 			l_precommit_count++;
             if ( 3* l_precommit_count >= 2*l_session->cur_round.validators_count  ) {
-				size_t l_store_size = 0;
-				dap_chain_cs_block_ton_store_t *l_store = 
-									(dap_chain_cs_block_ton_store_t *)dap_chain_global_db_gr_get(
-												l_candidate_hash_str, &l_store_size, l_session->gdb_group_store);
-				// event CommitSign
-				if (l_store) {
-					if (PVT(l_session->ton)->blocks_sign_key) {
-						l_store->hdr.precommit_collected = true;
-
-                        if (dap_global_db_set(l_session->gdb_group_store,l_candidate_hash_str, l_store,
-                                              l_store_size, true, NULL, NULL) == 0 ) {
-							size_t l_candidate_size = l_store->hdr.candidate_size;
-							dap_chain_block_t *l_candidate = 
-									(dap_chain_block_t *)DAP_DUP_SIZE(&l_store->candidate_n_signs, l_candidate_size);
-							size_t l_offset = dap_chain_block_get_sign_offset(l_candidate, l_candidate_size);
-						    dap_sign_t *l_candidate_sign = dap_sign_create(PVT(l_session->ton)->blocks_sign_key,
-						    								l_candidate, l_offset + sizeof(l_candidate->hdr), 0);
-						    size_t l_candidate_sign_size = dap_sign_get_size(l_candidate_sign);
-							
-							size_t l_commitsign_size = sizeof(dap_chain_cs_block_ton_message_commitsign_t)+l_candidate_sign_size;
-							dap_chain_cs_block_ton_message_commitsign_t *l_commitsign =
-													DAP_NEW_SIZE(dap_chain_cs_block_ton_message_commitsign_t, l_commitsign_size);
-							l_commitsign->round_id.uint64 = l_session->cur_round.id.uint64;
-							memcpy(&l_commitsign->candidate_hash, l_candidate_hash, sizeof(dap_chain_hash_fast_t));
-							memcpy(l_commitsign->candidate_sign, l_candidate_sign, l_candidate_sign_size);
-							s_message_send(l_session, DAP_STREAM_CH_CHAIN_MESSAGE_TYPE_COMMIT_SIGN, (uint8_t*)l_commitsign,
-												l_commitsign_size, l_session->cur_round.validators_start);
-							DAP_DELETE(l_commitsign);
-							DAP_DELETE(l_candidate);
-							DAP_DELETE(l_candidate_sign);
-                            pthread_rwlock_unlock(&l_session->rwlock);
-
-                            pthread_rwlock_wrlock(&l_session->rwlock);
-							l_session->state = DAP_STREAM_CH_CHAIN_SESSION_STATE_WAIT_SIGNS;
-							l_session->ts_round_state_commit = dap_time_now();
-							
-							if (PVT(l_session->ton)->debug)
-                                log_it(L_MSG, "TON: net:%s, chain:%s, round:%"DAP_UINT64_FORMAT_U" attempt:%hu Candidate:%s collected PRE_COMMIT more than 2/3 of the validators, so to sent a COMMIT_SIGN",
-										l_session->chain->net_name, l_session->chain->name, l_session->cur_round.id.uint64,
-											l_session->attempt_current_number, l_candidate_hash_str);
-                            pthread_rwlock_unlock(&l_session->rwlock);
-						}
-					}
-					else {
-						log_it(L_WARNING, "Can't sign block with blocks-sign-cert in [block-ton] section");	
-					}
-					DAP_DELETE(l_store);
-				}
+                struct proc_msg_type_pre_commit * l_args = DAP_NEW_Z(struct proc_msg_type_pre_commit);
+                l_args->session = l_session;
+                l_args->candidate_hash = *l_candidate_hash;
+                l_args->candidate_hash_str = l_candidate_hash_str;
+                if( dap_global_db_get(l_session->gdb_group_store, l_candidate_hash_str,s_callback_get_candidate_block_and_pre_commit, l_args ) != 0 ){
+                    log_it (L_ERROR, "Can't process get request for s_callback_get_candidate_block_and_pre_commit()");
+                    DAP_DELETE(l_candidate_hash_str);
+                    DAP_DELETE(l_args);
+                }
 			}
-			DAP_DELETE(l_candidate_hash_str);
+            pthread_rwlock_unlock(&l_session->rwlock);
+
         } break;
 		case DAP_STREAM_CH_CHAIN_MESSAGE_TYPE_COMMIT_SIGN: {
-			dap_chain_cs_block_ton_message_commitsign_t *l_commitsign =
-								(dap_chain_cs_block_ton_message_commitsign_t *)
-									(l_message->sign_n_message+l_message->hdr.sign_size);
-			dap_chain_hash_fast_t *l_candidate_hash = &l_commitsign->candidate_hash;
+            if  ( sizeof(dap_chain_cs_block_ton_message_commitsign_t) >l_message_data_size  ){
+                log_it(L_WARNING, "Wrong commit_sign message size,have %zu bytes for data section when requires %zu bytes",
+                       l_message_data_size,sizeof(dap_chain_cs_block_ton_message_commitsign_t));
+                goto handler_finish;
+            }
+
+            dap_chain_cs_block_ton_message_commitsign_t *l_commitsign =	(dap_chain_cs_block_ton_message_commitsign_t *) l_message_data;
+            dap_chain_hash_fast_t *l_candidate_hash = &l_commitsign->candidate_hash;
+
+            dap_sign_t * l_candidate_sign = (dap_sign_t *) l_commitsign->candidate_sign;
+            size_t l_candidate_sign_size = dap_sign_get_size(l_candidate_sign);
+            size_t l_message_candidate_sign_size_max = l_message_data_size - sizeof(dap_chain_cs_block_ton_message_commitsign_t);
+            if (l_message_candidate_sign_size_max == 0 || dap_sign_get_size(l_candidate_sign) > l_message_candidate_sign_size_max ){
+                log_it(L_WARNING, "Wrong reject message size,have %zu bytes for candidate sign section when requires  maximum %zu bytes",
+                       l_candidate_sign_size ,l_message_candidate_sign_size_max);
+                goto handler_finish;
+            }
+
+            pthread_rwlock_rdlock(&l_session->rwlock);
 
 			dap_chain_cs_block_ton_round_t *l_round =
 						l_commitsign->round_id.uint64 == l_session->old_round.id.uint64 ?
@@ -2174,6 +2439,8 @@ static void s_session_packet_in(void *a_arg, dap_chain_node_addr_t *a_sender_nod
                     log_it(L_MSG, "TON: net:%s, chain:%s, round:%"DAP_UINT64_FORMAT_U", attempt:%hu Receive COMMIT_SIGN: candidate: NULL",
 							l_session->chain->net_name, l_session->chain->name,
 								l_round->id.uint64, l_session->attempt_current_number);
+                pthread_rwlock_unlock(&l_session->rwlock);
+
 				goto handler_finish_save;
 			}
 
@@ -2183,49 +2450,26 @@ static void s_session_packet_in(void *a_arg, dap_chain_node_addr_t *a_sender_nod
 						l_session->chain->net_name, l_session->chain->name, l_round->id.uint64,
 							l_session->attempt_current_number, l_candidate_hash_str);
 
-			pthread_rwlock_unlock(&l_session->rwlock);
-
-			size_t l_store_size = 0;
-			dap_chain_cs_block_ton_store_t *l_store = 
-								(dap_chain_cs_block_ton_store_t *)dap_chain_global_db_gr_get(
-											l_candidate_hash_str, &l_store_size, l_session->gdb_group_store);
-			if (l_store) {
-				size_t l_candidate_size = l_store->hdr.candidate_size;
-				dap_chain_block_t *l_candidate = 
-						(dap_chain_block_t *)DAP_DUP_SIZE(&l_store->candidate_n_signs, l_candidate_size);
-				size_t l_offset = dap_chain_block_get_sign_offset(l_candidate, l_candidate_size);
-
-				int l_sign_verified=0;
-				// check candidate hash sign
-				if ( (l_sign_verified=dap_sign_verify((dap_sign_t*)l_commitsign->candidate_sign,
-												l_candidate, l_offset+sizeof(l_candidate->hdr))) == 1 ) {
-					l_message->hdr.is_verified = true;
-					l_store->hdr.sign_collected = true;
-                    if (dap_global_db_set(l_session->gdb_group_store, l_candidate_hash_str, l_store,
-                                    l_store_size, true, NULL, NULL) == 0 ) {
-						uint16_t l_commitsign_count = s_session_message_count(
-							l_session, DAP_TON$ROUND_CUR, DAP_STREAM_CH_CHAIN_MESSAGE_TYPE_COMMIT_SIGN,
-										l_candidate_hash, NULL);
-						l_commitsign_count++;
-                        if ( 3* l_commitsign_count >= 2*l_round->validators_count ) {
-                            // s_session_round_finish(l_session,false);
-							if (l_commitsign->round_id.uint64 == l_session->cur_round.id.uint64) {
-								l_finalize_consensus = true;
-							}
-							if (PVT(l_session->ton)->debug)
-                                log_it(L_MSG, "TON: net:%s, chain:%s, round:%"DAP_UINT64_FORMAT_U", attempt:%hu Candidate:%s collected COMMIT_SIGN more than 2/3 of the validators, so to finished this round",
-										l_session->chain->net_name, l_session->chain->name, l_round->id.uint64,
-											l_session->attempt_current_number, l_candidate_hash_str);
-						}
-					}
-				}
-				else {
-					log_it(L_WARNING, "Candidate:%s sign is incorrect: code %d", l_candidate_hash_str, l_sign_verified);
-				}
-			}
-			pthread_rwlock_unlock(&l_session->rwlock);
-			DAP_DELETE(l_store);
-			DAP_DELETE(l_candidate_hash_str);
+            struct proc_msg_type_commit_sign * l_args = DAP_NEW_Z(struct proc_msg_type_commit_sign);
+            l_args->session = l_session;
+            l_args->round = l_round;
+            l_args->round_id = l_commitsign->round_id;
+            l_args->candidate_hash_str = l_candidate_hash_str;
+            l_args->candidate_hash = *l_candidate_hash;
+            l_args->candidate_sign = DAP_DUP_SIZE(l_candidate_sign, l_candidate_sign_size);
+            l_args->message = l_message;
+            l_args->message_size = a_data_size;
+            l_args->sender_node_addr = *a_sender_node_addr;
+
+            if (dap_global_db_get(l_session->gdb_group_store, l_candidate_hash_str,s_callback_get_candidate_block_and_commit_sign , l_args) != 0 ){
+                log_it (L_ERROR, "Can't process get request for s_callback_get_candidate_block_and_commit_sign()");
+                DAP_DELETE(l_candidate_hash_str);
+                DAP_DELETE(l_args);
+            }else{
+                pthread_rwlock_unlock(&l_session->rwlock);
+                return; // Message we'll proc in callback later
+            }
+            pthread_rwlock_unlock(&l_session->rwlock);
 
 		} break;
 		default:
diff --git a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c
index 61d2f2dbf8..95c39991ac 100644
--- a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c
+++ b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c
@@ -41,14 +41,15 @@
 #include "dap_chain_net.h"
 #include "dap_chain_node_cli.h"
 #include "dap_chain_node_cli_cmd.h"
-#include "dap_chain_global_db.h"
+#include "dap_global_db.h"
+#include "dap_chain_global_db_driver.h"
 #include "dap_chain_cs.h"
 #include "dap_chain_cs_dag.h"
 #include "dap_chain_cs_dag_event.h"
 #include "dap_chain_cs_dag_poa.h"
 #include "dap_chain_net_srv_stake.h"
 #include "dap_chain_cell.h"
-#include "dap_chain_global_db.h"
+#include "dap_global_db.h"
 #include "dap_cert.h"
 
 #define LOG_TAG "dap_chain_cs_dag_poa"
diff --git a/modules/consensus/none/dap_chain_cs_none.c b/modules/consensus/none/dap_chain_cs_none.c
index 42b4fe2a4b..5e0ed733a5 100644
--- a/modules/consensus/none/dap_chain_cs_none.c
+++ b/modules/consensus/none/dap_chain_cs_none.c
@@ -35,7 +35,7 @@
 #include "dap_hash.h"
 #include "dap_chain_cell.h"
 #include "dap_chain_ledger.h"
-#include "dap_chain_global_db.h"
+#include "dap_global_db.h"
 #include "dap_chain_global_db_driver.h"
 #include "dap_chain_cs.h"
 #include "dap_chain_cs_none.h"
diff --git a/modules/global-db/CMakeLists.txt b/modules/global-db/CMakeLists.txt
index 3f4dadeb1c..b6e759e7b3 100644
--- a/modules/global-db/CMakeLists.txt
+++ b/modules/global-db/CMakeLists.txt
@@ -15,7 +15,7 @@ file(GLOB DAP_CHAIN_GLOBAL_DB_HDR
     include/dap_global_db.h
     include/dap_global_db_sync.h
     include/dap_global_db_pkt.h
-    include/dap_chain_global_db.h
+    include/dap_global_db.h
     include/dap_chain_global_db_remote.h
     include/dap_chain_global_db_driver.h
     include/dap_chain_global_db_driver_pgsql.h
diff --git a/modules/global-db/dap_chain_global_db_driver.c b/modules/global-db/dap_chain_global_db_driver.c
index 6e83d4d317..851f1ce99b 100644
--- a/modules/global-db/dap_chain_global_db_driver.c
+++ b/modules/global-db/dap_chain_global_db_driver.c
@@ -43,7 +43,7 @@
 #include "dap_events.h"
 #include "dap_list.h"
 #include "dap_common.h"
-#include "dap_chain_global_db.h"
+#include "dap_global_db.h"
 
 #include "dap_chain_global_db_driver_sqlite.h"
 #include "dap_chain_global_db_driver_cdb.h"
diff --git a/modules/global-db/dap_chain_global_db_driver_cdb.c b/modules/global-db/dap_chain_global_db_driver_cdb.c
index ad233a126b..d5f78a6e47 100644
--- a/modules/global-db/dap_chain_global_db_driver_cdb.c
+++ b/modules/global-db/dap_chain_global_db_driver_cdb.c
@@ -34,7 +34,7 @@
 
 #define _GNU_SOURCE
 
-#include "dap_chain_global_db.h"
+#include "dap_global_db.h"
 #include "dap_chain_global_db_driver_cdb.h"
 #include "dap_common.h"
 #include "dap_hash.h"
diff --git a/modules/global-db/dap_chain_global_db_driver_mdbx.c b/modules/global-db/dap_chain_global_db_driver_mdbx.c
index e6113d34e3..7c2a35ec69 100644
--- a/modules/global-db/dap_chain_global_db_driver_mdbx.c
+++ b/modules/global-db/dap_chain_global_db_driver_mdbx.c
@@ -45,7 +45,8 @@
 
 #define _GNU_SOURCE
 
-#include "dap_chain_global_db.h"
+#include "dap_global_db.h"
+#include "dap_config.h"
 #include "dap_chain_global_db_driver_mdbx.h"
 #include "dap_hash.h"
 #include "dap_strfuncs.h"
diff --git a/modules/global-db/dap_chain_global_db_driver_sqlite.c b/modules/global-db/dap_chain_global_db_driver_sqlite.c
index 46b19f2057..4ae35c61f3 100644
--- a/modules/global-db/dap_chain_global_db_driver_sqlite.c
+++ b/modules/global-db/dap_chain_global_db_driver_sqlite.c
@@ -35,7 +35,7 @@
 #include <unistd.h>
 #endif
 
-#include "dap_chain_global_db.h"
+#include "dap_global_db.h"
 #include "dap_chain_global_db_driver_sqlite.h"
 #include "dap_common.h"
 #include "dap_hash.h"
diff --git a/modules/global-db/dap_chain_global_db_remote.c b/modules/global-db/dap_chain_global_db_remote.c
index 11e22dcd93..92c1769f6f 100644
--- a/modules/global-db/dap_chain_global_db_remote.c
+++ b/modules/global-db/dap_chain_global_db_remote.c
@@ -1,7 +1,7 @@
 #include <string.h>
 #include <stdlib.h>
 
-#include "dap_chain_global_db.h"
+#include "dap_global_db.h"
 #include "dap_chain_global_db_remote.h"
 #include "dap_common.h"
 #include "dap_strfuncs.h"
diff --git a/modules/global-db/dap_global_db.c b/modules/global-db/dap_global_db.c
index 987bb14198..f006df713d 100644
--- a/modules/global-db/dap_global_db.c
+++ b/modules/global-db/dap_global_db.c
@@ -33,7 +33,7 @@
 #include "dap_proc_thread.h"
 #define LOG_TAG "dap_global_db"
 
-#include "dap_chain_global_db.h"
+#include "dap_global_db.h"
 #include "dap_global_db_sync.h"
 #include "dap_chain_global_db_driver.h"
 
diff --git a/modules/global-db/include/dap_chain_global_db.h b/modules/global-db/include/dap_chain_global_db.h
index 436e968fe8..b3235a6ccb 100644
--- a/modules/global-db/include/dap_chain_global_db.h
+++ b/modules/global-db/include/dap_chain_global_db.h
@@ -13,14 +13,4 @@
 #include "dap_global_db_sync.h"
 
 
-enum    {
-    DAP_DB$K_OPTYPE_ADD  = 0x61,    /* 'a', */                              /* Operation Type = INSERT/ADD */
-    DAP_DB$K_OPTYPE_DEL  = 0x64,    /* 'd', */                              /*  -- // -- DELETE */
-    DAP_DB$K_OPTYPE_RETR = 0x72,    /* 'r', */                              /*  -- // -- RETRIEVE/GET */
-};
 
-
-/**
- * Get entry from base
- */
-uint8_t * dap_chain_global_db_gr_get(const char *a_key, size_t *a_data_len_out, const char *a_group);
diff --git a/modules/global-db/include/dap_global_db.h b/modules/global-db/include/dap_global_db.h
index 0908c3412b..8e237b265a 100644
--- a/modules/global-db/include/dap_global_db.h
+++ b/modules/global-db/include/dap_global_db.h
@@ -45,6 +45,12 @@ typedef struct dap_global_db_context
 
 #define DAP_CONTEXT_TYPE_GLOBAL_DB   100
 
+enum    {
+    DAP_DB$K_OPTYPE_ADD  = 0x61,    /* 'a', */                              /* Operation Type = INSERT/ADD */
+    DAP_DB$K_OPTYPE_DEL  = 0x64,    /* 'd', */                              /*  -- // -- DELETE */
+    DAP_DB$K_OPTYPE_RETR = 0x72,    /* 'r', */                              /*  -- // -- RETRIEVE/GET */
+};
+
 typedef struct dap_store_obj {
     uint64_t id;
     dap_nanotime_t timestamp;
@@ -89,6 +95,8 @@ typedef bool (*dap_global_db_callback_results_raw_t) (dap_global_db_context_t *
 #define DAP_GLOBAL_DB_RC_NO_RESULTS     -1
 #define DAP_GLOBAL_DB_RC_ERROR           -666
 
+
+
 extern bool g_dap_global_db_debug_more;
 
 int dap_global_db_init(const char * a_path, const char * a_driver);
diff --git a/modules/mempool/dap_chain_mempool.c b/modules/mempool/dap_chain_mempool.c
index 0a9dd8357c..4d1c8a047a 100644
--- a/modules/mempool/dap_chain_mempool.c
+++ b/modules/mempool/dap_chain_mempool.c
@@ -48,7 +48,7 @@
 #include "http_status_code.h"
 #include "dap_chain_common.h"
 #include "dap_chain_node.h"
-#include "dap_chain_global_db.h"
+#include "dap_global_db.h"
 #include "dap_enc.h"
 #include <dap_enc_http.h>
 #include <dap_enc_key.h>
diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index 586bc72814..ddd4952c95 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -89,7 +89,7 @@
 #include "dap_chain_ledger.h"
 #include "dap_chain_cs_none.h"
 
-#include "dap_chain_global_db.h"
+#include "dap_global_db.h"
 #include "dap_chain_global_db_remote.h"
 
 #include "dap_stream_ch_chain_net_pkt.h"
diff --git a/modules/net/dap_chain_node.c b/modules/net/dap_chain_node.c
index d70573058a..dba3a0a5b6 100644
--- a/modules/net/dap_chain_node.c
+++ b/modules/net/dap_chain_node.c
@@ -43,7 +43,7 @@
 #include "dap_hash.h"
 #include "rand/dap_rand.h"
 #include "dap_chain_net.h"
-#include "dap_chain_global_db.h"
+#include "dap_global_db.h"
 #include "dap_chain_node.h"
 
 #define LOG_TAG "chain_node"
diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c
index f35cac3be0..a787a58fe1 100644
--- a/modules/net/dap_chain_node_cli_cmd.c
+++ b/modules/net/dap_chain_node_cli_cmd.c
@@ -71,7 +71,7 @@
 #include "dap_enc_base58.h"
 #include "dap_chain_wallet.h"
 #include "dap_chain_node.h"
-#include "dap_chain_global_db.h"
+#include "dap_global_db.h"
 #include "dap_chain_node_client.h"
 #include "dap_chain_node_remote.h"
 #include "dap_chain_node_cli_cmd.h"
@@ -96,7 +96,7 @@
 #include "dap_chain_datum_tx_items.h"
 #include "dap_chain_ledger.h"
 #include "dap_chain_mempool.h"
-#include "dap_chain_global_db.h"
+#include "dap_global_db.h"
 #include "dap_chain_global_db_remote.h"
 
 #include "dap_stream_ch_chain_net.h"
diff --git a/modules/net/dap_chain_node_dns_server.c b/modules/net/dap_chain_node_dns_server.c
index 1bffdd2bbb..1c5c06078f 100644
--- a/modules/net/dap_chain_node_dns_server.c
+++ b/modules/net/dap_chain_node_dns_server.c
@@ -31,7 +31,7 @@
 #include "dap_chain_net.h"
 #include "dap_chain_node.h"
 #include "dap_string.h"
-#include "dap_chain_global_db.h"
+#include "dap_global_db.h"
 #include "dap_chain_global_db_remote.h"
 
 #define LOG_TAG "dap_chain_node_dns_server"
diff --git a/modules/net/include/dap_chain_node.h b/modules/net/include/dap_chain_node.h
index 0b5c2b8bc5..d14c6afbe7 100644
--- a/modules/net/include/dap_chain_node.h
+++ b/modules/net/include/dap_chain_node.h
@@ -45,7 +45,7 @@
 #include "dap_events_socket.h"
 
 #include "dap_chain_common.h"
-#include "dap_chain_global_db.h"
+#include "dap_global_db.h"
 #include "dap_chain.h"
 #include "dap_chain_net.h"
 
diff --git a/modules/net/srv/dap_chain_net_srv_order.c b/modules/net/srv/dap_chain_net_srv_order.c
index 44bd0494e5..08999930ce 100644
--- a/modules/net/srv/dap_chain_net_srv_order.c
+++ b/modules/net/srv/dap_chain_net_srv_order.c
@@ -28,7 +28,7 @@
 #include "dap_chain_net_srv_order.h"
 #include "dap_hash.h"
 #include "dap_enc_base58.h"
-#include "dap_chain_global_db.h"
+#include "dap_global_db.h"
 #include "dap_chain_net_srv_countries.h"
 
 #define LOG_TAG "dap_chain_net_srv_order"
diff --git a/modules/type/blocks/dap_chain_block_chunk.c b/modules/type/blocks/dap_chain_block_chunk.c
index 7f8a313227..265767acea 100644
--- a/modules/type/blocks/dap_chain_block_chunk.c
+++ b/modules/type/blocks/dap_chain_block_chunk.c
@@ -23,7 +23,7 @@
 #include "dap_chain_net.h"
 #include "dap_common.h"
 #include "dap_strfuncs.h"
-#include "dap_chain_global_db.h"
+#include "dap_global_db.h"
 #include "dap_chain_block_chunk.h"
 
 #define LOG_TAG "dap_chain_block_chunk"
diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c
index 4a0e25847a..b7df079f90 100644
--- a/modules/type/dag/dap_chain_cs_dag.c
+++ b/modules/type/dag/dap_chain_cs_dag.c
@@ -47,7 +47,8 @@
 #include "dap_chain_datum.h"
 #include "dap_chain_cs.h"
 #include "dap_chain_cs_dag.h"
-#include "dap_chain_global_db.h"
+#include "dap_global_db.h"
+#include "dap_chain_global_db_driver.h"
 #include "dap_chain_node_cli.h"
 #include "dap_chain_node_cli_cmd.h"
 #include "dap_chain_cell.h"
-- 
GitLab