From a89db0518e93d5365852a7900c999acb86a3bf03 Mon Sep 17 00:00:00 2001
From: Dmitriy Gerasimov <naeper@demlabs.net>
Date: Fri, 7 Jun 2019 01:30:16 +0700
Subject: [PATCH] [*] Updated massive transaction creation

---
 dap_chain_mempool.c | 49 +++++++++++++++++++++++++--------------------
 1 file changed, 27 insertions(+), 22 deletions(-)

diff --git a/dap_chain_mempool.c b/dap_chain_mempool.c
index e4dd278..183a68a 100755
--- a/dap_chain_mempool.c
+++ b/dap_chain_mempool.c
@@ -61,8 +61,8 @@
 typedef struct list_used_item {
     dap_chain_hash_fast_t tx_hash_fast;
     int num_idx_out;
+    uint8_t padding[4];
     uint64_t value;
-
 //dap_chain_tx_out_t *tx_out;
 } list_used_item_t;
 
@@ -79,7 +79,9 @@ int dap_datum_mempool_init(void)
  */
 int dap_chain_mempool_datum_add(dap_chain_datum_t * a_datum)
 {
-    return 0;
+    // TODO
+    (void) a_datum;
+    return -1;
 }
 
 /**
@@ -94,7 +96,7 @@ int dap_chain_mempool_tx_create(dap_chain_t * a_chain, dap_enc_key_t *a_key_from
         uint64_t a_value, uint64_t a_value_fee)
 {
     // check valid param
-    if(!a_chain | !a_key_from || !a_key_from->priv_key_data || !a_key_from->priv_key_data_size ||
+    if(!a_chain | !a_key_from || ! a_addr_from || !a_key_from->priv_key_data || !a_key_from->priv_key_data_size ||
             !dap_chain_addr_check_sum(a_addr_from) || !dap_chain_addr_check_sum(a_addr_to) ||
             (a_addr_fee && !dap_chain_addr_check_sum(a_addr_fee)) || !a_value)
         return -1;
@@ -121,7 +123,7 @@ int dap_chain_mempool_tx_create(dap_chain_t * a_chain, dap_enc_key_t *a_key_from
             while(l_list_tmp) {
                 dap_chain_tx_out_t *out_item = l_list_tmp->data;
                 // if 'out' item has addr = a_addr_from
-                if(out_item && &out_item->addr && !memcmp(a_addr_from, &out_item->addr, sizeof(dap_chain_addr_t))) {
+                if(out_item && !memcmp(a_addr_from, &out_item->addr, sizeof(dap_chain_addr_t))) {
 
                     // Check whether used 'out' items
                     if(!dap_chain_ledger_tx_hash_is_used_out_item (a_chain->ledger, &l_tx_cur_hash, l_out_idx_tmp)) {
@@ -160,7 +162,7 @@ int dap_chain_mempool_tx_create(dap_chain_t * a_chain, dap_enc_key_t *a_key_from
         uint64_t l_value_to_items = 0; // how many coins to transfer
         while(l_list_tmp) {
             list_used_item_t *item = l_list_tmp->data;
-            if(dap_chain_datum_tx_add_in_item(&l_tx, &item->tx_hash_fast, item->num_idx_out) == 1) {
+            if(dap_chain_datum_tx_add_in_item(&l_tx, &item->tx_hash_fast,(uint32_t) item->num_idx_out) == 1) {
                 l_value_to_items += item->value;
             }
             l_list_tmp = dap_list_next(l_list_tmp);
@@ -292,8 +294,6 @@ int dap_chain_mempool_tx_create_massive( dap_chain_t * a_chain, dap_enc_key_t *a
         return -2;
     }
 
-
-    dap_chain_hash_fast_t l_tx_new_prev_hash = {0};
     for (size_t i=0; i< a_tx_num ; i++){
         log_it(L_DEBUG, "Prepare tx %u",i);
         // find the transactions from which to take away coins
@@ -308,8 +308,13 @@ int dap_chain_mempool_tx_create_massive( dap_chain_t * a_chain, dap_enc_key_t *a
         // Add in and remove out used items
         while(l_list_tmp) {
             list_used_item_t *item = l_list_tmp->data;
-            if(dap_chain_datum_tx_add_in_item(&l_tx_new, &item->tx_hash_fast, item->num_idx_out) == 1) {
+            char l_in_hash_str[70];
+            dap_chain_hash_fast_to_str(&item->tx_hash_fast,l_in_hash_str,sizeof (l_in_hash_str) );
+            if(dap_chain_datum_tx_add_in_item(&l_tx_new, &item->tx_hash_fast, (uint32_t) item->num_idx_out) == 1) {
                 l_value_to_items += item->value;
+                log_it(L_DEBUG,"Added input %s with %llu datoshi",l_in_hash_str, item->value);
+            }else{
+                log_it(L_WARNING,"Can't add input from %s with %llu datoshi",l_in_hash_str, item->value);
             }
             l_list_used_out = l_list_tmp->next;
             DAP_DELETE(l_list_tmp);
@@ -354,7 +359,6 @@ int dap_chain_mempool_tx_create_massive( dap_chain_t * a_chain, dap_enc_key_t *a
 
         dap_chain_hash_fast_t l_tx_new_hash;
         dap_hash_fast(l_tx_new, l_tx_size, &l_tx_new_hash);
-        memcpy (&l_tx_new_prev_hash, &l_tx_new_hash, sizeof (l_tx_new_hash) );
         // If we have value back - update balance cache
         if(l_value_back) {
             //log_it(L_DEBUG,"We have value back %llu now lets see how many outputs we have", l_value_back);
@@ -368,6 +372,7 @@ int dap_chain_mempool_tx_create_massive( dap_chain_t * a_chain, dap_enc_key_t *a
                 dap_chain_tx_out_t * l_out = l_list_tmp->data ;
                 if( ! l_out){
                     log_it(L_WARNING, "Output is NULL, continue check outputs...");
+                    l_out_idx_tmp++;
                     continue;
                 }
                 if ( memcmp(&l_out->addr, a_addr_from, sizeof (*a_addr_from))==0 ){
@@ -375,8 +380,8 @@ int dap_chain_mempool_tx_create_massive( dap_chain_t * a_chain, dap_enc_key_t *a
                     memcpy(&l_item_back->tx_hash_fast, &l_tx_new_hash, sizeof(dap_chain_hash_fast_t));
                     l_item_back->num_idx_out = l_out_idx_tmp;
                     l_item_back->value = l_value_back;
-                    l_list_used_out = dap_list_append(l_list_used_out, l_item_back);
-                    //log_it(L_DEBUG,"Found change back output, stored back in UTXO table");
+                    l_list_used_out = dap_list_prepend(l_list_used_out, l_item_back);
+                    log_it(L_DEBUG,"Found change back output, stored back in UTXO table");
                     break;
                  }
                 l_list_tmp = l_list_tmp->next;
@@ -396,8 +401,8 @@ int dap_chain_mempool_tx_create_massive( dap_chain_t * a_chain, dap_enc_key_t *a
         //continue;
         l_objs[i].value = (uint8_t*) l_datum;
         l_objs[i].value_len = l_tx_size + sizeof(l_datum->header);
-        //log_it(L_DEBUG, "Prepared obj with key %s (value_len = %llu)",
-        //       l_objs[i].key? l_objs[i].key :"NULL" , l_objs[i].value_len );
+        log_it(L_DEBUG, "Prepared obj with key %s (value_len = %llu)",
+               l_objs[i].key? l_objs[i].key :"NULL" , l_objs[i].value_len );
 
     }
     dap_list_free(l_list_used_out);
@@ -445,20 +450,20 @@ int dap_chain_mempool_tx_create_cond(dap_chain_t * a_chain,
         while(l_value_transfer < l_value_need)
         {
             // Get the transaction in the cache by the addr in out item
-            const dap_chain_datum_tx_t *l_tx = dap_chain_ledger_tx_find_by_addr(a_chain->ledger, a_token_ticker,a_addr_from,
+            dap_chain_datum_tx_t *l_tx = dap_chain_ledger_tx_find_by_addr(a_chain->ledger, a_token_ticker,a_addr_from,
                     &l_tx_cur_hash);
             if(!l_tx)
                 break;
             // Get all item from transaction by type
             int l_item_count = 0;
-            dap_list_t *l_list_out_items = dap_chain_datum_tx_items_get((dap_chain_datum_tx_t*) l_tx, TX_ITEM_TYPE_OUT,
+            dap_list_t *l_list_out_items = dap_chain_datum_tx_items_get( l_tx, TX_ITEM_TYPE_OUT,
                     &l_item_count);
             dap_list_t *l_list_tmp = l_list_out_items;
             int l_out_idx_tmp = 0; // current index of 'out' item
             while(l_list_tmp) {
                 dap_chain_tx_out_t *out_item = l_list_tmp->data;
                 // if 'out' item has addr = a_addr_from
-                if(out_item && &out_item->addr && !memcmp(a_addr_from, &out_item->addr, sizeof(dap_chain_addr_t))) {
+                if(out_item &&  !memcmp(a_addr_from, &out_item->addr, sizeof(dap_chain_addr_t))) {
 
                     // Check whether used 'out' items
                     if(!dap_chain_ledger_tx_hash_is_used_out_item(a_chain->ledger, &l_tx_cur_hash, l_out_idx_tmp)) {
@@ -497,7 +502,7 @@ int dap_chain_mempool_tx_create_cond(dap_chain_t * a_chain,
         uint64_t l_value_to_items = 0; // how many coins to transfer
         while(l_list_tmp) {
             list_used_item_t *item = l_list_tmp->data;
-            if(dap_chain_datum_tx_add_in_item(&l_tx, &item->tx_hash_fast, item->num_idx_out) == 1) {
+            if(dap_chain_datum_tx_add_in_item(&l_tx, &item->tx_hash_fast,(uint32_t) item->num_idx_out) == 1) {
                 l_value_to_items += item->value;
             }
             l_list_tmp = dap_list_next(l_list_tmp);
@@ -758,7 +763,7 @@ void dap_datum_mempool_free(dap_datum_mempool_t *datum)
 static char* calc_datum_hash(const char *datum_str, size_t datum_size)
 {
     dap_chain_hash_fast_t a_hash;
-    dap_hash((char*) datum_str, datum_size, a_hash.raw, sizeof(a_hash.raw), DAP_HASH_TYPE_SLOW_0);
+    dap_hash( datum_str, datum_size, a_hash.raw, sizeof(a_hash.raw), DAP_HASH_TYPE_SLOW_0);
     size_t a_str_max = (sizeof(a_hash.raw) + 1) * 2 + 2; /* heading 0x */
     char *a_str = DAP_NEW_Z_SIZE(char, a_str_max);
     size_t hash_len = dap_chain_hash_fast_to_str(&a_hash, a_str, a_str_max);
@@ -829,7 +834,7 @@ void chain_mempool_proc(struct dap_http_simple *cl_st, void * arg)
     if(dg) {
         char *suburl = dg->url_path;
         char *request_str = dg->request_str;
-        int request_size = dg->request_size;
+        int request_size = (int) dg->request_size;
         //printf("!!***!!! chain_mempool_proc arg=%d suburl=%s str=%s len=%d\n", arg, suburl, request_str, request_size);
         if(request_str && request_size > 1) {
             //  find what to do
@@ -844,7 +849,7 @@ void chain_mempool_proc(struct dap_http_simple *cl_st, void * arg)
             }
             dap_datum_mempool_t *datum_mempool =
                     (action != DAP_DATUM_MEMPOOL_NONE) ?
-                            dap_datum_mempool_deserialize(request_str, (size_t) request_size) : NULL;
+                            dap_datum_mempool_deserialize((uint8_t*) request_str, (size_t) request_size) : NULL;
             if(datum_mempool)
             {
                 dap_datum_mempool_free(datum_mempool);
@@ -855,7 +860,7 @@ void chain_mempool_proc(struct dap_http_simple *cl_st, void * arg)
                 case DAP_DATUM_MEMPOOL_ADD: // add datum in base
                     //a_value = DAP_NEW_Z_SIZE(char, request_size * 2);
                     //bin2hex((char*) a_value, (const unsigned char*) request_str, request_size);
-                    if(dap_chain_global_db_gr_set(a_key, request_str, request_size,
+                    if(dap_chain_global_db_gr_set(a_key, request_str,(size_t) request_size,
                             dap_config_get_item_str_default(g_config, "mempool", "gdb_group", "datum-pool"))) {
                         *return_code = Http_Status_OK;
                     }
@@ -889,7 +894,7 @@ void chain_mempool_proc(struct dap_http_simple *cl_st, void * arg)
                     if(dap_chain_global_db_gr_del(((const char*) a_key),
                             dap_config_get_item_str_default(g_config, "mempool", "gdb_group", "datum-pool"))) {
                         dg->response = strdup("1");
-                        DAP_DELETE(str);
+
                         log_it(L_INFO, "Delete hash: key=%s result: Ok", a_key);
                     }
                     else
-- 
GitLab