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/dap-sdk/crypto/src/dap_enc_iaes.c b/dap-sdk/crypto/src/dap_enc_iaes.c index 293e298dcf3bc78ffa519743dece4c3996a58acc..30600f54e15dfabd0b7ed9e6523de1c9b4e3679d 100755 --- a/dap-sdk/crypto/src/dap_enc_iaes.c +++ b/dap-sdk/crypto/src/dap_enc_iaes.c @@ -100,10 +100,13 @@ size_t dap_enc_iaes256_cbc_decrypt_fast(struct dap_enc_key * a_key, const void * size_t block_in32_size = IAES_BLOCK_SIZE/sizeof(uint32_t); uint32_t round_decrypt_key[60]; uint32_t feedback[block_in32_size]; + uint8_t priv_key_swapped_endian[IAES_KEYSIZE]; memcpy(&feedback[0], DAP_ENC_AES_KEY(a_key)->ivec, IAES_BLOCK_SIZE); - swap_endian((uint32_t *)a_key->priv_key_data, IAES_KEYSIZE/sizeof(uint32_t)); - Key_Shedule_for_decrypT((uint32_t *)a_key->priv_key_data, round_decrypt_key); + memcpy(priv_key_swapped_endian, a_key->priv_key_data, sizeof(priv_key_swapped_endian)); + + swap_endian(priv_key_swapped_endian, sizeof(priv_key_swapped_endian)/sizeof(uint32_t)); + Key_Shedule_for_decrypT(priv_key_swapped_endian, round_decrypt_key); void *data = buf_out; const void *cdata = a_in; @@ -120,10 +123,14 @@ size_t dap_enc_iaes256_cbc_decrypt_fast(struct dap_enc_key * a_key, const void * // for(int i = 0; i < 16; ++i) // {printf("%.2x ", ((uint8_t*)data)[i]);} // printf("\n");fflush(stdout); - swap_endian((uint32_t *)a_key->priv_key_data, IAES_KEYSIZE/sizeof(uint32_t)); - - return a_in_size - ((uint8_t *)data)[a_in_size - 1]; + size_t l_padding_size = ((uint8_t *)data)[a_in_size - 1]; + if(l_padding_size > a_in_size){ + log_it(L_WARNING, "%s: padding size is %u while whole message is just %u", __PRETTY_FUNCTION__, l_padding_size, a_in_size); + return 0; + }else{ + return a_in_size - l_padding_size; + } } size_t dap_enc_iaes256_cbc_encrypt(struct dap_enc_key * a_key, const void * a_in, size_t a_in_size, void ** a_out) diff --git a/dap-sdk/crypto/src/dap_enc_key.c b/dap-sdk/crypto/src/dap_enc_key.c index a361c1513a31281c2aa8d64e4461a1cf8912a8e7..24e38aedf9968d1da58de509f444d66532d337f0 100755 --- a/dap-sdk/crypto/src/dap_enc_key.c +++ b/dap-sdk/crypto/src/dap_enc_key.c @@ -650,14 +650,19 @@ dap_enc_key_t* dap_enc_key_deserealize(const void *buf, size_t buf_size) result->priv_key_data_size = in_key->priv_key_data_size; result->pub_key_data_size = in_key->pub_key_data_size; result->_inheritor_size = in_key->inheritor_size; + DAP_DEL_Z(result->priv_key_data) + DAP_DEL_Z(result->pub_key_data) + result->priv_key_data = DAP_NEW_Z_SIZE(uint8_t, result->priv_key_data_size); memcpy(result->priv_key_data, in_key->priv_key_data, result->priv_key_data_size); + result->pub_key_data = DAP_NEW_Z_SIZE(uint8_t, result->pub_key_data_size); memcpy(result->pub_key_data, in_key->pub_key_data, result->pub_key_data_size); - - if(in_key->inheritor_size) + if(in_key->inheritor_size) { + DAP_DEL_Z(result->_inheritor) + result->_inheritor = DAP_NEW_Z(dap_enc_key_t); memcpy(result->_inheritor, in_key->inheritor, in_key->inheritor_size); - else + } else { result->_inheritor = NULL; - + } return result; } diff --git a/dap-sdk/net/core/dap_events.c b/dap-sdk/net/core/dap_events.c index b591f081a82f4a808ae280607f55919e3935a1c8..45a366318c4e3013571da0bffafdf31003485870 100644 --- a/dap-sdk/net/core/dap_events.c +++ b/dap-sdk/net/core/dap_events.c @@ -421,7 +421,7 @@ static void *thread_worker_function(void *arg) pthread_mutex_lock(&cur->write_hold); cur->buf_out_size -= total_sent; if (cur->buf_out_size) { - memcpy(cur->buf_out, &cur->buf_out[total_sent], cur->buf_out_size); + memmove(cur->buf_out, &cur->buf_out[total_sent], cur->buf_out_size); } else { cur->flags &= ~DAP_SOCK_READY_TO_WRITE; } diff --git a/dap-sdk/net/core/dap_events_socket.c b/dap-sdk/net/core/dap_events_socket.c index ca6769a0b385d94c90535bba528b199c475408db..be385111db3b9fb772d7b27a7458725274ccd922 100644 --- a/dap-sdk/net/core/dap_events_socket.c +++ b/dap-sdk/net/core/dap_events_socket.c @@ -433,12 +433,9 @@ void dap_events_socket_shrink_buf_in(dap_events_socket_t * cl, size_t shrink_siz return; }else if(cl->buf_in_size>shrink_size){ size_t buf_size=cl->buf_in_size-shrink_size; - void * buf = malloc(buf_size); - memcpy(buf,cl->buf_in+ shrink_size,buf_size ); - memcpy(cl->buf_in,buf,buf_size); + uint8_t* tmp = cl->buf_in + shrink_size; + memmove(cl->buf_in,tmp,buf_size); cl->buf_in_size=buf_size; - if (buf) - free(buf); }else{ //log_it(WARNING,"Shrinking size of input buffer on amount bigger than actual buffer's size"); cl->buf_in_size=0; diff --git a/dap-sdk/net/stream/stream/dap_stream.c b/dap-sdk/net/stream/stream/dap_stream.c index 34cc1b870fc73139417608397faa518038aafc90..a5eef987c52b5aaea2d9c24d5d48f27cd0806383 100644 --- a/dap-sdk/net/stream/stream/dap_stream.c +++ b/dap-sdk/net/stream/stream/dap_stream.c @@ -697,12 +697,15 @@ void stream_dap_delete(dap_client_remote_t* sh, void * arg){ } pthread_mutex_unlock(&s_mutex_keepalive_list); - pthread_rwlock_wrlock(&l_stream->rwlock); - size_t i; - for(i=0;i<l_stream->channel_count; i++) - dap_stream_ch_delete(l_stream->channel[i]); - l_stream->channel_count = 0; + /* Until channel is closed, it may still need l_stream->rwlock, so we can't lock it here yet. + In case of races on stream closing think about making this place more robust; + or forbid locking l_stream->rwlock from inside of channels. */ + for( ;l_stream->channel_count; l_stream->channel_count--){ + dap_stream_ch_delete(l_stream->channel[l_stream->channel_count - 1]); + l_stream->channel[l_stream->channel_count - 1] = NULL; + } + pthread_rwlock_wrlock(&l_stream->rwlock); if(l_stream->session) dap_stream_session_close(l_stream->session->id); l_stream->session = NULL; @@ -768,8 +771,10 @@ void stream_proc_pkt_in(dap_stream_t * a_stream) { dap_stream_ch_pkt_t * l_ch_pkt = (dap_stream_ch_pkt_t *) a_stream->pkt_cache; - if(dap_stream_pkt_read(a_stream,l_pkt, l_ch_pkt, STREAM_BUF_SIZE_MAX)==0){ + if(dap_stream_pkt_read(a_stream,l_pkt, l_ch_pkt, sizeof(a_stream->pkt_cache))==0){ log_it(L_WARNING, "Input: can't decode packet size=%d",l_pkt_size); + DAP_DELETE(l_pkt); + return; } _detect_loose_packet(a_stream); diff --git a/modules/chain/dap_chain_cell.c b/modules/chain/dap_chain_cell.c index acbb9e7b7f244d309e5708584e75523cf642b78b..4d7f76f0aa01c735677f9d345b2e5ccd78bfb01a 100644 --- a/modules/chain/dap_chain_cell.c +++ b/modules/chain/dap_chain_cell.c @@ -213,7 +213,7 @@ int dap_chain_cell_file_append( dap_chain_cell_t * a_cell, const void* a_atom, s l_total_wrote_bytes += a_atom_size; // change in chain happened -> nodes synchronization required if(a_cell->chain && a_cell->chain->callback_notify) - a_cell->chain->callback_notify(a_cell->chain->callback_notify_arg, a_cell->chain, a_cell->id); + a_cell->chain->callback_notify(a_cell->chain->callback_notify_arg, a_cell->chain, a_cell->id, (void *)a_atom, a_atom_size); } else { log_it (L_ERROR, "Can't write data from cell 0x%016X to the file \"%s\"", a_cell->id.uint64, diff --git a/modules/chain/include/dap_chain.h b/modules/chain/include/dap_chain.h index ed25e99e7a4e96db0417ecefa426eb8c4e18ae85..97c8f83dd9d3b04ab312482bc85d92979610880f 100644 --- a/modules/chain/include/dap_chain.h +++ b/modules/chain/include/dap_chain.h @@ -83,7 +83,7 @@ typedef void (*dap_chain_callback_atom_iter_delete_t)(dap_chain_atom_iter_t * ) typedef size_t (*dap_chain_datum_callback_datum_pool_proc_add_t)(dap_chain_t * , dap_chain_datum_t **, size_t ); typedef size_t (*dap_chain_datum_callback_datum_pool_proc_add_with_group_t)(dap_chain_t * , dap_chain_datum_t **, size_t, const char *); -typedef void (*dap_chain_callback_notify_t)(void * a_arg, dap_chain_t *a_chain, dap_chain_cell_id_t a_id); //change in chain happened +typedef void (*dap_chain_callback_notify_t)(void * a_arg, dap_chain_t *a_chain, dap_chain_cell_id_t a_id, void* a_atom, size_t a_atom_size); //change in chain happened typedef enum dap_chain_type { 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 b6ebb66395938331c5749b2dc6df989c11f074ec..945ed237ba50e7b07a35c818f58f90a2ea320023 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -64,12 +64,10 @@ #include "dap_enc_http.h" #include "dap_chain_common.h" #include "dap_chain_net.h" -#include "dap_chain_net_srv.h" #include "dap_chain_node_client.h" #include "dap_chain_node_cli.h" #include "dap_chain_node_cli_cmd.h" #include "dap_chain_ledger.h" -#include "dap_chain_net_srv_stake.h" #include "dap_chain_global_db.h" #include "dap_chain_global_db_remote.h" @@ -176,7 +174,7 @@ int s_net_load(const char * a_net_name, uint16_t a_acl_idx); static void s_gbd_history_callback_notify (void * a_arg,const char a_op_code, const char * a_prefix, const char * a_group, const char * a_key, const void * a_value, const size_t a_value_len); -static void s_chain_callback_notify(void * a_arg, dap_chain_t *a_chain, dap_chain_cell_id_t a_id); +static void s_chain_callback_notify(void * a_arg, dap_chain_t *a_chain, dap_chain_cell_id_t a_id, void *a_atom, size_t a_atom_size); static int s_cli_net(int argc, char ** argv, void *arg_func, char **str_reply); @@ -184,6 +182,9 @@ static bool s_seed_mode = false; static uint8_t *dap_chain_net_set_acl(dap_chain_hash_fast_t *a_pkey_hash); +static dap_global_db_obj_callback_notify_t s_srv_callback_notify = NULL; + + char *dap_chain_net_get_gdb_group_acl(dap_chain_net_t *a_net) { if (a_net) { @@ -200,18 +201,6 @@ char *dap_chain_net_get_gdb_group_acl(dap_chain_net_t *a_net) return NULL; } -/** - * @brief s_net_set_go_sync - * @param a_net - * @return - */ -void s_net_set_go_sync(dap_chain_net_t * a_net) -{ - if(!a_net) - return; - dap_chain_net_state_go_to(a_net, NET_STATE_SYNC_REQUESTED); -} - /** * @brief s_net_state_to_str * @param l_state @@ -229,16 +218,10 @@ inline static const char * s_net_state_to_str(dap_chain_net_state_t l_state) */ int dap_chain_net_state_go_to(dap_chain_net_t * a_net, dap_chain_net_state_t a_new_state) { - if (a_new_state == NET_STATE_SYNC_REQUESTED) { - if (PVT(a_net)->state_target != NET_STATE_OFFLINE) { - PVT(a_net)->state_target = NET_STATE_ONLINE; - } - } else { - if (PVT(a_net)->state_target == a_new_state){ - log_it(L_WARNING,"Already going to state %s",s_net_state_to_str(a_new_state)); - } - PVT(a_net)->state_target = a_new_state; + if (PVT(a_net)->state_target == a_new_state){ + log_it(L_WARNING,"Already going to state %s",s_net_state_to_str(a_new_state)); } + PVT(a_net)->state_target = a_new_state; pthread_mutex_lock( &PVT(a_net)->state_mutex_cond); // set flag for sync PVT(a_net)->flags |= F_DAP_CHAIN_NET_GO_SYNC; @@ -251,6 +234,12 @@ int dap_chain_net_state_go_to(dap_chain_net_t * a_net, dap_chain_net_state_t a_n return 0; } + +void dap_chain_net_set_srv_callback_notify(dap_global_db_obj_callback_notify_t a_callback) +{ + s_srv_callback_notify = a_callback; +} + /** * @brief s_gbd_history_callback_notify * @param a_arg @@ -268,47 +257,35 @@ static void s_gbd_history_callback_notify (void * a_arg, const char a_op_code, c (void) a_op_code; UNUSED(a_prefix); UNUSED(a_value_len); - if (a_arg) { - dap_chain_net_t * l_net = (dap_chain_net_t *) a_arg; - s_net_set_go_sync(l_net); - /*if (!PVT (l_net)->load_mode ){ - if( pthread_mutex_trylock( &PVT (l_net)->state_mutex) == 0 ){ - if ( PVT(l_net)->state == NET_STATE_ONLINE || PVT(l_net)->state == NET_STATE_ONLINE ) - dap_chain_net_sync_all(l_net); - pthread_mutex_unlock( &PVT (l_net)->state_mutex); - } - }*/ - } - if (!a_value || !dap_config_get_item_bool_default(g_config, "srv", "order_signed_only", false)) { + if (!a_arg) { return; } dap_chain_net_t *l_net = (dap_chain_net_t *)a_arg; - char *l_gdb_group_str = dap_chain_net_srv_order_get_gdb_group(l_net); - if (!strcmp(a_group, l_gdb_group_str)) { - dap_chain_net_srv_order_t *l_order = (dap_chain_net_srv_order_t *)a_value; - if (l_order->version == 1) { - dap_chain_global_db_gr_del((char *)a_key, a_group); - } else { - dap_sign_t *l_sign = (dap_sign_t *)&l_order->ext[l_order->ext_size]; - if (!dap_sign_verify(l_sign, l_order, sizeof(dap_chain_net_srv_order_t) + l_order->ext_size)) { - dap_chain_global_db_gr_del((char *)a_key, a_group); - DAP_DELETE(l_gdb_group_str); - return; - } - dap_chain_hash_fast_t l_pkey_hash; - if (!dap_sign_get_pkey_hash(l_sign, &l_pkey_hash)) { - dap_chain_global_db_gr_del((char *)a_key, a_group); - DAP_DELETE(l_gdb_group_str); - return; - } - dap_chain_addr_t l_addr = {}; - dap_chain_addr_fill(&l_addr, l_sign->header.type, &l_pkey_hash, l_net->pub.id); - uint64_t l_solvency = dap_chain_ledger_calc_balance(l_net->pub.ledger, &l_addr, l_order->price_ticker); - if (l_solvency < l_order->price && !dap_chain_net_srv_stake_key_delegated(&l_addr)) { - dap_chain_global_db_gr_del((char *)a_key, a_group); - } + if (PVT(l_net)->state == NET_STATE_ONLINE) { + dap_global_db_obj_t l_obj = {}; + dap_store_obj_t *l_obj_cur = dap_chain_global_db_obj_gr_get(a_key, NULL, a_group); + if (!l_obj_cur) { + log_it(L_ERROR, "Notified GDB event does not exist"); + return; } - DAP_DELETE(l_gdb_group_str); + l_obj.id = l_obj_cur->id; + l_obj.key = l_obj_cur->key; + l_obj.value = l_obj_cur->value; + l_obj.value_len = l_obj_cur->value_len; + size_t l_item_size_out = 0; + uint8_t *l_item = dap_db_log_pack(&l_obj, &l_item_size_out); + dap_chain_t *l_chain = dap_chain_net_get_chain_by_name(l_net, "gdb"); + dap_chain_id_t l_chain_id = l_chain ? l_chain->id : (dap_chain_id_t ) {}; + for (dap_list_t *l_tmp = PVT(l_net)->links; l_tmp; l_tmp = dap_list_next(l_tmp)) { + dap_chain_node_client_t *l_node_client = (dap_chain_node_client_t *)l_tmp->data; + dap_stream_ch_t *l_ch_chain = dap_client_get_stream_ch(l_node_client->client, dap_stream_ch_chain_get_id()); + dap_stream_ch_chain_pkt_write(l_ch_chain, DAP_STREAM_CH_CHAIN_PKT_TYPE_GLOBAL_DB, l_net->pub.id, + l_chain_id, l_net->pub.cell_id, l_item, l_item_size_out); + } + DAP_DELETE(l_item); + } + if (s_srv_callback_notify) { + s_srv_callback_notify(a_arg, a_op_code, a_prefix, a_group, a_key, a_value, a_value_len); } } @@ -318,14 +295,24 @@ static void s_gbd_history_callback_notify (void * a_arg, const char a_op_code, c * @param a_chain * @param a_id */ -static void s_chain_callback_notify(void * a_arg, dap_chain_t *a_chain, dap_chain_cell_id_t a_id) +static void s_chain_callback_notify(void * a_arg, dap_chain_t *a_chain, dap_chain_cell_id_t a_id, void* a_atom, size_t a_atom_size) { - UNUSED(a_chain); - UNUSED(a_id); - if(!a_arg) + if (!a_arg) return; - dap_chain_net_t * l_net = (dap_chain_net_t *) a_arg; - s_net_set_go_sync(l_net); + dap_chain_net_t *l_net = (dap_chain_net_t *)a_arg; + if (PVT(l_net)->state == NET_STATE_ONLINE) { + for (dap_list_t *l_tmp = PVT(l_net)->links; l_tmp; l_tmp = dap_list_next(l_tmp)) { + dap_chain_node_client_t *l_node_client = (dap_chain_node_client_t *)l_tmp->data; + uint8_t l_ch_id = dap_stream_ch_chain_get_id(); // Channel id for global_db and chains sync + dap_stream_ch_t *l_ch_chain = dap_client_get_stream_ch(l_node_client->client, l_ch_id); + if (!l_ch_chain) { + log_it(L_DEBUG,"Can't get stream_ch for id='%c' ", l_ch_id); + continue; + } + dap_stream_ch_chain_pkt_write(l_ch_chain, DAP_STREAM_CH_CHAIN_PKT_TYPE_CHAIN, l_net->pub.id, + a_chain->id, a_id, a_atom, a_atom_size); + } + } } @@ -465,12 +452,6 @@ static int s_net_states_proc(dap_chain_net_t * l_net) l_sync_gdb.node_addr.uint64 = dap_chain_net_get_cur_addr(l_net) ? dap_chain_net_get_cur_addr(l_net)->uint64 : dap_db_get_cur_node_addr(l_net->pub.name); - - dap_chain_id_t l_chain_id_null = {}; - dap_chain_cell_id_t l_chain_cell_id_null = {}; - l_chain_id_null.uint64 = l_net->pub.id.uint64; - l_chain_cell_id_null.uint64 = dap_chain_net_get_cur_cell(l_net) ? dap_chain_net_get_cur_cell(l_net)->uint64 : 0; - log_it(L_DEBUG, "Prepared request to gdb sync from %llu to %llu", l_sync_gdb.id_start, l_sync_gdb.id_end); // find dap_chain_id_t dap_chain_t *l_chain = dap_chain_net_get_chain_by_name(l_net, "gdb"); @@ -611,18 +592,6 @@ static int s_net_states_proc(dap_chain_net_t * l_net) return ret; } -// Global -/*static void s_net_proc_thread_callback_update_db(void) -{ - dap_chain_net_item_t *l_net_item, *l_net_item_tmp; - printf("update0\n"); - HASH_ITER(hh, s_net_items, l_net_item, l_net_item_tmp) - { - s_net_set_go_sync(l_net_item->chain_net); - } - printf("update1\n"); -}*/ - /** * @brief s_net_proc_thread * @details Brings up and check the Dap Chain Network @@ -827,7 +796,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); @@ -926,6 +895,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) { @@ -1100,12 +1078,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) { @@ -1125,7 +1119,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); @@ -1133,8 +1128,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; @@ -2131,7 +2127,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"); @@ -2191,8 +2187,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 @@ -2200,8 +2199,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/dap_dns_server.c b/modules/net/dap_dns_server.c index dd7a38a3aecde28b1c5eaf0bbae2018937440034..1f000b8a45d37d92528cba78e1f2f4ca0f9e62f3 100644 --- a/modules/net/dap_dns_server.c +++ b/modules/net/dap_dns_server.c @@ -117,7 +117,7 @@ dap_chain_node_info_t *dap_dns_resolve_hostname(char *str) { size_t l_nodes_count = 0; // read all node l_objs = dap_chain_global_db_gr_load(l_net->pub.gdb_nodes, &l_nodes_count); - if(!l_nodes_count || !l_objs) + if (!l_nodes_count || !l_objs) return 0; size_t l_node_num = rand() % l_nodes_count; dap_chain_node_info_t *l_node_info = DAP_NEW_Z(dap_chain_node_info_t); diff --git a/modules/net/include/dap_chain_net.h b/modules/net/include/dap_chain_net.h index 941019b63282482e9f5c6cd61dc7d59b69c32412..9c5c4d9e9ec5476595692d8f08defaa3d7aa2394 100644 --- a/modules/net/include/dap_chain_net.h +++ b/modules/net/include/dap_chain_net.h @@ -61,8 +61,7 @@ typedef enum dap_chain_net_state{ NET_STATE_ADDR_REQUEST, // Waiting for address assign NET_STATE_SYNC_GDB, NET_STATE_SYNC_CHAINS, - NET_STATE_ONLINE, - NET_STATE_SYNC_REQUESTED + NET_STATE_ONLINE } dap_chain_net_state_t; typedef struct dap_chain_net{ @@ -87,7 +86,6 @@ void dap_chain_net_deinit(void); void dap_chain_net_load_all(); -void s_net_set_go_sync(dap_chain_net_t * a_net); int dap_chain_net_state_go_to(dap_chain_net_t * a_net, dap_chain_net_state_t a_new_state); inline static int dap_chain_net_start(dap_chain_net_t * a_net){ return dap_chain_net_state_go_to(a_net,NET_STATE_ONLINE); } @@ -154,4 +152,5 @@ 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); +void dap_chain_net_set_srv_callback_notify(dap_global_db_obj_callback_notify_t a_callback); 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..0e58a7ae737f21e279ee65b3b37cbb5978cf9795 100644 --- a/modules/net/srv/dap_chain_net_srv.c +++ b/modules/net/srv/dap_chain_net_srv.c @@ -43,6 +43,7 @@ #include "uthash.h" #include "utlist.h" #include "dap_common.h" +#include "dap_enc_base58.h" #include "dap_list.h" #include "dap_string.h" #include "dap_file_utils.h" @@ -178,6 +179,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 +237,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 +275,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 +307,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"); } @@ -352,7 +377,7 @@ static int s_cli_net_srv( int argc, char **argv, void *arg_func, char **a_str_re size_t l_orders_size = 0; for (size_t i = 0; i< l_orders_num; i++){ dap_chain_net_srv_order_t *l_order =(dap_chain_net_srv_order_t *) (((byte_t*) l_orders) + l_orders_size); - dap_chain_net_srv_order_dump_to_string(l_order, l_string_ret); + dap_chain_net_srv_order_dump_to_string(l_order, l_string_ret, l_hash_out_type); l_orders_size += dap_chain_net_srv_order_get_size(l_order); dap_string_append(l_string_ret,"\n"); } @@ -366,13 +391,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); + dap_chain_net_srv_order_dump_to_string(l_order,l_string_ret, l_hash_out_type); 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{ @@ -388,7 +416,7 @@ static int s_cli_net_srv( int argc, char **argv, void *arg_func, char **a_str_re size_t l_orders_size = 0; for(size_t i = 0; i < l_orders_num; i++) { dap_chain_net_srv_order_t *l_order =(dap_chain_net_srv_order_t *) (((byte_t*) l_orders) + l_orders_size); - dap_chain_net_srv_order_dump_to_string(l_order, l_string_ret); + dap_chain_net_srv_order_dump_to_string(l_order, l_string_ret, l_hash_out_type); l_orders_size += dap_chain_net_srv_order_get_size(l_order); dap_string_append(l_string_ret, "\n"); } @@ -401,16 +429,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{ @@ -563,6 +597,8 @@ int dap_chain_net_srv_set_ch_callbacks(dap_chain_net_srv_uid_t a_uid, void dap_chain_net_srv_del(dap_chain_net_srv_t * a_srv) { service_list_t *l_sdata; + if(!a_srv) + return; pthread_mutex_lock(&s_srv_list_mutex); HASH_FIND(hh, s_srv_list, a_srv, sizeof(dap_chain_net_srv_uid_t), l_sdata); if(l_sdata) { diff --git a/modules/net/srv/dap_chain_net_srv_order.c b/modules/net/srv/dap_chain_net_srv_order.c index 63c5012756368e04858614e3be5555be0b7dcd98..2209e31fad9a547f212392b479a26200d688916e 100644 --- a/modules/net/srv/dap_chain_net_srv_order.c +++ b/modules/net/srv/dap_chain_net_srv_order.c @@ -28,8 +28,10 @@ #include "dap_chain_net_srv_order.h" #include "dap_hash.h" +#include "dap_enc_base58.h" #include "dap_chain_global_db.h" #include "dap_chain_net_srv_countries.h" +#include "dap_chain_net_srv_stake.h" //#include "dap_chain_net_srv_geoip.h" #define LOG_TAG "dap_chain_net_srv_order" @@ -57,13 +59,16 @@ char *s_server_continents[]={ "Antarctica" }; +static void s_srv_order_callback_notify(void *a_arg, const char a_op_code, const char *a_prefix, const char *a_group, + const char *a_key, const void *a_value, const size_t a_value_len); + /** * @brief dap_chain_net_srv_order_init * @return */ int dap_chain_net_srv_order_init(void) { - + dap_chain_net_set_srv_callback_notify(s_srv_order_callback_notify); //geoip_info_t *l_ipinfo = chain_net_geoip_get_ip_info("8.8.8.8"); return 0; } @@ -439,13 +444,18 @@ int dap_chain_net_srv_order_delete_by_hash_str(dap_chain_net_t * a_net, const ch * @param a_orders * @param a_str_out */ -void dap_chain_net_srv_order_dump_to_string(dap_chain_net_srv_order_t *a_order,dap_string_t * a_str_out) +void dap_chain_net_srv_order_dump_to_string(dap_chain_net_srv_order_t *a_order,dap_string_t * a_str_out, const char *a_hash_out_type) { if (a_order && a_str_out ){ dap_chain_hash_fast_t l_hash; - char l_hash_str[DAP_CHAIN_HASH_FAST_SIZE * 2 + 4]; + char *l_hash_str;//[DAP_CHAIN_HASH_FAST_SIZE * 2 + 4]; dap_hash_fast(a_order, dap_chain_net_srv_order_get_size(a_order), &l_hash); - dap_chain_hash_fast_to_str(&l_hash,l_hash_str,sizeof(l_hash_str)-1); + //dap_chain_hash_fast_to_str(&l_hash,l_hash_str,sizeof(l_hash_str)-1); + if(!dap_strcmp(a_hash_out_type,"hex")) + l_hash_str = dap_chain_hash_fast_to_str_new(&l_hash); + else + l_hash_str = dap_enc_base58_encode_hash_to_str(&l_hash); + dap_string_append_printf(a_str_out, "== Order %s ==\n", l_hash_str); dap_string_append_printf(a_str_out, " version: %u\n", a_order->version ); @@ -469,8 +479,13 @@ void dap_chain_net_srv_order_dump_to_string(dap_chain_net_srv_order_t *a_order,d l_continent_str = dap_chain_net_srv_order_continent_to_str(l_continent_num); dap_string_append_printf(a_str_out, " node_location: %s - %s\n", l_continent_str ? l_continent_str : "None" , l_region ? l_region : "None"); DAP_DELETE(l_region); + DAP_DELETE(l_hash_str); - dap_chain_hash_fast_to_str(&a_order->tx_cond_hash,l_hash_str, sizeof(l_hash_str)-1); + if(!dap_strcmp(a_hash_out_type, "hex")) + l_hash_str = dap_chain_hash_fast_to_str_new(&a_order->tx_cond_hash); + else + l_hash_str = dap_enc_base58_encode_hash_to_str(&a_order->tx_cond_hash); + //dap_chain_hash_fast_to_str(&a_order->tx_cond_hash,l_hash_str, sizeof(l_hash_str)-1); dap_string_append_printf(a_str_out, " tx_cond_hash: %s\n", l_hash_str ); char *l_ext_out = a_order->ext_size ? DAP_NEW_Z_SIZE(char, a_order->ext_size * 2 + 1) : NULL; dap_bin2hex(l_ext_out, a_order->ext, a_order->ext_size); @@ -478,7 +493,46 @@ void dap_chain_net_srv_order_dump_to_string(dap_chain_net_srv_order_t *a_order,d dap_string_append_printf(a_str_out, " ext: 0x%s\n", l_ext_out); else dap_string_append_printf(a_str_out, " ext: 0x0\n"); - + DAP_DELETE(l_hash_str); DAP_DELETE(l_ext_out); } } + +static void s_srv_order_callback_notify(void *a_arg, const char a_op_code, const char *a_prefix, const char *a_group, + const char *a_key, const void *a_value, const size_t a_value_len) +{ + (void) a_op_code; + UNUSED(a_prefix); + UNUSED(a_value_len); + if (!a_arg || !a_value || !dap_config_get_item_bool_default(g_config, "srv", "order_signed_only", false)) { + return; + } + dap_chain_net_t *l_net = (dap_chain_net_t *)a_arg; + char *l_gdb_group_str = dap_chain_net_srv_order_get_gdb_group(l_net); + if (!strcmp(a_group, l_gdb_group_str)) { + dap_chain_net_srv_order_t *l_order = (dap_chain_net_srv_order_t *)a_value; + if (l_order->version == 1) { + dap_chain_global_db_gr_del((char *)a_key, a_group); + } else { + dap_sign_t *l_sign = (dap_sign_t *)&l_order->ext[l_order->ext_size]; + if (!dap_sign_verify(l_sign, l_order, sizeof(dap_chain_net_srv_order_t) + l_order->ext_size)) { + dap_chain_global_db_gr_del((char *)a_key, a_group); + DAP_DELETE(l_gdb_group_str); + return; + } + dap_chain_hash_fast_t l_pkey_hash; + if (!dap_sign_get_pkey_hash(l_sign, &l_pkey_hash)) { + dap_chain_global_db_gr_del((char *)a_key, a_group); + DAP_DELETE(l_gdb_group_str); + return; + } + dap_chain_addr_t l_addr = {}; + dap_chain_addr_fill(&l_addr, l_sign->header.type, &l_pkey_hash, l_net->pub.id); + uint64_t l_solvency = dap_chain_ledger_calc_balance(l_net->pub.ledger, &l_addr, l_order->price_ticker); + if (l_solvency < l_order->price && !dap_chain_net_srv_stake_key_delegated(&l_addr)) { + dap_chain_global_db_gr_del((char *)a_key, a_group); + } + } + DAP_DELETE(l_gdb_group_str); + } +} diff --git a/modules/net/srv/include/dap_chain_net_srv_order.h b/modules/net/srv/include/dap_chain_net_srv_order.h index aa695855af8500fb8a961ab15e74272b1d5aba7c..f4a65545ea90428e278f79e85c0bdab4fda83b7e 100644 --- a/modules/net/srv/include/dap_chain_net_srv_order.h +++ b/modules/net/srv/include/dap_chain_net_srv_order.h @@ -109,7 +109,7 @@ char *dap_chain_net_srv_order_create(dap_chain_net_t * a_net, ); int dap_chain_net_srv_order_save(dap_chain_net_t * a_net, dap_chain_net_srv_order_t *a_order); -void dap_chain_net_srv_order_dump_to_string(dap_chain_net_srv_order_t *a_order,dap_string_t * a_str_out); +void dap_chain_net_srv_order_dump_to_string(dap_chain_net_srv_order_t *a_order,dap_string_t * a_str_out, const char *a_hash_out_type); /** * @brief dap_chain_net_srv_order_get_gdb_group_mempool 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/service/vpn/dap_chain_net_srv_vpn.c b/modules/service/vpn/dap_chain_net_srv_vpn.c index 2f92c769503adf7510ff220ecc9f3a3a57b4a47e..5f5e56c22b3b4e514ab9f7d1072f1d7f644b1ea2 100644 --- a/modules/service/vpn/dap_chain_net_srv_vpn.c +++ b/modules/service/vpn/dap_chain_net_srv_vpn.c @@ -1646,41 +1646,41 @@ void m_es_tun_read(dap_events_socket_t * a_es, void * arg) size_t l_read_ret; - do{ - l_read_ret = dap_events_socket_read(s_raw_server->tun_events_socket, l_tmp_buf, sizeof(l_tmp_buf)); - - if(l_read_ret > 0) { - struct iphdr *iph = (struct iphdr*) l_tmp_buf; - struct in_addr in_daddr, in_saddr; - in_daddr.s_addr = iph->daddr; - in_saddr.s_addr = iph->saddr; - char str_daddr[42], str_saddr[42]; - dap_snprintf(str_saddr, sizeof(str_saddr), "%s",inet_ntoa(in_saddr) ); - dap_snprintf(str_daddr, sizeof(str_daddr), "%s",inet_ntoa(in_daddr) ); - - dap_chain_net_srv_ch_vpn_t * l_ch_vpn = NULL; - pthread_rwlock_rdlock(&s_clients_rwlock); - HASH_FIND(hh,s_ch_vpn_addrs, &in_daddr, sizeof (in_daddr), l_ch_vpn); - - if(l_ch_vpn) { // Is present in hash table such destination address - - if (dap_stream_ch_get_ready_to_read(l_ch_vpn->ch ) ){ - dap_chain_net_srv_stream_session_t * l_srv_session = DAP_CHAIN_NET_SRV_STREAM_SESSION (l_ch_vpn->ch->stream->session ); - dap_chain_net_srv_usage_t * l_usage = dap_chain_net_srv_usage_find(l_srv_session, l_ch_vpn->usage_id); - ch_vpn_pkt_t *l_pkt_out = DAP_NEW_Z_SIZE(ch_vpn_pkt_t, sizeof(l_pkt_out->header) + l_read_ret); - l_pkt_out->header.op_code = VPN_PACKET_OP_CODE_VPN_RECV; - l_pkt_out->header.sock_id = s_raw_server->tun_fd; - l_pkt_out->header.usage_id = l_ch_vpn->usage_id; - l_pkt_out->header.op_data.data_size = l_read_ret; - memcpy(l_pkt_out->data, l_tmp_buf, l_read_ret); - dap_stream_ch_pkt_write(l_ch_vpn->ch, DAP_STREAM_CH_PKT_TYPE_NET_SRV_VPN_DATA, l_pkt_out, - l_pkt_out->header.op_data.data_size + sizeof(l_pkt_out->header)); - s_update_limits(l_ch_vpn->ch,l_srv_session,l_usage, l_read_ret); - } + + l_read_ret = dap_events_socket_read(s_raw_server->tun_events_socket, l_tmp_buf, sizeof(l_tmp_buf)); + + if(l_read_ret > 0) { + struct iphdr *iph = (struct iphdr*) l_tmp_buf; + struct in_addr in_daddr, in_saddr; + in_daddr.s_addr = iph->daddr; + in_saddr.s_addr = iph->saddr; + char str_daddr[42], str_saddr[42]; + dap_snprintf(str_saddr, sizeof(str_saddr), "%s",inet_ntoa(in_saddr) ); + dap_snprintf(str_daddr, sizeof(str_daddr), "%s",inet_ntoa(in_daddr) ); + + dap_chain_net_srv_ch_vpn_t * l_ch_vpn = NULL; + pthread_rwlock_rdlock(&s_clients_rwlock); + HASH_FIND(hh,s_ch_vpn_addrs, &in_daddr, sizeof (in_daddr), l_ch_vpn); + + if(l_ch_vpn) { // Is present in hash table such destination address + + if (dap_stream_ch_get_ready_to_read(l_ch_vpn->ch ) ){ + dap_chain_net_srv_stream_session_t * l_srv_session = DAP_CHAIN_NET_SRV_STREAM_SESSION (l_ch_vpn->ch->stream->session ); + dap_chain_net_srv_usage_t * l_usage = dap_chain_net_srv_usage_find(l_srv_session, l_ch_vpn->usage_id); + ch_vpn_pkt_t *l_pkt_out = DAP_NEW_Z_SIZE(ch_vpn_pkt_t, sizeof(l_pkt_out->header) + l_read_ret); + l_pkt_out->header.op_code = VPN_PACKET_OP_CODE_VPN_RECV; + l_pkt_out->header.sock_id = s_raw_server->tun_fd; + l_pkt_out->header.usage_id = l_ch_vpn->usage_id; + l_pkt_out->header.op_data.data_size = l_read_ret; + memcpy(l_pkt_out->data, l_tmp_buf, l_read_ret); + dap_stream_ch_pkt_write(l_ch_vpn->ch, DAP_STREAM_CH_PKT_TYPE_NET_SRV_VPN_DATA, l_pkt_out, + l_pkt_out->header.op_data.data_size + sizeof(l_pkt_out->header)); + s_update_limits(l_ch_vpn->ch,l_srv_session,l_usage, l_read_ret); } - pthread_rwlock_unlock(&s_clients_rwlock); } - }while(l_read_ret > 0); + pthread_rwlock_unlock(&s_clients_rwlock); + } + dap_events_socket_set_readable(a_es, true); } 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);