From 24dfc3d7c0cbbda100882105a398707109a7a8b2 Mon Sep 17 00:00:00 2001 From: "Dmitriy A. Gerasimov" <dmitriy.gerasimov@demlabs.net> Date: Fri, 25 Sep 2020 20:54:28 +0700 Subject: [PATCH] [+] Wrapping function for chain callback datum_get_by_hash [+] Block cli operations [+] hash-to-string conversion functions --- CMakeLists.txt | 2 +- dap-sdk/crypto/include/dap_enc_base58.h | 1 + dap-sdk/crypto/src/dap_enc_base58.c | 28 ++ modules/CMakeLists.txt | 2 +- modules/chain/dap_chain.c | 15 + modules/chain/include/dap_chain.h | 1 + modules/type/blocks/dap_chain_block.c | 27 +- modules/type/blocks/dap_chain_block_cache.c | 5 +- modules/type/blocks/dap_chain_cs_blocks.c | 424 +++++++++--------- modules/type/blocks/include/dap_chain_block.h | 28 +- .../blocks/include/dap_chain_block_cache.h | 2 +- 11 files changed, 299 insertions(+), 236 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9519c9174d..357ecdc0b8 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-2") +set(CELLFRAME_SDK_NATIVE_VERSION "2.6-3") add_definitions ("-DCELLFRAME_SDK_VERSION=\"${CELLFRAME_SDK_NATIVE_VERSION}\"") set(DAPSDK_MODULES "") diff --git a/dap-sdk/crypto/include/dap_enc_base58.h b/dap-sdk/crypto/include/dap_enc_base58.h index 8392fb617e..8652d7bfd0 100755 --- a/dap-sdk/crypto/include/dap_enc_base58.h +++ b/dap-sdk/crypto/include/dap_enc_base58.h @@ -47,6 +47,7 @@ char* dap_enc_base58_encode_hash_to_str(dap_chain_hash_fast_t *a_in_hash); 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); +int dap_enc_base58_hex_to_hash(const char * a_hex_str, dap_chain_hash_fast_t * a_datum_hash); #ifdef __cplusplus } diff --git a/dap-sdk/crypto/src/dap_enc_base58.c b/dap-sdk/crypto/src/dap_enc_base58.c index acbfe8fcc5..fba7d9a633 100755 --- a/dap-sdk/crypto/src/dap_enc_base58.c +++ b/dap-sdk/crypto/src/dap_enc_base58.c @@ -219,6 +219,34 @@ 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)); } +/** + * @brief dap_enc_base58_hex_to_hash + * @param a_hex_str + * @param a_datum_hash + * @return + */ +int dap_enc_base58_hex_to_hash(const char * a_hex_str, dap_chain_hash_fast_t * a_datum_hash) +{ + assert(a_datum_hash); + + if (a_hex_str){ + char* l_datum_base58 = dap_enc_base58_from_hex_str_to_str(a_hex_str); + void * l_decoded = DAP_NEW_Z_SIZE(void,strlen(l_datum_base58)); + size_t l_decoded_size; + if (( l_decoded_size = dap_enc_base58_decode(l_datum_base58, l_decoded))!= sizeof (*a_datum_hash) ){ + memcpy( a_datum_hash, l_decoded, l_decoded_size); + return 0; + }else{ + log_it(L_ERROR,"Wrong hash format: can't parse \"%s\", decoded size %zd when expected %zd", a_hex_str, l_decoded_size, + sizeof (*a_datum_hash)); + return -1; + } + + }else + return -1; +} + + // convert from "0xA21F1E865B6740A28E8708798ECF25D2C0AA596DF5EB1FD724186B6AD7FF2199" to "Bura1HFrKsqbdytEXQVrxpbovtvLhR1VbrJs65JBx3gc" char* dap_enc_base58_from_hex_str_to_str(const char *a_in_str) { diff --git a/modules/CMakeLists.txt b/modules/CMakeLists.txt index 78ae7458e4..ea42647f24 100644 --- a/modules/CMakeLists.txt +++ b/modules/CMakeLists.txt @@ -39,7 +39,7 @@ endif() # Consensus type dag if (CELLFRAME_MODULES MATCHES "cs-blocks") - add_subdirectory(type/blocks) +# add_subdirectory(type/blocks) endif() # No consensus diff --git a/modules/chain/dap_chain.c b/modules/chain/dap_chain.c index b7d05539b1..db90df595e 100644 --- a/modules/chain/dap_chain.c +++ b/modules/chain/dap_chain.c @@ -165,6 +165,21 @@ void dap_chain_delete(dap_chain_t * a_chain) pthread_rwlock_unlock(&s_chain_items_rwlock); } +/** + * @brief dap_chain_get_atom_by_hash + * @param a_chain + * @param a_atom_hash + * @param a_atom_size + * @return + */ +dap_chain_atom_ptr_t dap_chain_get_atom_by_hash(dap_chain_t * a_chain, dap_chain_hash_fast_t * a_atom_hash, size_t * a_atom_size) +{ + dap_chain_atom_iter_t * l_iter = a_chain->callback_atom_iter_create(a_chain); + dap_chain_atom_ptr_t *l_ret = a_chain->callback_atom_find_by_hash(l_iter, a_atom_hash, a_atom_size); + a_chain->callback_atom_iter_delete(l_iter); + return l_ret; +} + /** * @brief dap_chain_find_by_id * @param a_chain_net_id diff --git a/modules/chain/include/dap_chain.h b/modules/chain/include/dap_chain.h index ed3f73afb2..d75c893559 100644 --- a/modules/chain/include/dap_chain.h +++ b/modules/chain/include/dap_chain.h @@ -172,3 +172,4 @@ dap_chain_t * dap_chain_load_from_cfg(dap_ledger_t* a_ledger,const char * a_chai void dap_chain_delete(dap_chain_t * a_chain); void dap_chain_add_callback_notify(dap_chain_t * a_chain, dap_chain_callback_notify_t a_callback, void * a_arg); +dap_chain_atom_ptr_t dap_chain_get_atom_by_hash(dap_chain_t * a_chain, dap_chain_hash_fast_t * a_atom_hash, size_t * a_atom_size); diff --git a/modules/type/blocks/dap_chain_block.c b/modules/type/blocks/dap_chain_block.c index d9b46ac216..1df5d188d4 100644 --- a/modules/type/blocks/dap_chain_block.c +++ b/modules/type/blocks/dap_chain_block.c @@ -26,6 +26,7 @@ #include "dap_hash.h" #include "dap_chain_block.h" +#include "dap_chain_block_cache.h" #define LOG_TAG "dap_chain_block" @@ -61,31 +62,29 @@ dap_chain_block_t * dap_chain_block_new(dap_chain_hash_fast_t * a_prev_block ) }else{ l_block->hdr.signature = DAP_CHAIN_BLOCK_SIGNATURE; l_block->hdr.version = 1; - l_block->hdr.timestamp = time(NULL); + l_block->hdr.ts_created = time(NULL); if( a_prev_block ){ - memcpy(&l_block->hdr.prev_block,a_prev_block,sizeof(l_block->hdr.prev_block)); + dap_chain_block_meta_add(l_block, DAP_CHAIN_BLOCK_META_PREV,a_prev_block,sizeof (*a_prev_block) ); }else{ log_it(L_INFO, "Genesis block produced"); - memset(&l_block->hdr.prev_block,0xff,sizeof(l_block->hdr.prev_block)); } - - l_block->hdr.size = sizeof(l_block->hdr); return l_block; } } -/** - * @brief dap_chain_block_datum_add - * @param a_block - * @param a_datum - * @param a_datum_size - * @return - */ -dap_chain_datum_t * dap_chain_block_datum_add(dap_chain_block_t * a_block, dap_chain_datum_t * a_datum, size_t a_datum_size); +// Add metadata in block +size_t dap_chain_block_meta_add(dap_chain_block_t * a_block, size_t a_block_size, uint8_t a_meta_type, const void * a_data, size_t a_data_size) +{ + +} + + +size_t dap_chain_block_datum_add(dap_chain_block_t * a_block, size_t a_block_size, dap_chain_datum_t * a_datum, size_t a_datum_size) { if ( a_block) { + dap_chain_block_cache_t * l_block_cache = dap_chain_block_cache_get(a_block, ) uint32_t l_sections_size = ( a_block->hdr.size - sizeof(a_block->hdr) ); if( l_sections_size > a_section_offset ){ if( l_sections_size > (a_section_offset + a_section_data_size ) ) { @@ -107,5 +106,5 @@ dap_chain_datum_t * dap_chain_block_datum_add(dap_chain_block_t * a_block, dap_c } } -void dap_chain_block_datum_del_by_hash(dap_chain_block_t * a_block, dap_chain_hash_fast_t* a_datum_hash); +void dap_chain_block_datum_del_by_hash(dap_chain_block_t * a_block, size_t a_block_size, dap_chain_hash_fast_t* a_datum_hash); diff --git a/modules/type/blocks/dap_chain_block_cache.c b/modules/type/blocks/dap_chain_block_cache.c index 694e8bd3fa..5227a8e79b 100644 --- a/modules/type/blocks/dap_chain_block_cache.c +++ b/modules/type/blocks/dap_chain_block_cache.c @@ -53,8 +53,11 @@ void dap_chain_block_cache_deinit() * @param a_block_size * @return */ -dap_chain_block_cache_t * dap_chain_block_cache_new(dap_chain_block_t * a_block, size_t a_block_size) +dap_chain_block_cache_t * dap_chain_block_cache_get(dap_chain_block_t * a_block, size_t a_block_size) { + if (! a_block) + return NULL; + dap_chain_block_cache_t * l_block_cache = DAP_NEW_Z(dap_chain_block_cache_t); l_block_cache->block = a_block; dap_chain_block_cache_update(l_block_cache); diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c index 0462a95fc2..f7db8bcebe 100644 --- a/modules/type/blocks/dap_chain_cs_blocks.c +++ b/modules/type/blocks/dap_chain_cs_blocks.c @@ -22,6 +22,7 @@ */ #include "dap_common.h" +#include "dap_enc_base58.h" #include "dap_chain.h" #include "dap_chain_net.h" #include "dap_chain_cs.h" @@ -29,6 +30,7 @@ #include "dap_chain_block.h" #include "dap_chain_block_cache.h" #include "dap_chain_node_cli.h" +#include "dap_chain_node_cli_cmd.h" #define LOG_TAG "dap_chain_cs_blocks" typedef struct dap_chain_cs_blocks_pvt @@ -37,14 +39,20 @@ typedef struct dap_chain_cs_blocks_pvt dap_chain_block_cache_t * block_cache_first; // Mapped area start dap_chain_block_cache_t * block_cache_last; // Last block in mapped area + + uint64_t blocks_count; uint64_t difficulty; + dap_chain_block_t * block_new; + size_t block_new_size; } dap_chain_cs_blocks_pvt_t; #define PVT(a) ((dap_chain_cs_blocks_pvt_t *) a->_pvt ) -static int s_cli_blocks(int argc, char ** argv, void *arg_func, char **a_str_reply); +static int s_cli_parse_cmd_hash(char ** a_argv, int a_arg_index, int a_argc, char **a_str_reply,const char * a_param, dap_chain_hash_fast_t * a_datum_hash); +static void s_cli_meta_hash_print( dap_string_t * a_str_tmp, const char * a_meta_title, dap_chain_block_meta_t * a_meta); +static int s_cli_blocks(int a_argc, char ** a_argv, void *a_arg_func, char **a_str_reply); // Callbacks static void s_callback_delete(dap_chain_t * a_chain); @@ -163,6 +171,11 @@ int dap_chain_cs_blocks_new(dap_chain_t * a_chain, dap_config_t * a_chain_config a_chain->callback_datums_pool_proc = s_callback_datums_pool_proc; + dap_chain_cs_blocks_pvt_t *l_cs_blocks_pvt = DAP_NEW_Z(dap_chain_cs_blocks_pvt_t); + l_cs_blocks->_pvt = l_cs_blocks_pvt; + + dap_chain_node_role_t l_net_role= dap_chain_net_get_role( dap_chain_net_by_id(a_chain->net_id) ); + // Datum operations callbacks /* a_chain->callback_datum_iter_create = s_chain_callback_datum_iter_create; // Datum iterator create @@ -174,6 +187,60 @@ int dap_chain_cs_blocks_new(dap_chain_t * a_chain, dap_config_t * a_chain_config } + +/** + * @brief s_cli_parse_cmd_hash + * @param a_argv + * @param a_arg_index + * @param a_argc + * @param a_str_reply + * @param a_param + * @param a_datum_hash + * @return + */ +static int s_cli_parse_cmd_hash(char ** a_argv, int a_arg_index, int a_argc, char **a_str_reply,const char * a_param, + dap_chain_hash_fast_t * a_datum_hash) +{ + assert(a_datum_hash); + + const char *l_datum_hash_str = NULL; + dap_chain_node_cli_find_option_val(a_argv, a_arg_index, a_argc, a_param, &l_datum_hash_str); + + return dap_enc_base58_hex_to_hash(l_datum_hash_str, a_datum_hash); +} + +/** + * @brief s_cli_meta_hash_print + * @param a_str_tmp + * @param a_meta_title + * @param a_meta + */ +static void s_cli_meta_hash_print( dap_string_t * a_str_tmp, const char * a_meta_title, dap_chain_block_meta_t * a_meta) +{ + if(a_meta->hdr.size == sizeof (dap_chain_hash_fast_t) ){ + char * l_hash_str = dap_chain_hash_fast_to_str_new( (dap_chain_hash_fast_t *) a_meta->data); + dap_string_append_printf(a_str_tmp,"\t\tPREV: \"%s\"\n", a_meta_title,l_hash_str); + DAP_DELETE(l_hash_str); + }else{ + char * l_data_hex = DAP_NEW_Z_SIZE(char,a_meta->hdr.size*2+3); + dap_bin2hex(l_data_hex, a_meta->data, a_meta->hdr.size); + dap_string_append_printf(a_str_tmp,"\t\t\%s: 0x%s\n", a_meta_title, l_data_hex ); + } +} + +/** + * @brief s_cli_meta_hex_print + * @param a_str_tmp + * @param a_meta_title + * @param a_meta + */ +static void s_cli_meta_hex_print( dap_string_t * a_str_tmp, const char * a_meta_title, dap_chain_block_meta_t * a_meta) +{ + char * l_data_hex = DAP_NEW_Z_SIZE(char,a_meta->hdr.size*2+3); + dap_bin2hex(l_data_hex, a_meta->data, a_meta->hdr.size); + dap_string_append_printf(a_str_tmp,"\t\t\%s: 0x%s\n", a_meta_title, l_data_hex ); +} + /** * @brief s_cli_blocks * @param argc @@ -182,32 +249,36 @@ int dap_chain_cs_blocks_new(dap_chain_t * a_chain, dap_config_t * a_chain_config * @param a_str_reply * @return */ -static int s_cli_blocks(int argc, char ** argv, void *arg_func, char **a_str_reply) +static int s_cli_blocks(int a_argc, char ** a_argv, void *a_arg_func, char **a_str_reply) { - (void) arg_func; + (void) a_arg_func; enum { - SUBCMD_NEW, + SUBCMD_UNDEFINED =0, + SUBCMD_NEW_FLUSH, SUBCMD_NEW_DATUM_ADD, SUBCMD_NEW_DATUM_DEL, SUBCMD_NEW_DATUM_LIST, SUBCMD_NEW_COMPLETE, SUBCMD_DUMP, SUBCMD_LIST, - SUBCMD_UNDEFINED + SUBCMD_DROP } l_subcmd={0}; - const char* l_subcmd_str[]={ - [SUBCMD_NEW]="new", + const char* l_subcmd_strs[]={ + [SUBCMD_NEW_FLUSH]="new", [SUBCMD_NEW_DATUM_ADD]="new_datum_add", [SUBCMD_NEW_DATUM_DEL]="new_datum_del", [SUBCMD_NEW_DATUM_LIST]="new_datum_del", [SUBCMD_NEW_COMPLETE]="new_complete", [SUBCMD_DUMP]="dump", [SUBCMD_LIST]="list", + [SUBCMD_DROP]="drop", [SUBCMD_UNDEFINED]=NULL }; - const size_t l_subcmd_str_count=sizeof(l_subcmd_str)/sizeof(*l_subcmd_str)-1; + const size_t l_subcmd_str_count=sizeof(l_subcmd_strs)/sizeof(*l_subcmd_strs)-1; const char* l_subcmd_str_args[l_subcmd_str_count]; + const char* l_subcmd_str_arg; + const char* l_subcmd_str; int arg_index = 1; @@ -215,53 +286,51 @@ static int s_cli_blocks(int argc, char ** argv, void *arg_func, char **a_str_rep const char * l_net_name = NULL; const char * l_chain_name = NULL; - dap_chain_t * l_chain = NULL; dap_chain_cs_blocks_t * l_blocks = NULL; dap_chain_net_t * l_net = NULL; - dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-net", &l_net_name); - dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-chain", &l_chain_name); + // Parse default values + if(dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index, a_argc, a_argv, a_str_reply, &l_chain, &l_net) < 0) + return -11; + + l_blocks = DAP_CHAIN_CS_BLOCKS(l_chain); + // Parse commands for (size_t i=0; i<l_subcmd_str_count; i++){ - int l_opt_idx = dap_chain_node_cli_check_option(argv, arg_index,argc, l_subcmd_str[i]); + int l_opt_idx = dap_chain_node_cli_check_option(a_argv, arg_index,a_argc, l_subcmd_strs[i]); if( l_opt_idx >= 0 ){ - dap_chain_node_cli_find_option_val(argv, l_opt_idx, argc, l_subcmd_str[i], &l_subcmd_str_args[i] ); + dap_chain_node_cli_find_option_val(a_argv, l_opt_idx, a_argc, l_subcmd_strs[i], &l_subcmd_str_args[i] ); l_subcmd = i; + l_subcmd_str = l_subcmd_strs[i]; + l_subcmd_str_arg = l_subcmd_str_args[i]; } } - - if ( l_net_name == NULL){ - dap_chain_node_cli_set_reply_text(a_str_reply, "Need -net <net name> param!"); - return -1; - } - l_net = dap_chain_net_by_name( l_net_name ); - if ( l_net == NULL ){ - dap_chain_node_cli_set_reply_text(a_str_reply, "Can't find network \"%s\"",l_net_name); - return -2; - - } - - if ( l_chain_name == NULL){ - dap_chain_node_cli_set_reply_text(a_str_reply, "Need -chain <chain name> param!"); - return -3; - } - l_chain = dap_chain_net_get_chain_by_name(l_net,l_chain_name); - if ( l_chain == NULL ){ - dap_chain_node_cli_set_reply_text(a_str_reply, "Can't find chain \"%s\" in network \"%s\"", - l_chain_name, l_net_name); - return -4; - } - l_blocks = DAP_CHAIN_CS_BLOCKS(l_chain); - + int ret=-1000; + // Do subcommand action switch ( l_subcmd ){ - case SUBCMD_NEW:{ + // Flush memory for the new block + case SUBCMD_NEW_FLUSH:{ + if ( PVT(l_blocks)->block_new ) + DAP_DELETE( PVT(l_blocks)->block_new ); + PVT(l_blocks)->block_new = dap_chain_block_new( PVT(l_blocks)->block_cache_last? &PVT(l_blocks)->block_cache_last->block_hash: NULL ); + PVT(l_blocks)->block_new_size = sizeof (PVT(l_blocks)->block_new->hdr); } break; + + // Add datum to the forming new block case SUBCMD_NEW_DATUM_LIST:{ }break; case SUBCMD_NEW_DATUM_DEL:{ - + if ( PVT(l_blocks)->block_new ){ + dap_chain_hash_fast_t l_datum_hash; + s_cli_parse_cmd_hash(a_argv,arg_index,a_argc,a_str_reply,"-datum", &l_datum_hash ); + dap_chain_block_datum_del_by_hash( PVT(l_blocks)->block_new, PVT(l_blocks)->block_new_size, &l_datum_hash ); + }else { + dap_chain_node_cli_set_reply_text(a_str_reply, + "Error! Can't delete datum from hash because no forming new block! Check pls you role, it must be MASTER NODE or greater"); + ret = -12; + } }break; case SUBCMD_NEW_DATUM_ADD:{ size_t l_datums_count=1; @@ -269,11 +338,12 @@ static int s_cli_blocks(int argc, char ** argv, void *arg_func, char **a_str_rep 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_hex_str , + + dap_chain_datum_t * l_datum = (dap_chain_datum_t*) dap_chain_global_db_gr_get( l_subcmd_str_arg , &l_datum_size, l_gdb_group_mempool); l_datums[0] = l_datum; - if ( s_chain_callback_datums_pool_proc(l_chain,l_datums,l_datums_count ) == l_datums_count ){ + if ( s_callback_datums_pool_proc(l_chain,l_datums,l_datums_count ) == l_datums_count ){ for ( size_t i = 0; i <l_datums_count; i++){ dap_chain_hash_fast_t l_datum_hash; dap_hash_fast(l_datums[i],dap_chain_datum_size(l_datums[i]),&l_datum_hash); @@ -292,192 +362,121 @@ static int s_cli_blocks(int argc, char ** argv, void *arg_func, char **a_str_rep } } }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_base58_str); + "Warning! Can't convert datum %s from mempool to the new forming block's section ", l_subcmd_str_arg); + ret = -13; } - ret = -12; - } DAP_DELETE(l_gdb_group_mempool); - DAP_DELETE(l_datum_hash_hex_str); - DAP_DELETE(l_datum_hash_base58_str); + }break; + + case SUBCMD_NEW_COMPLETE:{ + dap_chain_net_sync_all(l_net); + } break; + + case SUBCMD_DROP:{ 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_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; - HASH_FIND(hh,PVT(l_dag)->events,&l_event_hash,sizeof(l_event_hash),l_event_item); - - if ( l_event_item ){ - HASH_DELETE(hh, PVT(l_dag)->events, l_event_item); - 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); + case SUBCMD_DUMP:{ + dap_chain_block_t * l_block; + size_t l_block_size = 0; + dap_chain_hash_fast_t l_block_hash={0}; + dap_enc_base58_hex_to_hash( l_subcmd_str_arg, &l_block_hash); // Convert argument to hash + l_block = (dap_chain_block_t*) dap_chain_get_atom_by_hash( l_chain, &l_block_hash, &l_block_size); + if ( l_block){ + dap_chain_block_cache_t *l_block_cache = dap_chain_block_cache_get(l_block, l_block_size); + if ( l_block_cache ){ + dap_string_t * l_str_tmp = dap_string_new(NULL); + char buf[50]; + time_t l_ts_reated = (time_t) l_block->hdr.ts_created; + // Header + dap_string_append_printf(l_str_tmp,"Block %s:\n", l_subcmd_str_arg); + dap_string_append_printf(l_str_tmp,"\t\t\tversion: 0x%04sX\n",l_block->hdr.version); + dap_string_append_printf(l_str_tmp,"\t\t\tcell_id: 0x%016llX\n",l_block->hdr.cell_id.uint64); + dap_string_append_printf(l_str_tmp,"\t\t\tchain_id: 0x%016llX\n",l_block->hdr.chain_id.uint64); + dap_string_append_printf(l_str_tmp,"\t\t\tts_created: %s\n",ctime_r(&l_ts_reated, buf) ); + + // Prepare to parse data section + size_t l_offset = 0; + + // Parse Metadata + dap_string_append_printf(l_str_tmp,"\tMetadata. Count: %us\n",l_block->hdr.meta_count ); + for (uint16_t i=0; i < l_block->hdr.meta_count && l_offset < l_block_size-sizeof (l_block->hdr); i++){ + dap_chain_block_meta_t * l_meta =(dap_chain_block_meta_t *) (l_block->meta_n_datum_n_sign + l_offset); + switch (l_meta->hdr.type) { + case DAP_CHAIN_BLOCK_META_GENESIS:{ + dap_string_append_printf(l_str_tmp,"\t\tGENESIS\n"); + }break; + case DAP_CHAIN_BLOCK_META_PREV:{ + s_cli_meta_hash_print(l_str_tmp, "PREV", l_meta); + }break; + case DAP_CHAIN_BLOCK_META_ANCHOR:{ + s_cli_meta_hash_print(l_str_tmp, "ANCHOR", l_meta); + }break; + case DAP_CHAIN_BLOCK_META_LINK:{ + s_cli_meta_hash_print(l_str_tmp, "LINK", l_meta); + }break; + case DAP_CHAIN_BLOCK_META_NONCE:{ + s_cli_meta_hex_print(l_str_tmp,"NONCE", l_meta); + }break; + case DAP_CHAIN_BLOCK_META_NONCE2:{ + s_cli_meta_hex_print(l_str_tmp,"NONCE2", l_meta); + }break; + default:{ + char * l_data_hex = DAP_NEW_Z_SIZE(char,l_meta->hdr.size*2+3); + dap_bin2hex(l_data_hex, l_meta->data, l_meta->hdr.size); + dap_string_append_printf(l_str_tmp,"\t\t\0x%0X: 0x%s\n", l_data_hex ); + } + } + l_offset += l_meta->hdr.size + sizeof (l_meta->hdr); } - dap_chain_save_all(l_chain); - }else { - 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); + for (uint16_t i=0; i < l_block->hdr.meta_count && l_offset < l_block_size-sizeof (l_block->hdr); i++){ + dap_chain_datum_t * l_datum = (dap_chain_datum_t*) (l_block->hashes_n_datum_n_signs + l_offset); + size_t l_datum_size = dap_chain_datum_size(l_datum); + time_t l_datum_ts_create = (time_t) l_datum->header.ts_create; + + // Nested datums + dap_string_append_printf(l_str_tmp,"\t\t\t\tdatum:\tdatum_size: %u\n",l_datum_size); + dap_string_append_printf(l_str_tmp,"\t\t\t\t\t\tversion:=0x%02X\n", l_datum->header.version_id); + dap_string_append_printf(l_str_tmp,"\t\t\t\t\t\ttype_id:=%s\n", c_datum_type_str[l_datum->header.type_id]); + dap_string_append_printf(l_str_tmp,"\t\t\t\t\t\tts_create=%s\n",ctime_r( &l_datum_ts_create,buf )); + dap_string_append_printf(l_str_tmp,"\t\t\t\t\t\tdata_size=%u\n", l_datum->header.data_size); } - else { - dap_chain_node_cli_set_reply_text(a_str_reply, - "Can't remove event 0x%s ", - l_event_hash_base58_str); + // Signatures + dap_string_append_printf(l_str_tmp,"\t\t\t\tsigns:\tcount: %us\n",l_block->hdr.sign_count); + l_offset += l_datum_size; + while (l_offset + sizeof (l_block->header) < l_event_size ){ + dap_sign_t * l_sign =(dap_sign_t *) (l_block->hashes_n_datum_n_signs +l_offset); + size_t l_sign_size = dap_sign_get_size(l_sign); + if (l_sign_size == 0 ){ + dap_string_append_printf(l_str_tmp,"\t\t\t\tERROR: wrong sign size 0, stop parsing headers\n"); + break; + } + dap_chain_addr_t l_addr = {0}; + dap_chain_hash_fast_t l_pkey_hash; + dap_sign_get_pkey_hash(l_sign, &l_pkey_hash); + dap_chain_addr_fill(&l_addr, l_sign->header.type, &l_pkey_hash, l_net->pub.id); + char * l_addr_str = dap_chain_addr_to_str(&l_addr); + dap_string_append_printf(l_str_tmp,"\t\t\t\t\t\ttype: %s\taddr: %s" + "n", dap_sign_type_to_str( l_sign->header.type ), + l_addr_str ); + l_offset += l_sign_size; + DAP_DELETE( l_addr_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; - case SUBCMD_EVENT_DUMP:{ - dap_chain_cs_dag_event_t * l_event = NULL; - size_t l_event_size = 0; - if ( l_from_events_str ){ - if ( strcmp(l_from_events_str,"round.new") == 0 ){ - const char * l_gdb_group_events = l_dag->gdb_group_events_round_new; - l_event = (dap_chain_cs_dag_event_t *) dap_chain_global_db_gr_get - ( l_event_hash_str ,&l_event_size,l_gdb_group_events ); - }else if ( strncmp(l_from_events_str,"round.",6) == 0){ - - }else if ( strcmp(l_from_events_str,"events_lasts") == 0){ - dap_chain_cs_dag_event_item_t * l_event_item = NULL; - pthread_rwlock_rdlock(&PVT(l_dag)->events_rwlock); - HASH_FIND(hh,PVT(l_dag)->events_lasts_unlinked,&l_event_hash,sizeof(l_event_hash),l_event_item); - pthread_rwlock_unlock(&PVT(l_dag)->events_rwlock); - if ( l_event_item ) - l_event = l_event_item->event; - else { - ret = -23; - dap_chain_node_cli_set_reply_text(a_str_reply, - "Can't find events in events_last table\n"); - break; - } - }else if ( strcmp(l_from_events_str,"events") == 0){ - dap_chain_cs_dag_event_item_t * l_event_item = NULL; - pthread_rwlock_rdlock(&PVT(l_dag)->events_rwlock); - HASH_FIND(hh,PVT(l_dag)->events,&l_event_hash,sizeof(l_event_hash),l_event_item); - pthread_rwlock_unlock(&PVT(l_dag)->events_rwlock); - if ( l_event_item ) - l_event = l_event_item->event; - else { - ret = -24; - dap_chain_node_cli_set_reply_text(a_str_reply, - "Can't find events in events table\n"); - break; - } - - }else { - ret = -22; - dap_chain_node_cli_set_reply_text(a_str_reply, - "Wrong events_from option \"%s\", need one of variant: events, round.new, events_lasts, round.0x0123456789ABCDEF", l_from_events_str); - break; + 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); + ret=0; } - } else { - ret = -21; - dap_chain_node_cli_set_reply_text(a_str_reply, - "No events_from option"); - break; - } - if ( l_event ){ - dap_string_t * l_str_tmp = dap_string_new(NULL); - char buf[50]; - time_t l_ts_reated = (time_t) l_event->header.ts_created; - // Header - dap_string_append_printf(l_str_tmp,"Event %s:\n", l_event_hash_str); - dap_string_append_printf(l_str_tmp,"\t\t\t\tversion: 0x%04sX\n",l_event->header.version); - dap_string_append_printf(l_str_tmp,"\t\t\t\tcell_id: 0x%016llX\n",l_event->header.cell_id.uint64); - dap_string_append_printf(l_str_tmp,"\t\t\t\tchain_id: 0x%016llX\n",l_event->header.chain_id.uint64); - dap_string_append_printf(l_str_tmp,"\t\t\t\tts_created: %s\n",ctime_r(&l_ts_reated, buf) ); - - // Hash links - dap_string_append_printf(l_str_tmp,"\t\t\t\thashes:\tcount: %us\n",l_event->header.hash_count); - for (uint16_t i=0; i < l_event->header.hash_count; i++){ - dap_chain_hash_fast_t * l_hash = (dap_chain_hash_fast_t *) (l_event->hashes_n_datum_n_signs + - i*sizeof (dap_chain_hash_fast_t)); - char * l_hash_str = dap_chain_hash_fast_to_str_new(l_hash); - dap_string_append_printf(l_str_tmp,"\t\t\t\t\t\thash: %s\n",l_hash_str); - DAP_DELETE(l_hash_str); - } - size_t l_offset = l_event->header.hash_count*sizeof (dap_chain_hash_fast_t); - dap_chain_datum_t * l_datum = (dap_chain_datum_t*) (l_event->hashes_n_datum_n_signs + l_offset); - size_t l_datum_size = dap_chain_datum_size(l_datum); - time_t l_datum_ts_create = (time_t) l_datum->header.ts_create; - - // Nested datum - dap_string_append_printf(l_str_tmp,"\t\t\t\tdatum:\tdatum_size: %u\n",l_datum_size); - dap_string_append_printf(l_str_tmp,"\t\t\t\t\t\tversion:=0x%02X\n", l_datum->header.version_id); - dap_string_append_printf(l_str_tmp,"\t\t\t\t\t\ttype_id:=%s\n", c_datum_type_str[l_datum->header.type_id]); - dap_string_append_printf(l_str_tmp,"\t\t\t\t\t\tts_create=%s\n",ctime_r( &l_datum_ts_create,buf )); - dap_string_append_printf(l_str_tmp,"\t\t\t\t\t\tdata_size=%u\n", l_datum->header.data_size); - - // Signatures - dap_string_append_printf(l_str_tmp,"\t\t\t\tsigns:\tcount: %us\n",l_event->header.signs_count); - l_offset += l_datum_size; - while (l_offset + sizeof (l_event->header) < l_event_size ){ - dap_sign_t * l_sign =(dap_sign_t *) (l_event->hashes_n_datum_n_signs +l_offset); - size_t l_sign_size = dap_sign_get_size(l_sign); - if (l_sign_size == 0 ){ - dap_string_append_printf(l_str_tmp,"\t\t\t\tERROR: wrong sign size 0, stop parsing headers\n"); - break; - } - dap_chain_addr_t l_addr = {0}; - dap_chain_hash_fast_t l_pkey_hash; - dap_sign_get_pkey_hash(l_sign, &l_pkey_hash); - dap_chain_addr_fill(&l_addr, l_sign->header.type, &l_pkey_hash, l_net->pub.id); - char * l_addr_str = dap_chain_addr_to_str(&l_addr); - dap_string_append_printf(l_str_tmp,"\t\t\t\t\t\ttype: %s\taddr: %s" - "n", dap_sign_type_to_str( l_sign->header.type ), - l_addr_str ); - l_offset += l_sign_size; - DAP_DELETE( l_addr_str); - } - 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); - ret=0; }else { dap_chain_node_cli_set_reply_text(a_str_reply, - "Can't find event 0x%s in the new forming round ", + "Can't find blocl 0x%s in the new forming round ", l_event_hash_str); ret=-10; } }break; - case SUBCMD_EVENT_LIST:{ + case SUBCMD_LIST:{ if( (l_from_events_str == NULL) || (strcmp(l_from_events_str,"round.new") == 0) ){ char * l_gdb_group_events = DAP_CHAIN_CS_DAG(l_chain)->gdb_group_events_round_new; @@ -538,11 +537,12 @@ static int s_cli_blocks(int argc, char ** argv, void *arg_func, char **a_str_rep case SUBCMD_UNDEFINED: { dap_chain_node_cli_set_reply_text(a_str_reply, - "Undefined event subcommand \"%s\" ", - l_event_cmd_str); + "Undefined block subcommand \"%s\" ", + l_subcmd_str); ret=-11; } } + return ret; } diff --git a/modules/type/blocks/include/dap_chain_block.h b/modules/type/blocks/include/dap_chain_block.h index 7cea8508f7..92a944fdad 100644 --- a/modules/type/blocks/include/dap_chain_block.h +++ b/modules/type/blocks/include/dap_chain_block.h @@ -29,9 +29,9 @@ #include "dap_chain_datum_hashtree_roots.h" #define DAP_CHAIN_BLOCK_SIGNATURE 0xDA05BF8E - #define DAP_CHAIN_BLOCK_ID_SIZE 4 + typedef union dap_chain_block_typeid{ uint8_t data[DAP_CHAIN_BLOCK_ID_SIZE]; } DAP_ALIGN_PACKED dap_chain_block_typeid_t; @@ -44,7 +44,8 @@ typedef struct dap_chain_block_hdr{ uint32_t signature; /// @param signature @brief Magic number, always equels to DAP_CHAIN_BLOCK_SIGNATURE int32_t version; /// @param version @brief block version (be carefull, signed value, as Bitcoin has) dap_chain_cell_id_t cell_id; /// Cell id - uint32_t size_ex_signs; /// @param size of the whole block except signatures meta + dap_chain_cell_id_t chain_id; /// Chain id + uint32_t meta_n_datums_size; /// @param size of the whole block except signatures meta dap_chain_time_t ts_created; /// @param timestamp @brief Block create time timestamp uint16_t meta_count; // Meta values number uint16_t datum_count; // Datums's count @@ -52,11 +53,23 @@ typedef struct dap_chain_block_hdr{ // Metadata item typedef struct dap_chain_block_meta{ - uint8_t type; /// Meta type - uint16_t size; /// Data size trailing the section + struct { + uint8_t type; /// Meta type + uint16_t size; /// Data size trailing the section + } DAP_ALIGN_PACKED hdr; byte_t data[]; /// Section's data } DAP_ALIGN_PACKED dap_chain_block_meta_t; +// Block metadata types + +#define DAP_CHAIN_BLOCK_META_GENESIS 0x01 +#define DAP_CHAIN_BLOCK_META_PREV 0x10 +#define DAP_CHAIN_BLOCK_META_ANCHOR 0x11 +#define DAP_CHAIN_BLOCK_META_LINK 0x12 +#define DAP_CHAIN_BLOCK_META_NONCE 0x20 +#define DAP_CHAIN_BLOCK_META_NONCE2 0x21 + + // Section with datum typedef struct dap_chain_block_datum{ uint32_t size_t; @@ -80,6 +93,9 @@ void dap_chain_block_deinit(); // Create new block dap_chain_block_t * dap_chain_block_new(dap_chain_hash_fast_t * a_prev_block ); +// Add metadata in block +size_t dap_chain_block_meta_add(dap_chain_block_t * a_block, size_t a_block_size, uint8_t a_meta_type, const void * a_data, size_t a_data_size); + // Add datum in block -dap_chain_datum_t * dap_chain_block_datum_add(dap_chain_block_t * a_block, dap_chain_datum_t * a_datum, size_t a_datum_size); -void dap_chain_block_datum_del_by_hash(dap_chain_block_t * a_block, dap_chain_hash_fast_t* a_datum_hash); +size_t dap_chain_block_datum_add(dap_chain_block_t * a_block, size_t a_block_size, dap_chain_datum_t * a_datum, size_t a_datum_size); +size_t dap_chain_block_datum_del_by_hash(dap_chain_block_t * a_block, size_t a_block_size, dap_chain_hash_fast_t* a_datum_hash); diff --git a/modules/type/blocks/include/dap_chain_block_cache.h b/modules/type/blocks/include/dap_chain_block_cache.h index f6875b3fb9..bd7439eb70 100644 --- a/modules/type/blocks/include/dap_chain_block_cache.h +++ b/modules/type/blocks/include/dap_chain_block_cache.h @@ -56,6 +56,6 @@ typedef struct dap_chain_block_cache{ int dap_chain_block_cache_init(); void dap_chain_block_cache_deinit(); -dap_chain_block_cache_t * dap_chain_block_cache_new(dap_chain_block_t * a_block, size_t a_block_size); +dap_chain_block_cache_t * dap_chain_block_cache_get(dap_chain_block_t * a_block, size_t a_block_size); void dap_chain_block_cache_update(dap_chain_block_cache_t * a_block_cache); void dap_chain_block_cache_delete(dap_chain_block_cache_t * a_block_cache); -- GitLab