From 170794645355e8fec3572163f02e6d9bd9088454 Mon Sep 17 00:00:00 2001 From: Aleksandr Lysikov <lysikov@inbox.ru> Date: Thu, 16 May 2019 21:35:13 +0500 Subject: [PATCH] insert dap_chain_mempool_tx_create_receipt() --- dap_chain_mempool.c | 143 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 138 insertions(+), 5 deletions(-) diff --git a/dap_chain_mempool.c b/dap_chain_mempool.c index 1389d10..3019c95 100755 --- a/dap_chain_mempool.c +++ b/dap_chain_mempool.c @@ -208,7 +208,7 @@ int dap_chain_mempool_tx_create(dap_enc_key_t *a_key_from, , c_dap_datum_mempool_gdb_group)) { log_it(L_NOTICE, "Transaction %s placed in mempool", l_key_str); // add transaction to utxo - if(dap_chain_utxo_tx_add((dap_chain_datum_tx_t*) l_datum->data)<0) + if(dap_chain_utxo_tx_add((dap_chain_datum_tx_t*) l_datum->data) < 0) log_it(L_ERROR, "Transaction %s not placed in UTXO", l_key_str); } DAP_DELETE(l_key_str); @@ -219,7 +219,7 @@ int dap_chain_mempool_tx_create(dap_enc_key_t *a_key_from, /** * Make transfer transaction & insert to cache * - * return 1 Ok, 0 not enough funds to transfer, -1 other Error + * return 0 Ok, -2 not enough funds to transfer, -1 other Error */ int dap_chain_mempool_tx_create_cond(dap_enc_key_t *a_key_from, dap_enc_key_t *a_key_cond, const dap_chain_addr_t* a_addr_from, const dap_chain_addr_t* a_addr_cond, @@ -304,7 +304,8 @@ int dap_chain_mempool_tx_create_cond(dap_enc_key_t *a_key_from, dap_enc_key_t *a // add 'out_cond' and 'out' items { uint64_t l_value_pack = 0; // how much coin add to 'out' items - if(dap_chain_datum_tx_add_out_cond_item(&l_tx, a_key_cond, (dap_chain_addr_t*)a_addr_cond, a_value, a_cond, a_cond_size) == 1) { + if(dap_chain_datum_tx_add_out_cond_item(&l_tx, a_key_cond, (dap_chain_addr_t*) a_addr_cond, a_value, a_cond, + a_cond_size) == 1) { l_value_pack += a_value; // transaction fee if(a_addr_fee) { @@ -335,17 +336,149 @@ int dap_chain_mempool_tx_create_cond(dap_enc_key_t *a_key_from, dap_enc_key_t *a dap_hash_fast(l_tx, l_tx_size, &l_key_hash); DAP_DELETE(l_tx); + char * l_key_str = dap_chain_hash_fast_to_str_new(&l_key_hash); + if(dap_chain_global_db_gr_set(l_key_str, (uint8_t *) l_datum, dap_chain_datum_size(l_datum) + , c_dap_datum_mempool_gdb_group)) { + log_it(L_NOTICE, "Transaction %s placed in mempool", l_key_str); + // add transaction to utxo + if(dap_chain_utxo_tx_add((dap_chain_datum_tx_t*) l_datum->data) < 0) + log_it(L_ERROR, "Transaction %s not placed in UTXO", l_key_str); + } + DAP_DELETE(l_key_str); + + return 0; +} + +/** + * Make receipt transaction & insert to cache + * + * return 0 Ok, -2 not enough funds to transfer, -1 other Error + */ +int dap_chain_mempool_tx_create_receipt(uint64_t a_value) +//(dap_enc_key_t *a_key_from, dap_enc_key_t *a_key_cond, +// const dap_chain_addr_t* a_addr_from, const dap_chain_addr_t* a_addr_cond, +// const dap_chain_addr_t* a_addr_fee, const char a_token_ticker[10], +// uint64_t a_value, uint64_t a_value_fee, const void *a_cond, size_t a_cond_size) +{ + // check valid param +/* if(!a_key_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_cond) || + (a_addr_fee && !dap_chain_addr_check_sum(a_addr_fee)) || !a_value) + return -1;*/ +/* + // find the transactions from which to take away coins + dap_list_t *l_list_used_out = NULL; // list of transaction with 'out' items + uint64_t l_value_transfer = 0; // how many coins to transfer + { + dap_chain_hash_fast_t l_tx_cur_hash = { 0 }; + uint64_t l_value_need = a_value + a_value_fee; + 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_utxo_tx_find_by_addr(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, + &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))) { + // Check whether used 'out' items + if(!dap_chain_utxo_tx_hash_is_used_out_item(&l_tx_cur_hash, l_out_idx_tmp)) { + + list_used_item_t *item = DAP_NEW(list_used_item_t); + memcpy(&item->tx_hash_fast, &l_tx_cur_hash, sizeof(dap_chain_hash_fast_t)); + item->num_idx_out = l_out_idx_tmp; + item->value = out_item->header.value; + l_list_used_out = dap_list_append(l_list_used_out, item); + l_value_transfer += item->value; + // already accumulated the required value, finish the search for 'out' items + if(l_value_transfer >= l_value_need) { + break; + } + } + } + // go to the next 'out' item in l_tx transaction + l_out_idx_tmp++; + l_list_tmp = dap_list_next(l_list_tmp); + } + dap_list_free(l_list_out_items); + } + + // nothing to tranfer (not enough funds) + if(!l_list_used_out || l_value_transfer < l_value_need) { + dap_list_free_full(l_list_used_out, free); + return -2; + } + } + + // create empty transaction + dap_chain_datum_tx_t *l_tx = dap_chain_datum_tx_create(); + // add 'in' items + { + dap_list_t *l_list_tmp = l_list_used_out; + 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) { + l_value_to_items += item->value; + } + l_list_tmp = dap_list_next(l_list_tmp); + } + assert(l_value_to_items == l_value_transfer); + dap_list_free_full(l_list_used_out, free); + } + // add 'out_cond' and 'out' items + { + uint64_t l_value_pack = 0; // how much coin add to 'out' items + if(dap_chain_datum_tx_add_out_cond_item(&l_tx, a_key_cond, (dap_chain_addr_t*) a_addr_cond, a_value, a_cond, + a_cond_size) == 1) { + l_value_pack += a_value; + // transaction fee + if(a_addr_fee) { + if(dap_chain_datum_tx_add_out_item(&l_tx, a_addr_fee, a_value_fee) == 1) + l_value_pack += a_value_fee; + } + } + // coin back + uint64_t l_value_back = l_value_transfer - l_value_pack; + if(l_value_back) { + if(dap_chain_datum_tx_add_out_item(&l_tx, a_addr_from, l_value_back) != 1) { + dap_chain_datum_tx_delete(l_tx); + return -1; + } + } + } + + // add 'sign' items + if(dap_chain_datum_tx_add_sign_item(&l_tx, a_key_from) != 1) { + dap_chain_datum_tx_delete(l_tx); + return -1; + } + + size_t l_tx_size = dap_chain_datum_tx_get_size(l_tx); + dap_chain_datum_t *l_datum = dap_chain_datum_create(DAP_CHAIN_DATUM_TX, l_tx, l_tx_size); + + dap_chain_hash_fast_t l_key_hash; + dap_hash_fast(l_tx, l_tx_size, &l_key_hash); + DAP_DELETE(l_tx); char * l_key_str = dap_chain_hash_fast_to_str_new(&l_key_hash); if(dap_chain_global_db_gr_set(l_key_str, (uint8_t *) l_datum, dap_chain_datum_size(l_datum) , c_dap_datum_mempool_gdb_group)) { log_it(L_NOTICE, "Transaction %s placed in mempool", l_key_str); // add transaction to utxo - if(dap_chain_utxo_tx_add((dap_chain_datum_tx_t*) l_datum->data)<0) + if(dap_chain_utxo_tx_add((dap_chain_datum_tx_t*) l_datum->data) < 0) log_it(L_ERROR, "Transaction %s not placed in UTXO", l_key_str); } - DAP_DELETE(l_key_str); + DAP_DELETE(l_key_str);*/ return 0; } -- GitLab