diff --git a/dap_chain_mempool.c b/dap_chain_mempool.c index 7348370b70fd604e73d6ec1f10a5bca563a6e120..6eb5ce839e2cb50def0b72e58c9ee4024f3026fc 100755 --- a/dap_chain_mempool.c +++ b/dap_chain_mempool.c @@ -444,17 +444,19 @@ int dap_chain_mempool_tx_create_massive( dap_chain_t * a_chain, dap_enc_key_t *a * * return 0 Ok, -2 not enough funds to transfer, -1 other Error */ -int dap_chain_mempool_tx_create_cond(dap_chain_t * a_chain, +dap_chain_hash_fast_t* dap_chain_mempool_tx_create_cond(dap_chain_net_t * a_net, 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[DAP_CHAIN_TICKER_SIZE_MAX], - uint64_t a_value, uint64_t a_value_fee, const void *a_cond, size_t a_cond_size) + const dap_chain_addr_t* a_addr_from, + const char a_token_ticker[DAP_CHAIN_TICKER_SIZE_MAX], + uint64_t a_value,uint64_t a_value_per_unit_max, dap_chain_net_srv_price_unit_uid_t a_unit, + dap_chain_net_srv_uid_t a_srv_uid, uint64_t a_value_fee, const void *a_cond, size_t a_cond_size) { + dap_ledger_t * l_ledger = a_net ? dap_chain_ledger_by_net_name( a_net->pub.name ) : NULL; // check valid param - if(!a_chain || !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; + if(!a_net || ! l_ledger || !a_key_from || !a_key_from->priv_key_data || !a_key_from->priv_key_data_size || + !dap_chain_addr_check_sum(a_addr_from) || + !a_value) + return NULL; // find the transactions from which to take away coins dap_list_t *l_list_used_out = NULL; // list of transaction with 'out' items @@ -465,7 +467,7 @@ 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 - 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(l_ledger, a_token_ticker,a_addr_from, &l_tx_cur_hash); if(!l_tx) break; @@ -481,7 +483,7 @@ int dap_chain_mempool_tx_create_cond(dap_chain_t * a_chain, 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)) { + if(!dap_chain_ledger_tx_hash_is_used_out_item(l_ledger, &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)); @@ -505,7 +507,8 @@ int dap_chain_mempool_tx_create_cond(dap_chain_t * a_chain, // 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; + log_it( L_ERROR, "nothing to tranfer (not enough funds)"); + return NULL; } } @@ -528,13 +531,12 @@ int dap_chain_mempool_tx_create_cond(dap_chain_t * a_chain, // 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, + if(dap_chain_datum_tx_add_out_cond_item(&l_tx, a_key_cond, a_srv_uid, a_value, a_value_per_unit_max, a_unit, 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; + if(a_value_fee) { + // TODO add condition with fee for mempool-as-service } } // coin back @@ -542,7 +544,8 @@ int dap_chain_mempool_tx_create_cond(dap_chain_t * a_chain, 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; + log_it( L_ERROR, "Cant add coin back output"); + return NULL; } } } @@ -550,26 +553,27 @@ int dap_chain_mempool_tx_create_cond(dap_chain_t * a_chain, // 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; + log_it( L_ERROR, "Can't add sign output"); + return NULL; } - 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); + 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); + dap_chain_hash_fast_t *l_key_hash = DAP_NEW_Z( dap_chain_hash_fast_t ); + 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); - char * l_gdb_group = dap_chain_net_get_gdb_group_mempool(a_chain); - if(dap_chain_global_db_gr_set(l_key_str, (uint8_t *) l_datum, dap_chain_datum_size(l_datum) - , l_gdb_group)) { + char * l_key_str = dap_chain_hash_fast_to_str_new( l_key_hash ); + char * l_gdb_group = dap_chain_net_get_gdb_group_mempool_by_chain_type( a_net ,CHAIN_TYPE_TX); + if( dap_chain_global_db_gr_set( l_key_str, (uint8_t *) l_datum, dap_chain_datum_size(l_datum) + , l_gdb_group ) ) { log_it(L_NOTICE, "Transaction %s placed in mempool", l_key_str); } DAP_DELETE(l_gdb_group); DAP_DELETE(l_key_str); - return 0; + return l_key_hash; } /** diff --git a/dap_chain_mempool.h b/dap_chain_mempool.h index 1114285ec060ceca63370f4606bf1d7dfd2b0d0c..a078ccf164116bb6709d9162592be36d5def158f 100755 --- a/dap_chain_mempool.h +++ b/dap_chain_mempool.h @@ -2,6 +2,7 @@ #include <stdint.h> #include "dap_chain_datum.h" +#include "dap_chain_net.h" #include "dap_chain_ledger.h" #include "dap_http.h" /* @@ -49,11 +50,12 @@ 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); // Make transfer transaction & insert to cache -int dap_chain_mempool_tx_create_cond(dap_chain_t * a_chain, +dap_chain_hash_fast_t* dap_chain_mempool_tx_create_cond(dap_chain_net_t * a_net, 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[DAP_CHAIN_TICKER_SIZE_MAX], - uint64_t a_value, uint64_t a_value_fee, const void *a_cond, size_t a_cond_size); + const dap_chain_addr_t* a_addr_from, + const char a_token_ticker[DAP_CHAIN_TICKER_SIZE_MAX], + uint64_t a_value,uint64_t a_value_per_unit_max, dap_chain_net_srv_price_unit_uid_t a_unit, + dap_chain_net_srv_uid_t a_srv_uid, uint64_t a_value_fee, const void *a_cond, size_t a_cond_size); int dap_chain_mempool_datum_add(dap_chain_datum_t * a_datum); int dap_chain_mempool_tx_create_massive( dap_chain_t * a_chain, dap_enc_key_t *a_key_from,