diff --git a/modules/chain/dap_chain_ledger.c b/modules/chain/dap_chain_ledger.c index b44bad7c8d3b749ee33e74a6f76bb4f382171a3b..4dc559894592499095395a00abec215e4734c9a6 100644 --- a/modules/chain/dap_chain_ledger.c +++ b/modules/chain/dap_chain_ledger.c @@ -2860,7 +2860,7 @@ static bool s_ledger_tx_hash_is_used_out_item(dap_chain_ledger_tx_item_t *a_item { if (!a_item || !a_item->cache_data.n_outs) { //log_it(L_DEBUG, "list_cached_item is NULL"); - return false; + return true; } if(a_idx_out >= MAX_OUT_ITEMS) { if(s_debug_more) diff --git a/modules/consensus/esbocs/dap_chain_cs_esbocs.c b/modules/consensus/esbocs/dap_chain_cs_esbocs.c index e94453c57f6f4998ac942e2ef726fc1a16392ecf..b4808129cc9cff13fb0014cb87e4f8df9dfdad59 100644 --- a/modules/consensus/esbocs/dap_chain_cs_esbocs.c +++ b/modules/consensus/esbocs/dap_chain_cs_esbocs.c @@ -16,6 +16,7 @@ #include "dap_chain_node_cli_cmd.h" #define LOG_TAG "dap_chain_cs_esbocs" +const char* block_fee_group = "local.fee-collect-block-hashes"; enum s_esbocs_session_state { DAP_CHAIN_ESBOCS_SESSION_STATE_WAIT_START, @@ -95,6 +96,7 @@ typedef struct dap_chain_esbocs_pvt { // PoA section dap_list_t *poa_validators; uint256_t minimum_fee; + uint256_t fee_coll_set; } dap_chain_esbocs_pvt_t; #define PVT(a) ((dap_chain_esbocs_pvt_t *)a->_pvt) @@ -231,6 +233,7 @@ static int s_callback_created(dap_chain_t *a_chain, dap_config_t *a_chain_net_cf l_esbocs_pvt->minimum_fee = dap_chain_coins_to_balance(dap_config_get_item_str_default(a_chain_net_cfg, "esbocs", "minimum_fee", "0.05")); l_esbocs_pvt->fee_addr = dap_chain_addr_from_str(dap_config_get_item_str(a_chain_net_cfg, "esbocs", "fee_addr")); + l_esbocs_pvt->fee_coll_set = dap_chain_coins_to_balance(dap_config_get_item_str_default(a_chain_net_cfg, "esbocs", "set_collect_fee", "10.05")); const char *l_sign_cert_str = NULL; if ((l_sign_cert_str = dap_config_get_item_str(a_chain_net_cfg, "esbocs", "blocks-sign-cert")) != NULL) { @@ -1018,6 +1021,95 @@ static bool s_session_candidate_to_chain(dap_chain_esbocs_session_t *a_session, return res; } +typedef struct fee_serv_param +{ + dap_hash_fast_t block_hash; + dap_enc_key_t * key_from; + dap_chain_addr_t * a_addr_to; + uint256_t fee_need_cfg; + uint256_t value_fee; + dap_chain_t * chain; +}fee_serv_param_t; + +static void s_check_db_callback_fee_collect (dap_global_db_context_t *a_global_db_context, + int a_rc, const char *a_group, + const size_t a_values_total, const size_t a_values_count, + dap_global_db_obj_t *a_values, void *a_arg) +{ + int res = 0; + uint256_t l_value_out_block = {}; + uint256_t l_value_total = {}; + uint256_t l_value_gdb = {}; + fee_serv_param_t *l_arg = (fee_serv_param_t*)a_arg; + + dap_chain_t *l_chain = l_arg->chain; + dap_chain_block_cache_t *l_block_cache = NULL; + dap_chain_cs_blocks_t *l_blocks = DAP_CHAIN_CS_BLOCKS(l_chain); + dap_list_t *l_block_list = NULL; + l_block_cache = dap_chain_block_cs_cache_get_by_hash(l_blocks, &l_arg->block_hash); + dap_list_t *l_list_used_out = dap_chain_block_get_list_tx_cond_outs_with_val(l_chain->ledger,l_block_cache,&l_value_out_block); + if(!l_list_used_out) + { + log_it(L_WARNING, "There aren't any fee in this block"); + return; + } + dap_list_free_full(l_list_used_out, NULL); + l_block_list = dap_list_append(l_block_list, l_block_cache); + if(!a_values_count) + { + if(compare256(l_value_out_block,l_arg->fee_need_cfg) == 1) + { + dap_chain_mempool_tx_coll_fee_create(l_arg->key_from, l_arg->a_addr_to, + l_block_list, l_arg->value_fee, "hex"); + log_it(L_NOTICE, "Fee collect transaction successfully created"); + dap_global_db_del(block_fee_group, NULL, NULL, NULL); + } + else + { + res = dap_global_db_set(block_fee_group,l_block_cache->block_hash_str,&l_value_out_block,sizeof(uint256_t),false,NULL,NULL); + if(res) + log_it(L_WARNING, "Unable to write data to database"); + else + log_it(L_NOTICE, "The block was successfully added to the database"); + } + dap_list_free_full(l_block_list, NULL); + DAP_DELETE(l_arg->a_addr_to); + DAP_DELETE(l_arg); + return; + } + else + { + for(size_t i=0;i<a_values_count;i++) + { + dap_hash_fast_t block_hash; + dap_chain_hash_fast_from_hex_str(a_values[i].key,&block_hash); + dap_chain_block_cache_t *block_cache = dap_chain_block_cs_cache_get_by_hash(l_blocks, &block_hash); + l_block_list = dap_list_append(l_block_list, block_cache); + SUM_256_256(*(uint256_t*)a_values[i].value,l_value_gdb,&l_value_gdb); + } + SUM_256_256(l_value_out_block,l_value_gdb,&l_value_total); + if(compare256(l_value_total,l_arg->fee_need_cfg) == 1) + { + dap_chain_mempool_tx_coll_fee_create(l_arg->key_from, l_arg->a_addr_to, + l_block_list, l_arg->value_fee, "hex"); + dap_global_db_del(block_fee_group, NULL, NULL, NULL); + log_it(L_NOTICE, "Fee collect transaction successfully created"); + } + else + { + res = dap_global_db_set(block_fee_group,l_block_cache->block_hash_str,&l_value_out_block,sizeof(uint256_t),false,NULL,NULL); + if(res) + log_it(L_WARNING, "Unable to write data to database"); + else + log_it(L_NOTICE, "The block was successfully added to the database"); + } + dap_list_free_full(l_block_list, NULL); + DAP_DELETE(l_arg->a_addr_to); + DAP_DELETE(l_arg); + return; + } +} + static void s_session_round_finish(dap_chain_esbocs_session_t *a_session, dap_chain_esbocs_store_t *l_store) { bool l_cs_debug = PVT(a_session->esbocs)->debug; @@ -1074,18 +1166,23 @@ static void s_session_round_finish(dap_chain_esbocs_session_t *a_session, dap_ch a_session->cur_round.attempt_num, l_finish_candidate_hash_str, l_finish_block_hash_str); DAP_DELETE(l_finish_candidate_hash_str); DAP_DELETE(l_finish_block_hash_str); - } - + } memcpy(&l_precommit_candidate_hash, &l_store->precommit_candidate_hash, sizeof(dap_hash_fast_t)); bool l_compare = dap_hash_fast_compare(&l_store->candidate_hash,&(PVT(a_session->esbocs)->candidate_hash)); if(s_session_candidate_to_chain(a_session, &l_store->precommit_candidate_hash, l_store->candidate, l_store->candidate_size) && l_compare && PVT(a_session->esbocs)->fee_addr) { - dap_list_t *l_block_list = NULL; - l_block_cache = dap_chain_block_cs_cache_get_by_hash(l_blocks, &l_precommit_candidate_hash); - l_block_list = dap_list_append(l_block_list, l_block_cache); - dap_chain_mempool_tx_coll_fee_create(a_session->blocks_sign_key, (PVT(a_session->esbocs)->fee_addr), - l_block_list, PVT(a_session->esbocs)->minimum_fee, "hex"); - dap_list_free(l_block_list); + + fee_serv_param_t *tmp = DAP_NEW(fee_serv_param_t); + dap_chain_addr_t * addr = DAP_NEW_Z(dap_chain_addr_t); + *addr = *PVT(a_session->esbocs)->fee_addr; + tmp->a_addr_to = addr; + tmp->block_hash = l_precommit_candidate_hash; + tmp->chain = l_chain; + tmp->value_fee = PVT(a_session->esbocs)->minimum_fee; + tmp->fee_need_cfg = PVT(a_session->esbocs)->fee_coll_set; + tmp->key_from = a_session->blocks_sign_key; + + dap_global_db_get_all(block_fee_group,0,s_check_db_callback_fee_collect,tmp); } } diff --git a/modules/mempool/dap_chain_mempool.c b/modules/mempool/dap_chain_mempool.c index 90ad7a05a418c839de12a0b91cc6cd76a6d8da3a..55425201f6be8e8308368d232b9c13a095de5420 100644 --- a/modules/mempool/dap_chain_mempool.c +++ b/modules/mempool/dap_chain_mempool.c @@ -296,7 +296,7 @@ char *dap_chain_mempool_tx_coll_fee_create(dap_enc_key_t *a_key_from,const dap_c bool l_net_fee_used = dap_chain_net_tx_get_fee(l_chain->net_id, &l_net_fee, &l_addr_fee); //add tx if (NULL == (l_tx = dap_chain_datum_tx_create())) { - + log_it(L_WARNING, "Can't create datum tx"); return NULL; } @@ -323,6 +323,7 @@ char *dap_chain_mempool_tx_coll_fee_create(dap_enc_key_t *a_key_from,const dap_c if (dap_chain_datum_tx_add_out_item(&l_tx, &l_addr_fee, l_net_fee) == 1) SUM_256_256(l_value_pack, l_net_fee, &l_value_pack); else { + log_it(L_WARNING, "Can't create net_fee out item in transaction fee"); dap_chain_datum_tx_delete(l_tx); return NULL; } @@ -332,6 +333,7 @@ char *dap_chain_mempool_tx_coll_fee_create(dap_enc_key_t *a_key_from,const dap_c if (dap_chain_datum_tx_add_fee_item(&l_tx, a_value_fee) == 1) SUM_256_256(l_value_pack, a_value_fee, &l_value_pack); else { + log_it(L_WARNING, "Can't create valid_fee item in transaction fee"); dap_chain_datum_tx_delete(l_tx); return NULL; } @@ -349,12 +351,14 @@ char *dap_chain_mempool_tx_coll_fee_create(dap_enc_key_t *a_key_from,const dap_c //add 'out' items if (dap_chain_datum_tx_add_out_item(&l_tx, a_addr_to, l_value_out) != 1) { dap_chain_datum_tx_delete(l_tx); + log_it(L_WARNING, "Can't create out item in transaction fee"); return NULL; } // add 'sign' items if(dap_chain_datum_tx_add_sign_item(&l_tx, a_key_from) != 1) { dap_chain_datum_tx_delete(l_tx); + log_it(L_WARNING, "Can't sign item in transaction fee"); return NULL; } diff --git a/modules/net/dap_chain_node_cli_cmd_tx.c b/modules/net/dap_chain_node_cli_cmd_tx.c index 3e257fa427150b5c30e5e2cf6b96ff56698c540d..c4d64d435478b6f332ecedb575b75a4bf788901d 100644 --- a/modules/net/dap_chain_node_cli_cmd_tx.c +++ b/modules/net/dap_chain_node_cli_cmd_tx.c @@ -64,6 +64,7 @@ typedef struct dap_chain_tx_hash_processed_ht{ UT_hash_handle hh; }dap_chain_tx_hash_processed_ht_t; + /** * @brief s_chain_tx_hash_processed_ht_free * free l_current_hash->hash, l_current_hash, l_hash_processed @@ -587,7 +588,6 @@ static char* dap_db_history_filter(dap_chain_t * a_chain, dap_ledger_t *a_ledger return l_ret_str; } - /** * @brief com_ledger * ledger command @@ -605,7 +605,7 @@ int com_ledger(int a_argc, char ** a_argv, char **a_str_reply) const char *l_wallet_name = NULL; const char *l_net_str = NULL; const char *l_chain_str = NULL; - const char *l_tx_hash_str = NULL; + const char *l_tx_hash_str = NULL; dap_chain_t * l_chain = NULL; dap_chain_net_t * l_net = NULL; diff --git a/modules/service/stake_pos_delegate/dap_chain_net_srv_stake_pos_delegate.c b/modules/service/stake_pos_delegate/dap_chain_net_srv_stake_pos_delegate.c index a83b0b5c9e2cdf34419d2e838573a0a63ebc5d58..cbadc37d6399235933a9ea50dff6ebe713290c5a 100644 --- a/modules/service/stake_pos_delegate/dap_chain_net_srv_stake_pos_delegate.c +++ b/modules/service/stake_pos_delegate/dap_chain_net_srv_stake_pos_delegate.c @@ -1147,7 +1147,7 @@ static int callback_compare_tx_list(const void * a_datum1, const void * a_datum2 static int s_cli_srv_stake(int a_argc, char **a_argv, char **a_str_reply) { enum { - CMD_NONE, CMD_ORDER, CMD_DELEGATE, CMD_APPROVE, CMD_LIST, CMD_INVALIDATE, CMD_MIN_VALUE + CMD_NONE, CMD_ORDER, CMD_DELEGATE, CMD_APPROVE, CMD_LIST, CMD_INVALIDATE, CMD_MIN_VALUE,CMD_test }; int l_arg_index = 1; @@ -1184,10 +1184,15 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, char **a_str_reply) l_cmd_num = CMD_MIN_VALUE; } else if(dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, min(a_argc, l_arg_index + 1), "test_com", NULL)) { - //l_cmd_num = CMD_test; + l_cmd_num = CMD_test; } switch (l_cmd_num) { + case CMD_test: + { + + } + break; case CMD_ORDER: return s_cli_srv_stake_order(a_argc, a_argv, l_arg_index + 1, a_str_reply, l_hash_out_type); case CMD_DELEGATE: { diff --git a/modules/type/blocks/dap_chain_block_cache.c b/modules/type/blocks/dap_chain_block_cache.c index 05fac01756cbbfcd384095bc066372cfa234af4c..943863111de6a8f5742d030a7e06b6f620ae17fb 100644 --- a/modules/type/blocks/dap_chain_block_cache.c +++ b/modules/type/blocks/dap_chain_block_cache.c @@ -196,9 +196,8 @@ dap_list_t * dap_chain_block_get_list_tx_cond_outs_with_val(dap_ledger_t *a_ledg dap_list_free_full(l_list_used_out, NULL); return NULL; } - - // Check whether used 'out' items - if (!dap_chain_ledger_tx_hash_is_used_out_item (a_ledger, &(l_tx_cur->tx_hash), l_out_idx_tmp)) { + //Check whether used 'out' items + if (!dap_chain_ledger_tx_hash_is_used_out_item (a_ledger, &l_tx_cur->tx_hash, l_out_idx_tmp)) { list_used_item_t *l_item = DAP_NEW_Z(list_used_item_t); l_item->tx_hash_fast = l_tx_cur->tx_hash; l_item->num_idx_out = l_out_idx_tmp;