diff --git a/dap-sdk b/dap-sdk index a0124f4519ba7b9bf80c1506ac337fbddffe400c..6c41c1c308b8247f172b77dc4656d0f3eecf38e0 160000 --- a/dap-sdk +++ b/dap-sdk @@ -1 +1 @@ -Subproject commit a0124f4519ba7b9bf80c1506ac337fbddffe400c +Subproject commit 6c41c1c308b8247f172b77dc4656d0f3eecf38e0 diff --git a/modules/chain/dap_chain_ledger.c b/modules/chain/dap_chain_ledger.c index d6a4bc90f10f19ac6562f80c1e524993ff826df3..de71478d2d94a92dc45d6e8c6de7cff24b763367 100644 --- a/modules/chain/dap_chain_ledger.c +++ b/modules/chain/dap_chain_ledger.c @@ -24,7 +24,7 @@ */ #include "dap_common.h" - +#include <dirent.h> #ifdef _WIN32 #include <winsock2.h> #include <windows.h> @@ -57,6 +57,7 @@ #include "json_object.h" #include "dap_notify_srv.h" + #define LOG_TAG "dap_chain_ledger" typedef struct dap_chain_ledger_verificator { @@ -323,6 +324,12 @@ typedef struct dap_ledger_private { } dap_ledger_private_t; #define PVT(a) ( (dap_ledger_private_t* ) a->_internal ) +typedef struct dap_ledger_hal_item { + dap_chain_hash_fast_t hash; + UT_hash_handle hh; +} dap_ledger_hal_item_t; + +static dap_ledger_hal_item_t *s_hal_items = NULL; static dap_chain_ledger_tx_item_t* tx_item_find_by_addr(dap_ledger_t *a_ledger, const dap_chain_addr_t *a_addr, const char * a_token, dap_chain_hash_fast_t *a_tx_first_hash); @@ -2479,6 +2486,36 @@ dap_ledger_t *dap_chain_ledger_create(uint16_t a_flags, char *a_net_name, const pthread_cond_init(&l_ledger_pvt->load_cond, NULL); pthread_mutex_init(&l_ledger_pvt->load_mutex, NULL); + char * l_chains_path = dap_strdup_printf("%s/network/%s", dap_config_path(), a_net_name); + DIR * l_chains_dir = opendir(l_chains_path); + DAP_DEL_Z(l_chains_path); + + struct dirent * l_dir_entry; + uint8_t i = 0; + while ( (l_dir_entry = readdir(l_chains_dir) )!= NULL ){ + if (l_dir_entry->d_name[0] == '\0') + continue; + char * l_entry_name = dap_strdup(l_dir_entry->d_name); + if (strlen(l_entry_name) > 4) { + if ( strncmp (l_entry_name + strlen(l_entry_name)-4,".cfg",4) == 0 ) { // its .cfg file + l_entry_name [strlen(l_entry_name)-4] = 0; + log_it(L_DEBUG,"Open chain config \"%s\"...",l_entry_name); + l_chains_path = dap_strdup_printf("network/%s/%s", a_net_name, l_entry_name); + dap_config_t * l_cfg = dap_config_open(l_chains_path); + uint16_t l_whitelist_size; + char **l_whitelist = dap_config_get_array_str(l_cfg, "ledger", "hard_accept_list", &l_whitelist_size); + for (uint16_t i = 0; i < l_whitelist_size; ++i) { + dap_ledger_hal_item_t *l_hal_item = DAP_NEW_Z(dap_ledger_hal_item_t); + dap_chain_hash_fast_from_str(l_whitelist[i], &l_hal_item->hash); + HASH_ADD(hh, s_hal_items, hash, sizeof(l_hal_item->hash), l_hal_item); + } + dap_config_close(l_cfg); + log_it(L_DEBUG, "HAL items count for chain %s : %d", l_entry_name, l_whitelist_size); + } + } + DAP_DELETE (l_entry_name); + } + closedir(l_chains_dir); log_it(L_DEBUG,"Created ledger \"%s\"",a_net_name); l_ledger_pvt->load_mode = true; @@ -2550,6 +2587,18 @@ int dap_chain_ledger_token_emission_add_check(dap_ledger_t *a_ledger, byte_t *a_ } if (l_ret || !PVT(a_ledger)->check_token_emission) return l_ret; + + if (s_hal_items) { + dap_ledger_hal_item_t *l_hash_found = NULL; + HASH_FIND(hh, s_hal_items, a_emission_hash, sizeof(*a_emission_hash), l_hash_found); + if (l_hash_found) { + char l_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE] = { '\0' }; + dap_chain_hash_fast_to_str(a_emission_hash, l_hash_str, sizeof(l_hash_str)); + debug_if(s_debug_more, L_MSG, "Event %s is whitelisted", l_hash_str); + return l_ret; + } + } + // Check emission correctness size_t l_emission_size = a_token_emission_size; dap_chain_datum_token_emission_t *l_emission = dap_chain_datum_emission_read(a_token_emission, &l_emission_size); @@ -2634,6 +2683,9 @@ int dap_chain_ledger_token_emission_add_check(dap_ledger_t *a_ledger, byte_t *a_ DAP_DELETE(l_balance); } l_ret = DAP_CHAIN_LEDGER_EMISSION_ADD_CHECK_NOT_ENOUGH_VALID_SIGNS; + char l_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE] = { '\0' }; + dap_chain_hash_fast_to_str(a_emission_hash, l_hash_str, sizeof(l_hash_str)); + log_it(L_MSG, "!!! Datum hash for HAL: %s", l_hash_str); } }else{ if(s_debug_more) 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 1e566122d1cc0980150664a0c2c5c28d7168d200..28876785406260cf4600542ae481ce8a54e05315 100644 --- a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c +++ b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c @@ -884,11 +884,16 @@ static int s_callback_event_verify(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_ } a_event->header.signs_count = l_event_signs_count; DAP_DELETE(l_signs); - if ( l_ret != 0 ) { - return l_ret; + if (l_signs_verified_count < l_certs_count_verify) { + dap_hash_fast_t l_event_hash; + dap_hash_fast(a_event, a_event_size, &l_event_hash); + char l_event_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; + dap_hash_fast_to_str(&l_event_hash, l_event_hash_str, DAP_CHAIN_HASH_FAST_STR_SIZE); + log_it(L_ERROR, "Corrupted event %s, not enough signs %hu from %hu", + l_event_hash_str, l_signs_verified_count, l_certs_count_verify); + return l_ret ? l_ret : -4; } - return l_signs_verified_count >= l_certs_count_verify ? 0 : -1; - + return 0; } else if (a_event->header.hash_count == 0){ dap_chain_hash_fast_t l_event_hash; diff --git a/modules/consensus/esbocs/dap_chain_cs_esbocs.c b/modules/consensus/esbocs/dap_chain_cs_esbocs.c index 0aed4c3421cbc984f255a34159ef2533bb57a7c3..83e52504dece8861cc54e57557788ff89de2e3a1 100644 --- a/modules/consensus/esbocs/dap_chain_cs_esbocs.c +++ b/modules/consensus/esbocs/dap_chain_cs_esbocs.c @@ -2433,7 +2433,7 @@ static int s_callback_block_verify(dap_chain_cs_blocks_t *a_blocks, dap_chain_bl /*if (a_block->hdr.meta_n_datum_n_signs_size != a_block_size - sizeof(a_block->hdr)) { log_it(L_WARNING, "Incorrect size with block %p on chain %s", a_block, a_blocks->chain->name); return -8; - }*/ + }*/ // TODO Retunn it after hard-fork with correct block sizes if (l_esbocs->session && l_esbocs->session->processing_candidate == a_block) // It's a block candidate, don't check signs @@ -2460,6 +2460,7 @@ static int s_callback_block_verify(dap_chain_cs_blocks_t *a_blocks, dap_chain_bl uint16_t l_signs_verified_count = 0; size_t l_block_excl_sign_size = dap_chain_block_get_sign_offset(a_block, a_block_size) + sizeof(a_block->hdr); // Get the header on signing operation time + size_t l_block_original = a_block->hdr.meta_n_datum_n_signs_size; a_block->hdr.meta_n_datum_n_signs_size = l_block_excl_sign_size - sizeof(a_block->hdr); for (size_t i=0; i< l_signs_count; i++) { dap_sign_t *l_sign = (dap_sign_t *)l_signs[i]; @@ -2493,7 +2494,7 @@ static int s_callback_block_verify(dap_chain_cs_blocks_t *a_blocks, dap_chain_bl } DAP_DELETE(l_signs); // Restore the original header - a_block->hdr.meta_n_datum_n_signs_size = a_block_size - sizeof(a_block->hdr); + a_block->hdr.meta_n_datum_n_signs_size = l_block_original; if (l_signs_verified_count < l_esbocs_pvt->min_validators_count) { dap_hash_fast_t l_block_hash; @@ -2502,7 +2503,7 @@ static int s_callback_block_verify(dap_chain_cs_blocks_t *a_blocks, dap_chain_bl dap_hash_fast_to_str(&l_block_hash, l_block_hash_str, DAP_CHAIN_HASH_FAST_STR_SIZE); log_it(L_ERROR, "Corrupted block %s: not enough authorized signs: %u of %u", l_block_hash_str, l_signs_verified_count, l_esbocs_pvt->min_validators_count); - return 0; //l_ret + return l_ret ? l_ret : -4; } return 0; } diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c index 7e69c6ecd1e5be79a30b5c18e229033af6087785..36a723f9e35034c6f741b7e2624591f95c417e80 100644 --- a/modules/type/blocks/dap_chain_cs_blocks.c +++ b/modules/type/blocks/dap_chain_cs_blocks.c @@ -47,6 +47,11 @@ typedef struct dap_chain_block_datum_index { UT_hash_handle hh; } dap_chain_block_datum_index_t; +struct cs_blocks_hal_item { + dap_chain_hash_fast_t hash; + UT_hash_handle hh; +}; + typedef struct dap_chain_cs_blocks_pvt { pthread_rwlock_t rwlock; @@ -78,6 +83,7 @@ typedef struct dap_chain_cs_blocks_pvt pthread_rwlock_t datums_lock; uint64_t fill_timeout; + struct cs_blocks_hal_item *hal; } dap_chain_cs_blocks_pvt_t; #define PVT(a) ((dap_chain_cs_blocks_pvt_t *)(a)->_pvt ) @@ -276,6 +282,21 @@ int dap_chain_cs_blocks_new(dap_chain_t * a_chain, dap_config_t * a_chain_config l_cs_blocks_pvt->fill_timeout = dap_config_get_item_uint64_default(a_chain_config, "blocks", "fill_timeout", 60) * 1000; // 1 min l_cs_blocks_pvt->blocks_count = 0; + uint16_t l_list_len = 0; + char **l_hard_accept_list = dap_config_get_array_str(a_chain_config, "blocks", "hard_accept_list", &l_list_len); + log_it(L_MSG, "HAL for blocks contains %d whitelisted events", l_list_len); + for (uint16_t i = 0; i < l_list_len; i++) { + struct cs_blocks_hal_item *l_hal_item = DAP_NEW_Z(struct cs_blocks_hal_item); + if (!l_hal_item){ + log_it(L_ERROR, "Memory allocation error in dap_chain_cs_dag_new"); + DAP_DEL_Z(l_cs_blocks_pvt); + DAP_DELETE(l_cs_blocks); + return -10; + } + dap_chain_hash_fast_from_str(l_hard_accept_list[i], &l_hal_item->hash); + HASH_ADD(hh, l_cs_blocks_pvt->hal, hash, sizeof(l_hal_item->hash), l_hal_item); + } + return 0; } @@ -1101,11 +1122,23 @@ static dap_chain_atom_verify_res_t s_callback_atom_verify(dap_chain_t * a_chain, dap_chain_cs_blocks_pvt_t * l_blocks_pvt = PVT(l_blocks); assert(l_blocks_pvt); dap_chain_block_t * l_block = (dap_chain_block_t *) a_atom; + dap_chain_hash_fast_t l_block_hash; if(sizeof (l_block->hdr) >= a_atom_size){ log_it(L_WARNING,"Size of block is %zd that is equal or less then block's header size %zd",a_atom_size,sizeof (l_block->hdr)); return ATOM_REJECT; } + + // Hard accept list + if (l_blocks_pvt->hal) { + dap_hash_fast(l_block, a_atom_size, &l_block_hash); + struct cs_blocks_hal_item *l_hash_found = NULL; + HASH_FIND(hh, l_blocks_pvt->hal, &l_block_hash, sizeof(l_block_hash), l_hash_found); + if (l_hash_found) { + return ATOM_ACCEPT; + } + } + size_t l_meta_count = 0; dap_chain_block_meta_t ** l_meta= dap_chain_block_get_meta(l_block, a_atom_size, & l_meta_count); // Parse metadata @@ -1114,7 +1147,6 @@ static dap_chain_atom_verify_res_t s_callback_atom_verify(dap_chain_t * a_chain, dap_chain_hash_fast_t l_block_anchor_hash = {0}; uint64_t l_nonce = 0; uint64_t l_nonce2 = 0; - dap_chain_hash_fast_t l_block_hash; dap_chain_block_meta_extract(l_meta, l_meta_count, &l_block_prev_hash, diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c index 1a47abbba49c81ac7cd9d61e73ad489f8ab4c7e2..2b400d43161b2b86a64078647f4f04a61f274503 100644 --- a/modules/type/dag/dap_chain_cs_dag.c +++ b/modules/type/dag/dap_chain_cs_dag.c @@ -297,7 +297,8 @@ int dap_chain_cs_dag_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) } } uint16_t l_list_len = 0; - char **l_hard_accept_list = dap_config_get_array_str(a_chain_cfg, "dag", "hard_accept_list", &l_list_len); + char **l_hard_accept_list = dap_config_get_array_str(a_chain_cfg, "dag-poa", "hard_accept_list", &l_list_len); + log_it(L_MSG, "HAL contains %d whitelisted events", l_list_len); for (uint16_t i = 0; i < l_list_len; i++) { dap_chain_cs_dag_hal_item_t *l_hal_item = DAP_NEW_Z(dap_chain_cs_dag_hal_item_t); if (!l_hal_item){