diff --git a/dap_chain_net.c b/dap_chain_net.c index b0455f71acd560860351a417cef7b18b93b59ea2..2aacd4d5a3bc1ac02c4ebe9d16b21ad2885aa3b9 100644 --- a/dap_chain_net.c +++ b/dap_chain_net.c @@ -1,6 +1,7 @@ /* * Authors: * Dmitriy A. Gearasimov <gerasimov.dmitriy@demlabs.net> + * Alexander Lysikov <alexander.lysikov@demlabs.net> * DeM Labs Inc. https://demlabs.net * Kelvin Project https://github.com/kelvinblockchain * Copyright (c) 2017-2018 @@ -34,7 +35,6 @@ #include "dap_strfuncs.h" #include "dap_config.h" #include "dap_hash.h" -#include "dap_chain_utxo.h" #include "dap_chain_net.h" #include "dap_chain_node_client.h" #include "dap_chain_node_cli.h" @@ -539,20 +539,20 @@ int dap_chain_net_load(const char * a_net_name) dap_config_get_item_str_default(l_cfg , "general" , "gdb_groups_prefix","" ) ); - // UTXO model - uint16_t l_utxo_flags = 0; + // LEDGER model + uint16_t l_ledger_flags = 0; switch ( PVT( l_net )->node_role.enums ) { case NODE_ROLE_ROOT_MASTER: case NODE_ROLE_ROOT: case NODE_ROLE_ARCHIVE: - l_utxo_flags |= DAP_CHAIN_UTXO_CHECK_TOKEN_EMISSION; + l_ledger_flags |= DAP_CHAIN_LEDGER_CHECK_TOKEN_EMISSION; case NODE_ROLE_MASTER: - l_utxo_flags |= DAP_CHAIN_UTXO_CHECK_CELLS_DS; + l_ledger_flags |= DAP_CHAIN_LEDGER_CHECK_CELLS_DS; case NODE_ROLE_CELL_MASTER: - l_utxo_flags |= DAP_CHAIN_UTXO_CHECK_TOKEN_EMISSION; + l_ledger_flags |= DAP_CHAIN_LEDGER_CHECK_TOKEN_EMISSION; case NODE_ROLE_FULL: case NODE_ROLE_LIGHT: - l_utxo_flags |= DAP_CHAIN_UTXO_CHECK_LOCAL_DS; + l_ledger_flags |= DAP_CHAIN_LEDGER_CHECK_LOCAL_DS; } // Check if seed nodes are present in local db alias @@ -683,8 +683,8 @@ int dap_chain_net_load(const char * a_net_name) memcpy( l_net_item2,l_net_item,sizeof (*l_net_item)); HASH_ADD(hh,s_net_items_ids,net_id,sizeof ( l_net_item2->net_id),l_net_item2); - // init UTXO model - dap_chain_utxo_init(l_utxo_flags); + // init LEDGER model + l_net->pub.ledger = dap_chain_ledger_create(l_ledger_flags); // Start the proc thread s_net_proc_thread_start(l_net); @@ -715,6 +715,19 @@ dap_chain_net_t * dap_chain_net_by_name( const char * a_name) return NULL; } +/** + * @brief dap_chain_ledger_by_net_name + * @param a_net_name + * @return + */ +dap_ledger_t * dap_chain_ledger_by_net_name( const char * a_net_name) +{ + dap_chain_net_t *l_net = dap_chain_net_by_name(a_net_name); + if(l_net) + return l_net->pub.ledger; + return NULL; +} + /** * @brief dap_chain_net_by_id * @param a_id diff --git a/dap_chain_net.h b/dap_chain_net.h index f1ff037a3f198fc4c697196951181ac01353a242..9a37113b814077692cb0f070d86e31891505999a 100644 --- a/dap_chain_net.h +++ b/dap_chain_net.h @@ -1,6 +1,7 @@ /* * Authors: * Dmitriy A. Gearasimov <gerasimov.dmitriy@demlabs.net> + * Alexander Lysikov <alexander.lysikov@demlabs.net> * DeM Labs Inc. https://demlabs.net * Kelvin Project https://github.com/kelvinblockchain * Copyright (c) 2017-2019 @@ -30,6 +31,7 @@ #include "dap_chain_common.h" #include "dap_chain_node.h" #include "dap_chain.h" +#include "dap_chain_ledger.h" #define DAP_CHAIN_NET_NAME_MAX 32 @@ -53,6 +55,7 @@ typedef struct dap_chain_net{ char * name; char * gdb_groups_prefix; dap_chain_t * chains; // double-linked list of chains + dap_ledger_t *ledger; } pub; uint8_t pvt[]; } dap_chain_net_t; @@ -78,6 +81,7 @@ void dap_chain_net_proc_datapool (dap_chain_net_t * a_net); dap_chain_net_t * dap_chain_net_by_name( const char * a_name); dap_chain_net_t * dap_chain_net_by_id( dap_chain_net_id_t a_id); dap_chain_net_id_t dap_chain_net_id_by_name( const char * a_name); +dap_ledger_t * dap_chain_ledger_by_net_name( const char * a_net_name); dap_chain_t * dap_chain_net_get_chain_by_name( dap_chain_net_t * l_net, const char * a_name); diff --git a/dap_chain_node_cli.c b/dap_chain_node_cli.c index fa51f86ac79b5b0346607bd18810d2d2a0ba7575..97392aec3f8540f575c0d8ed68adf481f4e83673 100644 --- a/dap_chain_node_cli.c +++ b/dap_chain_node_cli.c @@ -1,7 +1,11 @@ /* * Authors: - * Dmitriy A. Gearasimov <naeper@demlabs.net> + * Dmitriy A. Gearasimov <gerasimov.dmitriy@demlabs.net> + * Alexander Lysikov <alexander.lysikov@demlabs.net> * DeM Labs Inc. https://demlabs.net + * Kelvin Project https://github.com/kelvinblockchain + * Copyright (c) 2019 + * All rights reserved. This file is part of DAP (Deus Applications Prototypes) the open source project @@ -483,7 +487,7 @@ int dap_chain_node_cli_init(dap_config_t * g_config) "\tObtain help for <command> or get the total list of the commands\n" ); dap_chain_node_cli_cmd_item_create("wallet", com_tx_wallet, "Wallet operations", - "wallet [new -w <wallet_name> | list | info -addr <addr> -w <wallet_name>]\n"); + "wallet [new -w <wallet_name> | list | info -addr <addr> -w <wallet_name> -net <net_name>]\n"); // Token commands dap_chain_node_cli_cmd_item_create ("token_decl", com_token_decl, "Token declaration", @@ -513,7 +517,7 @@ int dap_chain_node_cli_init(dap_config_t * g_config) // Transaction commands dap_chain_node_cli_cmd_item_create ("tx_create", com_tx_create, "Make transaction", - "tx_create from_wallet_name <name> to_addr <addr> token <token> value <val> [fee <addr> value_fee <val>]\n" ); + "tx_create from_wallet_name <name> to_addr <addr> token <token> value <val> net <net name> [fee <addr> value_fee <val>]\n" ); dap_chain_node_cli_cmd_item_create ("tx_cond_create", com_tx_cond_create, "Make cond transaction", "tx_cond_create todo\n" ); dap_chain_node_cli_cmd_item_create ("tx_verify", com_tx_verify, "Verifing transaction", diff --git a/dap_chain_node_cli.h b/dap_chain_node_cli.h index f7fd19f4c633070086cbd0d74b870835e2fcc0fc..f41b637254e1a356306010738f4e3f4df4e07ceb 100644 --- a/dap_chain_node_cli.h +++ b/dap_chain_node_cli.h @@ -1,23 +1,28 @@ /* * Authors: - * Dmitriy A. Gearasimov <naeper@demlabs.net> + * Dmitriy A. Gearasimov <gerasimov.dmitriy@demlabs.net> + * Alexander Lysikov <alexander.lysikov@demlabs.net> * DeM Labs Inc. https://demlabs.net + * Kelvin Project https://github.com/kelvinblockchain + * Copyright (c) 2019 + * All rights reserved. This file is part of DAP (Deus Applications Prototypes) the open source project - DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. + DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. - DAP is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + DAP is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with any DAP based project. If not, see <http://www.gnu.org/licenses/>. + */ - You should have received a copy of the GNU General Public License - along with any DAP based project. If not, see <http://www.gnu.org/licenses/>. -*/ #pragma once #include "dap_common.h" diff --git a/dap_chain_node_cli_cmd.c b/dap_chain_node_cli_cmd.c index 1ee99b542e21cff0d18151a2315addf3821f0959..33fe355ad6dbd7e1b21c39472f5fd6f21bb8ba97 100644 --- a/dap_chain_node_cli_cmd.c +++ b/dap_chain_node_cli_cmd.c @@ -1,9 +1,10 @@ /* * Authors: * Dmitriy A. Gearasimov <gerasimov.dmitriy@demlabs.net> + * Alexander Lysikov <alexander.lysikov@demlabs.net> * DeM Labs Inc. https://demlabs.net * Kelvin Project https://github.com/kelvinblockchain - * Copyright (c) 2017-2019 + * Copyright (c) 2019 * All rights reserved. This file is part of DAP (Deus Applications Prototypes) the open source project @@ -58,7 +59,7 @@ #include "dap_chain_datum.h" #include "dap_chain_datum_tx_items.h" -#include "dap_chain_utxo.h" +#include "dap_chain_ledger.h" #include "dap_chain_mempool.h" #include "dap_chain_global_db.h" #include "dap_chain_global_db_remote.h" @@ -147,7 +148,6 @@ static dap_chain_node_addr_t* com_global_db_get_addr(dap_chain_node_info_t *node return address; } - /** * Read node from base */ @@ -204,15 +204,13 @@ static bool dap_chain_node_info_save_and_reply(dap_chain_node_info_t *node_info, } //char *a_value = dap_chain_node_info_serialize(node_info, NULL); size_t node_info_size = dap_chain_node_info_get_size(node_info); - bool res = dap_chain_global_db_gr_set(a_key, (const uint8_t *) node_info, node_info_size, GROUP_GLOBAL_ADDRS_LEASED); + bool res = dap_chain_global_db_gr_set(a_key, (const uint8_t *) node_info, node_info_size, + GROUP_GLOBAL_ADDRS_LEASED); DAP_DELETE(a_key); //DAP_DELETE(a_value); return res; } - - - /** * Handler of command 'global_db node add' * @@ -358,10 +356,9 @@ static int com_global_db_link(dap_chain_node_info_t *node_info, const char *cmd, return -1; } - dap_chain_node_info_t * l_node_info_read = dap_chain_node_info_read_and_reply(address, str_reply); - size_t l_node_info_read_size = dap_chain_node_info_get_size( l_node_info_read); - if(! l_node_info_read) + size_t l_node_info_read_size = dap_chain_node_info_get_size(l_node_info_read); + if(!l_node_info_read) return -1; int cmd_int = 0; @@ -372,8 +369,8 @@ static int com_global_db_link(dap_chain_node_info_t *node_info, const char *cmd, // find link in node_info_read int index_link = -1; - for(size_t i = 0; i < l_node_info_read->hdr.links_number; i++) { - if( l_node_info_read->links[i].uint64 == link->uint64) { + for(size_t i = 0; i < l_node_info_read->hdr.links_number; i++) { + if(l_node_info_read->links[i].uint64 == link->uint64) { // link already present index_link = (int) i; break; @@ -383,9 +380,9 @@ static int com_global_db_link(dap_chain_node_info_t *node_info, const char *cmd, // add link if(cmd_int == 1) { if(index_link == -1) { - l_node_info_read = DAP_REALLOC ( l_node_info_read,l_node_info_read_size += sizeof (*link) ); - memcpy(&( l_node_info_read->links[ l_node_info_read->hdr.links_number]), link, sizeof(dap_chain_node_addr_t)); - l_node_info_read->hdr.links_number++; + l_node_info_read = DAP_REALLOC(l_node_info_read, l_node_info_read_size += sizeof(*link)); + memcpy(&(l_node_info_read->links[l_node_info_read->hdr.links_number]), link, sizeof(dap_chain_node_addr_t)); + l_node_info_read->hdr.links_number++; res_successful = true; } } @@ -393,17 +390,17 @@ static int com_global_db_link(dap_chain_node_info_t *node_info, const char *cmd, else if(cmd_int == 2) { // move link list to one item prev if(index_link >= 0) { - for(unsigned int j = (unsigned int) index_link; j < ( l_node_info_read->hdr.links_number - 1); j++) { - memcpy(&( l_node_info_read->links[j]), &( l_node_info_read->links[j + 1]), sizeof(dap_chain_node_addr_t)); + for(unsigned int j = (unsigned int) index_link; j < (l_node_info_read->hdr.links_number - 1); j++) { + memcpy(&(l_node_info_read->links[j]), &(l_node_info_read->links[j + 1]), sizeof(dap_chain_node_addr_t)); } l_node_info_read->hdr.links_number--; res_successful = true; - l_node_info_read = DAP_REALLOC ( l_node_info_read,l_node_info_read_size -= sizeof (*link) ); + l_node_info_read = DAP_REALLOC(l_node_info_read, l_node_info_read_size -= sizeof(*link)); } } // save edited node_info if(res_successful) { - bool res = dap_chain_node_info_save_and_reply( l_node_info_read, str_reply); + bool res = dap_chain_node_info_save_and_reply(l_node_info_read, str_reply); if(res) { res_successful = true; if(cmd_int == 1) @@ -431,7 +428,7 @@ static int com_global_db_link(dap_chain_node_info_t *node_info, const char *cmd, } DAP_DELETE(address); - DAP_DELETE( l_node_info_read); + DAP_DELETE(l_node_info_read); if(res_successful) return 0; return -1; @@ -653,7 +650,7 @@ static int com_node_request_addr(dap_chain_node_info_t *a_node_info, const char // send request res = dap_chain_node_client_send_ch_pkt(client, dap_stream_ch_chain_net_get_id(), - DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR_LEASE_REQUEST,NULL,0); + DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR_LEASE_REQUEST, NULL, 0); if(res != 1) { dap_chain_node_cli_set_reply_text(a_str_reply, "no request sent"); // clean client struct @@ -709,26 +706,32 @@ int com_global_db(int a_argc, const char ** a_argv, char **a_str_reply) != 0) { cmd_num = CMD_ADD; } - else if((arg_index_n = dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "del", NULL)) + else if((arg_index_n = dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "del", + NULL)) != 0) { cmd_num = CMD_DEL; } - else if((arg_index_n = dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "link", NULL)) + else if((arg_index_n = dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "link", + NULL)) != 0) { cmd_num = CMD_LINK; } - else if((arg_index_n = dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "dump", NULL)) + else if((arg_index_n = dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "dump", + NULL)) != 0) { cmd_num = CMD_DUMP; } - else if((arg_index_n = dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "cur_node_get", NULL)) != 0) { + else if((arg_index_n = dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), + "cur_node_get", NULL)) != 0) { cmd_num = CMD_CUR_NODE_GET; } - else if((arg_index_n = dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "cur_node_set", NULL)) != 0) { + else if((arg_index_n = dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), + "cur_node_set", NULL)) != 0) { cmd_num = CMD_CUR_NODE_SET; } - else if((arg_index_n = dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "cur_node_set_from_remote", - NULL)) != 0) { + else if((arg_index_n = dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), + "cur_node_set_from_remote", + NULL)) != 0) { cmd_num = CMD_CUR_NODE_SET_FROM_REMOTE; } if(cmd_num == CMD_NONE) { @@ -749,13 +752,13 @@ int com_global_db(int a_argc, const char ** a_argv, char **a_str_reply) dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-link", &l_link_str); // struct to write to the global db - dap_chain_node_addr_t l_link={0}; + dap_chain_node_addr_t l_link = { 0 }; dap_chain_node_info_t *l_node_info; - size_t l_node_info_size = sizeof (l_node_info->hdr)+sizeof(l_link); - l_node_info = DAP_NEW_Z_SIZE(dap_chain_node_info_t,l_node_info_size); + size_t l_node_info_size = sizeof(l_node_info->hdr) + sizeof(l_link); + l_node_info = DAP_NEW_Z_SIZE(dap_chain_node_info_t, l_node_info_size); if(l_addr_str) { - dap_digit_from_string(l_addr_str, l_node_info->hdr.address.raw, sizeof(l_node_info->hdr.address.raw) ); + dap_digit_from_string(l_addr_str, l_node_info->hdr.address.raw, sizeof(l_node_info->hdr.address.raw)); } if(l_cell_str) { dap_digit_from_string(l_cell_str, l_node_info->hdr.cell_id.raw, sizeof(l_node_info->hdr.cell_id.raw)); //DAP_CHAIN_CELL_ID_SIZE); @@ -849,202 +852,207 @@ int com_node(int argc, const char ** argv, char **str_reply) dap_digit_from_string(addr_str, address.raw, sizeof(address.raw)); - if( l_net_str == NULL){ + if(l_net_str == NULL) { dap_chain_node_cli_set_reply_text(str_reply, "No -net <net name> option in command %s", argv[1]); return -11; } dap_chain_net_t * l_net = dap_chain_net_by_name(l_net_str); - if( l_net == NULL){ + if(l_net == NULL) { dap_chain_node_cli_set_reply_text(str_reply, "%s: Can't find such network %s", argv[1], l_net_str); return -12; } switch (cmd_num) - { - // add alias - case CMD_ALIAS: - if(alias_str) { - if(addr_str) { - // add alias - if(!dap_chain_node_alias_register(alias_str, &address)) - log_it(L_WARNING, "can't save alias %s", alias_str); - else { - dap_chain_node_cli_set_reply_text(str_reply, "alias mapped successfully"); - } - } + { + // add alias + case CMD_ALIAS: + if(alias_str) { + if(addr_str) { + // add alias + if(!dap_chain_node_alias_register(alias_str, &address)) + log_it(L_WARNING, "can't save alias %s", alias_str); else { - dap_chain_node_cli_set_reply_text(str_reply, "alias can't be mapped because -addr is not found"); - return -1; + dap_chain_node_cli_set_reply_text(str_reply, "alias mapped successfully"); } } else { - dap_chain_node_cli_set_reply_text(str_reply, "alias can't be mapped because -alias is not found"); + dap_chain_node_cli_set_reply_text(str_reply, "alias can't be mapped because -addr is not found"); return -1; } + } + else { + dap_chain_node_cli_set_reply_text(str_reply, "alias can't be mapped because -alias is not found"); + return -1; + } - break; - // make connect - case CMD_CONNECT: { - // get address from alias if addr not defined - if(alias_str && !address.uint64) { - dap_chain_node_addr_t *address_tmp = dap_chain_node_addr_get_by_alias(alias_str); - if(address_tmp) { - memcpy(&address, address_tmp, sizeof(address_tmp)); - DAP_DELETE(address_tmp); - } - else { - dap_chain_node_cli_set_reply_text(str_reply, "no address found by alias"); - return -1; - } + break; + // make connect + case CMD_CONNECT: { + // get address from alias if addr not defined + if(alias_str && !address.uint64) { + dap_chain_node_addr_t *address_tmp = dap_chain_node_addr_get_by_alias(alias_str); + if(address_tmp) { + memcpy(&address, address_tmp, sizeof(address_tmp)); + DAP_DELETE(address_tmp); } - if(!address.uint64) { - dap_chain_node_cli_set_reply_text(str_reply, "addr not found"); + else { + dap_chain_node_cli_set_reply_text(str_reply, "no address found by alias"); return -1; } + } + if(!address.uint64) { + dap_chain_node_cli_set_reply_text(str_reply, "addr not found"); + return -1; + } - // get cur node addr - dap_chain_node_addr_t l_cur_node_addr; - l_cur_node_addr.uint64 = dap_db_get_cur_node_addr(); //0x12345 - if(!l_cur_node_addr.uint64) { - dap_chain_node_cli_set_reply_text(str_reply, "Current node has no address"); - return -1; - } + // get cur node addr + dap_chain_node_addr_t l_cur_node_addr; + l_cur_node_addr.uint64 = dap_db_get_cur_node_addr(); //0x12345 + if(!l_cur_node_addr.uint64) { + dap_chain_node_cli_set_reply_text(str_reply, "Current node has no address"); + return -1; + } - dap_chain_node_info_t *l_remote_node_info = dap_chain_node_info_read_and_reply(&address, str_reply); - if(!l_remote_node_info) { - return -1; - } - // start connect - dap_chain_node_client_t *l_node_client = dap_chain_node_client_connect(l_remote_node_info); - if(!l_node_client) { - dap_chain_node_cli_set_reply_text(str_reply, "can't connect"); - DAP_DELETE(l_remote_node_info); - return -1; - } - // wait connected - int timeout_ms = 15000; //15 sec = 15000 ms - int res = dap_chain_node_client_wait(l_node_client, NODE_CLIENT_STATE_CONNECTED, timeout_ms); - if(res != 1) { - dap_chain_node_cli_set_reply_text(str_reply, "no response from node"); - // clean client struct - dap_chain_node_client_close(l_node_client); - DAP_DELETE(l_remote_node_info); - return -1; - } - log_it(L_NOTICE, "Stream connection established, now lets sync all"); - dap_stream_ch_chain_sync_request_t l_sync_request = {{0}}; - dap_stream_ch_t * l_ch_chain = dap_client_get_stream_ch(l_node_client->client, dap_stream_ch_chain_get_id() ); - l_sync_request.ts_start = (uint64_t) dap_db_log_get_last_timestamp_remote( l_remote_node_info->hdr.address.uint64 ); - //l_sync_request.ts_end = (time_t) time(NULL); - l_sync_request.node_addr.uint64 = dap_chain_net_get_cur_addr(l_net)?dap_chain_net_get_cur_addr(l_net)->uint64: - dap_db_get_cur_node_addr(); - dap_chain_id_t l_chain_id_null = {{0}}; - dap_chain_cell_id_t l_chain_cell_id_null = {{0}}; - log_it(L_INFO,"Requested GLOBAL_DB syncronizatoin, %llu:%llu period", l_sync_request.ts_start, - l_sync_request.ts_end ) ; - if( 0 == dap_stream_ch_chain_pkt_write(l_ch_chain,DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_GLOBAL_DB, - l_net->pub.id, l_chain_id_null ,l_chain_cell_id_null ,&l_sync_request, - sizeof (l_sync_request))) { + dap_chain_node_info_t *l_remote_node_info = dap_chain_node_info_read_and_reply(&address, str_reply); + if(!l_remote_node_info) { + return -1; + } + // start connect + dap_chain_node_client_t *l_node_client = dap_chain_node_client_connect(l_remote_node_info); + if(!l_node_client) { + dap_chain_node_cli_set_reply_text(str_reply, "can't connect"); + DAP_DELETE(l_remote_node_info); + return -1; + } + // wait connected + int timeout_ms = 15000; //15 sec = 15000 ms + int res = dap_chain_node_client_wait(l_node_client, NODE_CLIENT_STATE_CONNECTED, timeout_ms); + if(res != 1) { + dap_chain_node_cli_set_reply_text(str_reply, "no response from node"); + // clean client struct + dap_chain_node_client_close(l_node_client); + DAP_DELETE(l_remote_node_info); + return -1; + } + log_it(L_NOTICE, "Stream connection established, now lets sync all"); + dap_stream_ch_chain_sync_request_t l_sync_request = { { 0 } }; + dap_stream_ch_t * l_ch_chain = dap_client_get_stream_ch(l_node_client->client, dap_stream_ch_chain_get_id()); + l_sync_request.ts_start = (uint64_t) dap_db_log_get_last_timestamp_remote( + l_remote_node_info->hdr.address.uint64); + //l_sync_request.ts_end = (time_t) time(NULL); + l_sync_request.node_addr.uint64 = + dap_chain_net_get_cur_addr(l_net) ? dap_chain_net_get_cur_addr(l_net)->uint64 : + dap_db_get_cur_node_addr(); + dap_chain_id_t l_chain_id_null = { { 0 } }; + dap_chain_cell_id_t l_chain_cell_id_null = { { 0 } }; + log_it(L_INFO, "Requested GLOBAL_DB syncronizatoin, %llu:%llu period", l_sync_request.ts_start, + l_sync_request.ts_end); + if(0 == dap_stream_ch_chain_pkt_write(l_ch_chain, DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_GLOBAL_DB, + l_net->pub.id, l_chain_id_null, l_chain_cell_id_null, &l_sync_request, + sizeof(l_sync_request))) { + dap_chain_node_cli_set_reply_text(str_reply, "Error: Cant send sync chains request"); + // clean client struct + dap_chain_node_client_close(l_node_client); + DAP_DELETE(l_remote_node_info); + return -1; + } + dap_stream_ch_set_ready_to_write(l_ch_chain, true); + // wait for finishing of request + timeout_ms = 120000; // 2 min = 120 sec = 120 000 ms + // TODO add progress info to console + res = dap_chain_node_client_wait(l_node_client, NODE_CLIENT_STATE_SYNCED, timeout_ms); + + // Requesting chains + dap_chain_t *l_chain = NULL; + DL_FOREACH(l_net->pub.chains, l_chain) + { + // send request + dap_stream_ch_chain_sync_request_t l_sync_request = { { 0 } }; + if(0 == dap_stream_ch_chain_pkt_write(l_ch_chain, DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_CHAINS, + l_net->pub.id, l_chain->id, l_remote_node_info->hdr.cell_id, &l_sync_request, + sizeof(l_sync_request))) { dap_chain_node_cli_set_reply_text(str_reply, "Error: Cant send sync chains request"); // clean client struct dap_chain_node_client_close(l_node_client); DAP_DELETE(l_remote_node_info); return -1; } - dap_stream_ch_set_ready_to_write(l_ch_chain,true); + log_it(L_NOTICE, "Requested syncronization for chain \"%s\"", l_chain->name); + dap_stream_ch_set_ready_to_write(l_ch_chain, true); + // wait for finishing of request timeout_ms = 120000; // 2 min = 120 sec = 120 000 ms // TODO add progress info to console res = dap_chain_node_client_wait(l_node_client, NODE_CLIENT_STATE_SYNCED, timeout_ms); + } + log_it(L_INFO, "Chains and gdb are synced"); + DAP_DELETE(l_remote_node_info); + dap_client_disconnect(l_node_client->client); + dap_chain_node_client_close(l_node_client); + dap_chain_node_cli_set_reply_text(str_reply, "Node sync completed: Chains and gdb are synced"); + return 0; - // Requesting chains - dap_chain_t *l_chain = NULL; - DL_FOREACH(l_net->pub.chains, l_chain) { - // send request - dap_stream_ch_chain_sync_request_t l_sync_request = {{0}}; - if( 0 == dap_stream_ch_chain_pkt_write(l_ch_chain,DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_CHAINS, - l_net->pub.id, l_chain->id ,l_remote_node_info->hdr.cell_id,&l_sync_request, - sizeof (l_sync_request))) { - dap_chain_node_cli_set_reply_text(str_reply, "Error: Cant send sync chains request"); - // clean client struct - dap_chain_node_client_close(l_node_client); - DAP_DELETE(l_remote_node_info); - return -1; - } - log_it(L_NOTICE, "Requested syncronization for chain \"%s\"",l_chain->name); - dap_stream_ch_set_ready_to_write(l_ch_chain,true); - - // wait for finishing of request - timeout_ms = 120000; // 2 min = 120 sec = 120 000 ms - // TODO add progress info to console - res = dap_chain_node_client_wait(l_node_client, NODE_CLIENT_STATE_SYNCED, timeout_ms); - } - log_it(L_INFO,"Chains and gdb are synced"); - DAP_DELETE(l_remote_node_info); - dap_client_disconnect(l_node_client->client); - dap_chain_node_client_close(l_node_client); - dap_chain_node_cli_set_reply_text(str_reply, "Node sync completed: Chains and gdb are synced"); - return 0; - - } break; - // make handshake - case CMD_HANDSHAKE: { - // get address from alias if addr not defined - if(alias_str && !address.uint64) { - dap_chain_node_addr_t *address_tmp = dap_chain_node_addr_get_by_alias(alias_str); - if(address_tmp) { - memcpy(&address, address_tmp, sizeof(address_tmp)); - DAP_DELETE(address_tmp); - } - else { - dap_chain_node_cli_set_reply_text(str_reply, "no address found by alias"); - return -1; - } + } + break; + // make handshake + case CMD_HANDSHAKE: { + // get address from alias if addr not defined + if(alias_str && !address.uint64) { + dap_chain_node_addr_t *address_tmp = dap_chain_node_addr_get_by_alias(alias_str); + if(address_tmp) { + memcpy(&address, address_tmp, sizeof(address_tmp)); + DAP_DELETE(address_tmp); } - if(!address.uint64) { - dap_chain_node_cli_set_reply_text(str_reply, "addr not found"); + else { + dap_chain_node_cli_set_reply_text(str_reply, "no address found by alias"); return -1; } + } + if(!address.uint64) { + dap_chain_node_cli_set_reply_text(str_reply, "addr not found"); + return -1; + } - dap_chain_node_info_t *node_info = dap_chain_node_info_read_and_reply(&address, str_reply); - if(!node_info) - return -1; - int timeout_ms = 10000; //10 sec = 10000 ms - // start handshake - dap_chain_node_client_t *client = dap_chain_node_client_connect(node_info); - if(!client) { - dap_chain_node_cli_set_reply_text(str_reply, "can't connect"); - DAP_DELETE(node_info); - return -1; - } - // wait handshake - int res = dap_chain_node_client_wait(client, NODE_CLIENT_STATE_CONNECTED, timeout_ms); - if(res != 1) { - dap_chain_node_cli_set_reply_text(str_reply, "no response from node"); - // clean client struct - dap_chain_node_client_close(client); - DAP_DELETE(node_info); - return -1; - } + dap_chain_node_info_t *node_info = dap_chain_node_info_read_and_reply(&address, str_reply); + if(!node_info) + return -1; + int timeout_ms = 10000; //10 sec = 10000 ms + // start handshake + dap_chain_node_client_t *client = dap_chain_node_client_connect(node_info); + if(!client) { + dap_chain_node_cli_set_reply_text(str_reply, "can't connect"); DAP_DELETE(node_info); + return -1; + } + // wait handshake + int res = dap_chain_node_client_wait(client, NODE_CLIENT_STATE_CONNECTED, timeout_ms); + if(res != 1) { + dap_chain_node_cli_set_reply_text(str_reply, "no response from node"); + // clean client struct + dap_chain_node_client_close(client); + DAP_DELETE(node_info); + return -1; + } + DAP_DELETE(node_info); - //Add new established connection in the list - int ret = dap_chain_node_client_list_add(&address, client); - switch (ret) - { - case -1: - dap_chain_node_client_close(client); - dap_chain_node_cli_set_reply_text(str_reply, "connection established, but not saved"); - return -1; - case -2: - dap_chain_node_client_close(client); - dap_chain_node_cli_set_reply_text(str_reply, "connection already present"); - return -1; - } - dap_chain_node_cli_set_reply_text(str_reply, "connection established"); - } break; + //Add new established connection in the list + int ret = dap_chain_node_client_list_add(&address, client); + switch (ret) + { + case -1: + dap_chain_node_client_close(client); + dap_chain_node_cli_set_reply_text(str_reply, "connection established, but not saved"); + return -1; + case -2: + dap_chain_node_client_close(client); + dap_chain_node_cli_set_reply_text(str_reply, "connection already present"); + return -1; + } + dap_chain_node_cli_set_reply_text(str_reply, "connection established"); + } + break; } return 0; } @@ -1316,16 +1324,17 @@ int com_tx_wallet(int argc, const char ** argv, char **str_reply) arg_index++; if(cmd_num == CMD_NONE) { dap_chain_node_cli_set_reply_text(str_reply, - "format of command: wallet [new -w <wallet_name> | list | info -addr <addr> -w <wallet_name>]"); + "format of command: wallet [new -w <wallet_name> | list | info -addr <addr> -w <wallet_name> -net <net_name>]"); return -1; } dap_chain_node_addr_t address; memset(&address, 0, sizeof(dap_chain_node_addr_t)); - const char *addr_str = NULL, *wallet_name = NULL; + const char *addr_str = NULL, *wallet_name = NULL, *l_net_name = NULL; // find wallet addr dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-addr", &addr_str); dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-w", &wallet_name); + dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-net", &l_net_name); // for dap_string_t *l_string_ret = dap_string_new(NULL); switch (cmd_num) { @@ -1355,12 +1364,12 @@ int com_tx_wallet(int argc, const char ** argv, char **str_reply) // wallet list case CMD_WALLET_LIST: { DIR * l_dir = opendir(c_wallets_path); - if( l_dir ) { + if(l_dir) { struct dirent * l_dir_entry; - while((l_dir_entry=readdir(l_dir))!=NULL){ + while((l_dir_entry = readdir(l_dir)) != NULL) { const char *l_file_name = l_dir_entry->d_name; size_t l_file_name_len = (l_file_name) ? strlen(l_file_name) : 0; - if( (l_file_name_len > 8 )&& ( strcmp(l_file_name + l_file_name_len - 8, ".dwallet") == 0 ) ) { + if((l_file_name_len > 8) && (strcmp(l_file_name + l_file_name_len - 8, ".dwallet") == 0)) { char *l_file_path_tmp = dap_strdup_printf("%s/%s", c_wallets_path, l_file_name); dap_chain_wallet_t *l_wallet = dap_chain_wallet_open_file(l_file_path_tmp); if(l_wallet) { @@ -1391,6 +1400,18 @@ int com_tx_wallet(int argc, const char ** argv, char **str_reply) if(!l_addr && addr_str) l_addr = dap_chain_str_to_addr(addr_str); + dap_ledger_t *l_ledger = dap_chain_ledger_by_net_name((const char *) l_net_name); + if(!l_net_name) { + dap_chain_node_cli_set_reply_text(str_reply, "wallet info requires parameter 'net'"); + return -1; + } + else { + if((l_ledger = dap_chain_ledger_by_net_name(l_net_name)) == NULL) { + dap_chain_node_cli_set_reply_text(str_reply, "not found net by name '%s'", l_net_name); + return -1; + } + } + if(l_addr) { char *l_addr_str = dap_chain_addr_to_str((dap_chain_addr_t*) l_addr); if(l_wallet) @@ -1399,14 +1420,14 @@ int com_tx_wallet(int argc, const char ** argv, char **str_reply) size_t l_addr_tokens_size = 0; char **l_addr_tokens = NULL; - dap_chain_utxo_addr_get_token_ticker_all(l_addr, &l_addr_tokens, &l_addr_tokens_size); + dap_chain_ledger_addr_get_token_ticker_all(l_ledger, l_addr, &l_addr_tokens, &l_addr_tokens_size); if(l_addr_tokens_size > 0) dap_string_append_printf(l_string_ret, "balance:\n"); else dap_string_append_printf(l_string_ret, "balance: 0\n"); for(size_t i = 0; i < l_addr_tokens_size; i++) { if(l_addr_tokens[i]) { - uint64_t balance = dap_chain_utxo_calc_balance(l_addr, l_addr_tokens[i]); + uint64_t balance = dap_chain_ledger_calc_balance(l_ledger, l_addr, l_addr_tokens[i]); dap_string_append_printf(l_string_ret, " %llu %s\n", balance, l_addr_tokens[i]); } DAP_DELETE(l_addr_tokens[i]); @@ -1443,43 +1464,44 @@ int com_tx_wallet(int argc, const char ** argv, char **str_reply) * @param l_net * @return */ -int dap_chain_node_cli_cmd_values_parse_net_chain(int *a_arg_index,int argc, const char ** argv, char ** a_str_reply, - dap_chain_t ** a_chain, dap_chain_net_t ** a_net) +int dap_chain_node_cli_cmd_values_parse_net_chain(int *a_arg_index, int argc, const char ** argv, char ** a_str_reply, + dap_chain_t ** a_chain, dap_chain_net_t ** a_net) { const char * l_chain_str = NULL; const char * l_net_str = NULL; // Net name - if ( a_net ) + if(a_net) dap_chain_node_cli_find_option_val(argv, *a_arg_index, argc, "-net", &l_net_str); else - return -100; + return -100; // Select network if(!l_net_str) { - dap_chain_node_cli_set_reply_text(a_str_reply, "%s requires parameter 'net'",argv[0]); + dap_chain_node_cli_set_reply_text(a_str_reply, "%s requires parameter 'net'", argv[0]); return -101; } - if ( ( *a_net = dap_chain_net_by_name(l_net_str) ) == NULL ){ // Can't find such network - dap_chain_node_cli_set_reply_text(a_str_reply, "%s cand find network \"%s\"",argv[0],l_net_str); + if((*a_net = dap_chain_net_by_name(l_net_str)) == NULL) { // Can't find such network + dap_chain_node_cli_set_reply_text(a_str_reply, "%s cand find network \"%s\"", argv[0], l_net_str); return -102; } // Chain name - if ( a_chain ){ + if(a_chain) { dap_chain_node_cli_find_option_val(argv, *a_arg_index, argc, "-chain", &l_chain_str); // Select chain if(l_chain_str) { - if ( ( *a_chain = dap_chain_net_get_chain_by_name(*a_net, l_chain_str ) ) == NULL ){ // Can't find such chain - dap_chain_node_cli_set_reply_text(a_str_reply, "%s requires parameter 'chain' to be valid chain name in chain net %s", - argv[0] , l_net_str); + if((*a_chain = dap_chain_net_get_chain_by_name(*a_net, l_chain_str)) == NULL) { // Can't find such chain + dap_chain_node_cli_set_reply_text(a_str_reply, + "%s requires parameter 'chain' to be valid chain name in chain net %s", + argv[0], l_net_str); return -103; } } } - return 0; + return 0; } @@ -1498,7 +1520,7 @@ int com_token_decl_sign(int argc, const char ** argv, char ** a_str_reply) // Chain name dap_chain_node_cli_find_option_val(argv, arg_index, argc, "datum", &l_datum_hash_str); - if ( l_datum_hash_str ){ + if(l_datum_hash_str) { const char * l_certs_str = NULL; dap_chain_cert_t ** l_certs = NULL; size_t l_certs_size = 0; @@ -1506,11 +1528,11 @@ int com_token_decl_sign(int argc, const char ** argv, char ** a_str_reply) dap_chain_net_t * l_net = NULL; - if ( dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index,argc,argv,a_str_reply,&l_chain, &l_net) < 0 ) + if(dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index, argc, argv, a_str_reply, &l_chain, &l_net) < 0) return -1; // Load certs lists - size_t l_signs_size = dap_chain_cert_parse_str_list(l_certs_str,&l_certs, &l_certs_size); + size_t l_signs_size = dap_chain_cert_parse_str_list(l_certs_str, &l_certs, &l_certs_size); if(!l_certs_size) { dap_chain_node_cli_set_reply_text(a_str_reply, "token_create command requres at least one valid certificate to sign the basic transaction of emission"); @@ -1520,16 +1542,16 @@ int com_token_decl_sign(int argc, const char ** argv, char ** a_str_reply) char * l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool(l_chain); - log_it (L_DEBUG, "Requested to sign token declaration %s in gdb://%s with certs %s", - l_gdb_group_mempool,l_datum_hash_str, l_certs_str); + log_it(L_DEBUG, "Requested to sign token declaration %s in gdb://%s with certs %s", + l_gdb_group_mempool, l_datum_hash_str, l_certs_str); dap_chain_datum_t * l_datum = NULL; size_t l_datum_size = 0; - if( (l_datum = (dap_chain_datum_t*) dap_chain_global_db_gr_get( - l_datum_hash_str ,&l_datum_size,l_gdb_group_mempool )) != NULL ) { + if((l_datum = (dap_chain_datum_t*) dap_chain_global_db_gr_get( + l_datum_hash_str, &l_datum_size, l_gdb_group_mempool)) != NULL) { // Check if its token declaration - if ( l_datum->header.type_id == DAP_CHAIN_DATUM_TOKEN_DECL ){ + if(l_datum->header.type_id == DAP_CHAIN_DATUM_TOKEN_DECL) { dap_chain_datum_token_t * l_datum_token = (dap_chain_datum_token_t *) l_datum->data; size_t l_datum_token_size = l_datum->header.data_size; size_t l_signs_size = l_datum_token_size - sizeof(l_datum_token->header); @@ -1537,81 +1559,85 @@ int com_token_decl_sign(int argc, const char ** argv, char ** a_str_reply) // Check for signatures, are they all in set and are good enought? size_t l_signs_count = 0; - for ( size_t l_offset = 0; l_offset < l_signs_size; l_signs_count++ ) { + for(size_t l_offset = 0; l_offset < l_signs_size; l_signs_count++) { dap_chain_sign_t * l_sign = (dap_chain_sign_t *) l_datum_token->signs + l_offset; l_offset += dap_chain_sign_get_size(l_sign); - if ( dap_chain_sign_verify(l_sign,&l_datum_token->header,sizeof (l_datum_token->header) ) != 1 ){ - log_it(L_WARNING,"Wrong signature for datum_token with key %s in mempool!",l_datum_hash_str ); - dap_chain_node_cli_set_reply_text(a_str_reply, "Datum %s with datum token has wrong signature %u, break process and exit", - l_datum_hash_str, l_signs_count+1); + if(dap_chain_sign_verify(l_sign, &l_datum_token->header, sizeof(l_datum_token->header)) != 1) { + log_it(L_WARNING, "Wrong signature for datum_token with key %s in mempool!", l_datum_hash_str); + dap_chain_node_cli_set_reply_text(a_str_reply, + "Datum %s with datum token has wrong signature %u, break process and exit", + l_datum_hash_str, l_signs_count + 1); DAP_DELETE(l_datum); DAP_DELETE(l_datum_token); DAP_DELETE(l_gdb_group_mempool); return -666; } } - log_it( L_DEBUG,"Datum % with token declaration: %u signatures are verified well", l_signs_count); + log_it(L_DEBUG, "Datum % with token declaration: %u signatures are verified well", l_signs_count); // Check if all signs are present - if ( l_signs_count == l_datum_token->header.signs_total ){ - dap_chain_node_cli_set_reply_text(a_str_reply, "Datum %s with datum token has all signs on board. Can't add anything in it"); + if(l_signs_count == l_datum_token->header.signs_total) { + dap_chain_node_cli_set_reply_text(a_str_reply, + "Datum %s with datum token has all signs on board. Can't add anything in it"); DAP_DELETE(l_datum); DAP_DELETE(l_datum_token); DAP_DELETE(l_gdb_group_mempool); return -7; } // Check if more signs that could be (corrupted datum) - else if ( l_signs_count > l_datum_token->header.signs_total ){ - dap_chain_node_cli_set_reply_text(a_str_reply, "Warning! Datum %s with datum token has more signs on board (%u) than its possible to have (%u)!", - l_signs_count, l_datum_token->header.signs_total ); + else if(l_signs_count > l_datum_token->header.signs_total) { + dap_chain_node_cli_set_reply_text(a_str_reply, + "Warning! Datum %s with datum token has more signs on board (%u) than its possible to have (%u)!", + l_signs_count, l_datum_token->header.signs_total); DAP_DELETE(l_datum); DAP_DELETE(l_datum_token); DAP_DELETE(l_gdb_group_mempool); return -8; } // Check if we have enough place to sign the datum token declaration - else if ( l_datum_token->header.signs_total - l_signs_count < l_certs_count ){ - l_datum = DAP_REALLOC(l_datum, l_datum_size+ l_signs_size ); // add place for new signatures - size_t l_offset = 0; - for ( size_t i = 0 ; i < l_certs_count ; i++ ){ - dap_chain_sign_t * l_sign = dap_chain_sign_create( l_certs[i]->enc_key, - &l_datum_token->header, - sizeof (l_datum_token->header), 0 ); + else if(l_datum_token->header.signs_total - l_signs_count < l_certs_count) { + l_datum = DAP_REALLOC(l_datum, l_datum_size + l_signs_size); // add place for new signatures + size_t l_offset = 0; + for(size_t i = 0; i < l_certs_count; i++) { + dap_chain_sign_t * l_sign = dap_chain_sign_create(l_certs[i]->enc_key, + &l_datum_token->header, + sizeof(l_datum_token->header), 0); size_t l_sign_size = dap_chain_sign_get_size(l_sign); - if ( l_offset + l_sign_size <= l_signs_size ){ - memcpy( l_datum_token->signs + l_datum_token_size - sizeof (l_datum_token->header) + l_offset, - l_sign,l_sign_size ); - log_it (L_DEBUG, "Added datum token declaration sign with cert %s", l_certs[i]->name); + if(l_offset + l_sign_size <= l_signs_size) { + memcpy(l_datum_token->signs + l_datum_token_size - sizeof(l_datum_token->header) + l_offset, + l_sign, l_sign_size); + log_it(L_DEBUG, "Added datum token declaration sign with cert %s", l_certs[i]->name); } - DAP_DELETE( l_sign); + DAP_DELETE(l_sign); l_offset += l_sign_size; - if (l_offset > l_signs_size ){ + if(l_offset > l_signs_size) { break; } } l_datum_size += l_signs_size; - // Recalc hash, string and place new datum // Calc datum's hash dap_chain_hash_fast_t l_key_hash; - dap_hash_fast(l_datum,l_datum_size, &l_key_hash); + dap_hash_fast(l_datum, l_datum_size, &l_key_hash); char * l_key_str = dap_chain_hash_fast_to_str_new(&l_key_hash); // Add datum to mempool with datum_token hash as a key - if(dap_chain_global_db_gr_set(l_key_str, (uint8_t *) l_datum, l_datum_size,l_gdb_group_mempool )) { + if(dap_chain_global_db_gr_set(l_key_str, (uint8_t *) l_datum, l_datum_size, l_gdb_group_mempool)) { // Remove old datum from pool - if (dap_chain_global_db_gr_del(l_datum_hash_str,l_gdb_group_mempool) ){ - dap_chain_node_cli_set_reply_text(a_str_reply, "datum %s produced from %s is replacing the %s in datum pool", - l_key_str, l_datum_hash_str,l_datum_hash_str); + if(dap_chain_global_db_gr_del(l_datum_hash_str, l_gdb_group_mempool)) { + dap_chain_node_cli_set_reply_text(a_str_reply, + "datum %s produced from %s is replacing the %s in datum pool", + l_key_str, l_datum_hash_str, l_datum_hash_str); DAP_DELETE(l_datum); DAP_DELETE(l_datum_token); DAP_DELETE(l_gdb_group_mempool); - return 0; + return 0; } else { - dap_chain_node_cli_set_reply_text(a_str_reply, "Warning! Can't remove old datum %s ( new datum %s added normaly in datum pool)", - l_datum_hash_str,l_key_str); + dap_chain_node_cli_set_reply_text(a_str_reply, + "Warning! Can't remove old datum %s ( new datum %s added normaly in datum pool)", + l_datum_hash_str, l_key_str); DAP_DELETE(l_datum); DAP_DELETE(l_datum_token); DAP_DELETE(l_gdb_group_mempool); @@ -1619,9 +1645,10 @@ int com_token_decl_sign(int argc, const char ** argv, char ** a_str_reply) } } - else{ - dap_chain_node_cli_set_reply_text(a_str_reply, "Error! datum %s produced from %s can't be placed in mempool", - l_key_str, l_datum_hash_str); + else { + dap_chain_node_cli_set_reply_text(a_str_reply, + "Error! datum %s produced from %s can't be placed in mempool", + l_key_str, l_datum_hash_str); DAP_DELETE(l_datum); DAP_DELETE(l_datum_token); DAP_DELETE(l_gdb_group_mempool); @@ -1629,25 +1656,28 @@ int com_token_decl_sign(int argc, const char ** argv, char ** a_str_reply) } } else { - dap_chain_node_cli_set_reply_text(a_str_reply, "Error! Not enought place for new signature (%u is left when we need %u signatures)", - l_datum_token->header.signs_total - l_signs_count, l_certs_count ); + dap_chain_node_cli_set_reply_text(a_str_reply, + "Error! Not enought place for new signature (%u is left when we need %u signatures)", + l_datum_token->header.signs_total - l_signs_count, l_certs_count); return -6; } } else { - dap_chain_node_cli_set_reply_text(a_str_reply, "Error! Wrong datum type. token_decl_sign sign only token declarations datum"); + dap_chain_node_cli_set_reply_text(a_str_reply, + "Error! Wrong datum type. token_decl_sign sign only token declarations datum"); return -61; } - }else { - dap_chain_node_cli_set_reply_text(a_str_reply, "token_decl_sign can't find datum with %s hash in the mempool of %s:%s", l_net->pub.name,l_chain->name); + } else { + dap_chain_node_cli_set_reply_text(a_str_reply, + "token_decl_sign can't find datum with %s hash in the mempool of %s:%s", l_net->pub.name, + l_chain->name); return -5; } - }else { + } else { dap_chain_node_cli_set_reply_text(a_str_reply, "token_decl_sign need datum <datum hash> argument"); return -2; } } - /** * @brief com_token_decl_list * @param argc @@ -1661,35 +1691,36 @@ int com_mempool_list(int argc, const char ** argv, char ** a_str_reply) dap_chain_t * l_chain = NULL; dap_chain_net_t * l_net = NULL; - if (dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index,argc,argv,a_str_reply,&l_chain, &l_net) != 0){ + if(dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index, argc, argv, a_str_reply, &l_chain, &l_net) != 0) { return -1; } - if ( l_chain && l_net ){ + if(l_chain && l_net) { char * l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool(l_chain); dap_string_t * l_str_tmp = dap_string_new(NULL); size_t l_objs_size = 0; - dap_global_db_obj_t ** l_objs = dap_chain_global_db_gr_load(l_gdb_group_mempool,&l_objs_size); - dap_string_append_printf(l_str_tmp,"%s.%s: Found %u records :\n",l_net->pub.name,l_chain->name,l_objs_size); - for ( size_t i = 0; i< l_objs_size; i++){ - dap_chain_datum_t * l_datum =(dap_chain_datum_t* ) l_objs[i]->value; + dap_global_db_obj_t ** l_objs = dap_chain_global_db_gr_load(l_gdb_group_mempool, &l_objs_size); + dap_string_append_printf(l_str_tmp, "%s.%s: Found %u records :\n", l_net->pub.name, l_chain->name, l_objs_size); + for(size_t i = 0; i < l_objs_size; i++) { + dap_chain_datum_t * l_datum = (dap_chain_datum_t*) l_objs[i]->value; char buf[50]; time_t l_ts_create = (time_t) l_datum->header.ts_create; - dap_string_append_printf(l_str_tmp,"%s: type_id=%s data_size=%u ts_create=%s", - l_objs[i]->key, c_datum_type_str[l_datum->header.type_id], - l_datum->header.data_size,ctime_r( &l_ts_create,buf ) ); + dap_string_append_printf(l_str_tmp, "%s: type_id=%s data_size=%u ts_create=%s", + l_objs[i]->key, c_datum_type_str[l_datum->header.type_id], + l_datum->header.data_size, ctime_r(&l_ts_create, buf)); } // Clean up dap_chain_node_cli_set_reply_text(a_str_reply, l_str_tmp->str); dap_chain_global_db_objs_delete(l_objs); - dap_string_free(l_str_tmp,false); + dap_string_free(l_str_tmp, false); - return 0; - }else { - dap_chain_node_cli_set_reply_text(a_str_reply, "Error! Need both -net <network name> and -chain <chain name> params\n"); + return 0; + } else { + dap_chain_node_cli_set_reply_text(a_str_reply, + "Error! Need both -net <network name> and -chain <chain name> params\n"); return -2; } } @@ -1707,29 +1738,31 @@ int com_mempool_delete(int argc, const char ** argv, char ** a_str_reply) dap_chain_t * l_chain = NULL; dap_chain_net_t * l_net = NULL; - if (dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index,argc,argv,a_str_reply,&l_chain, &l_net) != 0){ - dap_chain_node_cli_set_reply_text(a_str_reply, "Error! Need both -net <network name> and -chain <chain name> params\n"); + if(dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index, argc, argv, a_str_reply, &l_chain, &l_net) != 0) { + dap_chain_node_cli_set_reply_text(a_str_reply, + "Error! Need both -net <network name> and -chain <chain name> params\n"); return -1; } - if ( l_chain && l_net ){ + if(l_chain && l_net) { const char * l_datum_hash_str = NULL; dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-datum", &l_datum_hash_str); - if ( l_datum_hash_str ){ + if(l_datum_hash_str) { char * l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool(l_chain); - if ( dap_chain_global_db_gr_del(l_datum_hash_str,l_gdb_group_mempool) ) { - dap_chain_node_cli_set_reply_text(a_str_reply, "Datum %s deleted",l_datum_hash_str); - return 0; - }else { - dap_chain_node_cli_set_reply_text(a_str_reply, "Error! Can't find datum %s",l_datum_hash_str); - return -4; + if(dap_chain_global_db_gr_del(l_datum_hash_str, l_gdb_group_mempool)) { + dap_chain_node_cli_set_reply_text(a_str_reply, "Datum %s deleted", l_datum_hash_str); + return 0; + } else { + dap_chain_node_cli_set_reply_text(a_str_reply, "Error! Can't find datum %s", l_datum_hash_str); + return -4; } - }else { - dap_chain_node_cli_set_reply_text(a_str_reply, "Error! %s requires -datum <datum hash> option",argv[0]); + } else { + dap_chain_node_cli_set_reply_text(a_str_reply, "Error! %s requires -datum <datum hash> option", argv[0]); return -3; } - }else { - dap_chain_node_cli_set_reply_text(a_str_reply, "Error! Need both -net <network name> and -chain <chain name> params\n"); + } else { + dap_chain_node_cli_set_reply_text(a_str_reply, + "Error! Need both -net <network name> and -chain <chain name> params\n"); return -2; } } @@ -1747,46 +1780,44 @@ int com_mempool_proc(int argc, const char ** argv, char ** a_str_reply) dap_chain_t * l_chain; dap_chain_net_t * l_net = NULL; - if (dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index,argc,argv,a_str_reply,&l_chain, &l_net) < 0) + if(dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index, argc, argv, a_str_reply, &l_chain, &l_net) < 0) return -1; char * l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool(l_chain); size_t l_objs_size = 0; - dap_global_db_obj_t ** l_objs = dap_chain_global_db_gr_load(l_gdb_group_mempool,&l_objs_size); + dap_global_db_obj_t ** l_objs = dap_chain_global_db_gr_load(l_gdb_group_mempool, &l_objs_size); dap_string_t * l_str_tmp = dap_string_new(NULL); - if ( l_objs_size ) { - dap_string_append_printf(l_str_tmp,"%s.%s: Found %u records :\n",l_net->pub.name,l_chain->name); - + if(l_objs_size) { + dap_string_append_printf(l_str_tmp, "%s.%s: Found %u records :\n", l_net->pub.name, l_chain->name); size_t l_datums_size = l_objs_size; - dap_chain_datum_t ** l_datums = DAP_NEW_Z_SIZE(dap_chain_datum_t*,sizeof(dap_chain_datum_t*)*l_datums_size); - for ( size_t i = 0; i< l_objs_size; i++){ - dap_chain_datum_t * l_datum = (dap_chain_datum_t* ) l_objs[i]->value; + dap_chain_datum_t ** l_datums = DAP_NEW_Z_SIZE(dap_chain_datum_t*, sizeof(dap_chain_datum_t*) * l_datums_size); + for(size_t i = 0; i < l_objs_size; i++) { + dap_chain_datum_t * l_datum = (dap_chain_datum_t*) l_objs[i]->value; l_datums[i] = l_datum; char buf[50]; time_t l_ts_create = (time_t) l_datum->header.ts_create; - dap_string_append_printf(l_str_tmp,"0x%s: type_id=%s ts_create=%s data_size=%u\n", - l_objs[i]->key, c_datum_type_str[l_datum->header.type_id], - ctime_r( &l_ts_create,buf ),l_datum->header.data_size ); + dap_string_append_printf(l_str_tmp, "0x%s: type_id=%s ts_create=%s data_size=%u\n", + l_objs[i]->key, c_datum_type_str[l_datum->header.type_id], + ctime_r(&l_ts_create, buf), l_datum->header.data_size); } - size_t l_objs_processed = l_chain->callback_datums_pool_proc(l_chain,l_datums,l_datums_size); + size_t l_objs_processed = l_chain->callback_datums_pool_proc(l_chain, l_datums, l_datums_size); // Delete processed objects - for ( size_t i = 0; i< l_objs_processed; i++){ - dap_chain_global_db_gr_del(l_objs[i]->key,l_gdb_group_mempool); - dap_string_append_printf(l_str_tmp,"New event created, removed datum 0x%s from mempool \n",l_objs[i]->key); + for(size_t i = 0; i < l_objs_processed; i++) { + dap_chain_global_db_gr_del(l_objs[i]->key, l_gdb_group_mempool); + dap_string_append_printf(l_str_tmp, "New event created, removed datum 0x%s from mempool \n", + l_objs[i]->key); } dap_chain_global_db_objs_delete(l_objs); dap_chain_node_cli_set_reply_text(a_str_reply, l_str_tmp->str); - dap_string_free(l_str_tmp,false); - }else { - dap_chain_node_cli_set_reply_text(a_str_reply, "%s.^s: No records in mempool",l_net->pub.name,l_chain->name); + dap_string_free(l_str_tmp, false); + } else { + dap_chain_node_cli_set_reply_text(a_str_reply, "%s.^s: No records in mempool", l_net->pub.name, l_chain->name); } return 0; } - - /** * @brief com_token_decl * @param argc @@ -1810,7 +1841,6 @@ int com_token_decl(int argc, const char ** argv, char ** str_reply) const char * l_signs_total_str = NULL; uint16_t l_signs_total = 0; - const char * l_certs_str = NULL; dap_chain_cert_t ** l_certs = NULL; @@ -1819,18 +1849,15 @@ int com_token_decl(int argc, const char ** argv, char ** str_reply) dap_chain_t * l_chain; dap_chain_net_t * l_net = NULL; - if (dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index,argc,argv,str_reply,&l_chain, &l_net) < 0) + if(dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index, argc, argv, str_reply, &l_chain, &l_net) < 0) return -1; - - // Total supply value dap_chain_node_cli_find_option_val(argv, arg_index, argc, "total_supply", &l_total_supply_str); // Token ticker dap_chain_node_cli_find_option_val(argv, arg_index, argc, "token", &l_ticker); - // Certificates thats will be used to sign currend datum token dap_chain_node_cli_find_option_val(argv, arg_index, argc, "certs", &l_certs_str); @@ -1843,10 +1870,11 @@ int com_token_decl(int argc, const char ** argv, char ** str_reply) if(!l_total_supply_str) { dap_chain_node_cli_set_reply_text(str_reply, "token_create requires parameter 'total_supply'"); return -11; - }else { + } else { char * l_tmp = NULL; - if ( ( l_total_supply = strtoull(l_total_supply_str,&l_tmp,10) ) == 0 ){ - dap_chain_node_cli_set_reply_text(str_reply, "token_create requires parameter 'total_supply' to be unsigned integer value that fits in 8 bytes"); + if((l_total_supply = strtoull(l_total_supply_str, &l_tmp, 10)) == 0) { + dap_chain_node_cli_set_reply_text(str_reply, + "token_create requires parameter 'total_supply' to be unsigned integer value that fits in 8 bytes"); return -2; } } @@ -1855,10 +1883,11 @@ int com_token_decl(int argc, const char ** argv, char ** str_reply) if(!l_signs_emission_str) { dap_chain_node_cli_set_reply_text(str_reply, "token_create requires parameter 'signs_emission'"); return -3; - }else { + } else { char * l_tmp = NULL; - if ( ( l_signs_emission =(uint16_t) strtol(l_signs_emission_str,&l_tmp,10) ) == 0 ){ - dap_chain_node_cli_set_reply_text(str_reply, "token_create requires parameter 'signs_emission' to be unsigned integer value that fits in 2 bytes"); + if((l_signs_emission = (uint16_t) strtol(l_signs_emission_str, &l_tmp, 10)) == 0) { + dap_chain_node_cli_set_reply_text(str_reply, + "token_create requires parameter 'signs_emission' to be unsigned integer value that fits in 2 bytes"); return -4; } } @@ -1867,22 +1896,21 @@ int com_token_decl(int argc, const char ** argv, char ** str_reply) if(!l_signs_total_str) { dap_chain_node_cli_set_reply_text(str_reply, "token_create requires parameter 'signs_total'"); return -31; - }else { + } else { char * l_tmp = NULL; - if ( ( l_signs_total =(uint16_t) strtol(l_signs_total_str,&l_tmp,10) ) == 0 ){ - dap_chain_node_cli_set_reply_text(str_reply, "token_create requires parameter 'signs_total' to be unsigned integer value that fits in 2 bytes"); + if((l_signs_total = (uint16_t) strtol(l_signs_total_str, &l_tmp, 10)) == 0) { + dap_chain_node_cli_set_reply_text(str_reply, + "token_create requires parameter 'signs_total' to be unsigned integer value that fits in 2 bytes"); return -41; } } - // Check for ticker if(!l_ticker) { dap_chain_node_cli_set_reply_text(str_reply, "token_emit requires parameter 'token'"); return -5; } - // Check certs list if(!l_certs_str) { dap_chain_node_cli_set_reply_text(str_reply, "token_emit requires parameter 'certs'"); @@ -1890,7 +1918,7 @@ int com_token_decl(int argc, const char ** argv, char ** str_reply) } // Load certs lists - size_t l_signs_size = dap_chain_cert_parse_str_list(l_certs_str,&l_certs, &l_certs_size); + size_t l_signs_size = dap_chain_cert_parse_str_list(l_certs_str, &l_certs, &l_certs_size); if(!l_certs_size) { dap_chain_node_cli_set_reply_text(str_reply, "token_create command requres at least one valid certificate to sign the basic transaction of emission"); @@ -1898,14 +1926,14 @@ int com_token_decl(int argc, const char ** argv, char ** str_reply) } // If we have more certs than we need signs - use only first part of the list - if (l_certs_size > l_signs_total ) + if(l_certs_size > l_signs_total) l_certs_size = l_signs_total; // Create new datum token - dap_chain_datum_token_t * l_datum_token = DAP_NEW_Z_SIZE(dap_chain_datum_token_t,sizeof(l_datum_token->header) + - l_signs_size); + dap_chain_datum_token_t * l_datum_token = DAP_NEW_Z_SIZE(dap_chain_datum_token_t, sizeof(l_datum_token->header) + + l_signs_size); l_datum_token->header.version = 1; // Current version - snprintf(l_datum_token->header.ticker,sizeof(l_datum_token->header.ticker),"%s",l_ticker); + snprintf(l_datum_token->header.ticker, sizeof(l_datum_token->header.ticker), "%s", l_ticker); l_datum_token->header.total_supply = l_total_supply; l_datum_token->header.signs_total = l_signs_total; l_datum_token->header.signs_valid = l_signs_emission; @@ -1913,35 +1941,37 @@ int com_token_decl(int argc, const char ** argv, char ** str_reply) size_t l_signs_offset = 0; // Sign header with all certificates in the list and add signs to the end of ticker declaration // Important: - for ( size_t i = 0 ; i < l_certs_size; i++ ){ - dap_chain_sign_t * l_sign = dap_chain_cert_sign( l_certs[i], - l_datum_token, - sizeof(l_datum_token->header), - 0); + for(size_t i = 0; i < l_certs_size; i++) { + dap_chain_sign_t * l_sign = dap_chain_cert_sign(l_certs[i], + l_datum_token, + sizeof(l_datum_token->header), + 0); size_t l_sign_size = dap_chain_sign_get_size(l_sign); - memcpy(l_datum_token->signs+l_signs_offset,l_sign,l_sign_size); + memcpy(l_datum_token->signs + l_signs_offset, l_sign, l_sign_size); DAP_DELETE(l_sign); } - dap_chain_datum_t * l_datum = dap_chain_datum_create(DAP_CHAIN_DATUM_TOKEN_DECL,l_datum_token, - sizeof (l_datum_token->header)+ l_signs_size); + dap_chain_datum_t * l_datum = dap_chain_datum_create(DAP_CHAIN_DATUM_TOKEN_DECL, l_datum_token, + sizeof(l_datum_token->header) + l_signs_size); size_t l_datum_size = dap_chain_datum_size(l_datum); // Calc datum's hash dap_chain_hash_fast_t l_key_hash; - dap_hash_fast(l_datum,l_datum_size, &l_key_hash); + dap_hash_fast(l_datum, l_datum_size, &l_key_hash); char * l_key_str = dap_chain_hash_fast_to_str_new(&l_key_hash); // Add datum to mempool with datum_token hash as a key char * l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool(l_chain); - if(dap_chain_global_db_gr_set(l_key_str, (uint8_t *) l_datum, l_datum_size,l_gdb_group_mempool )) { - dap_chain_node_cli_set_reply_text(str_reply, "%s\ndatum %s with token %s is placed in datum pool ", str_reply_tmp, l_key_str,l_ticker); + if(dap_chain_global_db_gr_set(l_key_str, (uint8_t *) l_datum, l_datum_size, l_gdb_group_mempool)) { + dap_chain_node_cli_set_reply_text(str_reply, "%s\ndatum %s with token %s is placed in datum pool ", + str_reply_tmp, l_key_str, l_ticker); DAP_DELETE(l_datum); DAP_DELETE(l_datum_token); DAP_DELETE(l_gdb_group_mempool); - return 0; + return 0; } - else{ - dap_chain_node_cli_set_reply_text(str_reply, "%s\ndatum tx %s is not placed in datum pool ", str_reply_tmp, l_key_str); + else { + dap_chain_node_cli_set_reply_text(str_reply, "%s\ndatum tx %s is not placed in datum pool ", str_reply_tmp, + l_key_str); DAP_DELETE(l_datum); DAP_DELETE(l_datum_token); DAP_DELETE(l_gdb_group_mempool); @@ -1982,7 +2012,6 @@ int com_token_emit(int argc, const char ** argv, char ** str_reply) const char * l_net_str = NULL; dap_chain_net_t * l_net = NULL; - // Wallet address that recieves the emission dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-certs", &l_certs_str); @@ -2018,7 +2047,7 @@ int com_token_emit(int argc, const char ** argv, char ** str_reply) } // Load certs - dap_chain_cert_parse_str_list(l_certs_str,&l_certs,&l_certs_size); + dap_chain_cert_parse_str_list(l_certs_str, &l_certs, &l_certs_size); if(!l_certs_size) { dap_chain_node_cli_set_reply_text(str_reply, @@ -2026,7 +2055,6 @@ int com_token_emit(int argc, const char ** argv, char ** str_reply) return -5; } - dap_chain_addr_t * l_addr = dap_chain_str_to_addr(l_addr_str); if(!l_addr) { @@ -2041,9 +2069,10 @@ int com_token_emit(int argc, const char ** argv, char ** str_reply) if(!l_net_str) { dap_chain_node_cli_set_reply_text(str_reply, "token_create requires parameter 'net'"); return -42; - }else { - if ( ( l_net = dap_chain_net_by_name(l_net_str) ) == NULL ){ // Can't find such network - dap_chain_node_cli_set_reply_text(str_reply, "token_create requires parameter '-net' to be valid chain network name"); + } else { + if((l_net = dap_chain_net_by_name(l_net_str)) == NULL) { // Can't find such network + dap_chain_node_cli_set_reply_text(str_reply, + "token_create requires parameter '-net' to be valid chain network name"); return -43; } } @@ -2055,9 +2084,11 @@ int com_token_emit(int argc, const char ** argv, char ** str_reply) if(!l_chain_emission_str) { dap_chain_node_cli_set_reply_text(str_reply, "token_create requires parameter '-chain_emission'"); return -44; - }else { - if ( ( l_chain_emission = dap_chain_net_get_chain_by_name(l_net, l_chain_emission_str ) ) == NULL ){ // Can't find such chain - dap_chain_node_cli_set_reply_text(str_reply, "token_create requires parameter 'chain_emission' to be valid chain name in chain net %s",l_net_str); + } else { + if((l_chain_emission = dap_chain_net_get_chain_by_name(l_net, l_chain_emission_str)) == NULL) { // Can't find such chain + dap_chain_node_cli_set_reply_text(str_reply, + "token_create requires parameter 'chain_emission' to be valid chain name in chain net %s", + l_net_str); return -45; } } @@ -2066,9 +2097,11 @@ int com_token_emit(int argc, const char ** argv, char ** str_reply) if(!l_chain_base_tx_str) { dap_chain_node_cli_set_reply_text(str_reply, "token_create requires parameter 'chain_base_tx'"); return -46; - }else { - if ( ( l_chain_base_tx = dap_chain_net_get_chain_by_name(l_net, l_chain_base_tx_str ) ) == NULL ){ // Can't find such chain - dap_chain_node_cli_set_reply_text(str_reply, "token_create requires parameter 'chain_emission' to be valid chain name in chain net %s",l_net_str); + } else { + if((l_chain_base_tx = dap_chain_net_get_chain_by_name(l_net, l_chain_base_tx_str)) == NULL) { // Can't find such chain + dap_chain_node_cli_set_reply_text(str_reply, + "token_create requires parameter 'chain_emission' to be valid chain name in chain net %s", + l_net_str); return -47; } } @@ -2077,7 +2110,6 @@ int com_token_emit(int argc, const char ** argv, char ** str_reply) char * l_gdb_group_mempool_emission = dap_chain_net_get_gdb_group_mempool(l_chain_emission); char * l_gdb_group_mempool_base_tx = dap_chain_net_get_gdb_group_mempool(l_chain_base_tx); - // Create emission datum dap_chain_datum_token_emission_t * l_token_emission; dap_chain_hash_fast_t l_token_emission_hash; @@ -2148,12 +2180,12 @@ int com_token_emit(int argc, const char ** argv, char ** str_reply) l_key_str = dap_chain_hash_fast_to_str_new(&l_key_hash); DAP_DELETE(l_tx); - // Add to mempool tx token if(dap_chain_global_db_gr_set(l_key_str, (uint8_t *) l_datum_tx, l_datum_tx_size , l_gdb_group_mempool_base_tx)) { - dap_chain_node_cli_set_reply_text(str_reply, "%s\ndatum tx %s is placed in datum pool ", str_reply_tmp, l_key_str); - dap_chain_utxo_tx_add((dap_chain_datum_tx_t*) l_datum_tx->data); + dap_chain_node_cli_set_reply_text(str_reply, "%s\ndatum tx %s is placed in datum pool ", str_reply_tmp, + l_key_str); + dap_chain_ledger_tx_add(l_net->pub.ledger, (dap_chain_datum_tx_t*) l_datum_tx->data); } else { dap_chain_node_cli_set_reply_text(str_reply, "%s\ndatum tx %s is not placed in datum pool ", str_reply_tmp, @@ -2178,6 +2210,7 @@ int com_tx_cond_create(int argc, const char ** argv, char **str_reply) const char *c_wallets_path = dap_config_get_item_str(g_config, "general", "wallets_path"); const char *c_wallet_name_from = "w_tesla"; // where to take coins for service const char *c_wallet_name_cond = "w_picnic"; // who will be use service, usually the same address (addr_from) + const char *c_net_name = "kelvin-testnet"; uint64_t l_value = 50; //debug { @@ -2199,7 +2232,9 @@ int com_tx_cond_create(int argc, const char ** argv, char **str_reply) 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"); - int res = dap_chain_mempool_tx_create_cond(l_key, l_key_cond, addr_from, + dap_ledger_t *l_ledger = dap_chain_ledger_by_net_name((const char *) c_net_name); + + int res = dap_chain_mempool_tx_create_cond(l_ledger, 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)); @@ -2225,11 +2260,14 @@ int com_tx_create(int argc, const char ** argv, char **str_reply) const char *str_tmp = NULL; const char * l_from_wallet_name = NULL; const char * l_token_ticker = NULL; + const char * l_net_name = NULL; + uint64_t value = 0; uint64_t value_fee = 0; dap_chain_node_cli_find_option_val(argv, arg_index, argc, "from_wallet_name", &l_from_wallet_name); dap_chain_node_cli_find_option_val(argv, arg_index, argc, "to_addr", &addr_base58_to); dap_chain_node_cli_find_option_val(argv, arg_index, argc, "token", &l_token_ticker); + dap_chain_node_cli_find_option_val(argv, arg_index, argc, "net", &l_net_name); if(dap_chain_node_cli_find_option_val(argv, arg_index, argc, "fee", &addr_base58_fee)) { if(dap_chain_node_cli_find_option_val(argv, arg_index, argc, "value_fee", &str_tmp)) { @@ -2256,6 +2294,18 @@ int com_tx_create(int argc, const char ** argv, char **str_reply) return -1; } + dap_ledger_t *l_ledger = dap_chain_ledger_by_net_name((const char *) l_net_name); + if(!l_net_name) { + dap_chain_node_cli_set_reply_text(str_reply, "tx_create requires parameter 'net'"); + return -1; + } + else { + if((l_ledger = dap_chain_ledger_by_net_name(l_net_name)) == NULL) { + dap_chain_node_cli_set_reply_text(str_reply, "not found net by name '%s'", l_net_name); + return -1; + } + } + const char *c_wallets_path = dap_config_get_item_str(g_config, "general", "wallets_path"); dap_chain_wallet_t * l_wallet = dap_chain_wallet_open(l_from_wallet_name, c_wallets_path); @@ -2284,7 +2334,7 @@ int com_tx_create(int argc, const char ** argv, char **str_reply) //g_string_printf(string_ret, "from=%s\nto=%s\nval=%lld\nfee=%s\nval_fee=%lld\n\n", // addr_base58_from, addr_base58_to, value, addr_base58_fee, value_fee); - int res = dap_chain_mempool_tx_create(dap_chain_wallet_get_key(l_wallet, 0), addr_from, addr_to, addr_fee, + int res = dap_chain_mempool_tx_create(l_ledger, dap_chain_wallet_get_key(l_wallet, 0), addr_from, addr_to, addr_fee, l_token_ticker, value, value_fee); dap_string_append_printf(string_ret, "transfer=%s\n", (res == 0) ? "Ok" : (res == -2) ? "False, not enough funds for transfer" : "False"); diff --git a/dap_chain_node_cli_cmd.h b/dap_chain_node_cli_cmd.h index 98b77ac556cf053ef74c9fc6ab547995011e5ad9..999ac25f74aba9ff61decdaebfea58979512dce1 100644 --- a/dap_chain_node_cli_cmd.h +++ b/dap_chain_node_cli_cmd.h @@ -1,26 +1,27 @@ /* * Authors: * Dmitriy A. Gearasimov <gerasimov.dmitriy@demlabs.net> + * Alexander Lysikov <alexander.lysikov@demlabs.net> * DeM Labs Inc. https://demlabs.net * Kelvin Project https://github.com/kelvinblockchain - * Copyright (c) 2017-2019 + * Copyright (c) 2019 * All rights reserved. This file is part of DAP (Deus Applications Prototypes) the open source project - DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. + DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. - DAP is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + DAP is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with any DAP based project. If not, see <http://www.gnu.org/licenses/>. -*/ + You should have received a copy of the GNU General Public License + along with any DAP based project. If not, see <http://www.gnu.org/licenses/>. + */ #pragma once