From d3c186780445b2f8660a9aff38c424dd7fa8df5a Mon Sep 17 00:00:00 2001
From: Dmitriy Gerasimov <naeper@demlabs.net>
Date: Sun, 19 May 2019 15:48:12 +0700
Subject: [PATCH] [*] Bidirectional syncronyzation [*] Fixed token emission:
 added signing

---
 dap_chain_node_cli_cmd.c | 48 ++++++++++++++++++++++++++++++----------
 dap_chain_node_client.c  |  6 ++---
 2 files changed, 39 insertions(+), 15 deletions(-)

diff --git a/dap_chain_node_cli_cmd.c b/dap_chain_node_cli_cmd.c
index 1ee99b542e..6bcba7c5f6 100644
--- a/dap_chain_node_cli_cmd.c
+++ b/dap_chain_node_cli_cmd.c
@@ -2079,22 +2079,46 @@ int com_token_emit(int argc, const char ** argv, char ** str_reply)
 
 
     // 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++) {
+        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;
-    dap_chain_hash_fast_t l_token_emission_hash;
+    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;
+
     l_token_emission = DAP_NEW_Z(dap_chain_datum_token_emission_t);
-    strncpy(l_token_emission->ticker, l_ticker, sizeof(l_token_emission->ticker));
-    l_token_emission->value = l_emission_value;
-    dap_hash_fast(l_token_emission, sizeof(dap_chain_datum_token_emission_t), &l_token_emission_hash);
+    strncpy(l_token_emission->hdr.ticker, l_ticker, sizeof(l_token_emission->hdr.ticker));
+    l_token_emission->hdr.value = l_emission_value;
+
+    // Then add signs
+    size_t l_offset=0;
+    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);
+        memcpy(l_token_emission->data.type_auth.signs+l_offset,l_sign,l_sign_size);
+        l_offset+= l_sign_size;
+        DAP_DELETE(l_sign);
+    }
+
+    // Produce datum
     dap_chain_datum_t * l_datum_emission = dap_chain_datum_create(DAP_CHAIN_DATUM_TOKEN_EMISSION,
             l_token_emission,
-            sizeof(dap_chain_datum_token_emission_t));
+            l_token_emission_size);
     size_t l_datum_emission_size = sizeof(l_datum_emission->header) + l_datum_emission->header.data_size;
 
+    // Delete token emission
     DAP_DELETE(l_token_emission);
 
-    dap_chain_hash_fast_t l_key_hash;
-    dap_hash_fast(l_datum_emission, l_datum_emission_size, &l_key_hash);
-    char * l_key_str = dap_chain_hash_fast_to_str_new(&l_key_hash);
+    // Calc datum's hash
+    dap_chain_hash_fast_t l_datum_emission_hash;
+    dap_hash_fast(l_datum_emission, l_datum_emission_size, &l_datum_emission_hash);
+    char * l_key_str = dap_chain_hash_fast_to_str_new(&l_datum_emission_hash);
 
     // Add to mempool emission token
     if(dap_chain_global_db_gr_set(l_key_str, (uint8_t *) l_datum_emission, l_datum_emission_size
@@ -2110,9 +2134,8 @@ int com_token_emit(int argc, const char ** argv, char ** str_reply)
     // create first transaction (with tx_token)
     dap_chain_datum_tx_t *l_tx = DAP_NEW_Z_SIZE(dap_chain_datum_tx_t, sizeof(dap_chain_datum_tx_t));
     dap_chain_hash_fast_t l_tx_prev_hash = { 0 };
-    dap_chain_hash_fast_t l_datum_token_hash = { 0 };
     // create items
-    dap_chain_tx_token_t *l_tx_token = dap_chain_datum_tx_item_token_create(&l_token_emission_hash, l_ticker);
+    dap_chain_tx_token_t *l_tx_token = dap_chain_datum_tx_item_token_create(&l_datum_emission_hash, l_ticker);
     dap_chain_tx_in_t *l_in = dap_chain_datum_tx_item_in_create(&l_tx_prev_hash, 0);
     dap_chain_tx_out_t *l_out = dap_chain_datum_tx_item_out_create(l_addr, l_emission_value);
 
@@ -2144,8 +2167,9 @@ int com_token_emit(int argc, const char ** argv, char ** str_reply)
     // use l_tx hash for compatible with utho hash
     //dap_hash_fast(l_tx, l_tx_size, &l_key_hash); //dap_hash_fast(l_datum_tx, l_datum_tx_size, &l_key_hash);
     // calc datum hash
-    dap_hash_fast(l_datum_tx, l_datum_tx_size, &l_key_hash);
-    l_key_str = dap_chain_hash_fast_to_str_new(&l_key_hash);
+    dap_chain_hash_fast_t l_datum_tx_hash;
+    dap_hash_fast(l_datum_tx, l_datum_tx_size, &l_datum_tx_hash);
+    l_key_str = dap_chain_hash_fast_to_str_new(&l_datum_tx_hash);
     DAP_DELETE(l_tx);
 
 
diff --git a/dap_chain_node_client.c b/dap_chain_node_client.c
index d837f15768..cb14bdd995 100644
--- a/dap_chain_node_client.c
+++ b/dap_chain_node_client.c
@@ -167,8 +167,8 @@ static void s_ch_chain_callback_notify_packet_in(dap_stream_ch_chain_t* a_ch_cha
         case DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNCED_GLOBAL_DB:
         case DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNCED_CHAINS:{
             dap_stream_ch_chain_sync_request_t * l_request = NULL;
-            //if ( a_pkt_data_size == sizeof ( *l_request))
-            //     l_request = (dap_stream_ch_chain_sync_request_t* ) a_pkt->data;
+            if ( a_pkt_data_size == sizeof ( *l_request))
+                l_request = (dap_stream_ch_chain_sync_request_t* ) a_pkt->data;
 
             if ( l_request ){
                 if ( l_request->ts_start < (uint64_t) dap_db_log_get_last_timestamp() ){
@@ -179,7 +179,7 @@ static void s_ch_chain_callback_notify_packet_in(dap_stream_ch_chain_t* a_ch_cha
 
                     if ( l_list ) {
                         // Add it to outgoing list
-                        l_list->next = a_ch_chain->request_global_db_trs;
+                        l_list->prev = a_ch_chain->request_global_db_trs;
                         a_ch_chain->request_global_db_trs = l_list;
                         a_ch_chain->request_net_id.uint64 = a_pkt->hdr.net_id.uint64;
                         a_ch_chain->request_cell_id.uint64 = a_pkt->hdr.cell_id.uint64;
-- 
GitLab