diff --git a/dap-sdk/crypto/include/dap_enc_base58.h b/dap-sdk/crypto/include/dap_enc_base58.h index b3caeb682062d1a9050a885b66b72c6179d13500..8392fb617e0f0c29a391484feaddb65a4e9193fe 100755 --- a/dap-sdk/crypto/include/dap_enc_base58.h +++ b/dap-sdk/crypto/include/dap_enc_base58.h @@ -27,6 +27,7 @@ #include <stddef.h> #include <stdint.h> #include "dap_enc_key.h" +#include "dap_hash.h" #ifdef __cplusplus extern "C" { #endif @@ -40,6 +41,13 @@ extern "C" { size_t dap_enc_base58_encode(const void * a_in, size_t a_in_size, char * a_out); size_t dap_enc_base58_decode(const char * a_in, void * a_out); +char* dap_enc_base58_encode_to_str(const void * a_in, size_t a_in_size); +char* dap_enc_base58_encode_hash_to_str(dap_chain_hash_fast_t *a_in_hash); +// convert from "0xA21F1E865B6740A28E8708798ECF25D2C0AA596DF5EB1FD724186B6AD7FF2199" to "Bura1HFrKsqbdytEXQVrxpbovtvLhR1VbrJs65JBx3gc" +char* dap_enc_base58_from_hex_str_to_str(const char *a_in_str); +// convert from "Bura1HFrKsqbdytEXQVrxpbovtvLhR1VbrJs65JBx3gc" to "0xA21F1E865B6740A28E8708798ECF25D2C0AA596DF5EB1FD724186B6AD7FF2199" +char* dap_enc_base58_to_hex_str_from_str(const char *a_in_str); + #ifdef __cplusplus } #endif diff --git a/dap-sdk/crypto/src/dap_enc_base58.c b/dap-sdk/crypto/src/dap_enc_base58.c index 8549457a15969a8f279de36c18475ef5fd31efb1..a8538a9b97132b8758bf6d5819c6d7d8872e01d4 100755 --- a/dap-sdk/crypto/src/dap_enc_base58.c +++ b/dap-sdk/crypto/src/dap_enc_base58.c @@ -192,6 +192,67 @@ size_t dap_enc_base58_encode(const void * a_in, size_t a_in_size, char * a_out) return l_out_size; } +/** + * @brief dap_enc_base58_encode_to_str Encode to base58 and convert to string like '0xXXXXXXXXXXXXXXX' + * @param a_in + * @param a_in_size + * @return allocated string or NULL if error + */ +char* dap_enc_base58_encode_to_str(const void * a_in, size_t a_in_size) +{ + size_t l_out_size = DAP_ENC_BASE58_ENCODE_SIZE (a_in_size); + char * l_out = DAP_NEW_Z_SIZE(char, l_out_size + 1);//+ 3); no prefix needed + size_t l_size = dap_enc_base58_encode(a_in, a_in_size, l_out);//l_out+2); no prefix needed + if(!l_size || !l_out){ + DAP_DELETE(l_out); + return NULL; + } + // no prefix needed + // memcpy(l_out, "0x", 2); + return l_out; +} +char* dap_enc_base58_encode_hash_to_str(dap_chain_hash_fast_t *a_in_hash) +{ + return dap_enc_base58_encode_to_str(a_in_hash->raw, sizeof(dap_chain_hash_fast_t)); +} +// convert from "0xA21F1E865B6740A28E8708798ECF25D2C0AA596DF5EB1FD724186B6AD7FF2199" to "Bura1HFrKsqbdytEXQVrxpbovtvLhR1VbrJs65JBx3gc" +char* dap_enc_base58_from_hex_str_to_str(const char *a_in_str) +{ + size_t a_in_hash_len = dap_strlen(a_in_str); + if(a_in_hash_len<3 || dap_strncmp(a_in_str,"0x",2)) + return NULL; + // from "0x..." to binary + char *l_out_str = DAP_NEW_Z_SIZE(char, a_in_hash_len / 2 + 1); + size_t len = dap_hex2bin(l_out_str, a_in_str+2, a_in_hash_len-2); + // from binary to base58 + char *l_base58_out = dap_enc_base58_encode_to_str(l_out_str, len/2); + DAP_DELETE(l_out_str); + return l_base58_out; +} +// convert from "Bura1HFrKsqbdytEXQVrxpbovtvLhR1VbrJs65JBx3gc" to "0xA21F1E865B6740A28E8708798ECF25D2C0AA596DF5EB1FD724186B6AD7FF2199" +char* dap_enc_base58_to_hex_str_from_str(const char *a_in_str) +{ + size_t a_in_hash_len = dap_strlen(a_in_str); + if(a_in_hash_len < 8) + return NULL; + // from base58 to binary + size_t l_out_size_max = DAP_ENC_BASE58_DECODE_SIZE(a_in_hash_len); + void * l_out = DAP_NEW_Z_SIZE(char, l_out_size_max + 1); + size_t l_out_size = dap_enc_base58_decode( a_in_str, l_out); + // dap_htoa64() requires a multiple of 8 bytes + if(l_out_size < 8 || l_out_size%8){ + DAP_DELETE(l_out); + return NULL; + } + // from binary to "0x..." + size_t l_out_str_size = l_out_size * 2 + 3; + char* l_out_str = DAP_NEW_Z_SIZE(char, l_out_str_size); + l_out_str[0] = '0'; + l_out_str[1] = 'x'; + dap_htoa64((l_out_str + 2), l_out, l_out_size); + DAP_DELETE(l_out); + return l_out_str; +} diff --git a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c index ed9a1d1ffeba618a22e9f045a25838fdf314e600..ac632bf6be2fc51c38ce3ee651cd95e6abffeba6 100644 --- a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c +++ b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c @@ -35,6 +35,7 @@ #include "dap_common.h" #include "dap_strfuncs.h" +#include "dap_enc_base58.h" #include "dap_chain_net.h" #include "dap_chain_node_cli.h" #include "dap_chain_node_cli_cmd.h" @@ -82,7 +83,7 @@ int dap_chain_cs_dag_poa_init(void) dap_chain_cs_add ("dag_poa", s_callback_new ); s_seed_mode = dap_config_get_item_bool_default(g_config,"general","seed_mode",false); dap_chain_node_cli_cmd_item_create ("dag_poa", s_cli_dag_poa, NULL, "DAG PoA commands", - "dag_poa -net <chain net name> -chain <chain name> event sign -event <event hash>\n" + "dag_poa -net <chain net name> -chain <chain name> event sign -event <event hash> [-H hex|base58(default)]\n" "\tSign event <event hash> in the new round pool with its authorize certificate\n\n"); return 0; @@ -112,6 +113,16 @@ static int s_cli_dag_poa(int argc, char ** argv, void *arg_func, char **a_str_re int arg_index = 1; dap_chain_net_t * l_chain_net = NULL; dap_chain_t * l_chain = NULL; + + const char * l_hash_out_type = NULL; + dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-H", &l_hash_out_type); + if(!l_hash_out_type) + l_hash_out_type = "base58"; + 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>"); + return -1; + } + dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index,argc,argv,a_str_reply,&l_chain,&l_chain_net); dap_chain_cs_dag_t * l_dag = DAP_CHAIN_CS_DAG(l_chain); @@ -128,6 +139,18 @@ static int s_cli_dag_poa(int argc, char ** argv, void *arg_func, char **a_str_re dap_chain_node_cli_find_option_val(argv, arg_index, argc, "event", &l_event_cmd_str); dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-event", &l_event_hash_str); + // event hash may be in hex or base58 format + char *l_event_hash_hex_str; + char *l_event_hash_base58_str; + if(!dap_strncmp(l_event_hash_str, "0x", 2) || !dap_strncmp(l_event_hash_str, "0X", 2)) { + l_event_hash_hex_str = dap_strdup(l_event_hash_str); + l_event_hash_base58_str = dap_enc_base58_from_hex_str_to_str(l_event_hash_str); + } + else { + l_event_hash_hex_str = dap_enc_base58_to_hex_str_from_str(l_event_hash_str); + l_event_hash_base58_str = dap_strdup(l_event_hash_str); + } + if ( l_event_cmd_str != NULL ){ if (l_poa_pvt->events_sign_cert ) ret = -1; @@ -135,7 +158,7 @@ static int s_cli_dag_poa(int argc, char ** argv, void *arg_func, char **a_str_re char * l_gdb_group_events = l_dag->gdb_group_events_round_new; size_t l_event_size = 0; dap_chain_cs_dag_event_t * l_event; - if ( (l_event = (dap_chain_cs_dag_event_t*) dap_chain_global_db_gr_get( l_event_hash_str , + if ( (l_event = (dap_chain_cs_dag_event_t*) dap_chain_global_db_gr_get( dap_strdup(l_event_hash_hex_str), &l_event_size, l_gdb_group_events )) == NULL ){ dap_chain_node_cli_set_reply_text(a_str_reply, "Can't find event in round.new - only place where could be signed the new event\n", @@ -146,26 +169,45 @@ static int s_cli_dag_poa(int argc, char ** argv, void *arg_func, char **a_str_re dap_chain_hash_fast_t l_event_new_hash; dap_chain_cs_dag_event_calc_hash(l_event_new,&l_event_new_hash); //size_t l_event_new_size = dap_chain_cs_dag_event_calc_size(l_event_new); - char * l_event_new_hash_str = dap_chain_hash_fast_to_str_new(&l_event_new_hash); - if (dap_chain_global_db_gr_set( dap_strdup(l_event_new_hash_str),(uint8_t*) l_event,l_event_size,l_gdb_group_events) ){ - if ( dap_chain_global_db_gr_del(dap_strdup(l_event_hash_str),l_gdb_group_events) ) { // Delete old event - dap_chain_node_cli_set_reply_text(a_str_reply, "Added new sign with cert \"%s\", event %s placed back in round.new\n", - l_poa_pvt->events_sign_cert->name ,l_event_new_hash_str); + char * l_event_new_hash_hex_str = dap_chain_hash_fast_to_str_new(&l_event_new_hash); + char * l_event_new_hash_base58_str = dap_enc_base58_encode_hash_to_str(&l_event_new_hash); + //char * l_event_new_hash_base58_str = dap_enc_base58_from_hex_str_to_str(l_event_new_hash_hex_str); + if (dap_chain_global_db_gr_set( dap_strdup(l_event_new_hash_hex_str),(uint8_t*) l_event,l_event_size,l_gdb_group_events) ){ + if ( dap_chain_global_db_gr_del(dap_strdup(l_event_hash_hex_str),l_gdb_group_events) ) { // Delete old event + if(!dap_strcmp(l_hash_out_type, "hex")) { + dap_chain_node_cli_set_reply_text(a_str_reply, + "Added new sign with cert \"%s\", event %s placed back in round.new\n", + l_poa_pvt->events_sign_cert->name, l_event_new_hash_hex_str); + } + else { + dap_chain_node_cli_set_reply_text(a_str_reply, + "Added new sign with cert \"%s\", event %s placed back in round.new\n", + l_poa_pvt->events_sign_cert->name, l_event_new_hash_base58_str); + } ret = 0; dap_chain_net_sync_gdb(l_chain_net); // Propagate changes in pool }else { ret = 1; dap_chain_node_cli_set_reply_text(a_str_reply, "Added new sign with cert \"%s\", event %s placed back in round.new\n" - "WARNING! Old event %s with same datum is still in round.new, produced DUP!\n" - , - l_poa_pvt->events_sign_cert->name ,l_event_new_hash_str, l_event_hash_str); + "WARNING! Old event %s with same datum is still in round.new, produced DUP!\n", + l_poa_pvt->events_sign_cert->name ,l_event_new_hash_hex_str, l_event_hash_str); } }else { - dap_chain_node_cli_set_reply_text(a_str_reply, "GDB Error: Can't place event %s with new sign back in round.new\n", - l_event_new_hash_str); + if(!dap_strcmp(l_hash_out_type, "hex")) { + dap_chain_node_cli_set_reply_text(a_str_reply, + "GDB Error: Can't place event %s with new sign back in round.new\n", + l_event_new_hash_hex_str); + } + else { + dap_chain_node_cli_set_reply_text(a_str_reply, + "GDB Error: Can't place event %s with new sign back in round.new\n", + l_event_new_hash_base58_str); + } ret=-31; + } - DAP_DELETE(l_event_new_hash_str); + DAP_DELETE(l_event_new_hash_hex_str); + DAP_DELETE(l_event_new_hash_base58_str); } DAP_DELETE( l_gdb_group_events ); DAP_DELETE(l_event); diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index 5a9025d903b6abd49d6bdfa932643094081b727e..f208c1eaa5774bc90f506f7d6e2d57ef8738f44b 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -1041,7 +1041,7 @@ int dap_chain_net_init() "\tAdd certificate to list of authority cetificates in GDB group\n" "net -net <chain net name> ca list\n" "\tPrint list of authority cetificates from GDB group\n" - "net -net <chain net name> ca del -hash <cert hash>\n" + "net -net <chain net name> ca del -hash <cert hash> [-H hex|base58(default)]\n" "\tDelete certificate from list of authority cetificates in GDB group by it's hash\n" ); s_seed_mode = dap_config_get_item_bool_default(g_config,"general","seed_mode",false); @@ -1139,6 +1139,15 @@ static int s_cli_net( int argc, char **argv, void *arg_func, char **a_str_reply) int arg_index = 1; dap_chain_net_t * l_net = NULL; + const char * l_hash_out_type = NULL; + dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-H", &l_hash_out_type); + if(!l_hash_out_type) + l_hash_out_type = "base58"; + 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>"); + return -1; + } + // command 'net list' if(dap_chain_node_cli_find_option_val(argv, arg_index, argc, "list", NULL) == arg_index) { @@ -1313,12 +1322,28 @@ static int s_cli_net( int argc, char **argv, void *arg_func, char **a_str_reply) } else if (l_ca_str) { if (strcmp(l_ca_str, "add") == 0 ) { const char *l_cert_string = NULL, *l_hash_string = NULL; + + + dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-cert", &l_cert_string); dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-hash", &l_hash_string); + if (!l_cert_string && !l_hash_string) { dap_chain_node_cli_set_reply_text(a_str_reply, "One of -cert or -hash parameters is mandatory"); return -6; } + char *l_hash_hex_str; + //char *l_hash_base58_str; + // hash may be in hex or base58 format + if(!dap_strncmp(l_hash_string, "0x", 2) || !dap_strncmp(l_hash_string, "0X", 2)) { + l_hash_hex_str = dap_strdup(l_hash_string); + //l_hash_base58_str = dap_enc_base58_from_hex_str_to_str(l_hash_string); + } + else { + l_hash_hex_str = dap_enc_base58_to_hex_str_from_str(l_hash_string); + //l_hash_base58_str = dap_strdup(l_hash_string); + } + if (l_cert_string) { dap_cert_t * l_cert = dap_cert_find_by_name(l_cert_string); if (l_cert == NULL) { @@ -1338,7 +1363,8 @@ static int s_cli_net( int argc, char **argv, void *arg_func, char **a_str_reply) } dap_chain_hash_fast_t l_pkey_hash; dap_hash_fast(l_pub_key, l_pub_key_size, &l_pkey_hash); - l_hash_string = dap_chain_hash_fast_to_str_new(&l_pkey_hash); + l_hash_hex_str = dap_chain_hash_fast_to_str_new(&l_pkey_hash); + //l_hash_base58_str = dap_enc_base58_encode_hash_to_str(&l_pkey_hash); } const char c = '1'; char *l_gdb_group_str = dap_chain_net_get_gdb_group_acl(l_net); @@ -1346,8 +1372,9 @@ static int s_cli_net( int argc, char **argv, void *arg_func, char **a_str_reply) dap_chain_node_cli_set_reply_text(a_str_reply, "Database ACL group not defined for this network"); return -11; } - ret = dap_chain_global_db_gr_set(dap_strdup(l_hash_string), (void *)&c, 1, dap_chain_net_get_gdb_group_acl(l_net)); + ret = dap_chain_global_db_gr_set(dap_strdup(l_hash_hex_str), (void *)&c, 1, dap_chain_net_get_gdb_group_acl(l_net)); DAP_DELETE(l_gdb_group_str); + DAP_DELETE(l_hash_hex_str); if (!ret) { dap_chain_node_cli_set_reply_text(a_str_reply, "Can't save public key hash in database"); return -10; @@ -2341,7 +2368,7 @@ int dap_chain_net_verify_datum_for_add(dap_chain_net_t *a_net, dap_chain_datum_t * @param a_str_out * @param a_datum */ -void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_datum) +void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_datum, const char *a_hash_out_type) { if( a_datum == NULL){ dap_string_append_printf(a_str_out,"==Datum is NULL\n"); @@ -2401,8 +2428,11 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da break; case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SIGNS_ADD : if(l_tsd->size == sizeof(dap_chain_hash_fast_t) ){ - char *l_hash_str = dap_chain_hash_fast_to_str_new( - (dap_chain_hash_fast_t*) l_tsd->data ); + char *l_hash_str; + if(!dap_strcmp(a_hash_out_type, "hex")) + l_hash_str = dap_chain_hash_fast_to_str_new((dap_chain_hash_fast_t*) l_tsd->data); + else + l_hash_str = dap_enc_base58_encode_hash_to_str((dap_chain_hash_fast_t*) l_tsd->data); dap_string_append_printf(a_str_out,"total_signs_add: %s\n", l_hash_str ); DAP_DELETE( l_hash_str ); }else @@ -2410,8 +2440,11 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da break; case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SIGNS_REMOVE : if(l_tsd->size == sizeof(dap_chain_hash_fast_t) ){ - char *l_hash_str = dap_chain_hash_fast_to_str_new( - (dap_chain_hash_fast_t*) l_tsd->data ); + char *l_hash_str; + if(!dap_strcmp(a_hash_out_type,"hex")) + l_hash_str = dap_chain_hash_fast_to_str_new((dap_chain_hash_fast_t*) l_tsd->data); + else + l_hash_str = dap_enc_base58_encode_hash_to_str((dap_chain_hash_fast_t*) l_tsd->data); dap_string_append_printf(a_str_out,"total_signs_remove: %s\n", l_hash_str ); DAP_DELETE( l_hash_str ); }else diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c index 8e79e0e6a3eb1db6076d153ea77991f539a40ab7..850dcd100476ad7431ad45fbb6db2b03d84bf6ee 100644 --- a/modules/net/dap_chain_node_cli_cmd.c +++ b/modules/net/dap_chain_node_cli_cmd.c @@ -66,6 +66,7 @@ #include "dap_cert.h" #include "dap_cert_file.h" #include "dap_file_utils.h" +#include "dap_enc_base58.h" #include "dap_chain_wallet.h" #include "dap_chain_node.h" #include "dap_chain_global_db.h" @@ -1778,16 +1779,25 @@ int com_token_decl_sign(int argc, char ** argv, void *arg_func, char ** a_str_re { int arg_index = 1; + const char * l_hash_out_type = NULL; + dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-H", &l_hash_out_type); + if(!l_hash_out_type) + l_hash_out_type = "base58"; + 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>"); + return -1; + } + const char * l_datum_hash_str = NULL; // Chain name dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-datum", &l_datum_hash_str); - if(l_datum_hash_str) { + char * l_datum_hash_hex_str = NULL; + char * l_datum_hash_base58_str = NULL; const char * l_certs_str = NULL; dap_cert_t ** l_certs = NULL; size_t l_certs_count = 0; dap_chain_t * l_chain; - dap_chain_net_t * l_net = NULL; dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index, argc, argv, a_str_reply, &l_chain, &l_net); @@ -1817,14 +1827,28 @@ int com_token_decl_sign(int argc, char ** argv, void *arg_func, char ** a_str_re if(!l_gdb_group_mempool) { l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool_by_chain_type(l_net, CHAIN_TYPE_TOKEN); } + // datum hash may be in hex or base58 format + if(!dap_strncmp(l_datum_hash_str, "0x", 2) || !dap_strncmp(l_datum_hash_str, "0X", 2)) { + l_datum_hash_hex_str = dap_strdup(l_datum_hash_str); + l_datum_hash_base58_str = dap_enc_base58_from_hex_str_to_str(l_datum_hash_str); + } + else { + l_datum_hash_hex_str = dap_enc_base58_to_hex_str_from_str(l_datum_hash_str); + l_datum_hash_base58_str = dap_strdup(l_datum_hash_str); + } + const char *l_datum_hash_out_str; + if(!dap_strcmp(l_hash_out_type,"hex")) + l_datum_hash_out_str = l_datum_hash_hex_str; + else + l_datum_hash_out_str = l_datum_hash_base58_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); + l_gdb_group_mempool, l_datum_hash_hex_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) { + l_datum_hash_hex_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) { @@ -1839,10 +1863,10 @@ int com_token_decl_sign(int argc, char ** argv, void *arg_func, char ** a_str_re dap_sign_t * l_sign = (dap_sign_t *) l_datum_token->data_n_tsd + l_offset; l_offset += dap_sign_get_size(l_sign); if( dap_sign_verify(l_sign, l_datum_token, sizeof(l_datum_token->header_private)) != 1) { - log_it(L_WARNING, "Wrong signature %u for datum_token with key %s in mempool!", l_signs_count, l_datum_hash_str); + log_it(L_WARNING, "Wrong signature %u for datum_token with key %s in mempool!", l_signs_count, l_datum_hash_out_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 ); + l_datum_hash_out_str, l_signs_count ); DAP_DELETE(l_datum); //DAP_DELETE(l_datum_token); DAP_DELETE(l_gdb_group_mempool); @@ -1851,8 +1875,7 @@ int com_token_decl_sign(int argc, char ** argv, void *arg_func, char ** a_str_re log_it(L_DEBUG,"Sign %lu passed",l_signs_count); } } - log_it(L_DEBUG, "Datum %s with token declaration: %u signatures are verified well (sign_size = %u)",l_datum_hash_str, - l_signs_count, l_signs_size); + log_it(L_DEBUG, "Datum %s with token declaration: %u signatures are verified well (sign_size = %u)", l_datum_hash_out_str, l_signs_count, l_signs_size); // Check if all signs are present if(l_signs_count == l_datum_token->header_private.signs_total) { @@ -1907,16 +1930,22 @@ int com_token_decl_sign(int argc, char ** argv, void *arg_func, char ** a_str_re dap_chain_hash_fast_t l_key_hash={0}; 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); + char * l_key_str_base58 = dap_enc_base58_encode_hash_to_str(&l_key_hash); + const char * l_key_out_str; + if(!dap_strcmp(l_hash_out_type,"hex")) + l_key_out_str = l_key_str; + else + l_key_out_str = l_key_str_base58; // Add datum to mempool with datum_token hash as a key if(dap_chain_global_db_gr_set(dap_strdup(l_key_str), (uint8_t *) l_datum, l_datum_size, l_gdb_group_mempool)) { - char* l_hash_str = strdup(l_datum_hash_str); + char* l_hash_str = l_datum_hash_hex_str; // Remove old datum from pool if( dap_chain_global_db_gr_del( dap_strdup(l_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); + l_key_out_str, l_datum_hash_out_str, l_datum_hash_out_str); DAP_DELETE(l_datum); //DAP_DELETE(l_datum_token); @@ -1925,7 +1954,7 @@ int com_token_decl_sign(int argc, char ** argv, void *arg_func, char ** a_str_re } 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); + l_datum_hash_out_str, l_key_out_str); DAP_DELETE(l_datum); //DAP_DELETE(l_datum_token); DAP_DELETE(l_gdb_group_mempool); @@ -1933,15 +1962,17 @@ int com_token_decl_sign(int argc, char ** argv, void *arg_func, char ** a_str_re } DAP_DELETE(l_hash_str); DAP_DELETE(l_key_str); + DAP_DELETE(l_key_str_base58); } 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); + l_key_out_str, l_datum_hash_out_str); DAP_DELETE(l_datum); //DAP_DELETE(l_datum_token); DAP_DELETE(l_gdb_group_mempool); DAP_DELETE(l_key_str); + DAP_DELETE(l_key_str_base58); return -2; } @@ -1958,17 +1989,19 @@ int com_token_decl_sign(int argc, char ** argv, void *arg_func, char ** a_str_re } } 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_datum_hash_str, l_net->pub.name, + "token_decl_sign can't find datum with %s hash in the mempool of %s:%s",l_datum_hash_out_str, l_net->pub.name, l_chain->name); return -5; } + DAP_DELETE(l_datum_hash_hex_str); + DAP_DELETE(l_datum_hash_base58_str); } else { dap_chain_node_cli_set_reply_text(a_str_reply, "token_decl_sign need datum <datum hash> argument"); return -2; } } -void s_com_mempool_list_print_for_chain(const dap_chain_net_t * a_net, const dap_chain_t * a_chain, dap_string_t * a_str_tmp){ +void s_com_mempool_list_print_for_chain(const dap_chain_net_t * a_net, const dap_chain_t * a_chain, dap_string_t * a_str_tmp, const char *a_hash_out_type){ char * l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool(a_chain); if(!l_gdb_group_mempool){ dap_string_append_printf(a_str_tmp, "%s.%s: chain not found\n", a_net->pub.name, a_chain->name); @@ -1983,12 +2016,19 @@ void s_com_mempool_list_print_for_chain(const dap_chain_net_t * a_net, const dap 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]; + char * l_key; + if(!dap_strcmp(a_hash_out_type,"hex")) + // hex format + l_key = dap_strdup(l_objs[i].key); + else + // base58 format + l_key = dap_enc_base58_from_hex_str_to_str(l_objs[i].key); time_t l_ts_create = (time_t) l_datum->header.ts_create; - dap_string_append_printf(a_str_tmp, "%s: type_id=%s data_size=%u ts_create=%s", // \n included in timestamp - l_objs[i].key, c_datum_type_str[l_datum->header.type_id], + dap_string_append_printf(a_str_tmp, "hash %s: type_id=%s data_size=%u ts_create=%s", // \n included in timestamp + l_key, c_datum_type_str[l_datum->header.type_id], l_datum->header.data_size, ctime_r(&l_ts_create, buf)); - - dap_chain_net_dump_datum(a_str_tmp, l_datum); + DAP_DELETE(l_key); + dap_chain_net_dump_datum(a_str_tmp, l_datum, a_hash_out_type); } dap_chain_global_db_objs_delete(l_objs, l_objs_size); @@ -2011,6 +2051,15 @@ int com_mempool_list(int argc, char ** argv, void *arg_func, char ** a_str_reply dap_chain_t * l_chain = NULL; dap_chain_net_t * l_net = NULL; + const char * l_hash_out_type = NULL; + dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-H", &l_hash_out_type); + if(!l_hash_out_type) + l_hash_out_type = "base58"; + 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>"); + return -1; + } + dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index, argc, argv, a_str_reply, &l_chain, &l_net); if(!l_net) return -1; @@ -2025,10 +2074,10 @@ int com_mempool_list(int argc, char ** argv, void *arg_func, char ** a_str_reply dap_string_t * l_str_tmp = dap_string_new(NULL); if(l_chain) - s_com_mempool_list_print_for_chain(l_net, l_chain, l_str_tmp); + s_com_mempool_list_print_for_chain(l_net, l_chain, l_str_tmp, l_hash_out_type); else DL_FOREACH(l_net->pub.chains, l_chain) - s_com_mempool_list_print_for_chain(l_net, l_chain, l_str_tmp); + s_com_mempool_list_print_for_chain(l_net, l_chain, l_str_tmp, l_hash_out_type); dap_chain_node_cli_set_reply_text(a_str_reply, l_str_tmp->str); dap_string_free(l_str_tmp, false); @@ -2055,9 +2104,17 @@ int com_mempool_delete(int argc, char ** argv, void *arg_func, char ** a_str_rep dap_chain_t * l_chain = NULL; dap_chain_net_t * l_net = NULL; + const char * l_hash_out_type = NULL; + dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-H", &l_hash_out_type); + if(!l_hash_out_type) + l_hash_out_type = "base58"; + 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>"); + return -1; + } + 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"); + //dap_chain_node_cli_set_reply_text(a_str_reply, "Error! Need both -net <network name> and -chain <chain name> params\n"); return -1; } @@ -2065,15 +2122,36 @@ int com_mempool_delete(int argc, char ** argv, void *arg_func, char ** a_str_rep 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) { + char *l_datum_hash_hex_str; + char *l_datum_hash_base58_str; + // datum hash may be in hex or base58 format + if(!dap_strncmp(l_datum_hash_str, "0x", 2) || !dap_strncmp(l_datum_hash_str, "0X", 2)) { + l_datum_hash_hex_str = dap_strdup(l_datum_hash_str); + l_datum_hash_base58_str = dap_enc_base58_from_hex_str_to_str(l_datum_hash_str); + } + else { + l_datum_hash_hex_str = dap_enc_base58_to_hex_str_from_str(l_datum_hash_str); + l_datum_hash_base58_str = dap_strdup(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(strdup(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); + uint8_t *l_data_tmp = l_datum_hash_hex_str ? dap_chain_global_db_gr_get(dap_strdup(l_datum_hash_hex_str), NULL, l_gdb_group_mempool) : NULL; + if(l_data_tmp && dap_chain_global_db_gr_del(dap_strdup(l_datum_hash_hex_str), l_gdb_group_mempool)) { + if(!dap_strcmp(l_hash_out_type,"hex")) + dap_chain_node_cli_set_reply_text(a_str_reply, "Datum %s deleted", l_datum_hash_hex_str); + else + dap_chain_node_cli_set_reply_text(a_str_reply, "Datum %s deleted", l_datum_hash_base58_str); return 0; } else { - dap_chain_node_cli_set_reply_text(a_str_reply, "Error! Can't find datum %s", l_datum_hash_str); + if(!dap_strcmp(l_hash_out_type,"hex")) + dap_chain_node_cli_set_reply_text(a_str_reply, "Error! Can't find datum %s", l_datum_hash_hex_str); + else + dap_chain_node_cli_set_reply_text(a_str_reply, "Error! Can't find datum %s", l_datum_hash_base58_str); return -4; } DAP_DELETE(l_gdb_group_mempool); + DAP_DELETE(l_data_tmp); + DAP_DELETE(l_datum_hash_hex_str); + DAP_DELETE(l_datum_hash_base58_str); } else { dap_chain_node_cli_set_reply_text(a_str_reply, "Error! %s requires -datum <datum hash> option", argv[0]); return -3; @@ -2099,6 +2177,15 @@ int com_mempool_proc(int argc, char ** argv, void *arg_func, char ** a_str_reply dap_chain_t * l_chain = NULL; dap_chain_net_t * l_net = NULL; + const char * l_hash_out_type = NULL; + dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-H", &l_hash_out_type); + if(!l_hash_out_type) + l_hash_out_type = "base58"; + 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>"); + return -1; + } + dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index, argc, argv, a_str_reply, &l_chain, &l_net); if(!l_net) return -1; @@ -2121,8 +2208,25 @@ int com_mempool_proc(int argc, char ** argv, void *arg_func, char ** a_str_reply 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_datum_size=0; - dap_chain_datum_t * l_datum = (dap_chain_datum_t*) dap_chain_global_db_gr_get(l_datum_hash_str, - &l_datum_size, l_gdb_group_mempool); + const char *l_datum_hash_out_str; + char *l_datum_hash_hex_str; + char *l_datum_hash_base58_str; + // datum hash may be in hex or base58 format + if(!dap_strncmp(l_datum_hash_str, "0x", 2) || !dap_strncmp(l_datum_hash_str, "0X", 2)) { + l_datum_hash_hex_str = dap_strdup(l_datum_hash_str); + l_datum_hash_base58_str = dap_enc_base58_from_hex_str_to_str(l_datum_hash_str); + } + else { + l_datum_hash_hex_str = dap_enc_base58_to_hex_str_from_str(l_datum_hash_str); + l_datum_hash_base58_str = dap_strdup(l_datum_hash_str); + } + if(!dap_strcmp(l_hash_out_type,"hex")) + l_datum_hash_out_str = l_datum_hash_hex_str; + else + l_datum_hash_out_str = l_datum_hash_base58_str; + + dap_chain_datum_t * l_datum = l_datum_hash_hex_str ? (dap_chain_datum_t*) dap_chain_global_db_gr_get(l_datum_hash_hex_str, + &l_datum_size, l_gdb_group_mempool) : NULL; size_t l_datum_size2= l_datum? dap_chain_datum_size( l_datum): 0; if (l_datum_size != l_datum_size2 ){ ret = -8; @@ -2132,8 +2236,8 @@ int com_mempool_proc(int argc, char ** argv, void *arg_func, char ** a_str_reply if(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_datum_hash_str, c_datum_type_str[l_datum->header.type_id], + dap_string_append_printf(l_str_tmp, "hash %s: type_id=%s ts_create=%s data_size=%u\n", + l_datum_hash_out_str, c_datum_type_str[l_datum->header.type_id], ctime_r(&l_ts_create, buf), l_datum->header.data_size); int l_verify_datum= dap_chain_net_verify_datum_for_add( l_net, l_datum) ; if (l_verify_datum != 0){ @@ -2147,7 +2251,7 @@ int com_mempool_proc(int argc, char ** argv, void *arg_func, char ** a_str_reply ret = -6; }else{ dap_string_append_printf(l_str_tmp, "Datum processed well. "); - if (!dap_chain_global_db_gr_del( dap_strdup(l_datum_hash_str), l_gdb_group_mempool)){ + if (!dap_chain_global_db_gr_del( dap_strdup(l_datum_hash_hex_str), l_gdb_group_mempool)){ dap_string_append_printf(l_str_tmp, "Warning! Can't delete datum from mempool!"); }else dap_string_append_printf(l_str_tmp, "Removed datum from mempool."); @@ -2166,6 +2270,8 @@ int com_mempool_proc(int argc, char ** argv, void *arg_func, char ** a_str_reply } } DAP_DELETE(l_gdb_group_mempool); + DAP_DELETE(l_datum_hash_hex_str); + DAP_DELETE(l_datum_hash_base58_str); } else { dap_chain_node_cli_set_reply_text(a_str_reply, "Error! %s requires -datum <datum hash> option", argv[0]); ret = -5; @@ -2222,7 +2328,7 @@ int com_mempool_proc(int argc, char ** argv, void *arg_func, char ** a_str_reply "\t -tx_sender_blocked_remove <value>:\t Remove tx sender(s) from blocked\n" "\n" */ -int com_token_update(int argc, char ** argv, void *arg_func, char ** a_str_reply) +int com_token_update(int a_argc, char ** a_argv, void *a_arg_func, char ** a_str_reply) { int l_arg_index = 1; @@ -2248,7 +2354,16 @@ int com_token_update(int argc, char ** argv, void *arg_func, char ** a_str_reply dap_chain_t * l_chain = NULL; dap_chain_net_t * l_net = NULL; - dap_chain_node_cli_cmd_values_parse_net_chain(&l_arg_index, argc, argv, a_str_reply, &l_chain, &l_net); + const char * l_hash_out_type = NULL; + dap_chain_node_cli_find_option_val(a_argv, l_arg_index, a_argc, "-H", &l_hash_out_type); + if(!l_hash_out_type) + l_hash_out_type = "base58"; + 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>"); + return -1; + } + + dap_chain_node_cli_cmd_values_parse_net_chain(&l_arg_index, a_argc, a_argv, a_str_reply, &l_chain, &l_net); if(!l_net) return -1; else { @@ -2258,7 +2373,7 @@ int com_token_update(int argc, char ** argv, void *arg_func, char ** a_str_reply } } // Token ticker - l_arg_index=dap_chain_node_cli_find_option_val(argv, l_arg_index, argc, "-token", &l_ticker); + l_arg_index=dap_chain_node_cli_find_option_val(a_argv, l_arg_index, a_argc, "-token", &l_ticker); // Check for ticker if(!l_ticker) { dap_chain_node_cli_set_reply_text(a_str_reply, "token_update requires parameter 'token'"); @@ -2266,7 +2381,7 @@ int com_token_update(int argc, char ** argv, void *arg_func, char ** a_str_reply } // Token type - l_arg_index=dap_chain_node_cli_find_option_val(argv, l_arg_index, argc, "-type", &l_type_str); + l_arg_index=dap_chain_node_cli_find_option_val(a_argv, l_arg_index, a_argc, "-type", &l_type_str); if (strcmp( l_type_str, "private") == 0){ l_type = DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE; @@ -2283,9 +2398,9 @@ int com_token_update(int argc, char ** argv, void *arg_func, char ** a_str_reply dap_list_t *l_tsd_list = dap_list_alloc(); size_t l_tsd_total_size = 0; l_arg_index++; - while (l_arg_index<argc-1){ - char * l_arg_param= argv[l_arg_index+1]; - if ( strcmp( argv[l_arg_index],"-flags_set" )==0){ // Flags + while (l_arg_index<a_argc-1){ + char * l_arg_param= a_argv[l_arg_index+1]; + if ( strcmp( a_argv[l_arg_index],"-flags_set" )==0){ // Flags char ** l_str_flags = NULL; l_str_flags = dap_strsplit( l_arg_param,",",0xffff ); uint16_t l_flags = 0; @@ -2304,7 +2419,7 @@ int com_token_update(int argc, char ** argv, void *arg_func, char ** a_str_reply dap_list_append( l_tsd_list, l_tsd); l_tsd_total_size+= dap_chain_datum_token_tsd_size( l_tsd); - }else if ( strcmp( argv[l_arg_index],"-flags_unset" )==0){ // Flags + }else if ( strcmp( a_argv[l_arg_index],"-flags_unset" )==0){ // Flags char ** l_str_flags = NULL; l_str_flags = dap_strsplit( l_arg_param,",",0xffff ); uint16_t l_flags = 0; @@ -2323,88 +2438,88 @@ int com_token_update(int argc, char ** argv, void *arg_func, char ** a_str_reply dap_list_append( l_tsd_list, l_tsd); l_tsd_total_size+= dap_chain_datum_token_tsd_size( l_tsd); - }else if ( strcmp( argv[l_arg_index],"-signs" )==0){ + }else if ( strcmp( a_argv[l_arg_index],"-signs" )==0){ dap_cert_parse_str_list(l_arg_param, &l_certs, &l_certs_count); if(!l_certs_count) { dap_chain_node_cli_set_reply_text(a_str_reply, "token_update command requres at least one valid certificate to sign the basic transaction of emission"); return -10; } - } else if ( strcmp( argv[l_arg_index],"-total_supply" )==0){ // Total supply + } else if ( strcmp( a_argv[l_arg_index],"-total_supply" )==0){ // Total supply uint128_t l_param_value = dap_atou128(l_arg_param); dap_chain_datum_token_tsd_t * l_tsd = dap_chain_datum_token_tsd_create_scalar( DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY, l_param_value); dap_list_append( l_tsd_list, l_tsd); l_tsd_total_size+= dap_chain_datum_token_tsd_size( l_tsd); - }else if ( strcmp( argv[l_arg_index],"-total_signs_valid" )==0){ // Signs valid + }else if ( strcmp( a_argv[l_arg_index],"-total_signs_valid" )==0){ // Signs valid uint16_t l_param_value = (uint16_t)atoi(l_arg_param); l_signs_total = l_param_value; dap_chain_datum_token_tsd_t * l_tsd = dap_chain_datum_token_tsd_create_scalar( DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SIGNS_VALID, l_param_value); dap_list_append( l_tsd_list, l_tsd); l_tsd_total_size+= dap_chain_datum_token_tsd_size( l_tsd); - }else if ( strcmp( argv[l_arg_index],"-datum_type_allowed_add" )==0){ // Datum type allowed add + }else if ( strcmp( a_argv[l_arg_index],"-datum_type_allowed_add" )==0){ // Datum type allowed add dap_chain_datum_token_tsd_t * l_tsd = dap_chain_datum_token_tsd_create_string( DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_ALLOWED_ADD, l_arg_param); dap_list_append( l_tsd_list, l_tsd); l_tsd_total_size+= dap_chain_datum_token_tsd_size( l_tsd); - }else if ( strcmp( argv[l_arg_index],"-datum_type_allowed_remove" )==0){ // Datum type allowed remove + }else if ( strcmp( a_argv[l_arg_index],"-datum_type_allowed_remove" )==0){ // Datum type allowed remove dap_chain_datum_token_tsd_t * l_tsd = dap_chain_datum_token_tsd_create_string( DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_ALLOWED_REMOVE, l_arg_param); dap_list_append( l_tsd_list, l_tsd); l_tsd_total_size+= dap_chain_datum_token_tsd_size( l_tsd); - }else if ( strcmp( argv[l_arg_index],"-datum_type_blocked_add" )==0){ // Datum type blocked add + }else if ( strcmp( a_argv[l_arg_index],"-datum_type_blocked_add" )==0){ // Datum type blocked add dap_chain_datum_token_tsd_t * l_tsd = dap_chain_datum_token_tsd_create_string( DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_BLOCKED_ADD, l_arg_param); dap_list_append( l_tsd_list, l_tsd); l_tsd_total_size+= dap_chain_datum_token_tsd_size( l_tsd); - }else if ( strcmp( argv[l_arg_index],"-datum_type_blocked_remove" )==0){ // Datum type blocked remove + }else if ( strcmp( a_argv[l_arg_index],"-datum_type_blocked_remove" )==0){ // Datum type blocked remove dap_chain_datum_token_tsd_t * l_tsd = dap_chain_datum_token_tsd_create_string( DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_BLOCKED_REMOVE, l_arg_param); dap_list_append( l_tsd_list, l_tsd); l_tsd_total_size+= dap_chain_datum_token_tsd_size( l_tsd); - }else if ( strcmp( argv[l_arg_index],"-tx_receiver_allowed_add" )==0){ // TX Receiver add + }else if ( strcmp( a_argv[l_arg_index],"-tx_receiver_allowed_add" )==0){ // TX Receiver add dap_chain_datum_token_tsd_t * l_tsd = dap_chain_datum_token_tsd_create_string( DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_ALLOWED_ADD, l_arg_param); dap_list_append( l_tsd_list, l_tsd); l_tsd_total_size+= dap_chain_datum_token_tsd_size( l_tsd); - }else if ( strcmp( argv[l_arg_index],"-tx_receiver_allowed_remove" )==0){ // TX Receiver remove + }else if ( strcmp( a_argv[l_arg_index],"-tx_receiver_allowed_remove" )==0){ // TX Receiver remove dap_chain_datum_token_tsd_t * l_tsd = dap_chain_datum_token_tsd_create_string( DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_ALLOWED_REMOVE, l_arg_param); dap_list_append( l_tsd_list, l_tsd); l_tsd_total_size+= dap_chain_datum_token_tsd_size( l_tsd); - }else if ( strcmp( argv[l_arg_index],"-tx_receiver_blocked_add" )==0){ // TX Receiver blocked add + }else if ( strcmp( a_argv[l_arg_index],"-tx_receiver_blocked_add" )==0){ // TX Receiver blocked add dap_chain_datum_token_tsd_t * l_tsd = dap_chain_datum_token_tsd_create_string( DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_BLOCKED_ADD, l_arg_param); dap_list_append( l_tsd_list, l_tsd); l_tsd_total_size+= dap_chain_datum_token_tsd_size( l_tsd); - }else if ( strcmp( argv[l_arg_index],"-tx_receiver_blocked_remove" )==0){ // TX Receiver blocked remove + }else if ( strcmp( a_argv[l_arg_index],"-tx_receiver_blocked_remove" )==0){ // TX Receiver blocked remove dap_chain_datum_token_tsd_t * l_tsd = dap_chain_datum_token_tsd_create_string( DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_BLOCKED_REMOVE, l_arg_param); dap_list_append( l_tsd_list, l_tsd); l_tsd_total_size+= dap_chain_datum_token_tsd_size( l_tsd); - }else if ( strcmp( argv[l_arg_index],"-tx_sender_allowed_add" )==0){ // TX Sender allowed add + }else if ( strcmp( a_argv[l_arg_index],"-tx_sender_allowed_add" )==0){ // TX Sender allowed add dap_chain_datum_token_tsd_t * l_tsd = dap_chain_datum_token_tsd_create_string( DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_ALLOWED_ADD, l_arg_param); dap_list_append( l_tsd_list, l_tsd); l_tsd_total_size+= dap_chain_datum_token_tsd_size( l_tsd); - }else if ( strcmp( argv[l_arg_index],"-tx_sender_allowed_remove" )==0){ // TX Sender allowed remove + }else if ( strcmp( a_argv[l_arg_index],"-tx_sender_allowed_remove" )==0){ // TX Sender allowed remove dap_chain_datum_token_tsd_t * l_tsd = dap_chain_datum_token_tsd_create_string( DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_ALLOWED_REMOVE, l_arg_param); dap_list_append( l_tsd_list, l_tsd); l_tsd_total_size+= dap_chain_datum_token_tsd_size( l_tsd); - }else if ( strcmp( argv[l_arg_index],"-tx_sender_blocked_add" )==0){ // TX Sender blocked add + }else if ( strcmp( a_argv[l_arg_index],"-tx_sender_blocked_add" )==0){ // TX Sender blocked add dap_chain_datum_token_tsd_t * l_tsd = dap_chain_datum_token_tsd_create_string( DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_BLOCKED_ADD, l_arg_param); dap_list_append( l_tsd_list, l_tsd); l_tsd_total_size+= dap_chain_datum_token_tsd_size( l_tsd); - }else if ( strcmp( argv[l_arg_index],"-tx_sender_blocked_remove" )==0){ // TX Sender blocked remove + }else if ( strcmp( a_argv[l_arg_index],"-tx_sender_blocked_remove" )==0){ // TX Sender blocked remove dap_chain_datum_token_tsd_t * l_tsd = dap_chain_datum_token_tsd_create_string( DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_BLOCKED_REMOVE, l_arg_param); dap_list_append( l_tsd_list, l_tsd); l_tsd_total_size+= dap_chain_datum_token_tsd_size( l_tsd); }else { - dap_chain_node_cli_set_reply_text(a_str_reply, "Unknown param \"%s\"",argv[l_arg_index]); + dap_chain_node_cli_set_reply_text(a_str_reply, "Unknown param \"%s\"",a_argv[l_arg_index]); return -20; } l_arg_index+=2; @@ -2460,6 +2575,7 @@ int com_token_update(int argc, char ** argv, void *arg_func, char ** a_str_reply dap_chain_hash_fast_t 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); + char * l_key_str_base58 = dap_enc_base58_encode_hash_to_str(&l_key_hash); // Add datum to mempool with datum_token_update hash as a key char * l_gdb_group_mempool; @@ -2471,20 +2587,27 @@ int com_token_update(int argc, char ** argv, void *arg_func, char ** a_str_reply } if(dap_chain_global_db_gr_set(dap_strdup(l_key_str), (uint8_t *) l_datum, l_datum_size, l_gdb_group_mempool)) { - dap_chain_node_cli_set_reply_text(a_str_reply, "datum %s with token update %s is placed in datum pool ", l_key_str, - l_ticker); + if(!dap_strcmp(l_hash_out_type,"hex")) + dap_chain_node_cli_set_reply_text(a_str_reply, "datum %s with token update %s is placed in datum pool ", l_key_str, l_ticker); + else + dap_chain_node_cli_set_reply_text(a_str_reply, "datum %s with token update %s is placed in datum pool ", l_key_str_base58, l_ticker); DAP_DELETE(l_datum); DAP_DELETE(l_datum_token_update); DAP_DELETE(l_gdb_group_mempool); DAP_DELETE(l_key_str); + DAP_DELETE(l_key_str_base58); return 0; } else { - dap_chain_node_cli_set_reply_text(a_str_reply, "datum tx %s is not placed in datum pool ", l_key_str); + if(!dap_strcmp(l_hash_out_type,"hex")) + dap_chain_node_cli_set_reply_text(a_str_reply, "datum tx %s is not placed in datum pool ", l_key_str); + else + dap_chain_node_cli_set_reply_text(a_str_reply, "datum tx %s is not placed in datum pool ", l_key_str_base58); DAP_DELETE(l_datum); DAP_DELETE(l_datum_token_update); DAP_DELETE(l_gdb_group_mempool); DAP_DELETE(l_key_str); + DAP_DELETE(l_key_str_base58); return -2; } } @@ -2532,7 +2655,7 @@ int com_token_update(int argc, char ** argv, void *arg_func, char ** a_str_reply "\t -tx_sender_blocked <value>:\t Blocked tx sender(s)\n" "\n" */ -int com_token_decl(int argc, char ** argv, void *arg_func, char ** a_str_reply) +int com_token_decl(int a_argc, char ** a_argv, void *a_arg_func, char ** a_str_reply) { int l_arg_index = 1; @@ -2558,7 +2681,16 @@ int com_token_decl(int argc, char ** argv, void *arg_func, char ** a_str_reply) dap_chain_t * l_chain = NULL; dap_chain_net_t * l_net = NULL; - dap_chain_node_cli_cmd_values_parse_net_chain(&l_arg_index, argc, argv, a_str_reply, &l_chain, &l_net); + const char * l_hash_out_type = NULL; + dap_chain_node_cli_find_option_val(a_argv, l_arg_index, a_argc, "-H", &l_hash_out_type); + if(!l_hash_out_type) + l_hash_out_type = "base58"; + 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>"); + return -1; + } + + dap_chain_node_cli_cmd_values_parse_net_chain(&l_arg_index, a_argc, a_argv, a_str_reply, &l_chain, &l_net); if(!l_net) return -1; else { @@ -2568,7 +2700,7 @@ int com_token_decl(int argc, char ** argv, void *arg_func, char ** a_str_reply) } } // Token ticker - l_arg_index=dap_chain_node_cli_find_option_val(argv, l_arg_index, argc, "-token", &l_ticker); + l_arg_index=dap_chain_node_cli_find_option_val(a_argv, l_arg_index, a_argc, "-token", &l_ticker); // Check for ticker if(!l_ticker) { dap_chain_node_cli_set_reply_text(a_str_reply, "token_decl requires parameter 'token'"); @@ -2576,7 +2708,7 @@ int com_token_decl(int argc, char ** argv, void *arg_func, char ** a_str_reply) } // Token type - l_arg_index=dap_chain_node_cli_find_option_val(argv, l_arg_index, argc, "-type", &l_type_str); + l_arg_index=dap_chain_node_cli_find_option_val(a_argv, l_arg_index, a_argc, "-type", &l_type_str); if (l_type_str) { if (strcmp( l_type_str, "private") == 0){ @@ -2598,9 +2730,9 @@ int com_token_decl(int argc, char ** argv, void *arg_func, char ** a_str_reply) uint16_t l_flags = 0; char ** l_str_flags = NULL; l_arg_index++; - while (l_arg_index<argc-1){ - char * l_arg_param= argv[l_arg_index+1]; - if ( strcmp( argv[l_arg_index],"-flags" )==0){ // Flags + while (l_arg_index<a_argc-1){ + char * l_arg_param= a_argv[l_arg_index+1]; + if ( strcmp(a_argv[l_arg_index],"-flags" )==0){ // Flags l_str_flags = dap_strsplit( l_arg_param,",",0xffff ); while (l_str_flags && *l_str_flags){ uint16_t l_flag = dap_chain_datum_token_flag_from_str(*l_str_flags); @@ -2611,58 +2743,58 @@ int com_token_decl(int argc, char ** argv, void *arg_func, char ** a_str_reply) l_flags |= (1<<l_flag); l_str_flags++; } - } else if ( strcmp( argv[l_arg_index],"-total_supply" )==0){ // Total supply + } else if ( strcmp( a_argv[l_arg_index],"-total_supply" )==0){ // Total supply uint128_t l_param_value = dap_atou128(l_arg_param); dap_chain_datum_token_tsd_t * l_tsd = dap_chain_datum_token_tsd_create_scalar( DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY, l_param_value); dap_list_append( l_tsd_list, l_tsd); l_tsd_total_size+= dap_chain_datum_token_tsd_size( l_tsd); - }else if ( strcmp( argv[l_arg_index],"-total_signs_valid" )==0){ // Signs valid + }else if ( strcmp( a_argv[l_arg_index],"-total_signs_valid" )==0){ // Signs valid uint16_t l_param_value = (uint16_t)atoi(l_arg_param); l_signs_total = l_param_value; dap_chain_datum_token_tsd_t * l_tsd = dap_chain_datum_token_tsd_create_scalar( DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SIGNS_VALID, l_param_value); dap_list_append( l_tsd_list, l_tsd); l_tsd_total_size+= dap_chain_datum_token_tsd_size( l_tsd); - }else if ( strcmp( argv[l_arg_index],"-signs" )==0){ + }else if ( strcmp( a_argv[l_arg_index],"-signs" )==0){ dap_cert_parse_str_list(l_arg_param, &l_certs, &l_certs_count); if(!l_certs_count) { dap_chain_node_cli_set_reply_text(a_str_reply, "token_decl command requres at least one valid certificate to sign the basic transaction of emission"); return -10; } - }else if ( strcmp( argv[l_arg_index],"-datum_type_allowed" )==0){ + }else if ( strcmp( a_argv[l_arg_index],"-datum_type_allowed" )==0){ dap_chain_datum_token_tsd_t * l_tsd = dap_chain_datum_token_tsd_create_string( DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_ALLOWED_ADD, l_arg_param); dap_list_append( l_tsd_list, l_tsd); l_tsd_total_size+= dap_chain_datum_token_tsd_size( l_tsd); - }else if ( strcmp( argv[l_arg_index],"-datum_type_blocked" )==0){ + }else if ( strcmp( a_argv[l_arg_index],"-datum_type_blocked" )==0){ dap_chain_datum_token_tsd_t * l_tsd = dap_chain_datum_token_tsd_create_string( DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_BLOCKED_ADD, l_arg_param); dap_list_append( l_tsd_list, l_tsd); l_tsd_total_size+= dap_chain_datum_token_tsd_size( l_tsd); - }else if ( strcmp( argv[l_arg_index],"-tx_receiver_allowed" )==0){ + }else if ( strcmp( a_argv[l_arg_index],"-tx_receiver_allowed" )==0){ dap_chain_datum_token_tsd_t * l_tsd = dap_chain_datum_token_tsd_create_string( DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_ALLOWED_ADD, l_arg_param); dap_list_append( l_tsd_list, l_tsd); l_tsd_total_size+= dap_chain_datum_token_tsd_size( l_tsd); - }else if ( strcmp( argv[l_arg_index],"-tx_receiver_blocked" )==0){ + }else if ( strcmp( a_argv[l_arg_index],"-tx_receiver_blocked" )==0){ dap_chain_datum_token_tsd_t * l_tsd = dap_chain_datum_token_tsd_create_string( DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_BLOCKED_ADD, l_arg_param); dap_list_append( l_tsd_list, l_tsd); l_tsd_total_size+= dap_chain_datum_token_tsd_size( l_tsd); - }else if ( strcmp( argv[l_arg_index],"-tx_sender_allowed" )==0){ + }else if ( strcmp( a_argv[l_arg_index],"-tx_sender_allowed" )==0){ dap_chain_datum_token_tsd_t * l_tsd = dap_chain_datum_token_tsd_create_string( DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_ALLOWED_ADD, l_arg_param); dap_list_append( l_tsd_list, l_tsd); l_tsd_total_size+= dap_chain_datum_token_tsd_size( l_tsd); - }else if ( strcmp( argv[l_arg_index],"-tx_sender_blocked" )==0){ + }else if ( strcmp( a_argv[l_arg_index],"-tx_sender_blocked" )==0){ dap_chain_datum_token_tsd_t * l_tsd = dap_chain_datum_token_tsd_create_string( DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_BLOCKED_ADD, l_arg_param); dap_list_append( l_tsd_list, l_tsd); l_tsd_total_size+= dap_chain_datum_token_tsd_size( l_tsd); }else { - dap_chain_node_cli_set_reply_text(a_str_reply, "Unknown param \"%s\"",argv[l_arg_index]); + dap_chain_node_cli_set_reply_text(a_str_reply, "Unknown param \"%s\"",a_argv[l_arg_index]); return -20; } l_arg_index+=2; @@ -2744,17 +2876,17 @@ int com_token_decl(int argc, char ** argv, void *arg_func, char ** a_str_reply) }break; case DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE:{ // Total supply value - dap_chain_node_cli_find_option_val(argv, l_arg_index, argc, "-total_supply", &l_total_supply_str); + dap_chain_node_cli_find_option_val(a_argv, l_arg_index, a_argc, "-total_supply", &l_total_supply_str); // Certificates thats will be used to sign currend datum token - dap_chain_node_cli_find_option_val(argv, l_arg_index, argc, "-certs", &l_certs_str); + dap_chain_node_cli_find_option_val(a_argv, l_arg_index, a_argc, "-certs", &l_certs_str); // Signs number thats own emissioncan't find - dap_chain_node_cli_find_option_val(argv, l_arg_index, argc, "-signs_total", &l_signs_total_str); + dap_chain_node_cli_find_option_val(a_argv, l_arg_index, a_argc, "-signs_total", &l_signs_total_str); // Signs minimum number thats need to authorize the emission - dap_chain_node_cli_find_option_val(argv, l_arg_index, argc, "-signs_emission", &l_signs_emission_str); + dap_chain_node_cli_find_option_val(a_argv, l_arg_index, a_argc, "-signs_emission", &l_signs_emission_str); if(!l_total_supply_str) { @@ -2851,6 +2983,7 @@ int com_token_decl(int argc, char ** argv, void *arg_func, char ** a_str_reply) dap_chain_hash_fast_t 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); + char * l_key_str_base58 = dap_enc_base58_encode_hash_to_str(&l_key_hash); // Add datum to mempool with datum_token hash as a key char * l_gdb_group_mempool; @@ -2863,23 +2996,27 @@ int com_token_decl(int argc, char ** argv, void *arg_func, char ** a_str_reply) } if(dap_chain_global_db_gr_set(dap_strdup(l_key_str), (uint8_t *) l_datum, l_datum_size, l_gdb_group_mempool)) { - dap_chain_node_cli_set_reply_text(a_str_reply, "datum %s with token %s is placed in datum pool ", l_key_str, - l_ticker); + if(!dap_strcmp(l_hash_out_type,"hex")) + dap_chain_node_cli_set_reply_text(a_str_reply, "datum %s with token %s is placed in datum pool ", l_key_str, l_ticker); + else + dap_chain_node_cli_set_reply_text(a_str_reply, "datum %s with token %s is placed in datum pool ", l_key_str_base58, l_ticker); DAP_DELETE(l_datum); DAP_DELETE(l_datum_token); DAP_DELETE(l_gdb_group_mempool); DAP_DELETE(l_key_str); + DAP_DELETE(l_key_str_base58); return 0; } else { - dap_chain_node_cli_set_reply_text(a_str_reply, "datum tx %s is not placed in datum pool ", l_key_str); + dap_chain_node_cli_set_reply_text(a_str_reply, "datum tx %s is not placed in datum pool ", l_key_str_base58); DAP_DELETE(l_datum); DAP_DELETE(l_datum_token); DAP_DELETE(l_gdb_group_mempool); DAP_DELETE(l_key_str); + DAP_DELETE(l_key_str_base58); return -2; } - + return 0; } /** @@ -2890,7 +3027,7 @@ int com_token_decl(int argc, char ** argv, void *arg_func, char ** a_str_reply) * @param str_reply * @return */ -int com_token_emit(int argc, char ** argv, void *arg_func, char ** str_reply) +int com_token_emit(int a_argc, char ** a_argv, void *a_arg_func, char ** a_str_reply) { int arg_index = 1; const char *str_tmp = NULL; @@ -2915,37 +3052,46 @@ int com_token_emit(int argc, char ** argv, void *arg_func, char ** str_reply) const char * l_net_str = NULL; dap_chain_net_t * l_net = NULL; + const char * l_hash_out_type = NULL; + dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-H", &l_hash_out_type); + if(!l_hash_out_type) + l_hash_out_type = "base58"; + 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>"); + return -1; + } + // Wallet address that recieves the emission - dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-certs", &l_certs_str); + dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-certs", &l_certs_str); // Wallet address that recieves the emission - dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-addr", &l_addr_str); + dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-addr", &l_addr_str); // Token ticker - dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-token", &l_ticker); + dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-token", &l_ticker); // Token emission - if(dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-emission_value", &str_tmp)) { + if(dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-emission_value", &str_tmp)) { l_emission_value = strtoull(str_tmp, NULL, 10); } if(!l_emission_value) { - dap_chain_node_cli_set_reply_text(str_reply, "token_emit requires parameter '-emission_value'"); + dap_chain_node_cli_set_reply_text(a_str_reply, "token_emit requires parameter '-emission_value'"); return -1; } if(!l_addr_str) { - dap_chain_node_cli_set_reply_text(str_reply, "token_emit requires parameter '-addr'"); + dap_chain_node_cli_set_reply_text(a_str_reply, "token_emit requires parameter '-addr'"); return -2; } if(!l_ticker) { - dap_chain_node_cli_set_reply_text(str_reply, "token_emit requires parameter '-token'"); + dap_chain_node_cli_set_reply_text(a_str_reply, "token_emit requires parameter '-token'"); return -3; } if(!l_certs_str) { - dap_chain_node_cli_set_reply_text(str_reply, "token_emit requires parameter '-certs'"); + dap_chain_node_cli_set_reply_text(a_str_reply, "token_emit requires parameter '-certs'"); return -4; } @@ -2953,7 +3099,7 @@ int com_token_emit(int argc, char ** argv, void *arg_func, char ** str_reply) dap_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, + dap_chain_node_cli_set_reply_text(a_str_reply, "token_emit command requres at least one valid certificate to sign the basic transaction of emission"); return -5; } @@ -2961,29 +3107,29 @@ int com_token_emit(int argc, char ** argv, void *arg_func, char ** str_reply) dap_chain_addr_t * l_addr = dap_chain_addr_from_str(l_addr_str); if(!l_addr) { - dap_chain_node_cli_set_reply_text(str_reply, "address \"%s\" is invalid", l_addr_str); + dap_chain_node_cli_set_reply_text(a_str_reply, "address \"%s\" is invalid", l_addr_str); return -4; } // Net addr - dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-net", &l_net_str); + dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-net", &l_net_str); // Select chain network if(!l_net_str) { - dap_chain_node_cli_set_reply_text(str_reply, "token_create requires parameter 'net'"); + dap_chain_node_cli_set_reply_text(a_str_reply, "token_create requires parameter 'net'"); DAP_DELETE(l_addr); 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, + dap_chain_node_cli_set_reply_text(a_str_reply, "token_create requires parameter '-net' to be valid chain network name"); DAP_DELETE(l_addr); return -43; } } - dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-chain_emission", &l_chain_emission_str); - dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-chain_base_tx", &l_chain_base_tx_str); + dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-chain_emission", &l_chain_emission_str); + dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-chain_base_tx", &l_chain_base_tx_str); // Select chain emission /*if(!l_chain_emission_str) { @@ -2992,7 +3138,7 @@ int com_token_emit(int argc, char ** argv, void *arg_func, char ** str_reply) } */ if(l_chain_emission_str) { 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, + dap_chain_node_cli_set_reply_text(a_str_reply, "token_create requires parameter '-chain_emission' to be valid chain name in chain net %s", l_net_str); DAP_DELETE(l_addr); @@ -3007,7 +3153,7 @@ int com_token_emit(int argc, char ** argv, void *arg_func, char ** str_reply) }*/ if(l_chain_base_tx_str) { 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, + dap_chain_node_cli_set_reply_text(a_str_reply, "token_create requires parameter '-chain_emission' to be valid chain name in chain net %s", l_net_str); DAP_DELETE(l_addr); @@ -3066,6 +3212,7 @@ int com_token_emit(int argc, char ** argv, void *arg_func, char ** str_reply) dap_chain_hash_fast_t l_token_emission_hash; dap_hash_fast(l_token_emission, l_token_emission_size, &l_token_emission_hash); char * l_key_str = dap_chain_hash_fast_to_str_new(&l_token_emission_hash); + char * l_key_str_base58 = dap_enc_base58_encode_hash_to_str(&l_token_emission_hash); // Delete token emission DAP_DELETE(l_token_emission); @@ -3078,17 +3225,24 @@ int com_token_emit(int argc, char ** argv, void *arg_func, char ** str_reply) // Add to mempool emission token if(dap_chain_global_db_gr_set(dap_strdup(l_key_str), (uint8_t *) l_datum_emission, l_datum_emission_size , l_gdb_group_mempool_emission)) { - str_reply_tmp = dap_strdup_printf("datum emission %s is placed in datum pool ", l_key_str); + if(!dap_strcmp(l_hash_out_type,"hex")) + str_reply_tmp = dap_strdup_printf("datum emission %s is placed in datum pool ", l_key_str); + else + str_reply_tmp = dap_strdup_printf("datum emission %s is placed in datum pool ", l_key_str_base58); DAP_DELETE(l_key_str); + DAP_DELETE(l_key_str_base58); } else { - dap_chain_node_cli_set_reply_text(str_reply, "datum emission %s is not placed in datum pool ", l_key_str); + if(!dap_strcmp(l_hash_out_type,"hex")) + dap_chain_node_cli_set_reply_text(a_str_reply, "datum emission %s is not placed in datum pool ", l_key_str); + else + dap_chain_node_cli_set_reply_text(a_str_reply, "datum emission %s is not placed in datum pool ", l_key_str_base58); DAP_DELETE(l_key_str); + DAP_DELETE(l_key_str_base58); DAP_DELETE(l_datum_emission); return -1; } - // create first transaction (with tx_token) dap_chain_datum_tx_t *l_tx = DAP_NEW_Z_SIZE(dap_chain_datum_tx_t, sizeof(dap_chain_datum_tx_t)); dap_chain_hash_fast_t l_tx_prev_hash = { 0 }; @@ -3105,7 +3259,7 @@ int com_token_emit(int argc, char ** argv, void *arg_func, char ** str_reply) // Sign all that we have with certs for(size_t i = 0; i < l_certs_size; i++) { if(dap_chain_datum_tx_add_sign_item(&l_tx, l_certs[i]->enc_key) < 0) { - dap_chain_node_cli_set_reply_text(str_reply, "No private key for certificate=%s", + dap_chain_node_cli_set_reply_text(a_str_reply, "No private key for certificate=%s", l_certs[i]->name); DAP_DELETE(l_addr); return -3; @@ -3129,18 +3283,25 @@ int com_token_emit(int argc, char ** argv, void *arg_func, char ** str_reply) dap_chain_hash_fast_t l_datum_tx_hash; dap_hash_fast(l_datum_tx, l_datum_tx_size, &l_datum_tx_hash); l_key_str = dap_chain_hash_fast_to_str_new(&l_datum_tx_hash); + l_key_str_base58 = dap_enc_base58_encode_hash_to_str(&l_datum_tx_hash); DAP_DELETE(l_tx); // Add to mempool tx token if(dap_chain_global_db_gr_set(dap_strdup(l_key_str), 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); + if(!dap_strcmp(l_hash_out_type,"hex")) + dap_chain_node_cli_set_reply_text(a_str_reply, "%s\ndatum tx %s is placed in datum pool ", str_reply_tmp, l_key_str); + else + dap_chain_node_cli_set_reply_text(a_str_reply, "%s\ndatum tx %s is placed in datum pool ", str_reply_tmp, l_key_str_base58); DAP_DELETE(l_key_str); + DAP_DELETE(l_key_str_base58); } 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); + if(!dap_strcmp(l_hash_out_type,"hex")) + dap_chain_node_cli_set_reply_text(a_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(a_str_reply, "%s\ndatum tx %s is not placed in datum pool ", str_reply_tmp, l_key_str_base58); DAP_DELETE(l_key_str); + DAP_DELETE(l_key_str_base58); return -2; } @@ -3155,9 +3316,9 @@ int com_token_emit(int argc, char ** argv, void *arg_func, char ** str_reply) * * Create transaction */ -int com_tx_cond_create(int argc, char ** argv, void *arg_func, char **str_reply) +int com_tx_cond_create(int a_argc, char ** a_argv, void *a_arg_func, char **a_str_reply) { - (void) argc; + (void) a_argc; int arg_index = 1; const char *c_wallets_path = dap_chain_wallet_get_path(g_config); const char * l_token_ticker = NULL; @@ -3169,48 +3330,57 @@ int com_tx_cond_create(int argc, char ** argv, void *arg_func, char **str_reply) const char * l_service_str = NULL; uint64_t l_value_datoshi = 0; + const char * l_hash_out_type = NULL; + dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-H", &l_hash_out_type); + if(!l_hash_out_type) + l_hash_out_type = "base58"; + 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>"); + return -1; + } + // Token ticker - dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-token", &l_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(argv, arg_index, argc, "-wallet_f", &l_wallet_from_str); + dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-wallet_f", &l_wallet_from_str); // Wallet address - to - dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-wallet_t", &l_wallet_to_str); + dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-wallet_t", &l_wallet_to_str); // value datoshi - dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-value", &l_value_datoshi_str); + dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-value", &l_value_datoshi_str); // net - dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-net", &l_net_name); + dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-net", &l_net_name); // unit - dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-unit", &l_unit_str); + 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(argv, arg_index, argc, "-service", &l_service_str); + dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-service", &l_service_str); if(!l_token_ticker) { - dap_chain_node_cli_set_reply_text(str_reply, "tx_cond_create requires parameter '-token'"); + 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(str_reply, "tx_cond_create requires parameter '-wallet_f'"); + dap_chain_node_cli_set_reply_text(a_str_reply, "tx_cond_create requires parameter '-wallet_f'"); return -2; } if(!l_wallet_to_str) { - dap_chain_node_cli_set_reply_text(str_reply, "tx_cond_create requires parameter '-wallet_t'"); + dap_chain_node_cli_set_reply_text(a_str_reply, "tx_cond_create requires parameter '-wallet_t'"); return -3; } if(!l_value_datoshi_str) { - dap_chain_node_cli_set_reply_text(str_reply, "tx_cond_create requires parameter '-value'"); + dap_chain_node_cli_set_reply_text(a_str_reply, "tx_cond_create requires parameter '-value'"); return -4; } if(!l_net_name) { - dap_chain_node_cli_set_reply_text(str_reply, "tx_cond_create requires parameter '-net'"); + dap_chain_node_cli_set_reply_text(a_str_reply, "tx_cond_create requires parameter '-net'"); return -5; } if(!l_unit_str) { - dap_chain_node_cli_set_reply_text(str_reply, "tx_cond_create requires parameter '-unit={mb|kb|b|sec|day}'"); + 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(str_reply, "tx_cond_create requires parameter '-service={vpn}'"); + dap_chain_node_cli_set_reply_text(a_str_reply, "tx_cond_create requires parameter '-service={vpn}'"); return -7; } dap_chain_net_srv_uid_t l_srv_uid = { 0 }; @@ -3218,7 +3388,7 @@ int com_tx_cond_create(int argc, char ** argv, void *arg_func, char **str_reply) l_srv_uid.uint64 = 0x0000000000000001; //dap_chain_addr_t *addr_to = dap_chain_addr_from_str(l_addr_to_str); if(!l_srv_uid.uint64) { - dap_chain_node_cli_set_reply_text(str_reply, "can't recognize service='%s' unit must look like {vpn}", + dap_chain_node_cli_set_reply_text(a_str_reply, "can't recognize service='%s' unit must look like {vpn}", l_service_str); return -8; } @@ -3236,31 +3406,31 @@ int com_tx_cond_create(int argc, char ** argv, void *arg_func, char **str_reply) l_price_unit.enm = SERV_UNIT_B; if(l_price_unit.enm == SERV_UNIT_UNDEFINED) { - dap_chain_node_cli_set_reply_text(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(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(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(str_reply, "can't open wallet '%s'", l_wallet_from); + dap_chain_node_cli_set_reply_text(a_str_reply, "can't open wallet '%s'", l_wallet_from); 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(str_reply, "can't open wallet '%s'", l_wallet_to_str); + dap_chain_node_cli_set_reply_text(a_str_reply, "can't open wallet '%s'", l_wallet_to_str); return -13; } dap_enc_key_t *l_key_from = dap_chain_wallet_get_key(l_wallet_from, 0); @@ -3289,7 +3459,13 @@ int com_tx_cond_create(int argc, char ** argv, void *arg_func, char **str_reply) dap_chain_wallet_close(l_wallet_from); dap_chain_wallet_close(l_wallet_cond); - char *l_hash_str = l_tx_cond_hash ? dap_chain_hash_fast_to_str_new(l_tx_cond_hash) : NULL; + char *l_hash_str; + if(!dap_strcmp(l_hash_out_type, "hex")) { + l_hash_str = l_tx_cond_hash ? dap_chain_hash_fast_to_str_new(l_tx_cond_hash) : NULL; + } + else { + l_hash_str = l_tx_cond_hash ? dap_enc_base58_encode_hash_to_str(l_tx_cond_hash) : NULL; + } /*dap_chain_node_cli_set_reply_text(str_reply, "cond create=%s\n", (res == 0) ? "Ok" : (res == -2) ? "False, not enough funds for service fee" : "False"); @@ -3298,11 +3474,11 @@ int com_tx_cond_create(int argc, char ** argv, void *arg_func, char **str_reply) int l_ret; // example: cond create succefully hash=0x4AA303EB7C10430C0AAC42F399D265BC7DD09E3983E088E02B8CED38DA22EDA9 if(l_hash_str){ - dap_chain_node_cli_set_reply_text(str_reply, "cond create succefully hash=%s\n", l_hash_str); + dap_chain_node_cli_set_reply_text(a_str_reply, "cond create succefully hash=%s\n", l_hash_str); l_ret = 0; } else{ - dap_chain_node_cli_set_reply_text(str_reply, "cond can't create\n"); + dap_chain_node_cli_set_reply_text(a_str_reply, "cond can't create\n"); l_ret = -1; } @@ -3555,7 +3731,7 @@ int com_tx_verify(int argc, char ** argv, void *arg_func, char **str_reply) * * Transaction history for an address */ -int com_tx_history(int argc, char ** argv, void *arg_func, char **str_reply) +int com_tx_history(int a_argc, char ** a_argv, void *a_arg_func, char **a_str_reply) { int arg_index = 1; const char *l_addr_base58 = NULL; @@ -3567,35 +3743,44 @@ int com_tx_history(int argc, char ** argv, void *arg_func, char **str_reply) dap_chain_t * l_chain = NULL; dap_chain_net_t * l_net = NULL; - dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-addr", &l_addr_base58); - dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-w", &l_wallet_name); - dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-net", &l_net_str); - dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-chain", &l_chain_str); - dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-tx", &l_tx_hash_str); + const char * l_hash_out_type = NULL; + dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-H", &l_hash_out_type); + if(!l_hash_out_type) + l_hash_out_type = "base58"; + 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>"); + return -1; + } + + dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-addr", &l_addr_base58); + dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-w", &l_wallet_name); + dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-net", &l_net_str); + dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-chain", &l_chain_str); + dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-tx", &l_tx_hash_str); if(!l_addr_base58 && !l_wallet_name && !l_tx_hash_str) { - dap_chain_node_cli_set_reply_text(str_reply, "tx_history requires parameter '-addr' or '-w' or '-tx'"); + dap_chain_node_cli_set_reply_text(a_str_reply, "tx_history requires parameter '-addr' or '-w' or '-tx'"); return -1; } // Select chain network if(!l_net_str) { - dap_chain_node_cli_set_reply_text(str_reply, "tx_history requires parameter '-net'"); + dap_chain_node_cli_set_reply_text(a_str_reply, "tx_history requires parameter '-net'"); return -2; } 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, + dap_chain_node_cli_set_reply_text(a_str_reply, "tx_history requires parameter '-net' to be valid chain network name"); return -3; } } //Select chain emission if(!l_chain_str) { - dap_chain_node_cli_set_reply_text(str_reply, "tx_history requires parameter '-chain'"); + dap_chain_node_cli_set_reply_text(a_str_reply, "tx_history requires parameter '-chain'"); return -4; } else { if((l_chain = dap_chain_net_get_chain_by_name(l_net, l_chain_str)) == NULL) { // Can't find such chain - dap_chain_node_cli_set_reply_text(str_reply, + dap_chain_node_cli_set_reply_text(a_str_reply, "tx_history requires parameter '-chain' to be valid chain name in chain net %s", l_net_str); return -5; @@ -3608,7 +3793,7 @@ int com_tx_history(int argc, char ** argv, void *arg_func, char **str_reply) if(l_tx_hash_str) { if(dap_chain_str_to_hash_fast(l_tx_hash_str, &l_tx_hash) < 0) { l_tx_hash_str = NULL; - dap_chain_node_cli_set_reply_text(str_reply, "tx hash not recognized"); + dap_chain_node_cli_set_reply_text(a_str_reply, "tx hash not recognized"); return -1; } // char hash_str[99]; @@ -3632,14 +3817,14 @@ int com_tx_history(int argc, char ** argv, void *arg_func, char **str_reply) l_addr = dap_chain_addr_from_str(l_addr_base58); } if(!l_addr && !l_tx_hash_str) { - dap_chain_node_cli_set_reply_text(str_reply, "wallet address not recognized"); + dap_chain_node_cli_set_reply_text(a_str_reply, "wallet address not recognized"); return -1; } } char *l_str_out = l_tx_hash_str ? - dap_db_history_tx(&l_tx_hash, l_chain) : - dap_db_history_addr(l_addr, l_chain); + dap_db_history_tx(&l_tx_hash, l_chain, l_hash_out_type) : + dap_db_history_addr(l_addr, l_chain, l_hash_out_type); char *l_str_ret = NULL; if(l_tx_hash_str) { @@ -3652,7 +3837,7 @@ int com_tx_history(int argc, char ** argv, void *arg_func, char **str_reply) l_str_out ? l_str_out : " empty"); DAP_DELETE(l_addr_str); } - dap_chain_node_cli_set_reply_text(str_reply, l_str_ret); + dap_chain_node_cli_set_reply_text(a_str_reply, l_str_ret); DAP_DELETE(l_str_out); DAP_DELETE(l_str_ret); return 0; diff --git a/modules/net/dap_chain_node_cli_cmd_tx.c b/modules/net/dap_chain_node_cli_cmd_tx.c index a0ac403a3007c6ecf8e817d77342bb5dadd10136..c34c4e7e817e7b5ea945fdadd717d4e4b9c8a01a 100644 --- a/modules/net/dap_chain_node_cli_cmd_tx.c +++ b/modules/net/dap_chain_node_cli_cmd_tx.c @@ -27,6 +27,7 @@ #include <pthread.h> #include <dap_common.h> +#include <dap_enc_base58.h> #include <dap_strfuncs.h> #include <dap_string.h> #include <dap_list.h> @@ -85,7 +86,7 @@ static dap_chain_datum_t* get_prev_tx(dap_tx_data_t *a_tx_data) * * return history string */ -char* dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, dap_chain_t * a_chain) +char* dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, dap_chain_t * a_chain, const char *a_hash_out_type) { dap_string_t *l_str_out = dap_string_new(NULL); @@ -223,11 +224,20 @@ char* dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, dap_chain_t * a_chain) const dap_chain_tx_in_t *l_tx_in = (const dap_chain_tx_in_t*) l_list_tmp->data; dap_chain_hash_fast_t tx_prev_hash = l_tx_in->header.tx_prev_hash; char l_tx_hash_str[70]; - if(!dap_hash_fast_is_blank(&tx_prev_hash)) + char *tx_hash_base58_str = NULL; + if(!dap_hash_fast_is_blank(&tx_prev_hash)){ + tx_hash_base58_str = dap_enc_base58_from_hex_str_to_str( l_tx_data->tx_hash_str); dap_chain_hash_fast_to_str(&tx_prev_hash, l_tx_hash_str, sizeof(l_tx_hash_str)); - else + } + else{ strcpy(l_tx_hash_str, "Null"); - dap_string_append_printf(l_str_out, " IN item \n prev tx_hash %s\n", l_tx_hash_str); + tx_hash_base58_str = dap_strdup("Null"); + } + if(!dap_strcmp(a_hash_out_type,"hex")) + dap_string_append_printf(l_str_out, " IN item \n prev tx_hash %s\n", l_tx_hash_str); + else + dap_string_append_printf(l_str_out, " IN item \n prev tx_hash %s\n", tx_hash_base58_str); + DAP_DELETE(tx_hash_base58_str); //find prev OUT item dap_tx_data_t *l_tx_data_prev = NULL; @@ -294,7 +304,7 @@ char* dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, dap_chain_t * a_chain) * * return history string */ -char* dap_db_history_addr(dap_chain_addr_t * a_addr, dap_chain_t * a_chain) +char* dap_db_history_addr(dap_chain_addr_t * a_addr, dap_chain_t * a_chain, const char *a_hash_out_type) { dap_string_t *l_str_out = dap_string_new(NULL); @@ -437,12 +447,26 @@ char* dap_db_history_addr(dap_chain_addr_t * a_addr, dap_chain_t * a_chain) if(l_tx_data && !memcmp(&l_tx_data->addr, a_addr, sizeof(dap_chain_addr_t))) { dap_list_t *l_records_tmp = l_records_out; while(l_records_tmp) { - + char *tx_hash_str; + if(!dap_strcmp(a_hash_out_type,"hex")) + tx_hash_str = dap_strdup( l_tx_data->tx_hash_str); + else + tx_hash_str = dap_enc_base58_from_hex_str_to_str( l_tx_data->tx_hash_str); const dap_chain_tx_out_t *l_tx_out = (const dap_chain_tx_out_t*) l_records_tmp->data; + + if(!dap_strcmp(a_hash_out_type,"hex")){ dap_string_append_printf(l_str_out, "tx hash %s \n emit %lu %s\n", - l_tx_data->tx_hash_str, + tx_hash_str,//l_tx_data->tx_hash_str, l_tx_out->header.value, l_tx_data->token_ticker); + } + else { + dap_string_append_printf(l_str_out, "tx hash %s \n emit %lu %s\n", + l_tx_data->tx_hash_str, + l_tx_out->header.value, + l_tx_data->token_ticker); + } + DAP_DELETE(tx_hash_str); l_records_tmp = dap_list_next(l_records_tmp); } } @@ -536,11 +560,15 @@ char* dap_db_history_addr(dap_chain_addr_t * a_addr, dap_chain_t * a_chain) bool l_is_use_dst_addr = false; if(!memcmp(&l_tx_prev_out->addr, a_addr, sizeof(dap_chain_addr_t))) l_is_use_dst_addr = true; - + char *tx_hash_str; + if(!dap_strcmp(a_hash_out_type, "hex")) + tx_hash_str = dap_strdup(l_tx_data->tx_hash_str); + else + tx_hash_str = dap_enc_base58_from_hex_str_to_str(l_tx_data->tx_hash_str); if(l_is_use_src_addr && !l_is_use_dst_addr) { dap_string_append_printf(l_str_out, "tx hash %s \n %s in send %lu %s from %s\n to %s\n", - l_tx_data->tx_hash_str, + tx_hash_str,//l_tx_data->tx_hash_str, l_time_str ? l_time_str : "", l_tx_prev_out->header.value, l_tx_data->token_ticker, @@ -550,13 +578,13 @@ char* dap_db_history_addr(dap_chain_addr_t * a_addr, dap_chain_t * a_chain) if(!l_src_str_is_cur) dap_string_append_printf(l_str_out, "tx hash %s \n %s in recv %lu %s from %s\n", - l_tx_data->tx_hash_str, + tx_hash_str,//l_tx_data->tx_hash_str, l_time_str ? l_time_str : "", l_tx_prev_out->header.value, l_tx_data->token_ticker, l_src_str ? l_src_str : ""); } - + DAP_DELETE(tx_hash_str); DAP_DELETE(l_dst_to_str); } dap_list_free(l_list_out_prev_items); @@ -573,11 +601,16 @@ char* dap_db_history_addr(dap_chain_addr_t * a_addr, dap_chain_t * a_chain) char *l_addr_str = (l_tx_out) ? dap_chain_addr_to_str(&l_tx_out->addr) : NULL; + char *tx_hash_str; + if(!dap_strcmp(a_hash_out_type, "hex")) + tx_hash_str = dap_strdup(l_tx_data->tx_hash_str); + else + tx_hash_str = dap_enc_base58_from_hex_str_to_str(l_tx_data->tx_hash_str); if(!memcmp(&l_tx_out->addr, a_addr, sizeof(dap_chain_addr_t))) { if(!l_src_str_is_cur) dap_string_append_printf(l_str_out, "tx hash %s \n %s recv %lu %s from %s\n", - l_tx_data->tx_hash_str, + tx_hash_str,//l_tx_data->tx_hash_str, l_time_str ? l_time_str : "", l_tx_out->header.value, l_tx_data_prev->token_ticker, @@ -588,13 +621,14 @@ char* dap_db_history_addr(dap_chain_addr_t * a_addr, dap_chain_t * a_chain) else { dap_string_append_printf(l_str_out, "tx hash %s \n %s send %lu %s to %s\n", - l_tx_data->tx_hash_str, + tx_hash_str,//l_tx_data->tx_hash_str, l_time_str ? l_time_str : "", l_tx_out->header.value, l_tx_data_prev->token_ticker, l_addr_str ? l_addr_str : ""); l_list_in_items2_tmp = NULL; } + DAP_DELETE(tx_hash_str); DAP_DELETE(l_addr_str); } diff --git a/modules/net/include/dap_chain_net.h b/modules/net/include/dap_chain_net.h index 941019b63282482e9f5c6cd61dc7d59b69c32412..00fc47ae9ee4bc55b9f87a65ca2250e10e3a0bb4 100644 --- a/modules/net/include/dap_chain_net.h +++ b/modules/net/include/dap_chain_net.h @@ -154,4 +154,4 @@ dap_chain_net_t **dap_chain_net_list(uint16_t *a_size); dap_list_t * dap_chain_net_get_add_gdb_group(dap_chain_net_t * a_net, dap_chain_node_addr_t a_node_addr); int dap_chain_net_verify_datum_for_add(dap_chain_net_t *a_net, dap_chain_datum_t * a_datum ); -void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_datum); +void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_datum, const char *a_hash_out_type); diff --git a/modules/net/include/dap_chain_node_cli_cmd_tx.h b/modules/net/include/dap_chain_node_cli_cmd_tx.h index dfc1e1409f270d365a7602f79cf9f09105e38a2a..64fb1fbc0c12fe905efac4c8185075945b73a13d 100644 --- a/modules/net/include/dap_chain_node_cli_cmd_tx.h +++ b/modules/net/include/dap_chain_node_cli_cmd_tx.h @@ -29,5 +29,5 @@ * * return history string */ -char* dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, dap_chain_t * a_chain); -char* dap_db_history_addr(dap_chain_addr_t * a_addr, dap_chain_t * a_chain); +char* dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, dap_chain_t * a_chain, const char *a_hash_out_type); +char* dap_db_history_addr(dap_chain_addr_t * a_addr, dap_chain_t * a_chain, const char *a_hash_out_type); diff --git a/modules/net/srv/dap_chain_net_srv.c b/modules/net/srv/dap_chain_net_srv.c index debde56c2622c90c2ce02cd56788d82586512d8e..c2009ca4c1a53083b854c4a186467a2a7d8ccc74 100644 --- a/modules/net/srv/dap_chain_net_srv.c +++ b/modules/net/srv/dap_chain_net_srv.c @@ -178,6 +178,15 @@ static int s_cli_net_srv( int argc, char **argv, void *arg_func, char **a_str_re int arg_index = 1; dap_chain_net_t * l_net = NULL; + const char * l_hash_out_type = NULL; + dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-H", &l_hash_out_type); + if(!l_hash_out_type) + l_hash_out_type = "base58"; + 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>"); + return -1; + } + int ret = dap_chain_node_cli_cmd_values_parse_net_chain( &arg_index, argc, argv, a_str_reply, NULL, &l_net ); if ( l_net ) { //char * l_orders_group = dap_chain_net_srv_order_get_gdb_group( l_net ); @@ -227,6 +236,18 @@ static int s_cli_net_srv( int argc, char **argv, void *arg_func, char **a_str_re int8_t l_continent_num = dap_chain_net_srv_order_continent_to_num(l_continent_str); + char *l_order_hash_hex_str; + char *l_order_hash_base58_str; + // datum hash may be in hex or base58 format + if(!dap_strncmp(l_order_hash_str, "0x", 2) || !dap_strncmp(l_order_hash_str, "0X", 2)) { + l_order_hash_hex_str = dap_strdup(l_order_hash_str); + l_order_hash_base58_str = dap_enc_base58_from_hex_str_to_str(l_order_hash_str); + } + else { + l_order_hash_hex_str = dap_enc_base58_to_hex_str_from_str(l_order_hash_str); + l_order_hash_base58_str = dap_strdup(l_order_hash_str); + } + if(l_continent_str && l_continent_num <= 0) { dap_string_t *l_string_err = dap_string_new("Unrecognized \"-continent\" option="); dap_string_append_printf(l_string_err, "\"%s\". Variants: ", l_continent_str); @@ -253,10 +274,13 @@ static int s_cli_net_srv( int argc, char **argv, void *arg_func, char **a_str_re dap_string_append(l_string_ret, "Can't find option '-hash'\n"); } else { - dap_chain_net_srv_order_t * l_order = dap_chain_net_srv_order_find_by_hash_str(l_net, l_order_hash_str); + dap_chain_net_srv_order_t * l_order = dap_chain_net_srv_order_find_by_hash_str(l_net, l_order_hash_hex_str); if(!l_order) { ret = -2; - dap_string_append_printf(l_string_ret, "Can't find order with hash %s\n", l_order_hash_str); + if(!dap_strcmp(l_hash_out_type,"hex")) + dap_string_append_printf(l_string_ret, "Can't find order with hash %s\n", l_order_hash_hex_str); + else + dap_string_append_printf(l_string_ret, "Can't find order with hash %s\n", l_order_hash_base58_str); } else { if(l_ext) { @@ -282,8 +306,8 @@ static int s_cli_net_srv( int argc, char **argv, void *arg_func, char **a_str_re dap_hash_fast(l_order, l_new_order_size, &l_new_order_hash); char * l_new_order_hash_str = dap_chain_hash_fast_to_str_new(&l_new_order_hash); // delete prev order - if(dap_strcmp(l_new_order_hash_str, l_order_hash_str)) - dap_chain_net_srv_order_delete_by_hash_str(l_net, l_order_hash_str); + if(dap_strcmp(l_new_order_hash_str, l_order_hash_hex_str)) + dap_chain_net_srv_order_delete_by_hash_str(l_net, l_order_hash_hex_str); DAP_DELETE(l_new_order_hash_str); dap_string_append_printf(l_string_ret, "order updated\n"); } @@ -366,13 +390,16 @@ static int s_cli_net_srv( int argc, char **argv, void *arg_func, char **a_str_re }else if( dap_strcmp( l_order_str, "dump" ) == 0 ){ // Select with specified service uid if ( l_order_hash_str ){ - dap_chain_net_srv_order_t * l_order = dap_chain_net_srv_order_find_by_hash_str( l_net, l_order_hash_str ); + dap_chain_net_srv_order_t * l_order = dap_chain_net_srv_order_find_by_hash_str( l_net, l_order_hash_hex_str ); if (l_order){ dap_chain_net_srv_order_dump_to_string(l_order,l_string_ret); ret = 0; }else{ ret = -7 ; - dap_string_append_printf(l_string_ret,"Can't find order with hash %s\n", l_order_hash_str ); + if(!dap_strcmp(l_hash_out_type,"hex")) + dap_string_append_printf(l_string_ret,"Can't find order with hash %s\n", l_order_hash_hex_str ); + else + dap_string_append_printf(l_string_ret,"Can't find order with hash %s\n", l_order_hash_base58_str ); } } else{ @@ -401,16 +428,22 @@ static int s_cli_net_srv( int argc, char **argv, void *arg_func, char **a_str_re } }else if( dap_strcmp( l_order_str, "delete" ) == 0 ){ // Select with specified service uid - const char *l_order_hash_str = NULL; - dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-hash", &l_order_hash_str); + //const char *l_order_hash_str = NULL; + //dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-hash", &l_order_hash_str); if ( l_order_hash_str ){ - dap_chain_net_srv_order_t * l_order = dap_chain_net_srv_order_find_by_hash_str( l_net, l_order_hash_str ); - if (l_order && dap_chain_net_srv_order_delete_by_hash_str(l_net,l_order_hash_str) == 0){ + dap_chain_net_srv_order_t * l_order = dap_chain_net_srv_order_find_by_hash_str( l_net, l_order_hash_hex_str ); + if (l_order && dap_chain_net_srv_order_delete_by_hash_str(l_net,l_order_hash_hex_str) == 0){ ret = 0 ; - dap_string_append_printf(l_string_ret,"Deleted order %s\n", l_order_hash_str ); + if(!dap_strcmp(l_hash_out_type,"hex")) + dap_string_append_printf(l_string_ret, "Deleted order %s\n", l_order_hash_hex_str); + else + dap_string_append_printf(l_string_ret, "Deleted order %s\n", l_order_hash_base58_str); }else{ ret = -8 ; - dap_string_append_printf(l_string_ret,"Can't find order with hash %s\n", l_order_hash_str ); + if(!dap_strcmp(l_hash_out_type,"hex")) + dap_string_append_printf(l_string_ret, "Can't find order with hash %s\n", l_order_hash_hex_str); + else + dap_string_append_printf(l_string_ret, "Can't find order with hash %s\n", l_order_hash_base58_str); } DAP_DELETE(l_order); } else{ diff --git a/modules/service/stake/dap_chain_net_srv_stake.c b/modules/service/stake/dap_chain_net_srv_stake.c index fb49da89f356e0dddb24ecebce8268eea3884516..77f964178c05dce2c2c742a98c8022ee838aab86 100644 --- a/modules/service/stake/dap_chain_net_srv_stake.c +++ b/modules/service/stake/dap_chain_net_srv_stake.c @@ -48,9 +48,9 @@ int dap_chain_net_srv_stake_init() "srv_stake order create -net <net name> -from_addr <addr> -token <ticker> -coins <value> -cert <name> -fee_percent <value>\n" "\tCreate a new order with specified amount of datoshi to delegate it to the specified address." "The fee with specified percent with this delagation will be returned to the fee address pointed by delegator\n" - "srv_stake order remove -net <net name> -order <order hash>\n" + "srv_stake order remove -net <net name> -order <order hash> [-H hex|base58(default)]\n" "\tRemove order with specified hash\n" - "srv_stake order update -net <net name> -order <order hash> -cert <name>" + "srv_stake order update -net <net name> -order <order hash> -cert <name> [-H hex|base58(default)]" "{-from_addr <addr> | -token <ticker> -coins <value> | -fee_percent <value>}\n" "\tUpdate order with specified hash\n" "srv_stake order list -net <net name>\n" @@ -365,7 +365,7 @@ dap_chain_net_srv_stake_item_t *s_stake_item_from_order(dap_chain_net_t *a_net, return l_item; } -static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, char **a_str_reply) +static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, char **a_str_reply, const char *a_hash_out_type) { enum { CMD_NONE, CMD_CREATE, CMD_REMOVE, CMD_LIST, CMD_UPDATE @@ -485,12 +485,28 @@ static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, cha return -4; } dap_chain_node_cli_find_option_val(a_argv, l_arg_index, a_argc, "-order", &l_order_hash_str); + + char *l_order_hash_hex_str; + char *l_order_hash_base58_str; + // datum hash may be in hex or base58 format + if(!dap_strncmp(l_order_hash_str, "0x", 2) || !dap_strncmp(l_order_hash_str, "0X", 2)) { + l_order_hash_hex_str = dap_strdup(l_order_hash_str); + l_order_hash_base58_str = dap_enc_base58_from_hex_str_to_str(l_order_hash_str); + } + else { + l_order_hash_hex_str = dap_enc_base58_to_hex_str_from_str(l_order_hash_str); + l_order_hash_base58_str = dap_strdup(l_order_hash_str); + } + if (!l_net_str) { dap_chain_node_cli_set_reply_text(a_str_reply, "Command 'order remove' requires parameter -order"); return -13; } - if (dap_chain_net_srv_order_delete_by_hash_str(l_net, l_order_hash_str)) { - dap_chain_node_cli_set_reply_text(a_str_reply, "Can't remove order %s\n", l_order_hash_str); + if (dap_chain_net_srv_order_delete_by_hash_str(l_net, l_order_hash_hex_str)) { + if(!dap_strcmp(a_hash_out_type,"hex")) + dap_chain_node_cli_set_reply_text(a_str_reply, "Can't remove order %s\n", l_order_hash_hex_str); + else + dap_chain_node_cli_set_reply_text(a_str_reply, "Can't remove order %s\n", l_order_hash_base58_str); return -14; } dap_chain_node_cli_set_reply_text(a_str_reply, "Stake order successfully removed"); @@ -515,8 +531,24 @@ static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, cha return -13; } dap_chain_net_srv_order_t *l_order = dap_chain_net_srv_order_find_by_hash_str(l_net, l_order_hash_str); + + char *l_order_hash_hex_str; + char *l_order_hash_base58_str; + // datum hash may be in hex or base58 format + if(!dap_strncmp(l_order_hash_str, "0x", 2) || !dap_strncmp(l_order_hash_str, "0X", 2)) { + l_order_hash_hex_str = dap_strdup(l_order_hash_str); + l_order_hash_base58_str = dap_enc_base58_from_hex_str_to_str(l_order_hash_str); + } + else { + l_order_hash_hex_str = dap_enc_base58_to_hex_str_from_str(l_order_hash_str); + l_order_hash_base58_str = dap_strdup(l_order_hash_str); + } + if (!l_order) { - dap_chain_node_cli_set_reply_text(a_str_reply, "Can't find order %s\n", l_order_hash_str); + if(!dap_strcmp(a_hash_out_type,"hex")) + dap_chain_node_cli_set_reply_text(a_str_reply, "Can't find order %s\n", l_order_hash_hex_str); + else + dap_chain_node_cli_set_reply_text(a_str_reply, "Can't find order %s\n", l_order_hash_base58_str); return -14; } dap_chain_node_cli_find_option_val(a_argv, l_arg_index, a_argc, "-wallet", &l_cert_str); @@ -563,11 +595,21 @@ static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, cha memcpy(&l_stake->addr_to, l_addr_to, sizeof(dap_chain_addr_t)); DAP_DELETE(l_addr_to); // Create the order & put it to GDB - dap_chain_net_srv_order_delete_by_hash_str(l_net, l_order_hash_str); - l_order_hash_str = s_stake_order_create(l_stake, l_cert->enc_key); - if (l_order_hash_str) { - dap_chain_node_cli_set_reply_text(a_str_reply, "Successfully created order %s", l_order_hash_str); - DAP_DELETE(l_order_hash_str); + dap_chain_net_srv_order_delete_by_hash_str(l_net, l_order_hash_hex_str); + DAP_DELETE(l_order_hash_hex_str); + DAP_DELETE(l_order_hash_base58_str); + l_order_hash_hex_str = s_stake_order_create(l_stake, l_cert->enc_key); + if(l_order_hash_hex_str) { + if(!dap_strcmp(a_hash_out_type, "hex")) { + dap_chain_node_cli_set_reply_text(a_str_reply, "Successfully created order %s", l_order_hash_hex_str); + } + else { + l_order_hash_base58_str = dap_enc_base58_from_hex_str_to_str(l_order_hash_hex_str); + dap_chain_node_cli_set_reply_text(a_str_reply, "Successfully created order %s", + l_order_hash_base58_str); + DAP_DELETE(l_order_hash_base58_str); + } + DAP_DELETE(l_order_hash_hex_str); DAP_DELETE(l_stake); } else { dap_chain_node_cli_set_reply_text(a_str_reply, "Can't compose the order"); @@ -626,6 +668,16 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, void *a_arg_func, char **a CMD_NONE, CMD_ORDER, CMD_DELEGATE, CMD_TX, CMD_INVALIDATE }; int l_arg_index = 1; + + const char * l_hash_out_type = NULL; + dap_chain_node_cli_find_option_val(a_argv, l_arg_index, min(a_argc, l_arg_index + 1), "-H", &l_hash_out_type); + if(!l_hash_out_type) + l_hash_out_type = "base58"; + 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>"); + return -1; + } + int l_cmd_num = CMD_NONE; if (dap_chain_node_cli_find_option_val(a_argv, l_arg_index, min(a_argc, l_arg_index + 1), "order", NULL)) { l_cmd_num = CMD_ORDER; @@ -641,7 +693,7 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, void *a_arg_func, char **a } switch (l_cmd_num) { case CMD_ORDER: - return s_cli_srv_stake_order(a_argc, a_argv, l_arg_index + 1, a_str_reply); + return s_cli_srv_stake_order(a_argc, a_argv, l_arg_index + 1, a_str_reply, l_hash_out_type); case CMD_DELEGATE: { const char *l_net_str = NULL, *l_wallet_str = NULL, *l_order_hash_str = NULL, *l_addr_fee_str = NULL; l_arg_index++; diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c index 48afa1e8855c846f51d948e5d11639dd6acde486..078b09e1436cf2dee2f0fcfccedbc069ebf61ab5 100644 --- a/modules/type/dag/dap_chain_cs_dag.c +++ b/modules/type/dag/dap_chain_cs_dag.c @@ -37,6 +37,7 @@ #endif #include "dap_common.h" +#include "dap_enc_base58.h" #include "dap_string.h" #include "dap_strfuncs.h" #include "dap_hash.h" @@ -127,14 +128,14 @@ int dap_chain_cs_dag_init(void) dap_chain_class_add( "dag", dap_chain_cs_dag_new ); s_seed_mode = dap_config_get_item_bool_default(g_config,"general","seed_mode",false); dap_chain_node_cli_cmd_item_create ("dag", s_cli_dag, NULL, "DAG commands", - "dag -net <chain net name> -chain <chain name> event create -datum <datum hash>\n" + "dag -net <chain net name> -chain <chain name> event create -datum <datum hash> [-H hex|base58(default)]\n" "\tCreate event from datum mempool element\n\n" "dag -net <chain net name> -chain <chain name> event cancel -event <event hash>\n" "\tRemove event from forming new round and put back its datum to mempool\n\n" "dag -net <chain net name> -chain <chain name> event sign -event <event hash>\n" "\tAdd sign to event <event hash> in round.new. Hash doesn't include other signs so event hash\n" "\tdoesn't changes after sign add to event. \n\n" - "dag -net <chain net name> -chain <chain name> event dump -event <event hash> -from < events | events_lasts | round.new | round.<Round id in hex> >\n" + "dag -net <chain net name> -chain <chain name> event dump -event <event hash> -from < events | events_lasts | round.new | round.<Round id in hex> > [-H hex|base58(default)]\n" "\tDump event info\n\n" "dag -net <chain net name> -chain <chain name> event list -from < events | events_lasts | round.new | round.<Round id in hex> \n\n" "\tShow event list \n\n" @@ -1024,6 +1025,15 @@ static int s_cli_dag(int argc, char ** argv, void *arg_func, char **a_str_reply) dap_chain_node_cli_find_option_val(argv, arg_index, argc, "event", &l_event_cmd_str); dap_chain_node_cli_find_option_val(argv, arg_index, argc, "round", &l_round_cmd_str); + const char * l_hash_out_type = NULL; + dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-H", &l_hash_out_type); + if(!l_hash_out_type) + l_hash_out_type = "base58"; + 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>"); + return -1; + } + if ( l_net_name == NULL){ dap_chain_node_cli_set_reply_text(a_str_reply, "Need -net <net name> param!"); return -1; @@ -1126,8 +1136,22 @@ static int s_cli_dag(int argc, char ** argv, void *arg_func, char **a_str_reply) dap_chain_net_sync_all(l_net); } }else if ( l_event_cmd_str ) { + char *l_datum_hash_hex_str = NULL; + char *l_datum_hash_base58_str = NULL; if ( strcmp( l_event_cmd_str, "create" ) == 0 ) { dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-datum", &l_datum_hash_str); + + // datum hash may be in hex or base58 format + if(l_datum_hash_str) { + if(!dap_strncmp(l_datum_hash_str, "0x", 2) || !dap_strncmp(l_datum_hash_str, "0X", 2)) { + l_datum_hash_hex_str = dap_strdup(l_datum_hash_str); + l_datum_hash_base58_str = dap_enc_base58_from_hex_str_to_str(l_datum_hash_str); + } + else { + l_datum_hash_hex_str = dap_enc_base58_to_hex_str_from_str(l_datum_hash_str); + l_datum_hash_base58_str = dap_strdup(l_datum_hash_str); + } + } l_event_subcmd = SUBCMD_EVENT_CREATE; } else if ( strcmp( l_event_cmd_str, "cancel" ) == 0 ) { dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-event", &l_event_hash_str); @@ -1143,8 +1167,22 @@ static int s_cli_dag(int argc, char ** argv, void *arg_func, char **a_str_reply) l_event_subcmd = SUBCMD_UNDEFINED; } - if (l_event_hash_str) - dap_chain_str_to_hash_fast(l_event_hash_str,&l_event_hash); + char *l_event_hash_hex_str = NULL; + char *l_event_hash_base58_str = NULL; + // datum hash may be in hex or base58 format + if(l_event_hash_str) { + if(!dap_strncmp(l_event_hash_str, "0x", 2) || !dap_strncmp(l_event_hash_str, "0X", 2)) { + l_event_hash_hex_str = dap_strdup(l_event_hash_str); + l_event_hash_base58_str = dap_enc_base58_from_hex_str_to_str(l_event_hash_str); + } + else { + l_event_hash_hex_str = dap_enc_base58_to_hex_str_from_str(l_event_hash_str); + l_event_hash_base58_str = dap_strdup(l_event_hash_str); + } + } + + //if (l_event_hash_str) + // dap_chain_str_to_hash_fast(l_event_hash_str,&l_event_hash); switch ( l_event_subcmd ){ case SUBCMD_EVENT_CREATE:{ @@ -1153,7 +1191,7 @@ static int s_cli_dag(int argc, char ** argv, void *arg_func, char **a_str_reply) dap_chain_datum_t ** l_datums = DAP_NEW_Z_SIZE(dap_chain_datum_t*, sizeof(dap_chain_datum_t*)*l_datums_count); size_t l_datum_size = 0; - dap_chain_datum_t * l_datum = (dap_chain_datum_t*) dap_chain_global_db_gr_get( l_datum_hash_str , + dap_chain_datum_t * l_datum = (dap_chain_datum_t*) dap_chain_global_db_gr_get( l_datum_hash_hex_str , &l_datum_size, l_gdb_group_mempool); l_datums[0] = l_datum; @@ -1176,21 +1214,35 @@ static int s_cli_dag(int argc, char ** argv, void *arg_func, char **a_str_reply) } } }else { + if(!dap_strcmp(l_hash_out_type,"hex")){ + dap_chain_node_cli_set_reply_text(a_str_reply, + "Warning! Can't convert datum %s from mempool to event in the new forming round ", l_datum_hash_hex_str); + } + else { dap_chain_node_cli_set_reply_text(a_str_reply, - "Warning! Can't convert datum %s from mempool to event in the new forming round ", - l_datum_hash_str); + "Warning! Can't convert datum %s from mempool to event in the new forming round ", l_datum_hash_base58_str); + } ret = -12; } DAP_DELETE(l_gdb_group_mempool); + DAP_DELETE(l_datum_hash_hex_str); + DAP_DELETE(l_datum_hash_base58_str); dap_chain_net_sync_all(l_net); }break; case SUBCMD_EVENT_CANCEL:{ char * l_gdb_group_events = DAP_CHAIN_CS_DAG(l_chain)->gdb_group_events_round_new; - if ( dap_chain_global_db_gr_del( dap_strdup(l_event_hash_str) ,l_gdb_group_events ) ){ - dap_chain_node_cli_set_reply_text(a_str_reply, - "Successfuly removed event 0x%s from the new forming round ", - l_event_hash_str); + if ( dap_chain_global_db_gr_del( dap_strdup(l_event_hash_hex_str) ,l_gdb_group_events ) ){ + if(!dap_strcmp(l_hash_out_type, "hex")){ + dap_chain_node_cli_set_reply_text(a_str_reply, + "Successfuly removed event %s from the new forming round ", + l_event_hash_hex_str); + } + else{ + dap_chain_node_cli_set_reply_text(a_str_reply, + "Successfuly removed event %s from the new forming round ", + l_event_hash_base58_str); + } ret = 0; }else { dap_chain_cs_dag_event_item_t * l_event_item = NULL; @@ -1198,18 +1250,37 @@ static int s_cli_dag(int argc, char ** argv, void *arg_func, char **a_str_reply) if ( l_event_item ){ HASH_DELETE(hh, PVT(l_dag)->events, l_event_item); - log_it(L_WARNING,"Dropped event 0x%s from chains! Hope you know what are you doing!", l_event_hash_str ); - dap_chain_node_cli_set_reply_text(a_str_reply, - "Dropped event 0x%s from chains! Hope you know what are you doing! ", - l_event_hash_str ); + if(!dap_strcmp(l_hash_out_type, "hex")) { + log_it(L_WARNING, "Dropped event %s from chains! Hope you know what are you doing!", + l_event_hash_hex_str); + dap_chain_node_cli_set_reply_text(a_str_reply, + "Dropped event 0x%s from chains! Hope you know what are you doing! ", + l_event_hash_hex_str); + } + else { + log_it(L_WARNING, "Dropped event %s from chains! Hope you know what are you doing!", + l_event_hash_base58_str); + dap_chain_node_cli_set_reply_text(a_str_reply, + "Dropped event 0x%s from chains! Hope you know what are you doing! ", + l_event_hash_base58_str); + } dap_chain_save_all(l_chain); }else { - dap_chain_node_cli_set_reply_text(a_str_reply, - "Can't remove event 0x%s ", - l_event_hash_str); + if(!dap_strcmp(l_hash_out_type, "hex")) { + dap_chain_node_cli_set_reply_text(a_str_reply, + "Can't remove event 0x%s ", + l_event_hash_hex_str); + } + else { + dap_chain_node_cli_set_reply_text(a_str_reply, + "Can't remove event 0x%s ", + l_event_hash_base58_str); + } ret = -1; } } + DAP_DELETE(l_event_hash_hex_str); + DAP_DELETE(l_event_hash_base58_str); DAP_DELETE( l_gdb_group_events ); dap_chain_net_sync_gdb(l_net); }break; @@ -1316,7 +1387,7 @@ static int s_cli_dag(int argc, char ** argv, void *arg_func, char **a_str_reply) l_offset += l_sign_size; DAP_DELETE( l_addr_str); } - dap_chain_net_dump_datum(l_str_tmp, l_datum); + dap_chain_net_dump_datum(l_str_tmp, l_datum, l_hash_out_type); dap_chain_node_cli_set_reply_text(a_str_reply, l_str_tmp->str); dap_string_free(l_str_tmp,false);