From 75c38668ab268ef2f926185179151acf0ae19b65 Mon Sep 17 00:00:00 2001 From: Roman Khlopkov <roman.khlopkov@demlabs.net> Date: Sun, 6 Mar 2022 20:51:57 +0300 Subject: [PATCH] [*] Payable service coming soon --- dap-sdk/crypto/include/dap_pkey.h | 9 - dap-sdk/crypto/src/dap_pkey.c | 58 ++--- .../dap_stream_ch_chain_net_srv.c | 13 +- modules/common/dap_chain_datum_tx.c | 4 +- modules/common/dap_chain_datum_tx_items.c | 17 +- modules/common/include/dap_chain_datum_tx.h | 2 +- .../common/include/dap_chain_datum_tx_items.h | 2 +- modules/mempool/dap_chain_mempool.c | 238 ++---------------- modules/mempool/include/dap_chain_mempool.h | 15 +- modules/net/dap_chain_node_cli_cmd.c | 87 +++---- .../service/vpn/dap_chain_net_vpn_client.c | 15 +- 11 files changed, 105 insertions(+), 355 deletions(-) diff --git a/dap-sdk/crypto/include/dap_pkey.h b/dap-sdk/crypto/include/dap_pkey.h index 93040b6a06..50256f7eca 100755 --- a/dap-sdk/crypto/include/dap_pkey.h +++ b/dap-sdk/crypto/include/dap_pkey.h @@ -68,13 +68,4 @@ typedef struct dap_pkey{ uint8_t pkey[]; /// @param pkey @brief raw pkey dat } DAP_ALIGN_PACKED dap_pkey_t; -static dap_pkey_t m_dap_pkey_null; // For sizeof nothing more - dap_pkey_t *dap_pkey_from_enc_key(dap_enc_key_t *a_key); -static inline size_t dap_pkey_from_enc_key_output_calc(dap_enc_key_t *a_key) -{ - return sizeof(m_dap_pkey_null.header)+ a_key->pub_key_data_size; -} - -int dap_pkey_from_enc_key_output(dap_enc_key_t *a_key, void * a_output); - diff --git a/dap-sdk/crypto/src/dap_pkey.c b/dap-sdk/crypto/src/dap_pkey.c index a8a40a9ecb..0b3c969fed 100755 --- a/dap-sdk/crypto/src/dap_pkey.c +++ b/dap-sdk/crypto/src/dap_pkey.c @@ -37,56 +37,38 @@ */ dap_pkey_t* dap_pkey_from_enc_key(dap_enc_key_t *a_key) { - if (a_key->pub_key_data_size > 0 ){ - dap_pkey_t * l_ret = NULL; - l_ret = DAP_NEW_Z_SIZE(dap_pkey_t,dap_pkey_from_enc_key_output_calc(a_key)); - if( dap_pkey_from_enc_key_output(a_key,l_ret) != 0 ) { - DAP_DELETE(l_ret); - return NULL; - }else - return l_ret; - } - - return NULL; -} - -/** - * @brief dap_pkey_from_enc_key_output - * convert encryption key to public key and placed it in output buffer - * @param a_key dap_enc_key_t encryption key object - * @param a_output output data - * @return result - */ -int dap_pkey_from_enc_key_output(dap_enc_key_t *a_key, void * a_output) -{ - dap_pkey_t * l_output = (dap_pkey_t *) a_output; + dap_pkey_type_t l_type; if (a_key->pub_key_data_size > 0 ){ switch (a_key->type) { case DAP_ENC_KEY_TYPE_SIG_BLISS: - l_output->header.type.type = PKEY_TYPE_SIGN_BLISS ; - break; + l_type.type = PKEY_TYPE_SIGN_BLISS; break; case DAP_ENC_KEY_TYPE_SIG_TESLA: - l_output->header.type.type = PKEY_TYPE_SIGN_TESLA ; - break; + l_type.type = PKEY_TYPE_SIGN_TESLA; break; case DAP_ENC_KEY_TYPE_SIG_PICNIC: - l_output->header.type.type = PKEY_TYPE_SIGN_PICNIC ; - break; + l_type.type = PKEY_TYPE_SIGN_PICNIC; break; case DAP_ENC_KEY_TYPE_SIG_DILITHIUM: - l_output->header.type.type = PKEY_TYPE_SIGN_DILITHIUM; - break; - + l_type.type = PKEY_TYPE_SIGN_DILITHIUM; break; default: log_it(L_WARNING,"No serialization preset"); - return -1; + return NULL; } - l_output->header.size = a_key->pub_key_data_size; - memcpy(l_output->pkey,a_key->pub_key_data,a_key->pub_key_data_size); - return 0; + size_t l_pub_key_size; + uint8_t *l_pkey = dap_enc_key_serealize_pub_key(a_key, &l_pub_key_size); + if (!l_pkey) { + log_it(L_WARNING,"Serialization failed"); + return NULL; + } + dap_pkey_t *l_ret = DAP_NEW_SIZE(dap_pkey_t, sizeof(dap_pkey_t) + l_pub_key_size); + l_ret->header.type = l_type; + l_ret->header.size = (uint32_t)l_pub_key_size; + memcpy(&l_ret->pkey, l_pkey, l_pub_key_size); + DAP_DELETE(l_pkey); + return l_ret; }else{ log_it(L_WARNING, "No public key in the input enc_key object"); - return -2; + return NULL; } - return -3; + return NULL; } diff --git a/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c b/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c index 05f0746361..918931a368 100644 --- a/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c +++ b/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c @@ -227,7 +227,6 @@ static bool s_grace_period_control(dap_chain_net_srv_grace_t *a_grace) l_usage->tx_cond = l_tx; } dap_chain_net_srv_price_t * l_price = NULL; - dap_chain_datum_tx_receipt_t * l_receipt = NULL; const char * l_ticker = NULL; if (l_srv->pricelist && !l_grace_start) { l_ticker = dap_chain_ledger_tx_get_token_ticker_by_hash(l_ledger, &l_request->hdr.tx_cond ); @@ -377,7 +376,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch , void* a_arg) //printf("\n%lu.%06lu \n", (unsigned long) l_request->recv_time2.tv_sec, (unsigned long) l_request->recv_time2.tv_usec); dap_chain_hash_fast_t l_data_hash; dap_hash_fast(l_request->data, l_request->data_size, &l_data_hash); - if(l_request->data_size>0 && !dap_hash_fast_compare(&l_data_hash, &(l_request->data_hash))){ + if (l_request->data_size > 0 && !dap_hash_fast_compare(&l_data_hash, &l_request->data_hash)) { l_err.code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_WRONG_HASH; dap_stream_ch_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR, &l_err, sizeof(l_err)); break; @@ -386,10 +385,12 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch , void* a_arg) dap_stream_ch_chain_net_srv_pkt_test_t *l_request_out = DAP_NEW_Z_SIZE(dap_stream_ch_chain_net_srv_pkt_test_t, sizeof(dap_stream_ch_chain_net_srv_pkt_test_t) + l_request->data_size_recv); // copy info from recv message memcpy(l_request_out,l_request, sizeof(dap_stream_ch_chain_net_srv_pkt_test_t)); - l_request_out->data_size = l_request->data_size_recv; - randombytes(l_request_out->data, l_request_out->data_size); + if (l_request->data_size_recv) { + l_request_out->data_size = l_request->data_size_recv; + randombytes(l_request_out->data, l_request_out->data_size); + dap_hash_fast(l_request_out->data, l_request_out->data_size, &l_request_out->data_hash); + } l_request_out->err_code = 0; - dap_hash_fast(l_request_out->data, l_request_out->data_size, &l_request_out->data_hash); strncpy(l_request_out->ip_send,a_ch->stream->esocket->hostaddr , sizeof(l_request_out->ip_send)-1); // Thats to prevent unaligned pointer struct timeval l_tval; @@ -542,7 +543,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch , void* a_arg) dap_chain_addr_t *l_wallet_addr = dap_chain_wallet_get_addr(l_usage->price->wallet, l_usage->net->pub.id); l_tx_in_hash = dap_chain_mempool_tx_create_cond_input(l_usage->net, &l_usage->tx_cond_hash, l_wallet_addr, dap_chain_wallet_get_key(l_usage->price->wallet, 0), - l_receipt, l_receipt_size); + l_receipt); if ( l_tx_in_hash){ char * l_tx_in_hash_str = dap_chain_hash_fast_to_str_new(l_tx_in_hash); log_it(L_NOTICE, "Formed tx %s for input with active receipt", l_tx_in_hash_str); diff --git a/modules/common/dap_chain_datum_tx.c b/modules/common/dap_chain_datum_tx.c index 6f48ec58ed..6946ec4ef7 100644 --- a/modules/common/dap_chain_datum_tx.c +++ b/modules/common/dap_chain_datum_tx.c @@ -75,7 +75,7 @@ int dap_chain_datum_tx_add_item(dap_chain_datum_tx_t **a_tx, const uint8_t *a_it if(!size) return -1; dap_chain_datum_tx_t *tx_cur = *a_tx; - tx_cur = (dap_chain_datum_tx_t*) realloc(tx_cur, dap_chain_datum_tx_get_size(tx_cur) + size); + tx_cur = (dap_chain_datum_tx_t *)DAP_REALLOC(tx_cur, dap_chain_datum_tx_get_size(tx_cur) + size); memcpy((uint8_t*) tx_cur->tx_items + tx_cur->header.tx_items_size, a_item, size); tx_cur->header.tx_items_size += size; *a_tx = tx_cur; @@ -179,7 +179,7 @@ int dap_chain_datum_tx_add_out_ext_item(dap_chain_datum_tx_t **a_tx, const dap_c * * return 1 Ok, -1 Error */ -int dap_chain_datum_tx_add_out_cond_item(dap_chain_datum_tx_t **a_tx, dap_enc_key_t *a_key, dap_chain_net_srv_uid_t a_srv_uid, +int dap_chain_datum_tx_add_out_cond_item(dap_chain_datum_tx_t **a_tx, dap_pkey_t *a_key, dap_chain_net_srv_uid_t a_srv_uid, uint64_t a_value, uint64_t a_value_max_per_unit, dap_chain_net_srv_price_unit_uid_t a_unit, const void *a_cond, size_t a_cond_size) { dap_chain_tx_out_cond_t *l_tx_out = dap_chain_datum_tx_item_out_cond_create_srv_pay( diff --git a/modules/common/dap_chain_datum_tx_items.c b/modules/common/dap_chain_datum_tx_items.c index 8e62f58083..4f06099ddf 100644 --- a/modules/common/dap_chain_datum_tx_items.c +++ b/modules/common/dap_chain_datum_tx_items.c @@ -229,15 +229,12 @@ dap_chain_tx_out_ext_t* dap_chain_datum_tx_item_out_ext_create(const dap_chain_a * * return item, NULL Error */ -dap_chain_tx_out_cond_t* dap_chain_datum_tx_item_out_cond_create_srv_pay(dap_enc_key_t *a_key, dap_chain_net_srv_uid_t a_srv_uid, +dap_chain_tx_out_cond_t* dap_chain_datum_tx_item_out_cond_create_srv_pay(dap_pkey_t *a_key, dap_chain_net_srv_uid_t a_srv_uid, uint64_t a_value,uint64_t a_value_max_per_unit, dap_chain_net_srv_price_unit_uid_t a_unit, const void *a_params, size_t a_params_size) { - if(!a_key || !a_params) + if (!a_key || !a_key->pkey) return NULL; - size_t l_pub_key_size = 0; - uint8_t *l_pub_key = dap_enc_key_serealize_pub_key(a_key, &l_pub_key_size); - dap_chain_tx_out_cond_t *l_item = DAP_NEW_Z_SIZE(dap_chain_tx_out_cond_t, sizeof(dap_chain_tx_out_cond_t) + a_params_size); if(l_item == NULL) @@ -245,13 +242,15 @@ dap_chain_tx_out_cond_t* dap_chain_datum_tx_item_out_cond_create_srv_pay(dap_enc l_item->header.item_type = TX_ITEM_TYPE_OUT_COND; l_item->header.value = a_value; - l_item->header.subtype = DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY; // By default creatre cond for service pay. Rework with smth more flexible + l_item->header.subtype = DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY; l_item->subtype.srv_pay.srv_uid = a_srv_uid; l_item->subtype.srv_pay.unit = a_unit; l_item->subtype.srv_pay.unit_price_max_datoshi = a_value_max_per_unit; - dap_hash_fast( l_pub_key, l_pub_key_size, & l_item->subtype.srv_pay.pkey_hash); - l_item->params_size = (uint32_t)a_params_size; - memcpy(l_item->params, a_params, a_params_size); + dap_hash_fast(a_key->pkey,a_key->header.size, &l_item->subtype.srv_pay.pkey_hash); + if (a_params && a_params_size) { + l_item->params_size = (uint32_t)a_params_size; + memcpy(l_item->params, a_params, a_params_size); + } return l_item; } diff --git a/modules/common/include/dap_chain_datum_tx.h b/modules/common/include/dap_chain_datum_tx.h index 54885c4863..6c598c4ae6 100644 --- a/modules/common/include/dap_chain_datum_tx.h +++ b/modules/common/include/dap_chain_datum_tx.h @@ -119,7 +119,7 @@ int dap_chain_datum_tx_add_out_ext_item(dap_chain_datum_tx_t **a_tx, const dap_c * * return 1 Ok, -1 Error */ -int dap_chain_datum_tx_add_out_cond_item(dap_chain_datum_tx_t **a_tx, dap_enc_key_t *a_key, dap_chain_net_srv_uid_t a_srv_uid, +int dap_chain_datum_tx_add_out_cond_item(dap_chain_datum_tx_t **a_tx, dap_pkey_t *a_key, dap_chain_net_srv_uid_t a_srv_uid, uint64_t a_value, uint64_t a_value_max_per_unit, dap_chain_net_srv_price_unit_uid_t a_unit, const void *a_cond, size_t a_cond_size); /** diff --git a/modules/common/include/dap_chain_datum_tx_items.h b/modules/common/include/dap_chain_datum_tx_items.h index 6fb2f647cd..ec68fcf58f 100644 --- a/modules/common/include/dap_chain_datum_tx_items.h +++ b/modules/common/include/dap_chain_datum_tx_items.h @@ -111,7 +111,7 @@ dap_chain_tx_out_ext_t* dap_chain_datum_tx_item_out_ext_create(const dap_chain_a * * return item, NULL Error */ -dap_chain_tx_out_cond_t* dap_chain_datum_tx_item_out_cond_create_srv_pay(dap_enc_key_t *a_key, dap_chain_net_srv_uid_t a_srv_uid, +dap_chain_tx_out_cond_t* dap_chain_datum_tx_item_out_cond_create_srv_pay(dap_pkey_t *a_key, dap_chain_net_srv_uid_t a_srv_uid, uint64_t a_value, uint64_t a_value_max_per_unit, dap_chain_net_srv_price_unit_uid_t a_unit, const void *a_cond, size_t a_cond_size); /** diff --git a/modules/mempool/dap_chain_mempool.c b/modules/mempool/dap_chain_mempool.c index e72a1242c0..ec071e08dc 100644 --- a/modules/mempool/dap_chain_mempool.c +++ b/modules/mempool/dap_chain_mempool.c @@ -346,11 +346,10 @@ 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_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 *a_key_tx_sign, + dap_chain_datum_tx_receipt_t * l_receipt) { - UNUSED(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; @@ -416,16 +415,14 @@ dap_chain_hash_fast_t* dap_chain_mempool_tx_create_cond_input(dap_chain_net_t * } //add 'out_cond' item - size_t l_size = dap_chain_datum_item_tx_get_size((uint8_t *)l_out_cond); - dap_chain_tx_out_cond_t *l_out_cond_new = DAP_NEW_Z_SIZE(dap_chain_tx_out_cond_t, l_size); - memcpy(l_out_cond_new, l_out_cond, l_size); - l_out_cond_new->header.value -= l_value_send; - dap_chain_datum_tx_add_item(&l_tx, (const uint8_t *)l_out_cond_new); - DAP_DELETE(l_out_cond_new); + uint64_t l_old_val = l_out_cond->header.value; + l_out_cond->header.value -= l_value_send; + dap_chain_datum_tx_add_item(&l_tx, (const uint8_t *)l_out_cond); + l_out_cond->header.value = l_old_val; // add 'sign' items - if (l_key_tx_sign){ - if(dap_chain_datum_tx_add_sign_item(&l_tx, l_key_tx_sign) != 1) { + if (a_key_tx_sign){ + if(dap_chain_datum_tx_add_sign_item(&l_tx, a_key_tx_sign) != 1) { dap_chain_datum_tx_delete(l_tx); log_it( L_ERROR, "Can't add sign output"); return NULL; @@ -462,26 +459,26 @@ dap_chain_hash_fast_t* dap_chain_mempool_tx_create_cond_input(dap_chain_net_t * * * return dap_chain_datum_t, NULL if Error */ -static dap_chain_datum_t* dap_chain_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, +static dap_chain_datum_t* dap_chain_tx_create_cond(dap_chain_net_t *a_net, + dap_enc_key_t *a_key_from, dap_pkey_t *a_key_cond, 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, + 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_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) + if(!a_net || ! l_ledger || !a_key_from || !a_key_from->priv_key_data || !a_key_from->priv_key_data_size || !a_value) return NULL; // find the transactions from which to take away coins uint64_t l_value_transfer = 0; // how many coins to transfer uint64_t l_value_need = a_value + a_value_fee; + // where to take coins for service + dap_chain_addr_t l_addr_from; + dap_chain_addr_fill_from_key(&l_addr_from, a_key_from, a_net->pub.id); // list of transaction with 'out' items dap_list_t *l_list_used_out = dap_chain_ledger_get_list_tx_outs_with_val(l_ledger, a_token_ticker, - a_addr_from, l_value_need, &l_value_transfer); + &l_addr_from, l_value_need, &l_value_transfer); if(!l_list_used_out) { log_it( L_ERROR, "nothing to tranfer (not enough funds)"); return NULL; @@ -509,7 +506,7 @@ static dap_chain_datum_t* dap_chain_tx_create_cond(dap_chain_net_t * a_net, // 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) { + if(dap_chain_datum_tx_add_out_item(&l_tx, &l_addr_from, l_value_back) != 1) { dap_chain_datum_tx_delete(l_tx); log_it( L_ERROR, "Cant add coin back output"); return NULL; @@ -528,62 +525,6 @@ static dap_chain_datum_t* dap_chain_tx_create_cond(dap_chain_net_t * a_net, dap_chain_datum_t *l_datum = dap_chain_datum_create( DAP_CHAIN_DATUM_TX, l_tx, l_tx_size ); return l_datum; - /*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( dap_strdup(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 database - * - * return 0 Ok, -2 not enough funds to transfer, -1 other Error - */ -dap_chain_hash_fast_t* dap_chain_proc_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 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_chain_t *l_chain = NULL; - if(a_net->pub.default_chain) - l_chain = a_net->pub.default_chain; - else - l_chain = dap_chain_net_get_chain_by_chain_type(a_net, CHAIN_TYPE_TX); - - if(!l_chain) - return NULL; - // Make transfer transaction - dap_chain_datum_t *l_datum = dap_chain_tx_create_cond(a_net,a_key_from, a_key_cond, a_addr_from, - a_token_ticker,a_value,a_value_per_unit_max, a_unit, - a_srv_uid, a_value_fee, a_cond, a_cond_size); - - if(!l_datum) - return NULL; - size_t l_datums_number = l_chain->callback_add_datums(l_chain, &l_datum, 1); - if(!l_datums_number) - return NULL; - - dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t*)&(l_datum->data); - size_t l_tx_size = l_datum->header.data_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 ); - - return l_key_hash; } /** @@ -592,16 +533,15 @@ dap_chain_hash_fast_t* dap_chain_proc_tx_create_cond(dap_chain_net_t * a_net, * return 0 Ok, -2 not enough funds to transfer, -1 other Error */ 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, + dap_enc_key_t *a_key_from, dap_pkey_t *a_key_cond, 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) { // Make transfer transaction - dap_chain_datum_t *l_datum = dap_chain_tx_create_cond(a_net,a_key_from, a_key_cond, a_addr_from, - a_token_ticker,a_value,a_value_per_unit_max, a_unit, - a_srv_uid, a_value_fee, a_cond, a_cond_size); + dap_chain_datum_t *l_datum = dap_chain_tx_create_cond(a_net,a_key_from, a_key_cond, + a_token_ticker,a_value,a_value_per_unit_max, a_unit, + a_srv_uid, a_value_fee, a_cond, a_cond_size); if(!l_datum) return NULL; @@ -625,140 +565,6 @@ dap_chain_hash_fast_t* dap_chain_mempool_tx_create_cond(dap_chain_net_t * a_net, return l_key_hash; } -/** - * 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[DAP_CHAIN_TICKER_SIZE_MAX], -// 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_ledger_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_ledger_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(dap_strdup(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 ledger - if(dap_chain_ledger_tx_add((dap_chain_datum_tx_t*) l_datum->data) < 0) - log_it(L_ERROR, "Transaction %s not placed in LEDGER", l_key_str); - } - DAP_DELETE(l_key_str);*/ - - return 0; -} - uint8_t* dap_datum_mempool_serialize(dap_datum_mempool_t *datum_mempool, size_t *size) { size_t a_request_size = 2 * sizeof(uint16_t), shift_size = 0; diff --git a/modules/mempool/include/dap_chain_mempool.h b/modules/mempool/include/dap_chain_mempool.h index 0e8b0be25b..cc701e21f2 100644 --- a/modules/mempool/include/dap_chain_mempool.h +++ b/modules/mempool/include/dap_chain_mempool.h @@ -51,21 +51,14 @@ dap_hash_fast_t* dap_chain_mempool_tx_create(dap_chain_t * a_chain, dap_enc_key uint64_t a_value, uint64_t a_value_fee); // Make transfer transaction & insert to cache -dap_chain_hash_fast_t* dap_chain_proc_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 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_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, + dap_enc_key_t *a_key_from, dap_pkey_t *a_key_cond, 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, + 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); +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 * a_key_tx_sign, dap_chain_datum_tx_receipt_t * l_receipt); 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, diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c index cb98b415db..ed77f43c7f 100644 --- a/modules/net/dap_chain_node_cli_cmd.c +++ b/modules/net/dap_chain_node_cli_cmd.c @@ -3505,12 +3505,12 @@ int com_tx_cond_create(int a_argc, char ** a_argv, char **a_str_reply) int arg_index = 1; const char *c_wallets_path = dap_chain_wallet_get_path(g_config); const char * l_token_ticker = NULL; - const char * l_wallet_from_str = NULL; - const char * l_wallet_to_str = NULL; //l_addr_to_str + const char * l_wallet_str = NULL; + const char * l_cert_str = NULL; //l_addr_to_str const char * l_value_datoshi_str = NULL; const char * l_net_name = NULL; const char * l_unit_str = NULL; - const char * l_service_str = NULL; + const char * l_srv_uid_str = NULL; uint64_t l_value_datoshi = 0; const char * l_hash_out_type = NULL; @@ -3518,16 +3518,16 @@ int com_tx_cond_create(int a_argc, char ** a_argv, char **a_str_reply) if(!l_hash_out_type) l_hash_out_type = "hex"; if(dap_strcmp(l_hash_out_type,"hex") && dap_strcmp(l_hash_out_type,"base58")) { - dap_chain_node_cli_set_reply_text(a_str_reply, "invalid parameter -H, valid values: -H <hex | base58>"); + dap_chain_node_cli_set_reply_text(a_str_reply, "Invalid parameter -H, valid values: -H <hex | base58>"); return -1; } // Token ticker dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-token", &l_token_ticker); // Wallet name - from - dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-wallet_f", &l_wallet_from_str); + dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-wallet", &l_wallet_str); // Wallet address - to - dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-wallet_t", &l_wallet_to_str); + dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-cert", &l_cert_str); // value datoshi dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-value", &l_value_datoshi_str); // net @@ -3535,18 +3535,18 @@ int com_tx_cond_create(int a_argc, char ** a_argv, char **a_str_reply) // unit dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-unit", &l_unit_str); // service - dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-service", &l_service_str); + dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-srv_uid", &l_srv_uid_str); if(!l_token_ticker) { dap_chain_node_cli_set_reply_text(a_str_reply, "tx_cond_create requires parameter '-token'"); return -1; } - if(!l_wallet_from_str) { - dap_chain_node_cli_set_reply_text(a_str_reply, "tx_cond_create requires parameter '-wallet_f'"); + if(!l_wallet_str) { + dap_chain_node_cli_set_reply_text(a_str_reply, "tx_cond_create requires parameter '-wallet'"); return -2; } - if(!l_wallet_to_str) { - dap_chain_node_cli_set_reply_text(a_str_reply, "tx_cond_create requires parameter '-wallet_t'"); + if(!l_cert_str) { + dap_chain_node_cli_set_reply_text(a_str_reply, "tx_cond_create requires parameter '-cert'"); return -3; } if(!l_value_datoshi_str) { @@ -3562,17 +3562,14 @@ int com_tx_cond_create(int a_argc, char ** a_argv, char **a_str_reply) dap_chain_node_cli_set_reply_text(a_str_reply, "tx_cond_create requires parameter '-unit={mb|kb|b|sec|day}'"); return -6; } - if(!l_service_str) { - dap_chain_node_cli_set_reply_text(a_str_reply, "tx_cond_create requires parameter '-service={vpn}'"); + if(!l_srv_uid_str) { + dap_chain_node_cli_set_reply_text(a_str_reply, "tx_cond_create requires parameter '-srv_uid'"); return -7; } dap_chain_net_srv_uid_t l_srv_uid = {}; - if(!dap_strcmp(l_service_str, "vpn")) - l_srv_uid.uint64 = 0x0000000000000001; - //dap_chain_addr_t *addr_to = dap_chain_addr_from_str(l_addr_to_str); + l_srv_uid.uint64 = l_value_datoshi = strtoll(l_srv_uid_str, NULL, 10); if(!l_srv_uid.uint64) { - dap_chain_node_cli_set_reply_text(a_str_reply, "can't recognize service='%s' unit must look like {vpn}", - l_service_str); + dap_chain_node_cli_set_reply_text(a_str_reply, "Can't find service UID %s ", l_srv_uid_str); return -8; } @@ -3589,58 +3586,46 @@ int com_tx_cond_create(int a_argc, char ** a_argv, char **a_str_reply) l_price_unit.enm = SERV_UNIT_B; if(l_price_unit.enm == SERV_UNIT_UNDEFINED) { - dap_chain_node_cli_set_reply_text(a_str_reply, "can't recognize unit='%s' unit must look like {mb|kb|b|sec|day}", + dap_chain_node_cli_set_reply_text(a_str_reply, "Can't recognize unit='%s' unit must look like {mb|kb|b|sec|day}", l_unit_str); return -9; } l_value_datoshi = strtoll(l_value_datoshi_str, NULL, 10); if(!l_value_datoshi) { - dap_chain_node_cli_set_reply_text(a_str_reply, "can't recognize value='%s' as a number", l_value_datoshi_str); + dap_chain_node_cli_set_reply_text(a_str_reply, "Can't recognize value='%s' as a number", l_value_datoshi_str); return -10; } dap_chain_net_t * l_net = l_net_name ? dap_chain_net_by_name(l_net_name) : NULL; if(!l_net) { - dap_chain_node_cli_set_reply_text(a_str_reply, "can't find net '%s'", l_net_name); + dap_chain_node_cli_set_reply_text(a_str_reply, "Can't find net '%s'", l_net_name); return -11; } - dap_chain_wallet_t *l_wallet_from = dap_chain_wallet_open(l_wallet_from_str, c_wallets_path); - if(!l_wallet_from) { - dap_chain_node_cli_set_reply_text(a_str_reply, "can't open wallet '%s'", l_wallet_from); + dap_chain_wallet_t *l_wallet = dap_chain_wallet_open(l_wallet_str, c_wallets_path); + if(!l_wallet) { + dap_chain_node_cli_set_reply_text(a_str_reply, "Can't open wallet '%s'", l_wallet); return -12; } - dap_chain_wallet_t *l_wallet_cond = dap_chain_wallet_open(l_wallet_to_str, c_wallets_path); - if(!l_wallet_to_str) { - dap_chain_wallet_close(l_wallet_from); - dap_chain_node_cli_set_reply_text(a_str_reply, "can't open wallet '%s'", l_wallet_to_str); + dap_cert_t *l_cert_cond = dap_cert_find_by_name(l_cert_str); + if(!l_cert_cond) { + dap_chain_wallet_close(l_wallet); + dap_chain_node_cli_set_reply_text(a_str_reply, "Can't find cert '%s'", l_cert_str); return -13; } - dap_enc_key_t *l_key_from = dap_chain_wallet_get_key(l_wallet_from, 0); - dap_enc_key_t *l_key_cond = dap_chain_wallet_get_key(l_wallet_cond, 0); - - - // where to take coins for service - const dap_chain_addr_t *l_addr_from = dap_chain_wallet_get_addr(l_wallet_from, l_net->pub.id); - // who will be use service, usually the same address (addr_from) - //const dap_chain_addr_t *l_addr_cond = dap_chain_wallet_get_addr(l_wallet_cond, l_net->pub.id); - - -/* //dap_chain_net_srv_abstract_t l_cond; -// dap_chain_net_srv_abstract_set(&l_cond, SERV_CLASS_PERMANENT, SERV_ID_VPN, l_value, SERV_UNIT_MB, -// "test vpn service"); -// dap_ledger_t *l_ledger = dap_chain_ledger_by_net_name((const char *) c_net_name); - - int res = dap_chain_mempool_tx_create_cond(NULL, l_key, l_key_cond, addr_from, - addr_cond, - NULL, l_token_ticker, l_value, 0, (const void*) &l_cond, sizeof(dap_chain_net_srv_abstract_t)); -*/ + dap_enc_key_t *l_key_from = dap_chain_wallet_get_key(l_wallet, 0); + dap_pkey_t *l_key_cond = dap_pkey_from_enc_key(l_cert_cond->enc_key); + if (!l_key_cond) { + dap_chain_wallet_close(l_wallet); + dap_chain_node_cli_set_reply_text(a_str_reply, "Cert '%s' doesn't contain a valid public key", l_cert_str); + return -14; + } - dap_chain_hash_fast_t *l_tx_cond_hash = dap_chain_mempool_tx_create_cond(l_net, l_key_from, l_key_cond, l_addr_from, l_token_ticker, - l_value_datoshi, 0, l_price_unit, l_srv_uid, 0, NULL, 0); + dap_chain_hash_fast_t *l_tx_cond_hash = dap_chain_mempool_tx_create_cond(l_net, l_key_from, l_key_cond, l_token_ticker, + l_value_datoshi, 0, l_price_unit, l_srv_uid, 0, NULL, 0); - dap_chain_wallet_close(l_wallet_from); - dap_chain_wallet_close(l_wallet_cond); + dap_chain_wallet_close(l_wallet); + DAP_DELETE(l_key_cond); char *l_hash_str; if(!dap_strcmp(l_hash_out_type, "hex")) { diff --git a/modules/service/vpn/dap_chain_net_vpn_client.c b/modules/service/vpn/dap_chain_net_vpn_client.c index 77fd2861bc..7a6ebacc2d 100644 --- a/modules/service/vpn/dap_chain_net_vpn_client.c +++ b/modules/service/vpn/dap_chain_net_vpn_client.c @@ -322,19 +322,13 @@ static dap_chain_hash_fast_t* dap_chain_net_vpn_client_tx_cond_hash(dap_chain_ne if(!l_tx_cond_hash) { dap_chain_wallet_t *l_wallet_from = a_wallet; log_it(L_DEBUG, "Create tx from wallet %s", l_wallet_from->name); - dap_enc_key_t *l_key_from = l_enc_key; //dap_chain_wallet_get_key(l_wallet_from, 0); - dap_enc_key_t *l_client_key = l_enc_key; - //dap_chain_cell_id_t *xccell = dap_chain_net_get_cur_cell(l_tpl->net); - //uint64_t uint64 =dap_chain_net_get_cur_cell(l_tpl->net)->uint64; - - size_t l_pub_key_data_size = 0; - uint8_t *l_pub_key_data = dap_enc_key_serealize_pub_key(l_enc_key, &l_pub_key_data_size); + dap_pkey_t *l_client_key = dap_pkey_from_enc_key(l_enc_key); // where to take coins for service dap_chain_addr_t *l_addr_from = dap_chain_wallet_get_addr(l_wallet_from, a_net->pub.id); dap_chain_net_srv_price_unit_uid_t l_price_unit = { .enm = SERV_UNIT_SEC }; dap_chain_net_srv_uid_t l_srv_uid = { .uint64 = DAP_CHAIN_NET_SRV_VPN_ID }; - l_tx_cond_hash = dap_chain_proc_tx_create_cond(a_net, l_key_from, l_client_key, l_addr_from, - a_token_ticker, a_value_datoshi, 0, l_price_unit, l_srv_uid, 0, l_pub_key_data, l_pub_key_data_size); + l_tx_cond_hash = dap_chain_mempool_tx_create_cond(a_net, l_enc_key, l_client_key, + a_token_ticker, a_value_datoshi, 0, l_price_unit, l_srv_uid, 0, NULL, 0); //char *l_addr_from_str = dap_chain_addr_to_str(l_addr_from); DAP_DELETE(l_addr_from); if(!l_tx_cond_hash) { @@ -344,8 +338,7 @@ static dap_chain_hash_fast_t* dap_chain_net_vpn_client_tx_cond_hash(dap_chain_ne dap_chain_global_db_gr_set(dap_strdup("client_tx_cond_hash"), l_tx_cond_hash, sizeof(dap_chain_hash_fast_t), l_gdb_group); } - //DAP_DELETE(l_addr_from_str); - DAP_DELETE(l_pub_key_data); + DAP_DELETE(l_client_key); } dap_enc_key_delete(l_enc_key); DAP_DELETE(l_gdb_group); -- GitLab