diff --git a/CMakeLists.txt b/CMakeLists.txt index b3dc45e24351856fd940d42f496c709b34b7da01..f3633b819cf59e489340dfd74522eb695ae63020 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ project(cellframe-sdk C) cmake_minimum_required(VERSION 2.8) set(CMAKE_C_STANDARD 11) -set(CELLFRAME_SDK_NATIVE_VERSION "2.6-52") +set(CELLFRAME_SDK_NATIVE_VERSION "2.6-54") add_definitions ("-DCELLFRAME_SDK_VERSION=\"${CELLFRAME_SDK_NATIVE_VERSION}\"") set(DAPSDK_MODULES "") diff --git a/dap-sdk/crypto/include/dap_hash.h b/dap-sdk/crypto/include/dap_hash.h index 368157ec342d67c2a194228bdda49f7295138813..2cff59c6bde874a244cb13a5d20e83805b35af93 100755 --- a/dap-sdk/crypto/include/dap_hash.h +++ b/dap-sdk/crypto/include/dap_hash.h @@ -106,7 +106,11 @@ DAP_STATIC_INLINE int dap_chain_hash_fast_to_str( dap_hash_fast_t *a_hash, char return DAP_CHAIN_HASH_FAST_SIZE * 2 + 2; } -static inline char *dap_chain_hash_fast_to_str_new(dap_hash_fast_t * a_hash) +DAP_STATIC_INLINE int dap_hash_fast_to_str(dap_hash_fast_t *a_hash, char *a_str, size_t a_str_max){ + return dap_chain_hash_fast_to_str(a_hash,a_str,a_str_max); +} + +DAP_STATIC_INLINE char *dap_chain_hash_fast_to_str_new(dap_hash_fast_t * a_hash) { const size_t c_hash_str_size = sizeof(*a_hash)*2 +1 /*trailing zero*/ +2 /* heading 0x */+4/*just to be sure*/ ; char * ret = DAP_NEW_Z_SIZE(char, c_hash_str_size); @@ -114,6 +118,10 @@ static inline char *dap_chain_hash_fast_to_str_new(dap_hash_fast_t * a_hash) return ret; } +DAP_STATIC_INLINE char *dap_hash_fast_to_str_new(dap_hash_fast_t * a_hash) +{ + return dap_chain_hash_fast_to_str_new(a_hash); +} #ifdef __cplusplus } #endif diff --git a/modules/channel/chain/dap_stream_ch_chain.c b/modules/channel/chain/dap_stream_ch_chain.c index cb15c80a7f649ca1ef7627d9142cd062bcb0ae1b..97984100805038c474e8d6815424dd269eef1219 100644 --- a/modules/channel/chain/dap_stream_ch_chain.c +++ b/modules/channel/chain/dap_stream_ch_chain.c @@ -325,11 +325,11 @@ bool s_chain_pkt_callback(dap_proc_thread_t *a_thread, void *a_arg) } if (l_pkt_copy) DAP_DELETE(l_pkt_copy); + + DAP_DELETE(l_pkt_copy_list); }else{ // log_it(L_WARNING, "Next pkt copy list is NULL"); } - if (l_pkt_copy_list) - DAP_DELETE(l_pkt_copy_list); }else log_it(L_WARNING, "In proc thread got CHAINS stream ch packet with zero data"); dap_proc_thread_assign_on_worker_inter(a_thread, l_ch->stream_worker->worker, l_ch->stream->esocket ); @@ -693,22 +693,27 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) } break; case DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_CHAINS_RVRS: { - dap_stream_ch_chain_sync_request_t l_sync_chains = {}; - memcpy(&l_sync_chains, l_chain_pkt->data, l_chain_pkt_data_size); - dap_chain_t *l_chain = dap_chain_find_by_id(l_chain_pkt->hdr.net_id, l_chain_pkt->hdr.chain_id); - dap_chain_hash_fast_t *l_hash = dap_db_get_last_hash_remote(l_sync_chains.node_addr.uint64, l_chain); - if (l_hash) { - memcpy(&l_sync_chains.hash_from, l_hash, sizeof(*l_hash)); - DAP_DELETE(l_hash); + if(l_chain_pkt_data_size == sizeof(dap_stream_ch_chain_sync_request_t)) { + dap_stream_ch_chain_sync_request_t l_request={0}; + dap_chain_t *l_chain = dap_chain_find_by_id(l_chain_pkt->hdr.net_id, l_chain_pkt->hdr.chain_id); + if( l_chain){ + dap_chain_get_atom_last_hash(l_chain,& l_request.hash_from); + if( dap_log_level_get()<= L_INFO){ + char l_hash_from_str[70]={[0]='\0'}; + dap_chain_hash_fast_to_str(&l_request.hash_from,l_hash_from_str,sizeof (l_hash_from_str)-1); + log_it(L_INFO, "In: SYNC_CHAINS_RVRS pkt: net 0x%016x chain 0x%016x cell 0x%016x request chains sync from %s", + l_chain_pkt->hdr.net_id.uint64 , l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64, + l_hash_from_str[0] ? l_hash_from_str :"(null)"); + } + dap_stream_ch_chain_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_CHAINS, l_chain_pkt->hdr.net_id, + l_chain_pkt->hdr.chain_id, l_chain_pkt->hdr.cell_id, &l_request, sizeof(l_request)); + } + }else{ + log_it(L_WARNING, "DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_CHAINS_RVRS: Wrong chain packet size %zd when expected %zd", l_chain_pkt_data_size, sizeof(l_ch_chain->request)); + dap_stream_ch_chain_pkt_write_error(a_ch, l_chain_pkt->hdr.net_id, + l_chain_pkt->hdr.chain_id, l_chain_pkt->hdr.cell_id, + "ERROR_CHAIN_PKT_DATA_SIZE" ); } - char *l_hash_from_str = dap_chain_hash_fast_to_str_new(&l_sync_chains.hash_from); - log_it(L_INFO, "In: SYNC_CHAINS_RVRS pkt: net 0x%016x chain 0x%016x cell 0x%016x request chains sync from %s", - l_chain_pkt->hdr.net_id.uint64 , l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64, - l_hash_from_str ? l_hash_from_str :"(null)"); - - dap_stream_ch_chain_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_CHAINS, l_chain_pkt->hdr.net_id, - l_chain_pkt->hdr.chain_id, l_chain_pkt->hdr.cell_id, &l_sync_chains, sizeof(l_sync_chains)); - DAP_DELETE(l_hash_from_str); } break; case DAP_STREAM_CH_CHAIN_PKT_TYPE_ERROR: diff --git a/modules/common/dap_chain_datum_tx_items.c b/modules/common/dap_chain_datum_tx_items.c index de892d7e9671b7db9a21d70fccc1cb963315c4ce..4c21317ab586c34221110278e11d2b41bf35b293 100644 --- a/modules/common/dap_chain_datum_tx_items.c +++ b/modules/common/dap_chain_datum_tx_items.c @@ -415,4 +415,3 @@ dap_chain_tx_out_cond_t *dap_chain_datum_tx_out_cond_get(dap_chain_datum_tx_t *a } return l_res; } - diff --git a/modules/common/include/dap_chain_datum_tx_items.h b/modules/common/include/dap_chain_datum_tx_items.h index 6665d3eef27458f969d0d985b8e4797976023164..e194c7c33645b132b9560410e9a07565af2f95a7 100644 --- a/modules/common/include/dap_chain_datum_tx_items.h +++ b/modules/common/include/dap_chain_datum_tx_items.h @@ -48,6 +48,25 @@ * return type, or TX_ITEM_TYPE_ANY if error */ dap_chain_tx_item_type_t dap_chain_datum_tx_item_get_type(const uint8_t *a_item); +DAP_STATIC_INLINE const char * dap_chain_datum_tx_item_type_to_str(dap_chain_tx_item_type_t a_item_type) +{ + switch(a_item_type){ + case TX_ITEM_TYPE_IN: return "TX_ITEM_TYPE_IN"; + case TX_ITEM_TYPE_OUT: return "TX_ITEM_TYPE_OUT"; + case TX_ITEM_TYPE_OUT_EXT: return "TX_ITEM_TYPE_OUT_EXT"; + case TX_ITEM_TYPE_PKEY: return "TX_ITEM_TYPE_PKEY"; + case TX_ITEM_TYPE_SIG: return "TX_ITEM_TYPE_SIG"; + case TX_ITEM_TYPE_TOKEN: return "TX_ITEM_TYPE_TOKEN"; + case TX_ITEM_TYPE_TOKEN_EXT: return "TX_ITEM_TYPE_TOKEN_EXT"; + case TX_ITEM_TYPE_IN_COND: return "TX_ITEM_TYPE_IN_COND"; + case TX_ITEM_TYPE_OUT_COND: return "TX_ITEM_TYPE_OUT_COND"; + case TX_ITEM_TYPE_RECEIPT: return "TX_ITEM_TYPE_RECEIPT"; + case TX_ITEM_TYPE_OUT_ALL: return "TX_ITEM_TYPE_OUT_ALL"; + case TX_ITEM_TYPE_ANY: return "TX_ITEM_TYPE_ANY"; + default: return "UNDEFINED"; + } + +} /** * Get item size diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index 3490234113f30e068257a98d2df1dde562ec9c47..aac0e599e44eb706b08d5701a8f42af536baa53f 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -605,7 +605,8 @@ static int s_net_states_proc(dap_chain_net_t *a_net) if(dap_log_level_get() <= L_DEBUG){ char l_hash_str[128]={[0]='\0'}; dap_chain_hash_fast_to_str(&l_request.hash_from,l_hash_str,sizeof (l_hash_str)-1); - log_it(L_DEBUG,"Send sync chain request from %s to infinity",l_hash_str); + log_it(L_DEBUG,"Send sync chain request to"NODE_ADDR_FP_STR" for %s:%s from %s to infinity", + NODE_ADDR_FP_ARGS_S(l_node_client->remote_node_addr) ,a_net->pub.name, l_chain->name, l_hash_str); } }else log_it(L_DEBUG,"Send sync chain request for all the chains for addr "NODE_ADDR_FP_STR, @@ -628,7 +629,7 @@ static int s_net_states_proc(dap_chain_net_t *a_net) log_it(L_ERROR, "Sync of chain '%s' error %d", l_chain->name,l_res); } - /* + dap_chain_node_client_reset(l_node_client); l_request.node_addr.uint64 = dap_chain_net_get_cur_addr_int(a_net); @@ -652,7 +653,6 @@ static int s_net_states_proc(dap_chain_net_t *a_net) default: log_it(L_ERROR, "Reverse sync of chain '%s' error %d", l_chain->name,l_res); } - */ } l_tmp = dap_list_next(l_tmp); @@ -2193,6 +2193,7 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da dap_string_append_printf(a_str_out,"==Datum Token Declaration\n"); dap_string_append_printf(a_str_out, "ticker: %s\n", l_token->ticker); dap_string_append_printf(a_str_out, "size: %zd\n", l_token_size); + dap_hash_fast_t l_hash ={0}; switch (l_token->type) { case DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE:{ dap_string_append_printf(a_str_out, "type: SIMPLE\n"); @@ -2236,7 +2237,7 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SIGNS_ADD : if(l_tsd->size == sizeof(dap_chain_hash_fast_t) ){ char *l_hash_str; - if(!dap_strcmp(a_hash_out_type, "hex")) + if(!dap_strcmp(a_hash_out_type, "hex") || !dap_strcmp(a_hash_out_type, "content_hash") ) 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); @@ -2248,7 +2249,7 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SIGNS_REMOVE : if(l_tsd->size == sizeof(dap_chain_hash_fast_t) ){ char *l_hash_str; - if(!dap_strcmp(a_hash_out_type,"hex")) + if(!dap_strcmp(a_hash_out_type,"hex")|| !dap_strcmp(a_hash_out_type, "content_hash")) 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); @@ -2371,6 +2372,128 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da size_t l_certs_field_size = l_token_size - sizeof(*l_token) - l_token->header_private_decl.tsd_total_size; dap_chain_datum_token_certs_dump(a_str_out, l_token->data_n_tsd, l_certs_field_size); + }break; + case DAP_CHAIN_DATUM_TX:{ + dap_chain_datum_tx_t * l_tx =(dap_chain_datum_tx_t *) a_datum->data; + char buf[50]; + time_t l_ts_created = l_tx->header.ts_created; + dap_string_append_printf(a_str_out,"type: TX\n"); + dap_string_append_printf(a_str_out,"type: ts_created: %s \n",ctime_r(&l_ts_created, buf)); + int l_items_count = -1; + dap_list_t * l_items = dap_chain_datum_tx_items_get(l_tx,TX_ITEM_TYPE_ANY,&l_items_count); + dap_string_append_printf(a_str_out,"type: items_count: %d \n", l_items_count ); + if (l_items_count>0){ + size_t n=0; + for( dap_list_t * l_cur = l_items; l_cur; l_cur = l_cur->next ){ + dap_string_append_printf(a_str_out,"Item #%zd\n",n); + byte_t *l_tx_item = l_cur->data; + dap_chain_tx_item_type_t l_item_type = dap_chain_datum_tx_item_get_type(l_tx_item); + dap_string_append_printf(a_str_out,"\ttype: %s \n", + dap_chain_datum_tx_item_type_to_str (l_item_type) ); + switch (l_item_type) { + case TX_ITEM_TYPE_IN:{ + dap_chain_tx_in_t * l_in = l_cur->data; + dap_string_append_printf(a_str_out,"\ttx_out_prev_idx: %u\n", l_in->header.tx_out_prev_idx ); + dap_string_append_printf(a_str_out,"\ttx_out_prev_idx : %u\n", l_in->header.tx_prev_hash ); + char l_tx_prev_hash_str[70]={[0]='\0'}; + dap_hash_fast_to_str(&l_in->header.tx_prev_hash, l_tx_prev_hash_str,sizeof (l_tx_prev_hash_str)-1); + dap_string_append_printf(a_str_out,"\ttx_prev_hash : %s\n", l_tx_prev_hash_str ); + } break; + case TX_ITEM_TYPE_OUT:{ + dap_chain_tx_out_t * l_out = l_cur->data; + dap_string_append_printf(a_str_out,"\tvalue: %u\n", l_out->header.value ); + char * l_addr_str = dap_chain_addr_to_str(&l_out->addr); + dap_string_append_printf(a_str_out,"\taddr : %s\n", l_addr_str ); + DAP_DELETE(l_addr_str); + } break; + case TX_ITEM_TYPE_OUT_EXT:{ + dap_chain_tx_out_ext_t * l_out_ext = l_cur->data; + dap_string_append_printf(a_str_out,"\tvalue: %u\n", l_out_ext->header.value ); + char * l_addr_str = dap_chain_addr_to_str(&l_out_ext->addr); + dap_string_append_printf(a_str_out,"\taddr : %s\n", l_addr_str ); + dap_string_append_printf(a_str_out,"\ttoken : %s\n", l_out_ext->token ); + DAP_DELETE(l_addr_str); + } break; + case TX_ITEM_TYPE_SIG:{ + dap_chain_tx_sig_t * l_item_sign = l_cur->data; + dap_sign_t *l_sign = l_item_sign->sig; + dap_hash_fast_t l_sign_hash; + char l_sign_hash_str[70]={[0]='\0'}; + dap_string_append_printf(a_str_out,"\tsig_size: %u\n", l_item_sign->header.sig_size ); + dap_string_append_printf(a_str_out,"\ttype: %s\n", dap_sign_type_to_str(l_sign->header.type) ); + dap_sign_get_pkey_hash(l_sign,&l_sign_hash); + dap_hash_fast_to_str(&l_sign_hash,&l_sign_hash_str,sizeof (l_sign_hash_str)-1); + dap_string_append_printf(a_str_out,"\tpkey_hash: %s\n", l_sign_hash_str ); + } break; + case TX_ITEM_TYPE_TOKEN:{ + dap_chain_tx_token_t * l_token = l_cur->data; + dap_string_append_printf(a_str_out,"\tticker: %s\n", l_token->header.ticker ); + dap_string_append_printf(a_str_out,"\ttoken_emission_chain: 0x%016x\n", l_token->header.token_emission_chain_id ); + char l_token_emission_hash_str[70]={ [0]='\0'}; + dap_chain_hash_fast_to_str(& l_token->header.token_emission_hash,l_token_emission_hash_str, + sizeof (l_token_emission_hash_str)-1); + dap_string_append_printf(a_str_out,"\ttoken_emission_hash: %s", l_token_emission_hash_str ); + } break; + case TX_ITEM_TYPE_TOKEN_EXT:{ + dap_chain_tx_token_ext_t * l_token = l_cur->data; + dap_string_append_printf(a_str_out,"\tversion: %u\n",l_token->header.version ); + dap_string_append_printf(a_str_out,"\tticker: %s\n", l_token->header.ticker ); + dap_string_append_printf(a_str_out,"\text_net: 0x%016x\n",l_token->header.ext_net_id ); + dap_string_append_printf(a_str_out,"\text_chain: 0x%016x\n",l_token->header.ext_chain_id ); + dap_string_append_printf(a_str_out,"\text_tx_out_idx: %u\n",l_token->header.ext_tx_out_idx ); + char l_token_emission_hash_str[70]={ [0]='\0'}; + dap_chain_hash_fast_to_str(& l_token->header.ext_tx_hash,l_token_emission_hash_str, + sizeof (l_token_emission_hash_str)-1); + dap_string_append_printf(a_str_out,"\text_tx_hash: %s", l_token_emission_hash_str ); + } break; + case TX_ITEM_TYPE_IN_COND:{ + dap_chain_tx_in_cond_t * l_in = l_cur->data; + dap_string_append_printf(a_str_out,"\ttx_out_prev_idx: %u\n", l_in->header.tx_out_prev_idx ); + dap_string_append_printf(a_str_out,"\ttx_out_prev_idx : %u\n", l_in->header.tx_prev_hash ); + dap_string_append_printf(a_str_out,"\treceipt_idx : %u\n", l_in->header.receipt_idx ); + char l_tx_prev_hash_str[70]={[0]='\0'}; + dap_hash_fast_to_str(&l_in->header.tx_prev_hash, l_tx_prev_hash_str,sizeof (l_tx_prev_hash_str)-1); + dap_string_append_printf(a_str_out,"\ttx_prev_hash : %s\n", l_tx_prev_hash_str ); + } break; + case TX_ITEM_TYPE_OUT_COND:{ + dap_chain_tx_out_cond_t * l_out = l_cur->data; + dap_string_append_printf(a_str_out,"\tvalue: %u\n", l_out->header.value ); + switch ( l_out->header.subtype){ + case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY:{ + dap_string_append_printf(a_str_out,"\tsubtype: DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY\n"); + dap_string_append_printf(a_str_out,"\srv_uid: 0x%016x\n", l_out->subtype.srv_pay.srv_uid.uint64 ); + switch (l_out->subtype.srv_pay.unit.enm) { + case SERV_UNIT_UNDEFINED: dap_string_append_printf(a_str_out,"\tunit: SERV_UNIT_UNDEFINED\n"); break; + case SERV_UNIT_MB: dap_string_append_printf(a_str_out,"\tunit: SERV_UNIT_MB\n"); break; + case SERV_UNIT_SEC: dap_string_append_printf(a_str_out,"\tunit: SERV_UNIT_SEC\n"); break; + case SERV_UNIT_DAY: dap_string_append_printf(a_str_out,"\tunit: SERV_UNIT_DAY\n"); break; + case SERV_UNIT_KB: dap_string_append_printf(a_str_out,"\tunit: SERV_UNIT_KB\n"); break; + case SERV_UNIT_B : dap_string_append_printf(a_str_out,"\tunit: SERV_UNIT_B\n"); break; + default: dap_string_append_printf(a_str_out,"\tunit: SERV_UNIT_UNKNOWN\n"); break; + } + dap_string_append_printf(a_str_out,"\tunit_price_max: %llu\n", l_out->subtype.srv_pay.unit_price_max_datoshi); + char l_pkey_hash_str[70]={[0]='\0'}; + dap_chain_hash_fast_to_str(&l_out->subtype.srv_pay.pkey_hash, l_pkey_hash_str, sizeof (l_pkey_hash_str)-1); + dap_string_append_printf(a_str_out,"\tpkey_hash: %s\n", l_pkey_hash_str ); + }break; + case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE:{ + dap_string_append_printf(a_str_out,"\tsubtype: DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE\n"); + }break; + case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE:{ + dap_string_append_printf(a_str_out,"\tsubtype: DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE\n"); + }break; + } + dap_string_append_printf(a_str_out,"\tparams_size : %u\n", l_out->params_size ); + } break; + case TX_ITEM_TYPE_RECEIPT:{} break; + default:{} + } + n++; + } + } + dap_list_free(l_items); + + }break; case DAP_CHAIN_DATUM_TOKEN_TYPE_PUBLIC:{ dap_string_append_printf(a_str_out,"type: PUBLIC\n"); diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c index 14ff5131d5b51d0298ecb32cf5637f72730e4f32..2effd1679c4741f4c0f20a4fe890abf8b7eaf9e3 100644 --- a/modules/net/dap_chain_node_cli_cmd.c +++ b/modules/net/dap_chain_node_cli_cmd.c @@ -2053,17 +2053,17 @@ void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a 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); + char * l_key = dap_strdup(l_objs[i].key); time_t l_ts_create = (time_t) l_datum->header.ts_create; - dap_string_append_printf(a_str_tmp, "hash %s: type_id=%s data_size=%u ts_create=%s", // \n included in timestamp + + dap_hash_fast_t l_data_hash; + char l_data_hash_str[70]={[0]='\0'}; + dap_hash_fast(l_datum->data,l_datum->header.data_size,&l_data_hash); + dap_hash_fast_to_str(&l_data_hash,l_data_hash_str,sizeof (l_data_hash_str)-1); + + dap_string_append_printf(a_str_tmp, "hash %s: type_id=%s data_size=%u data_hash=%s 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)); + l_datum->header.data_size, l_data_hash_str, ctime_r(&l_ts_create, buf)); DAP_DELETE(l_key); dap_chain_net_dump_datum(a_str_tmp, l_datum, a_hash_out_type); } @@ -2088,15 +2088,8 @@ 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; + const char * l_hash_out_type = "hex"; 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 = "hex"; - if(dap_strcmp(l_hash_out_type,"hex") && dap_strcmp(l_hash_out_type,"base58")) { - dap_chain_node_cli_set_reply_text(a_str_reply, "invalid parameter -H, valid values: -H <hex | base58>"); - 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; diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c index dcff1c6d7923b498a6fa84207f2c12d558d43013..ffe522621815eb837c693c8caa957f7db3dfc532 100644 --- a/modules/type/dag/dap_chain_cs_dag.c +++ b/modules/type/dag/dap_chain_cs_dag.c @@ -54,6 +54,7 @@ typedef struct dap_chain_cs_dag_event_item { dap_chain_hash_fast_t hash; + dap_chain_hash_fast_t hash_event_content; time_t ts_added; dap_chain_cs_dag_event_t *event; size_t event_size; @@ -68,6 +69,7 @@ typedef struct dap_chain_cs_dag_pvt { pthread_rwlock_t events_rwlock; dap_chain_cs_dag_event_item_t * events; + dap_chain_cs_dag_event_item_t * events_tmp; // Tmp value for HASH_ITER dap_chain_cs_dag_event_item_t * tx_events; dap_chain_cs_dag_event_item_t * events_treshold; @@ -960,8 +962,11 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_first(dap_chain_atom_ } dap_chain_cs_dag_t * l_dag = DAP_CHAIN_CS_DAG(a_atom_iter->chain); dap_chain_cs_dag_pvt_t *l_dag_pvt = l_dag ? PVT(l_dag) : NULL; - a_atom_iter->cur_item = l_dag_pvt->events; - a_atom_iter->cur = (dap_chain_cs_dag_event_t*) (l_dag_pvt->events ? l_dag_pvt->events->event : NULL); + l_dag_pvt->events_tmp = NULL; + dap_chain_cs_dag_event_item_t * l_cur_item = NULL; + HASH_ITER(hh,l_dag_pvt->events, l_cur_item, l_dag_pvt->events_tmp); + a_atom_iter->cur_item = l_cur_item; + a_atom_iter->cur = (dap_chain_cs_dag_event_t*) (l_cur_item ? l_cur_item->event : NULL); a_atom_iter->cur_size = l_dag_pvt->events ? l_dag_pvt->events->event_size : 0; // a_atom_iter->cur = a_atom_iter->cur ? @@ -1329,8 +1334,8 @@ static int s_cli_dag(int argc, char ** argv, void *arg_func, char **a_str_reply) } } - //if (l_event_hash_str) - // dap_chain_str_to_hash_fast(l_event_hash_str,&l_event_hash); + if (l_event_hash_hex_str) + dap_chain_hash_fast_from_str(l_event_hash_hex_str,&l_event_hash); switch ( l_event_subcmd ){ case SUBCMD_EVENT_CREATE:{ @@ -1452,7 +1457,7 @@ static int s_cli_dag(int argc, char ** argv, void *arg_func, char **a_str_reply) else { ret = -23; dap_chain_node_cli_set_reply_text(a_str_reply, - "Can't find events in events_last table\n"); + "Can't find event %s in events_last table\n", l_event_hash_str); break; } }else if ( strcmp(l_from_events_str,"events") == 0){ @@ -1465,7 +1470,7 @@ static int s_cli_dag(int argc, char ** argv, void *arg_func, char **a_str_reply) else { ret = -24; dap_chain_node_cli_set_reply_text(a_str_reply, - "Can't find events in events table\n"); + "Can't find event %s in events table\n", l_event_hash_str); break; }