Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • cellframe/libdap-chain-mempool
1 result
Show changes
Commits on Source (11)
......@@ -8,8 +8,6 @@ add_definitions ("-DNODE_NETNAME=\"kelvin\"")
if(WIN32)
include_directories(../libdap/src/win32/)
include_directories(../3rdparty/libmemcached/)
include_directories(../3rdparty/libmemcached/win32/)
include_directories(../3rdparty/wepoll/include/)
include_directories(../3rdparty/uthash/src/)
include_directories(../3rdparty/libjson-c/)
......
......@@ -30,15 +30,12 @@
#include <errno.h>
#ifdef _WIN32
#undef _WIN32_WINNT
#define _WIN32_WINNT 0x0600
#include <winsock2.h>
#include <windows.h>
#include <mswsock.h>
#include <ws2tcpip.h>
#include <io.h>
#include <time.h>
#include <wepoll.h>
#include <pthread.h>
#endif
......@@ -50,10 +47,6 @@
#include "dap_http_client_simple.h"
#include "client_mempool.h"
#define DAP_APP_NAME NODE_NETNAME"-node"
#define SYSTEM_PREFIX "/opt/"DAP_APP_NAME
#define SYSTEM_CONFIGS_DIR SYSTEM_PREFIX"/etc"
#define LOG_TAG "dap_client_mempool"
static int listen_port_tcp = 8079;
......@@ -138,17 +131,7 @@ static void a_stage_end_callback(dap_client_t *a_client, void *a_arg)
int client_mempool_init(void)
{
/*dap_config_t *g_config;
// read listen_port_tcp from settings
dap_config_init(SYSTEM_CONFIGS_DIR);
if((g_config = dap_config_open(DAP_APP_NAME)) == NULL) {
return -1;
}
else { */
listen_port_tcp = dap_config_get_item_int32_default(g_config, "server", "listen_port_tcp", 8079);
/*}
if(g_config)
dap_config_close(g_config); */
return 0;
}
......
......@@ -30,15 +30,12 @@
#include <memory.h>
#ifdef _WIN32
#undef _WIN32_WINNT
#define _WIN32_WINNT 0x0600
#include <winsock2.h>
#include <windows.h>
#include <mswsock.h>
#include <ws2tcpip.h>
#include <io.h>
#include <time.h>
#include <wepoll.h>
#include <pthread.h>
#endif
......@@ -439,22 +436,84 @@ 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_info.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
*
* 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 +524,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 +540,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 +564,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 +588,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 +601,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 +610,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;
}
/**
......
......@@ -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,16 @@ 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);
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,
......