diff --git a/CMakeLists.txt b/CMakeLists.txt index a712896a4d58e89358f9a492b1bf05775507f5a3..a10ddcdb4c1f8b1cbc0953281e719973f11a4f5d 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.5-24") +set(CELLFRAME_SDK_NATIVE_VERSION "2.5-25") add_definitions ("-DCELLFRAME_SDK_VERSION=\"${CELLFRAME_SDK_NATIVE_VERSION}\"") set(DAPSDK_MODULES "") diff --git a/dap-sdk/net/client/dap_client_pvt.c b/dap-sdk/net/client/dap_client_pvt.c index 5a3ca7692c94c91b10a17f7e2d2401813e52ce60..3eb3a14148778e6d94193e62e9f712b783018c73 100644 --- a/dap-sdk/net/client/dap_client_pvt.c +++ b/dap-sdk/net/client/dap_client_pvt.c @@ -852,9 +852,10 @@ void dap_client_pvt_request_enc(dap_client_pvt_t * a_client_internal, const char } } - size_t l_key_hdr_str_size_max = strlen(a_client_internal->session_key_id) + 10; + size_t l_key_hdr_str_size_max = a_client_internal->session_key_id ? strlen(a_client_internal->session_key_id) + 10 : 12; char *l_key_hdr_str = DAP_NEW_Z_SIZE(char, l_key_hdr_str_size_max); - snprintf(l_key_hdr_str, l_key_hdr_str_size_max, "KeyID: %s", a_client_internal->session_key_id); + snprintf(l_key_hdr_str, l_key_hdr_str_size_max, "KeyID: %s", + a_client_internal->session_key_id ? a_client_internal->session_key_id : "NULL"); char *a_custom_new[2]; size_t a_custom_count = 1; diff --git a/modules/chain/dap_chain_ledger.c b/modules/chain/dap_chain_ledger.c index fa171cb1b43c8064f775b710e2e4a41c93a6a9a8..aca8f087bca238c7ce5ad50cf5ea17966d71d042 100644 --- a/modules/chain/dap_chain_ledger.c +++ b/modules/chain/dap_chain_ledger.c @@ -69,11 +69,8 @@ static pthread_rwlock_t s_verificators_rwlock; #define MAX_OUT_ITEMS 10 typedef struct dap_chain_ledger_token_emission_item { dap_chain_hash_fast_t datum_token_emission_hash; - // while these are not needed - //dap_chain_hash_fast_t datum_tx_token_hash; - //dap_chain_tx_token_t * tx_token; - dap_chain_datum_token_emission_t *datum_token_emission; + size_t datum_token_emission_size; UT_hash_handle hh; } dap_chain_ledger_token_emission_item_t; @@ -315,23 +312,51 @@ int dap_chain_ledger_token_add(dap_ledger_t * a_ledger, dap_chain_datum_token_t * @brief s_treshold_emissions_proc * @param a_ledger */ -static void s_treshold_emissions_proc( dap_ledger_t * a_ledger) -{ - UNUSED(a_ledger); - // TODO +static void s_treshold_emissions_proc(dap_ledger_t * a_ledger) +{ + bool l_success; + do { + l_success = false; + dap_chain_ledger_token_emission_item_t *l_emission_item, *l_emission_tmp; + HASH_ITER(hh, PVT(a_ledger)->treshold_emissions, l_emission_item, l_emission_tmp) { + int l_res = dap_chain_ledger_token_emission_add(a_ledger, l_emission_item->datum_token_emission, + l_emission_item->datum_token_emission_size); + if (!l_res) { + pthread_rwlock_wrlock(&PVT(a_ledger)->treshold_emissions_rwlock); + HASH_DEL(PVT(a_ledger)->treshold_emissions, l_emission_item); + pthread_rwlock_unlock(&PVT(a_ledger)->treshold_emissions_rwlock); + DAP_DELETE(l_emission_item->datum_token_emission); + DAP_DELETE(l_emission_item); + l_success = true; + } + } + } while (l_success); } /** * @brief s_treshold_txs_proc * @param a_ledger */ -static void s_treshold_txs_proc( dap_ledger_t * a_ledger) -{ - UNUSED(a_ledger); - // TODO +static void s_treshold_txs_proc( dap_ledger_t *a_ledger) +{ + bool l_success; + do { + l_success = false; + dap_chain_ledger_tx_item_t *l_tx_item, *l_tx_tmp; + HASH_ITER(hh, PVT(a_ledger)->treshold_txs, l_tx_item, l_tx_tmp) { + int l_res = dap_chain_ledger_tx_add(a_ledger, l_tx_item->tx); + if (!l_res) { + pthread_rwlock_wrlock(&PVT(a_ledger)->treshold_txs_rwlock); + HASH_DEL(PVT(a_ledger)->treshold_txs, l_tx_item); + pthread_rwlock_unlock(&PVT(a_ledger)->treshold_txs_rwlock); + DAP_DELETE(l_tx_item->tx); + DAP_DELETE(l_tx_item); + l_success = true; + } + } + } while (l_success); } - /** * @brief dap_chain_ledger_create * @param a_check_flags @@ -430,6 +455,7 @@ int dap_chain_ledger_token_emission_add(dap_ledger_t *a_ledger, memcpy(l_token_emission_item->datum_token_emission, a_token_emission, a_token_emission_size); memcpy(&l_token_emission_item->datum_token_emission_hash, l_token_emission_hash_ptr, sizeof(l_token_emission_hash)); + l_token_emission_item->datum_token_emission_size = a_token_emission_size; dap_chain_ledger_token_emission_item_t * l_token_emissions = l_token_item ? l_token_item->token_emissions : l_ledger_priv->treshold_emissions; HASH_ADD(hh, l_token_emissions , @@ -454,8 +480,10 @@ int dap_chain_ledger_token_emission_add(dap_ledger_t *a_ledger, ret = -2; } } else { - log_it(L_ERROR, "Can't add token emission datum of %llu %s ( %s )", + if (l_token_item) { + log_it(L_ERROR, "Can't add token emission datum of %llu %s ( %s )", a_token_emission->hdr.value, c_token_ticker, l_hash_str); + } ret = -1; } pthread_rwlock_unlock(l_token_item ? @@ -776,7 +804,7 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t bound_item->item_out = l_item_out; if(!l_tx_prev) { // First transaction log_it(L_DEBUG,"No previous transaction was found for hash %s",l_tx_prev_hash_str); - l_err_num = -5; + l_err_num = DAP_CHAIN_LEDGER_TX_NO_PREVIOUS; break; } //log_it(L_INFO,"Previous transaction was found for hash %s",l_tx_prev_hash_str); @@ -1072,39 +1100,53 @@ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx) dap_ledger_private_t *l_ledger_priv = PVT(a_ledger); dap_list_t *l_list_bound_items = NULL; dap_list_t *l_list_tx_out = NULL; + dap_chain_ledger_tx_item_t *l_item_tmp = NULL; dap_chain_hash_fast_t *l_tx_hash = dap_chain_node_datum_tx_calc_hash(a_tx); char l_tx_hash_str[70]; dap_chain_hash_fast_to_str(l_tx_hash,l_tx_hash_str,sizeof(l_tx_hash_str)); - int l_ret_check; - if( (l_ret_check = dap_chain_ledger_tx_cache_check( - a_ledger, a_tx, &l_list_bound_items, &l_list_tx_out)) < 0){ - log_it (L_WARNING, "dap_chain_ledger_tx_add() tx %s not passed the check: code %d ",l_tx_hash_str, l_ret_check); - return l_ret_check*100; - } - log_it ( L_DEBUG, "dap_chain_ledger_tx_add() check passed for tx %s",l_tx_hash_str); - - - char *l_token_ticker = NULL, *l_token_ticker_old = NULL; - dap_chain_ledger_tx_item_t *l_item_tmp = NULL; pthread_rwlock_wrlock(&l_ledger_priv->ledger_rwlock); - HASH_FIND(hh, l_ledger_priv->ledger_items, l_tx_hash, sizeof(dap_chain_hash_fast_t), l_item_tmp); // tx_hash already in the hash? + HASH_FIND(hh, l_ledger_priv->ledger_items, l_tx_hash, sizeof(dap_chain_hash_fast_t), l_item_tmp); + pthread_rwlock_unlock(&l_ledger_priv->ledger_rwlock); // transaction already present in the cache list - if(l_item_tmp) { - // delete transaction from the cache list - //ret = dap_chain_ledger_tx_remove(a_ledger, l_tx_hash); - // there should be no duplication - char * l_hash_str = dap_chain_hash_fast_to_str_new(l_tx_hash); - log_it(L_WARNING, "Transaction (hash=%s) deleted from cache because there is an attempt to add it to cache", - l_hash_str); - DAP_DELETE(l_hash_str); + if (l_item_tmp) { + log_it(L_WARNING, "Transaction %s already present in the cache", l_tx_hash_str); ret = 1; goto FIN; } - if (ret == -1) { + + int l_ret_check; + l_item_tmp = NULL; + if( (l_ret_check = dap_chain_ledger_tx_cache_check( + a_ledger, a_tx, &l_list_bound_items, &l_list_tx_out)) < 0) { + if (l_ret_check == DAP_CHAIN_LEDGER_TX_NO_PREVIOUS) { + HASH_FIND(hh, l_ledger_priv->treshold_txs, l_tx_hash, sizeof(*l_tx_hash), l_item_tmp); + if (!l_item_tmp) { + if (HASH_COUNT(l_ledger_priv->treshold_txs) >= s_treshold_txs_max) { + log_it(L_WARNING,"Treshold for tranactions is overfulled (%lu max), dropping down new data, added nothing", + s_treshold_txs_max); + } else { + l_item_tmp = DAP_NEW_Z(dap_chain_ledger_tx_item_t); + memcpy(&l_item_tmp->tx_hash_fast, l_tx_hash, sizeof(dap_chain_hash_fast_t)); + size_t l_tx_size = dap_chain_datum_tx_get_size(a_tx); + l_item_tmp->tx = DAP_NEW_SIZE(dap_chain_datum_tx_t, l_tx_size); + memcpy(l_item_tmp->tx, a_tx, l_tx_size); + pthread_rwlock_wrlock(&l_ledger_priv->treshold_txs_rwlock); + HASH_ADD(hh, l_ledger_priv->treshold_txs, tx_hash_fast, sizeof(dap_chain_hash_fast_t), l_item_tmp); + pthread_rwlock_unlock(&l_ledger_priv->treshold_txs_rwlock); + log_it (L_DEBUG, "Tx %s added to threshold", l_tx_hash_str); + } + } + } else { + log_it (L_WARNING, "dap_chain_ledger_tx_add() tx %s not passed the check: code %d ",l_tx_hash_str, l_ret_check); + } + ret = l_ret_check; goto FIN; } + log_it ( L_DEBUG, "dap_chain_ledger_tx_add() check passed for tx %s",l_tx_hash_str); + + char *l_token_ticker = NULL, *l_token_ticker_old = NULL; bool l_multichannel = false; // Mark 'out' items in cache if they were used & delete previous transactions from cache if it need // find all bound pairs 'in' and 'out' @@ -1168,14 +1210,14 @@ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx) int res = dap_chain_ledger_tx_remove(a_ledger, &l_tx_prev_hash_to_del); if(res == -2) { log_it(L_ERROR, "Can't delete previous transactions because hash=0x%x not found", l_tx_prev_hash_str); - ret = -2; + ret = -100; DAP_DELETE(l_tx_prev_hash_str); dap_list_free_full(l_list_bound_items, free); goto FIN; } else if(res != 1) { log_it(L_ERROR, "Can't delete previous transactions with hash=0x%x", l_tx_prev_hash_str); - ret = -3; + ret = -101; DAP_DELETE(l_tx_prev_hash_str); dap_list_free_full(l_list_bound_items, free); goto FIN; @@ -1307,14 +1349,16 @@ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx) } if (l_token_ticker && !l_multichannel) strncpy(l_item_tmp->token_tiker, l_token_ticker, sizeof(l_item_tmp->token_tiker) - 1); - - memcpy(l_item_tmp->tx, a_tx, dap_chain_datum_tx_get_size(a_tx)); + size_t l_tx_size = dap_chain_datum_tx_get_size(a_tx); + memcpy(l_item_tmp->tx, a_tx, l_tx_size); + pthread_rwlock_wrlock(&l_ledger_priv->ledger_rwlock); HASH_ADD(hh, l_ledger_priv->ledger_items, tx_hash_fast, sizeof(dap_chain_hash_fast_t), l_item_tmp); // tx_hash_fast: name of key field + pthread_rwlock_unlock(&l_ledger_priv->ledger_rwlock); + + s_treshold_txs_proc(a_ledger); ret = 1; } FIN: - pthread_rwlock_tryrdlock (&l_ledger_priv->ledger_rwlock); - pthread_rwlock_unlock(&l_ledger_priv->ledger_rwlock); DAP_DELETE(l_tx_hash); return ret; } @@ -1335,18 +1379,16 @@ int dap_chain_ledger_tx_remove(dap_ledger_t *a_ledger, dap_chain_hash_fast_t *a_ HASH_FIND(hh, l_ledger_priv->ledger_items, a_tx_hash, sizeof(dap_chain_hash_fast_t), l_item_tmp); if(l_item_tmp != NULL) { HASH_DEL(l_ledger_priv->ledger_items, l_item_tmp); + // delete transaction + DAP_DELETE(l_item_tmp->tx); + // del struct for hash + DAP_DELETE(l_item_tmp); l_ret = 1; } else // hash not found in the cache l_ret = -2; pthread_rwlock_unlock(&l_ledger_priv->ledger_rwlock); - if(!l_ret) { - // delete transaction - DAP_DELETE(l_item_tmp->tx); - // del struct for hash - DAP_DELETE(l_item_tmp); - } return l_ret; } @@ -1356,14 +1398,53 @@ int dap_chain_ledger_tx_remove(dap_ledger_t *a_ledger, dap_chain_hash_fast_t *a_ void dap_chain_ledger_purge(dap_ledger_t *a_ledger) { dap_ledger_private_t *l_ledger_priv = PVT(a_ledger); - dap_chain_ledger_tx_item_t *l_iter_current, *l_item_tmp; pthread_rwlock_wrlock(&l_ledger_priv->ledger_rwlock); - HASH_ITER(hh, l_ledger_priv->ledger_items , l_iter_current, l_item_tmp) - { - // delete transaction - DAP_DELETE(l_iter_current->tx); - // del struct for hash - HASH_DEL(l_ledger_priv->ledger_items, l_iter_current); + pthread_rwlock_wrlock(&l_ledger_priv->tokens_rwlock); + pthread_rwlock_wrlock(&l_ledger_priv->treshold_emissions_rwlock); + pthread_rwlock_wrlock(&l_ledger_priv->treshold_txs_rwlock); + + // delete transactions + dap_chain_ledger_tx_item_t *l_item_current, *l_item_tmp; + HASH_ITER(hh, l_ledger_priv->ledger_items , l_item_current, l_item_tmp) { + DAP_DELETE(l_item_current->tx); + HASH_DEL(l_ledger_priv->ledger_items, l_item_current); + DAP_DELETE(l_item_current); + } + + // delete threshold txs + HASH_ITER(hh, l_ledger_priv->treshold_txs, l_item_current, l_item_tmp) { + HASH_DEL(l_ledger_priv->treshold_txs, l_item_current); + DAP_DELETE(l_item_current->tx); + DAP_DELETE(l_item_current); + } + + // delete balances + dap_ledger_wallet_balance_t *l_balance_current, *l_balance_tmp; + HASH_ITER(hh, l_ledger_priv->balance_accounts, l_balance_current, l_balance_tmp) { + DAP_DELETE(l_balance_current->key); + DAP_DELETE(l_balance_current); + } + + // delete threshold emissions + dap_chain_ledger_token_emission_item_t *l_emission_current, *l_emission_tmp; + HASH_ITER(hh, l_ledger_priv->treshold_emissions, l_emission_current, l_emission_tmp) { + HASH_DEL(l_ledger_priv->treshold_emissions, l_emission_current); + DAP_DELETE(l_emission_current->datum_token_emission); + DAP_DELETE(l_emission_current); + } + + // delete tokens & its emissions + dap_chain_ledger_token_item_t *l_token_current, *l_token_tmp; + HASH_ITER(hh, l_ledger_priv->tokens, l_token_current, l_token_tmp) { + HASH_DEL(l_ledger_priv->tokens, l_token_current); + HASH_ITER(hh, l_token_current->token_emissions, l_emission_current, l_emission_tmp) { + HASH_DEL(l_token_current->token_emissions, l_emission_current); + DAP_DELETE(l_emission_current->datum_token_emission); + DAP_DELETE(l_emission_current); + } + DAP_DELETE(l_token_current->datum_token); + pthread_rwlock_destroy(&l_token_current->token_emissions_rwlock); + DAP_DELETE(l_token_current); } pthread_rwlock_unlock(&l_ledger_priv->ledger_rwlock); } diff --git a/modules/chain/include/dap_chain_ledger.h b/modules/chain/include/dap_chain_ledger.h index 29b7b7e9f0ecf06987174d0b66e1ca87b3370b82..7fe973442df58c40a14ceb658ad0d16dcb882bea 100644 --- a/modules/chain/include/dap_chain_ledger.h +++ b/modules/chain/include/dap_chain_ledger.h @@ -52,6 +52,9 @@ typedef bool (* dap_chain_ledger_verificator_callback_t)(dap_chain_tx_out_cond_t // Check the double spending in all cells #define DAP_CHAIN_LEDGER_CHECK_CELLS_DS 0x0100 +// Error code for no previous transaction (candidate to threshold) +#define DAP_CHAIN_LEDGER_TX_NO_PREVIOUS -5 + dap_ledger_t* dap_chain_ledger_create(uint16_t a_check_flags); // Remove dap_ledger_t structure diff --git a/modules/channel/chain/dap_stream_ch_chain.c b/modules/channel/chain/dap_stream_ch_chain.c index 26db4a4a6c3f6f922ad73af80d2520b143f023e4..57e3241a72fc33c604a8a5b3a297c71a0f75fd11 100644 --- a/modules/channel/chain/dap_stream_ch_chain.c +++ b/modules/channel/chain/dap_stream_ch_chain.c @@ -229,21 +229,18 @@ bool s_chain_pkt_callback(dap_proc_thread_t *a_thread, void *a_arg) size_t l_atom_size =0; if ( l_chain->callback_atom_find_by_hash(l_atom_iter, &l_atom_hash, &l_atom_size) == NULL ) { dap_chain_atom_verify_res_t l_atom_add_res = l_chain->callback_atom_add(l_chain, l_atom_copy, l_atom_copy_size); - if ((l_atom_add_res == ATOM_ACCEPT || l_atom_add_res == ATOM_MOVE_TO_THRESHOLD) && - dap_chain_has_file_store(l_chain)) { + if (l_atom_add_res == ATOM_ACCEPT && dap_chain_has_file_store(l_chain)) { // append to file dap_chain_cell_t *l_cell = dap_chain_cell_create_fill(l_chain, l_ch_chain->request_cell_id); int l_res; if (l_cell) { - if (l_atom_add_res == ATOM_ACCEPT) { - // add one atom only - l_res = dap_chain_cell_file_append(l_cell, l_atom_copy, l_atom_copy_size); - // rewrite all file - //l_res = dap_chain_cell_file_update(l_cell); - if(l_res < 0) { - log_it(L_ERROR, "Can't save event 0x%x to the file '%s'", l_atom_hash, - l_cell ? l_cell->file_storage_path : "[null]"); - } + // add one atom only + l_res = dap_chain_cell_file_append(l_cell, l_atom_copy, l_atom_copy_size); + // rewrite all file + //l_res = dap_chain_cell_file_update(l_cell); + if(l_res < 0) { + log_it(L_ERROR, "Can't save event 0x%x to the file '%s'", l_atom_hash, + l_cell ? l_cell->file_storage_path : "[null]"); } // add all atoms from treshold if (l_chain->callback_atom_add_from_treshold){ diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c index 48342a194ee44b9a94fc64070d8dea0516c37327..c0bcabc50b19da206d90237004ffbae31516aa1f 100644 --- a/modules/type/dag/dap_chain_cs_dag.c +++ b/modules/type/dag/dap_chain_cs_dag.c @@ -256,42 +256,40 @@ void dap_chain_cs_dag_delete(dap_chain_t * a_chain) DAP_DELETE(l_dag->_pvt); } -static int s_dap_chain_add_atom_to_ledger(dap_chain_cs_dag_t * a_dag, dap_ledger_t * a_ledger, dap_chain_cs_dag_event_item_t * a_event_item){ - - dap_chain_datum_t *l_datum = (dap_chain_datum_t*) dap_chain_cs_dag_event_get_datum(a_event_item->event, a_event_item->event_size); - switch (l_datum->header.type_id) { - case DAP_CHAIN_DATUM_TOKEN_DECL: { - dap_chain_datum_token_t *l_token = (dap_chain_datum_token_t*) l_datum->data; - return dap_chain_ledger_token_add(a_ledger, l_token, l_datum->header.data_size); - } - break; - case DAP_CHAIN_DATUM_TOKEN_EMISSION: { - dap_chain_datum_token_emission_t *l_token_emission = (dap_chain_datum_token_emission_t*) l_datum->data; - return dap_chain_ledger_token_emission_add(a_ledger, l_token_emission, l_datum->header.data_size); - } - break; - case DAP_CHAIN_DATUM_TX: { - dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t*) l_datum->data; - // don't save bad transactions to base - int l_ret = dap_chain_ledger_tx_add(a_ledger, l_tx); - if( l_ret !=0 ) { - return l_ret; - } - dap_chain_cs_dag_event_item_t * l_tx_event= DAP_NEW_Z(dap_chain_cs_dag_event_item_t); - l_tx_event->ts_added = a_event_item->ts_added; - l_tx_event->event = a_event_item->event; - l_tx_event->event_size = a_event_item->event_size; - memcpy(&l_tx_event->hash, &a_event_item->hash, sizeof (l_tx_event->hash) ); - - HASH_ADD(hh,PVT(a_dag)->tx_events,hash,sizeof (l_tx_event->hash),l_tx_event); - +static int s_dap_chain_add_atom_to_ledger(dap_chain_cs_dag_t * a_dag, dap_ledger_t * a_ledger, dap_chain_cs_dag_event_item_t * a_event_item) +{ + dap_chain_datum_t *l_datum = (dap_chain_datum_t*) dap_chain_cs_dag_event_get_datum(a_event_item->event, a_event_item->event_size); + switch (l_datum->header.type_id) { + case DAP_CHAIN_DATUM_TOKEN_DECL: { + dap_chain_datum_token_t *l_token = (dap_chain_datum_token_t*) l_datum->data; + return dap_chain_ledger_token_add(a_ledger, l_token, l_datum->header.data_size); + } + break; + case DAP_CHAIN_DATUM_TOKEN_EMISSION: { + dap_chain_datum_token_emission_t *l_token_emission = (dap_chain_datum_token_emission_t*) l_datum->data; + return dap_chain_ledger_token_emission_add(a_ledger, l_token_emission, l_datum->header.data_size); + } + break; + case DAP_CHAIN_DATUM_TX: { + dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t*) l_datum->data; + // don't save bad transactions to base + int l_ret = dap_chain_ledger_tx_add(a_ledger, l_tx); + if( l_ret != 1 ) { + return l_ret; + } + dap_chain_cs_dag_event_item_t * l_tx_event= DAP_NEW_Z(dap_chain_cs_dag_event_item_t); + l_tx_event->ts_added = a_event_item->ts_added; + l_tx_event->event = a_event_item->event; + l_tx_event->event_size = a_event_item->event_size; + memcpy(&l_tx_event->hash, &a_event_item->hash, sizeof (l_tx_event->hash) ); + HASH_ADD(hh,PVT(a_dag)->tx_events,hash,sizeof (l_tx_event->hash),l_tx_event); + } + break; + default: + return -1; } - break; - default: - return -1; - } - return 0; + return 0; } static int s_dap_chain_add_atom_to_events_table(dap_chain_cs_dag_t * a_dag, dap_ledger_t * a_ledger, dap_chain_cs_dag_event_item_t * a_event_item ) @@ -302,7 +300,11 @@ static int s_dap_chain_add_atom_to_events_table(dap_chain_cs_dag_t * a_dag, dap_ dap_chain_hash_fast_to_str(&a_event_item->hash,l_buf_hash,sizeof(l_buf_hash)-1); if (res == 0 || memcmp( &a_event_item->hash, &a_dag->static_genesis_event_hash, sizeof(a_event_item->hash) ) == 0) { log_it(L_DEBUG,"Dag event %s checked, add it to ledger", l_buf_hash); - s_dap_chain_add_atom_to_ledger(a_dag, a_ledger, a_event_item); + res = s_dap_chain_add_atom_to_ledger(a_dag, a_ledger, a_event_item); + if (res) { + log_it(L_DEBUG,"Dag event %s checked, but ledger declined", l_buf_hash); + return res; + } //All correct, no matter for result HASH_ADD(hh, PVT(a_dag)->events,hash,sizeof (a_event_item->hash), a_event_item); s_dag_events_lasts_process_new_last_event(a_dag, a_event_item); @@ -376,7 +378,8 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha int l_consensus_check = s_dap_chain_add_atom_to_events_table(l_dag, a_chain->ledger, l_event_item); if(!l_consensus_check){ log_it(L_DEBUG, "... added"); - }else if (l_consensus_check == -5){ + }else if (l_consensus_check == DAP_CHAIN_LEDGER_TX_NO_PREVIOUS){ + HASH_ADD(hh, PVT(l_dag)->events_treshold, hash, sizeof(l_event_item->hash), l_event_item); log_it(L_DEBUG, "... tresholded"); ret = ATOM_MOVE_TO_THRESHOLD; }else{