From 7713bd5c200e235e0ef3c25e93e0f60f0c21a2bb Mon Sep 17 00:00:00 2001 From: "Dmitriy A. Gerasimov" <dmitriy.gerasimov@demlabs.net> Date: Thu, 5 Dec 2019 17:06:43 +0700 Subject: [PATCH] [+] Create input cond tx --- dap_chain_mempool.c | 60 +++++++++++++++++++++++++++++++++++++++++++++ dap_chain_mempool.h | 4 +++ 2 files changed, 64 insertions(+) diff --git a/dap_chain_mempool.c b/dap_chain_mempool.c index fef66ce..31c4a6e 100755 --- a/dap_chain_mempool.c +++ b/dap_chain_mempool.c @@ -436,6 +436,66 @@ int dap_chain_mempool_tx_create_massive( dap_chain_t * a_chain, dap_enc_key_t *a } +dap_chain_hash_fast_t* dap_chain_mempool_tx_create_cond_input(dap_chain_net_t * a_net,dap_chain_hash_fast_t *a_tx_prev_hash, + + const dap_chain_addr_t* a_addr_to, dap_enc_key_t *l_key_tx_sign, dap_chain_datum_tx_receipt_t * l_receipt, size_t l_receipt_size) +{ + dap_ledger_t * l_ledger = a_net ? dap_chain_ledger_by_net_name( a_net->pub.name ) : NULL; + if ( ! a_net || ! l_ledger || ! a_addr_to ) + return NULL; + if ( ! dap_chain_addr_check_sum (a_addr_to) ){ + log_it(L_ERROR, "Wrong address_to checksum"); + return NULL; + } + + // create empty transaction + dap_chain_datum_tx_t *l_tx = dap_chain_datum_tx_create(); + + uint16_t pos=0; + dap_chain_datum_tx_add_item(&l_tx, (byte_t*) l_receipt); + pos++; + // add 'in_cond' items + // TODO - find first cond_item occurance, not just set it to 1 + if (dap_chain_datum_tx_add_in_cond_item(&l_tx,a_tx_prev_hash,1,pos-1) != 0 ){ + dap_chain_datum_tx_delete(l_tx); + log_it( L_ERROR, "Cant add tx cond input"); + return NULL; + } + + if(dap_chain_datum_tx_add_out_item(&l_tx, a_addr_to, l_receipt->receipt.value_datoshi) != 1) { + dap_chain_datum_tx_delete(l_tx); + log_it( L_ERROR, "Cant add tx output"); + return NULL; + } + + // add 'sign' items + if (l_key_tx_sign){ + if(dap_chain_datum_tx_add_sign_item(&l_tx, l_key_tx_sign) != 1) { + dap_chain_datum_tx_delete(l_tx); + 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 ); + + 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_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 l_key_hash; +} + + /** * Make transfer transaction & insert to cache * diff --git a/dap_chain_mempool.h b/dap_chain_mempool.h index a078ccf..f1c459b 100755 --- a/dap_chain_mempool.h +++ b/dap_chain_mempool.h @@ -57,6 +57,10 @@ dap_chain_hash_fast_t* dap_chain_mempool_tx_create_cond(dap_chain_net_t * a_net, 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_chain_hash_fast_t* dap_chain_mempool_tx_create_cond_input(dap_chain_net_t * a_net,dap_chain_hash_fast_t *a_tx_prev_hash, + const dap_chain_addr_t* a_addr_to, dap_enc_key_t * l_key_tx_sign, dap_chain_datum_tx_receipt_t * l_receipt, size_t l_receipt_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, const dap_chain_addr_t* a_addr_from, const dap_chain_addr_t* a_addr_to, -- GitLab