From 40151fee84cb2880f267e93cda2918ef7204e573 Mon Sep 17 00:00:00 2001
From: Dmitriy Gerasimov <naeper@demlabs.net>
Date: Tue, 21 May 2019 19:40:04 +0700
Subject: [PATCH] [*] Lot of fixes

---
 dap_chain_net.c          | 29 +++++++++++++++++++++++++++--
 dap_chain_node_cli_cmd.c | 22 ++++++++--------------
 2 files changed, 35 insertions(+), 16 deletions(-)

diff --git a/dap_chain_net.c b/dap_chain_net.c
index 92f0d6c..75255e6 100644
--- a/dap_chain_net.c
+++ b/dap_chain_net.c
@@ -120,7 +120,9 @@ static int s_net_states_proc(dap_chain_net_t * l_net);
 static void * s_net_proc_thread ( void * a_net);
 static void s_net_proc_thread_start( dap_chain_net_t * a_net );
 static void s_net_proc_kill( dap_chain_net_t * a_net );
-
+static void s_gbd_history_callback_notify (void * a_arg,const char a_op_code, const char * a_prefix, const char * a_group,
+                                                     const char * a_key, const void * a_value,
+                                                     const size_t a_value_len);
 static int s_cli_net(int argc, const char ** argv, char **str_reply);
 
 static bool s_seed_mode = false;
@@ -151,6 +153,25 @@ int dap_chain_net_state_go_to(dap_chain_net_t * a_net, dap_chain_net_state_t a_n
     return 0;
 }
 
+/**
+ * @brief s_gbd_history_callback_notify
+ * @param a_op_code
+ * @param a_prefix
+ * @param a_group
+ * @param a_key
+ * @param a_value
+ * @param a_value_len
+ */
+static void s_gbd_history_callback_notify (void * a_arg, const char a_op_code, const char * a_prefix, const char * a_group,
+                                                     const char * a_key, const void * a_value,
+                                                     const size_t a_value_len)
+{
+    if (a_arg) {
+        dap_chain_net_t * l_net = (dap_chain_net_t *) a_arg;
+        dap_chain_net_sync_all(l_net);
+    }
+}
+
 
 /**
  * @brief s_net_states_proc
@@ -582,6 +603,7 @@ int dap_chain_net_init()
             "\tList,add,del, dump or establish links\n\n"
                                         );
     s_seed_mode = dap_config_get_item_bool_default(g_config,"general","seed_mode",false);
+
     return  0;
 }
 
@@ -704,6 +726,8 @@ int dap_chain_net_load(const char * a_net_name)
         }
         l_net->pub.gdb_groups_prefix = dap_strdup (
                     dap_config_get_item_str_default(l_cfg , "general" , "gdb_groups_prefix","" ) );
+        dap_chain_global_db_add_history_group_prefix( l_net->pub.gdb_groups_prefix);
+        dap_chain_global_db_add_history_callback_notify(l_net->pub.gdb_groups_prefix, s_gbd_history_callback_notify, l_net );
 
 
         // Add network to the list
@@ -775,6 +799,7 @@ int dap_chain_net_load(const char * a_net_name)
 
 
          }
+
         // Init chains
         size_t l_chains_path_size =strlen(dap_config_path())+1+strlen(l_net->pub.name)+1+strlen("network")+1;
         char * l_chains_path = DAP_NEW_Z_SIZE (char,l_chains_path_size);
@@ -796,7 +821,7 @@ int dap_chain_net_load(const char * a_net_name)
                         //dap_config_open(l_chains_path);
 
                         // Create chain object
-                        dap_chain_t * l_chain = dap_chain_load_from_cfg(l_net->pub.name, l_net->pub.id, l_chains_path);
+                        dap_chain_t * l_chain = dap_chain_load_from_cfg(l_net->pub.ledger, l_net->pub.name, l_net->pub.id, l_chains_path);
                         if(l_chain){
                             DL_APPEND( l_net->pub.chains, l_chain);
                             if(l_chain->callback_created)
diff --git a/dap_chain_node_cli_cmd.c b/dap_chain_node_cli_cmd.c
index 1ffb7ca..306e166 100644
--- a/dap_chain_node_cli_cmd.c
+++ b/dap_chain_node_cli_cmd.c
@@ -1913,7 +1913,7 @@ int com_token_decl(int argc, const char ** argv, char ** str_reply)
     }
 
     // Load certs lists
-    size_t l_signs_size = dap_chain_cert_parse_str_list(l_certs_str, &l_certs, &l_certs_size);
+    size_t l_certs_count = dap_chain_cert_parse_str_list(l_certs_str, &l_certs, &l_certs_size);
     if(!l_certs_size) {
         dap_chain_node_cli_set_reply_text(str_reply,
                 "token_create command requres at least one valid certificate to sign the basic transaction of emission");
@@ -1925,8 +1925,7 @@ int com_token_decl(int argc, const char ** argv, char ** str_reply)
         l_certs_size = l_signs_total;
 
     // Create new datum token
-    dap_chain_datum_token_t * l_datum_token = DAP_NEW_Z_SIZE(dap_chain_datum_token_t, sizeof(l_datum_token->header) +
-            l_signs_size);
+    dap_chain_datum_token_t * l_datum_token = DAP_NEW_Z_SIZE(dap_chain_datum_token_t, sizeof(l_datum_token->header));
     l_datum_token->header.version = 1; // Current version
     snprintf(l_datum_token->header.ticker, sizeof(l_datum_token->header.ticker), "%s", l_ticker);
     l_datum_token->header.total_supply = l_total_supply;
@@ -1942,11 +1941,13 @@ int com_token_decl(int argc, const char ** argv, char ** str_reply)
                 sizeof(l_datum_token->header),
                 0);
         size_t l_sign_size = dap_chain_sign_get_size(l_sign);
+        l_datum_token=DAP_REALLOC(l_datum_token,sizeof (l_datum_token->header)+l_signs_offset +l_sign_size);
         memcpy(l_datum_token->signs + l_signs_offset, l_sign, l_sign_size);
+        l_signs_offset += l_sign_size;
         DAP_DELETE(l_sign);
     }
     dap_chain_datum_t * l_datum = dap_chain_datum_create(DAP_CHAIN_DATUM_TOKEN_DECL, l_datum_token,
-            sizeof(l_datum_token->header) + l_signs_size);
+            sizeof(l_datum_token->header) + l_signs_offset );
     size_t l_datum_size = dap_chain_datum_size(l_datum);
 
     // Calc datum's hash
@@ -2106,19 +2107,10 @@ int com_token_emit(int argc, const char ** argv, char ** str_reply)
     char * l_gdb_group_mempool_base_tx = dap_chain_net_get_gdb_group_mempool(l_chain_base_tx);
 
     // Create emission datum
-
-    // First calc summary sign size
-    size_t l_token_emission_signs_size =0;
-    for ( size_t i=0 ; i < l_certs_size ; i++) {
-        // TODO Here must be added serialized size!
-        l_token_emission_signs_size += dap_chain_cert_sign_output_size(l_certs[i],0);
-    }
-
     // then create datum in memory
     dap_chain_datum_token_emission_t * l_token_emission;
     size_t l_token_emission_size = sizeof (l_token_emission->hdr) +
-            sizeof (l_token_emission->data.type_auth.signs_count) +
-            l_token_emission_signs_size;
+            sizeof (l_token_emission->data.type_auth.signs_count);
 
     l_token_emission = DAP_NEW_Z_SIZE(dap_chain_datum_token_emission_t, l_token_emission_size);
     strncpy(l_token_emission->hdr.ticker, l_ticker, sizeof(l_token_emission->hdr.ticker));
@@ -2129,6 +2121,8 @@ int com_token_emit(int argc, const char ** argv, char ** str_reply)
     for (size_t i =0; i < l_certs_size; i++ ){
         dap_chain_sign_t * l_sign = dap_chain_cert_sign(l_certs[i],&l_token_emission->hdr, sizeof(l_token_emission->hdr),0 );
         size_t l_sign_size = dap_chain_sign_get_size(l_sign);
+        l_token_emission_size += l_sign_size;
+        l_token_emission= DAP_REALLOC(l_token_emission, l_token_emission_size);
         memcpy(l_token_emission->data.type_auth.signs+l_offset,l_sign,l_sign_size);
         l_offset+= l_sign_size;
         DAP_DELETE(l_sign);
-- 
GitLab