diff --git a/CMakeLists.txt b/CMakeLists.txt index 4eb71372f3de98d3f9b4d738d19bfa0c5b0acd13..3783dcd82e072cc3d574dde8cd19fabe69c314c8 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.1-2") +set(CELLFRAME_SDK_NATIVE_VERSION "2.1-3") include(cmake/OS_Detection.cmake) add_definitions ("-DCELLFRAME_SDK_VERSION=\"${CELLFRAME_SDK_NATIVE_VERSION}\"") diff --git a/modules/chain/dap_chain_ledger.c b/modules/chain/dap_chain_ledger.c index 646f888ebce4b32d8cc91c9a8b64fc8f368a48f2..977573186fcb88d79a8dff964680433e3af75087 100644 --- a/modules/chain/dap_chain_ledger.c +++ b/modules/chain/dap_chain_ledger.c @@ -613,8 +613,10 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t */ dap_ledger_private_t *l_ledger_priv = PVT(a_ledger); - if(!a_tx) + if(!a_tx){ + log_it(L_DEBUG, "NULL transaction, check broken"); return -1; + } dap_list_t *l_list_bound_items = NULL; @@ -822,6 +824,7 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t dap_list_free_full(l_list_bound_items, free); if (l_list_tx_out) dap_list_free(l_list_tx_out); + log_it(L_ERROR, "Emission for tx_token wasn't found for ticker %s and emission hash %s",l_tx_token->header.token_emission_hash ); return -6; } } diff --git a/modules/common/dap_chain_datum_token.c b/modules/common/dap_chain_datum_token.c index d0c8a39a530444b29c0714ee2b2cc8f1c05051b9..017e3d238717688379e60c587de666f07dd14b19 100644 --- a/modules/common/dap_chain_datum_token.c +++ b/modules/common/dap_chain_datum_token.c @@ -64,3 +64,74 @@ dap_chain_datum_token_tsd_t * dap_chain_datum_token_tsd_create(uint16_t a_type, return l_tsd; } + +/** + * @brief dap_chain_datum_token_tsd_get + * @param a_token + * @param a_token_size + * @return + */ +dap_chain_datum_token_tsd_t* dap_chain_datum_token_tsd_get(dap_chain_datum_token_t * a_token, size_t a_token_size) +{ + // Check if token type could have tsd section + size_t l_hdr_size; + size_t l_tsd_size; + switch( a_token->type){ + case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL: + l_hdr_size = sizeof (a_token->header_private_decl); + if (l_hdr_size> a_token_size){ + log_it(L_WARNING, "Token size smaller then header, corrupted data"); + return NULL; + } + l_tsd_size = a_token->header_private_decl.tsd_total_size; + break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE: + l_hdr_size = sizeof(a_token->header_private_update); + if (l_hdr_size> a_token_size){ + log_it(L_WARNING, "Token size smaller then header, corrupted data"); + return NULL; + } + l_tsd_size = a_token->header_private_update.tsd_total_size; + break; + default: return NULL; + } + + if (l_tsd_size+l_hdr_size > a_token_size){ + log_it(L_WARNING, "TSD size %zd overlaps with header, corrupted data"); + }else if (l_tsd_size +l_hdr_size == a_token_size){ + log_it(L_INFO, "No signatures at all, returning pointer to the top of data"); + return (dap_chain_datum_token_tsd_t*) a_token->data_n_tsd; + } + + // Pass through signatures to find top of TSD section + size_t l_offset = 0; + while( l_offset < (a_token_size - l_hdr_size-l_tsd_size) ){ + dap_sign_t* l_sign = (dap_sign_t*) (a_token->data_n_tsd + l_offset); + if (l_sign->header.sign_size == 0){ + log_it( L_WARNING, "Corrupted signature, 0 size"); + return NULL; + } + l_offset += dap_sign_get_size( l_sign); + } + if ( l_offset + l_hdr_size +l_tsd_size <= a_token_size ) + return (dap_chain_datum_token_tsd_t*) (a_token->data_n_tsd+l_offset); + else{ + log_it(L_WARNING, "Signatures overlaps with TSD section, corrupted data"); + return NULL; + } +} + +/** + * @brief dap_chain_datum_token_flags_dump + * @param a_str_out + * @param a_flags + */ +void dap_chain_datum_token_flags_dump(dap_string_t * a_str_out, uint16_t a_flags) +{ + for ( uint16_t i = 0; (2^i) <=DAP_CHAIN_DATUM_TOKEN_FLAG_MAX; i++ ){ + if( a_flags & (2^i) ) + dap_string_append_printf(a_str_out,"%s%s", c_dap_chain_datum_token_flag_str[2^i], + (2^i)==DAP_CHAIN_DATUM_TOKEN_FLAG_MAX?",":"\n" ); + } +} + diff --git a/modules/common/include/dap_chain_datum_token.h b/modules/common/include/dap_chain_datum_token.h index 695c7e02a6dd8ccca54a81e675c8008171bc22fc..f347de9d1a40e2a85816ca6ab105bab9fcefb570 100644 --- a/modules/common/include/dap_chain_datum_token.h +++ b/modules/common/include/dap_chain_datum_token.h @@ -24,8 +24,10 @@ */ #pragma once #include "dap_chain_common.h" +#include "dap_hash.h" #include "dap_sign.h" +#include "dap_string.h" #include "dap_strfuncs.h" // Token declaration @@ -148,24 +150,27 @@ typedef struct dap_chain_datum_token_tsd{ // Set total signs count value to set to be valid #define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SIGNS_VALID 0x0004 +// Remove owner signature by pkey fingerprint +#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SIGNS_REMOVE 0x0005 + // Add owner signature's pkey fingerprint #define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SIGNS_ADD 0x0006 -// Remove owner signature by pkey fingerprint -#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SIGNS_REMOVE 0x0007 /// ------- Permissions list flags, grouped by update-remove-clear operations -------- +// Blocked datum types list add, remove or clear +#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_BLOCKED_ADD 0x0007 +#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_BLOCKED_REMOVE 0x0008 +#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_BLOCKED_CLEAR 0x0009 + + // Allowed datum types list add, remove or clear #define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_ALLOWED_ADD 0x0010 #define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_ALLOWED_REMOVE 0x0011 #define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_ALLOWED_CLEAR 0x0012 -// Blocked datum types list add, remove or clear -#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_BLOCKED_ADD 0x0013 -#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_BLOCKED_REMOVE 0x0014 -#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_BLOCKED_CLEAR 0x0015 //Allowed tx receiver addres list add, remove or clear #define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_ALLOWED_ADD 0x0014 @@ -230,12 +235,15 @@ extern const char *c_dap_chain_datum_token_emission_type_str[]; /// dap_chain_datum_token_tsd_t * dap_chain_datum_token_tsd_create(uint16_t a_type, const void * a_data, size_t a_data_size); +dap_chain_datum_token_tsd_t* dap_chain_datum_token_tsd_get(dap_chain_datum_token_t * a_token, size_t a_token_size); +void dap_chain_datum_token_flags_dump(dap_string_t * a_str_out, uint16_t a_flags); + #define dap_chain_datum_token_tsd_create_scalar(type,value) dap_chain_datum_token_tsd_create (type, &value, sizeof(value) ) #define dap_chain_datum_token_tsd_get_scalar(a,typeconv) *((typeconv*) a->data) // NULL-terminated string #define dap_chain_datum_token_tsd_create_string(type,str) dap_chain_datum_token_tsd_create (type,str, dap_strlen(str)) -#define dap_chain_datum_token_tsd_get_string(a) ((char*) a->data ) -#define dap_chain_datum_token_tsd_get_string_const(a) ((const char*) a->data ) +#define dap_chain_datum_token_tsd_get_string(a) ( ((char*) a->data )[a->size-1] == '\0'? (char*) a->data : "<CORRUPTED STRING>" ) +#define dap_chain_datum_token_tsd_get_string_const(a) ( ((const char*) a->data )[a->size-1] == '\0'? (const char*) a->data : "<CORRUPTED STRING>" ) #define dap_chain_datum_token_tsd_size(a) (sizeof(*a)+a->size) diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index 817a8666efa59c87a67ec6423bfa442d6b46a531..aa01b74fc8ad9911af514f7d204f33c05254b755 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -2096,3 +2096,201 @@ int dap_chain_net_verify_datum_for_add(dap_chain_net_t *a_net, dap_chain_datum_t default: return 0; } } + +/** + * @brief dap_chain_net_dump_datum + * @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) +{ + if( a_datum == NULL){ + dap_string_append_printf(a_str_out,"==Datum is NULL\n"); + return; + } + switch (a_datum->header.type_id){ + case DAP_CHAIN_DATUM_TOKEN_DECL:{ + dap_chain_datum_token_t * l_token = (dap_chain_datum_token_t*) a_datum->data; + size_t l_token_size = a_datum->header.data_size; + 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); + switch (l_token->type) { + case DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE:{ + dap_string_append_printf(a_str_out, "type: SIMPLE\n"); + dap_string_append_printf(a_str_out, "sign_total: %u\n", l_token->header_private.signs_total ); + dap_string_append_printf(a_str_out, "sign_valid: %u\n", l_token->header_private.signs_valid ); + dap_string_append_printf(a_str_out, "total_supply: %u\n", l_token->header_private.total_supply ); + }break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE:{ + dap_string_append_printf(a_str_out,"type: PRIVATE_UPDATE\n"); + dap_chain_datum_token_tsd_t * l_tsd = dap_chain_datum_token_tsd_get(l_token, l_token_size); + if (l_tsd == NULL) + dap_string_append_printf(a_str_out,"<CORRUPTED TSD SECTION>\n"); + else{ + size_t l_offset = 0; + size_t l_offset_max = l_token->header_private_decl.tsd_total_size; + while( l_offset< l_offset_max){ + if ( (l_tsd->size+l_offset) >l_offset_max){ + log_it(L_WARNING, "<CORRUPTED TSD> too big size %zd when left maximum %zd", + l_tsd->size, l_offset_max - l_offset); + return; + } + switch( l_tsd->type){ + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_SET_FLAGS: + dap_string_append_printf(a_str_out,"flags_set: "); + dap_chain_datum_token_flags_dump(a_str_out, + dap_chain_datum_token_tsd_get_scalar(l_tsd, uint16_t)); + break; + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_UNSET_FLAGS: + dap_string_append_printf(a_str_out,"flags_unset: "); + dap_chain_datum_token_flags_dump(a_str_out, + dap_chain_datum_token_tsd_get_scalar(l_tsd, uint16_t)); + break; + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY: + dap_string_append_printf(a_str_out,"total_supply: %u\n", + dap_chain_datum_token_tsd_get_scalar(l_tsd, uint128_t) ); + break; + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SIGNS_VALID : + dap_string_append_printf(a_str_out,"total_signs_valid: %u\n", + dap_chain_datum_token_tsd_get_scalar(l_tsd, uint16_t) ); + 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 ); + dap_string_append_printf(a_str_out,"total_signs_add: %s\n", l_hash_str ); + DAP_DELETE( l_hash_str ); + }else + dap_string_append_printf(a_str_out,"total_signs_add: <WRONG SIZE %zd>\n", l_tsd->size); + 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 ); + dap_string_append_printf(a_str_out,"total_signs_remoev: %s\n", l_hash_str ); + DAP_DELETE( l_hash_str ); + }else + dap_string_append_printf(a_str_out,"total_signs_add: <WRONG SIZE %zd>\n", l_tsd->size); + break; + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_ALLOWED_ADD : + dap_string_append_printf(a_str_out,"datum_type_allowed_add: %s\n", + dap_chain_datum_token_tsd_get_string_const(l_tsd) ); + break; + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_ALLOWED_REMOVE : + dap_string_append_printf(a_str_out,"datum_type_allowed_remove: %s\n", + dap_chain_datum_token_tsd_get_string_const(l_tsd) ); + break; + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_BLOCKED_ADD : + dap_string_append_printf(a_str_out,"datum_type_blocked_add: %s\n", + dap_chain_datum_token_tsd_get_string_const(l_tsd) ); + break; + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_BLOCKED_REMOVE: + dap_string_append_printf(a_str_out,"datum_type_blocked_remove: %s\n", + dap_chain_datum_token_tsd_get_string_const(l_tsd) ); + break; + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_ALLOWED_ADD: + dap_string_append_printf(a_str_out,"tx_sender_allowed_add: %s\n", + dap_chain_datum_token_tsd_get_string_const(l_tsd) ); + break; + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_ALLOWED_REMOVE: + dap_string_append_printf(a_str_out,"tx_sender_allowed_remove: %s\n", + dap_chain_datum_token_tsd_get_string_const(l_tsd) ); + break; + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_BLOCKED_ADD: + dap_string_append_printf(a_str_out,"tx_sender_blocked_add: %s\n", + dap_chain_datum_token_tsd_get_string_const(l_tsd) ); + break; + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_BLOCKED_REMOVE: + dap_string_append_printf(a_str_out,"tx_sender_blocked_remove: %s\n", + dap_chain_datum_token_tsd_get_string_const(l_tsd) ); + break; + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_ALLOWED_ADD: + dap_string_append_printf(a_str_out,"tx_receiver_allowed_add: %s\n", + dap_chain_datum_token_tsd_get_string_const(l_tsd) ); + break; + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_ALLOWED_REMOVE: + dap_string_append_printf(a_str_out,"tx_receiver_allowed: %s\n", + dap_chain_datum_token_tsd_get_string_const(l_tsd) ); + break; + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_BLOCKED_ADD: + dap_string_append_printf(a_str_out, "tx_receiver_blocked_add: %s\n", + dap_chain_datum_token_tsd_get_string_const(l_tsd) ); + break; + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_BLOCKED_REMOVE: + dap_string_append_printf(a_str_out, "tx_receiver_blocked_remove: %s\n", + dap_chain_datum_token_tsd_get_string_const(l_tsd) ); + break; + default: dap_string_append_printf(a_str_out, "<0x%04X>: <size %zd>\n", l_tsd->type, l_tsd->size); + } + l_offset += dap_chain_datum_token_tsd_size(l_tsd); + + } + } + }break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL:{ + dap_string_append_printf(a_str_out,"type: PRIVATE_DECL\n"); + dap_string_append_printf(a_str_out,"flags: "); + dap_chain_datum_token_flags_dump(a_str_out, l_token->header_private_decl.flags); + dap_chain_datum_token_tsd_t * l_tsd = dap_chain_datum_token_tsd_get(l_token, l_token_size); + if (l_tsd == NULL) + dap_string_append_printf(a_str_out,"<CORRUPTED TSD SECTION>\n"); + else{ + size_t l_offset = 0; + size_t l_offset_max = l_token->header_private_decl.tsd_total_size; + while( l_offset< l_offset_max){ + if ( (l_tsd->size+l_offset) >l_offset_max){ + log_it(L_WARNING, "<CORRUPTED TSD> too big size %zd when left maximum %zd", + l_tsd->size, l_offset_max - l_offset); + return; + } + switch( l_tsd->type){ + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY: + dap_string_append_printf(a_str_out,"total_supply: %u\n", + dap_chain_datum_token_tsd_get_scalar(l_tsd, uint128_t) ); + break; + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SIGNS_VALID : + dap_string_append_printf(a_str_out,"total_signs_valid: %u\n", + dap_chain_datum_token_tsd_get_scalar(l_tsd, uint16_t) ); + break; + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_ALLOWED_ADD : + dap_string_append_printf(a_str_out,"datum_type_allowed: %s\n", + dap_chain_datum_token_tsd_get_string_const(l_tsd) ); + break; + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_BLOCKED_ADD : + dap_string_append_printf(a_str_out,"datum_type_blocked: %s\n", + dap_chain_datum_token_tsd_get_string_const(l_tsd) ); + break; + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_ALLOWED_ADD: + dap_string_append_printf(a_str_out,"tx_sender_allowed: %s\n", + dap_chain_datum_token_tsd_get_string_const(l_tsd) ); + break; + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_BLOCKED_ADD: + dap_string_append_printf(a_str_out,"tx_sender_blocked: %s\n", + dap_chain_datum_token_tsd_get_string_const(l_tsd) ); + break; + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_ALLOWED_ADD: + dap_string_append_printf(a_str_out,"tx_receiver_allowed: %s\n", + dap_chain_datum_token_tsd_get_string_const(l_tsd) ); + break; + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_BLOCKED_ADD: + dap_string_append_printf(a_str_out, "tx_receiver_blocked: %s\n", + dap_chain_datum_token_tsd_get_string_const(l_tsd) ); + break; + default: dap_string_append_printf(a_str_out, "<0x%04X>: <size %zd>\n", l_tsd->type, l_tsd->size); + } + l_offset += dap_chain_datum_token_tsd_size(l_tsd); + + } + } + }break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_PUBLIC:{ + dap_string_append_printf(a_str_out,"type: PUBLIC\n"); + }break; + default: + dap_string_append_printf(a_str_out,"type: UNKNOWN\n"); + } + + }break; + } +} diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c index 14c7a183cb08342f4ea1a4d6456b065c3b351b82..2d2a9b7752b34ac494314c42eb112c2124ee3761 100644 --- a/modules/net/dap_chain_node_cli_cmd.c +++ b/modules/net/dap_chain_node_cli_cmd.c @@ -2014,13 +2014,8 @@ int com_mempool_list(int argc, char ** argv, void *arg_func, char ** a_str_reply dap_string_append_printf(l_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], l_datum->header.data_size, ctime_r(&l_ts_create, buf)); - if ( l_datum->header.type_id == DAP_CHAIN_DATUM_TOKEN_DECL ){ - dap_chain_datum_token_t * l_datum_token = (dap_chain_datum_token_t *) l_datum->data; - dap_string_append_printf(l_str_tmp, - "\tDAP_CHAIN_DATUM_TOKEN_DECL: type=%u ticker=\"%s\" signs_total=%u signs_valid=%u\n", - l_datum_token->type, l_datum_token->ticker, - l_datum_token->header_private.signs_total, l_datum_token->header_private.signs_valid ); - } + + dap_chain_net_dump_datum(l_str_tmp, l_datum); } // Clean up dap_chain_global_db_objs_delete(l_objs, l_objs_size); diff --git a/modules/net/include/dap_chain_net.h b/modules/net/include/dap_chain_net.h index 463a6e777c4d46d4e445f648d362c6077acc9fea..1ee163f511085e3ec452a041b0bc162b152de67b 100644 --- a/modules/net/include/dap_chain_net.h +++ b/modules/net/include/dap_chain_net.h @@ -44,6 +44,7 @@ along with any CellFrame SDK based project. If not, see <http://www.gnu.org/lic #include <stdint.h> #include <string.h> #include "dap_strfuncs.h" +#include "dap_string.h" #include "dap_chain_common.h" #include "dap_chain_node.h" #include "dap_chain.h" @@ -153,3 +154,4 @@ dap_chain_net_t **dap_chain_net_list(size_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); diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c index 873be6125e2d4227abed8fe5fef109549bfd8ed5..3038215e8572106c3c397dccb86de12a6db9aafb 100644 --- a/modules/type/dag/dap_chain_cs_dag.c +++ b/modules/type/dag/dap_chain_cs_dag.c @@ -391,8 +391,10 @@ static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain for (size_t d = 0; d <a_datums_count ; d++){ dap_chain_datum_t * l_datum = a_datums[d]; - if(l_datum == NULL) // Was wrong datum thats not passed checks + if(l_datum == NULL){ // Was wrong datum thats not passed checks + log_it(L_WARNING,"Datum in mempool processing comes NULL"); continue; + } // Verify for correctness dap_chain_net_t * l_net = dap_chain_net_by_id( a_chain->net_id); @@ -444,12 +446,13 @@ static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain // Now link with ext events dap_chain_cs_dag_event_item_t *l_event_ext_item = NULL; // is_single_line - only one link inside - if(!l_dag->is_single_line || !l_hashes_linked) - if( PVT(l_dag)->events_lasts_unlinked && l_hashes_linked < l_hashes_size) { // Take then the first one if any events_lasts are present - l_event_ext_item = PVT(l_dag)->events_lasts_unlinked; - memcpy(&l_hashes[l_hashes_linked], &l_event_ext_item->hash, sizeof(l_event_ext_item->hash)); - l_hashes_linked++; - } + if(!l_dag->is_single_line || !l_hashes_linked){ + if( PVT(l_dag)->events_lasts_unlinked && l_hashes_linked < l_hashes_size) { // Take then the first one if any events_lasts are present + l_event_ext_item = PVT(l_dag)->events_lasts_unlinked; + memcpy(&l_hashes[l_hashes_linked], &l_event_ext_item->hash, sizeof(l_event_ext_item->hash)); + l_hashes_linked++; + } + } if (l_hashes_linked || s_seed_mode ) { dap_chain_cs_dag_event_t * l_event = NULL; @@ -1120,10 +1123,22 @@ static int s_cli_dag(int argc, char ** argv, void *arg_func, char **a_str_reply) l_event_hash_str); ret = 0; }else { - dap_chain_node_cli_set_reply_text(a_str_reply, - "Can't remove event 0x%s from the new forming round ", - l_event_hash_str); - ret = -1; + 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); + 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 ); + 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); + ret = -1; + } } DAP_DELETE( l_gdb_group_events ); dap_chain_net_sync_gdb(l_net); @@ -1201,7 +1216,7 @@ static int s_cli_dag(int argc, char ** argv, void *arg_func, char **a_str_reply) // 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:=%0x02X\n", l_datum->header.version_id); + 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); @@ -1227,6 +1242,7 @@ static int s_cli_dag(int argc, char ** argv, void *arg_func, char **a_str_reply) DAP_DELETE( l_addr_str); dap_enc_key_delete(l_sign_key); } + dap_chain_net_dump_datum(l_str_tmp, l_datum); dap_chain_node_cli_set_reply_text(a_str_reply, l_str_tmp->str); dap_string_free(l_str_tmp,false);