From da2a499237e7bcbcebe78b4907adedf0ae96f0ab Mon Sep 17 00:00:00 2001 From: Roman Khlopkov <roman.khlopkov@demlabs.net> Date: Wed, 10 Apr 2024 18:19:26 +0000 Subject: [PATCH] Merge branch 'feature-10221_d' into 'develop' feature-10221_d See merge request cellframe/cellframe-sdk!1570 (cherry picked from commit ccf3f56a263df0ee0762a917f0bf0303094ec73e) 1aa8f21d add new command for blocks - block autocollect renew 4ce4bcae [*] Sub update --- modules/chain/include/dap_chain.h | 2 + .../consensus/esbocs/dap_chain_cs_esbocs.c | 113 +++++++++----- .../esbocs/include/dap_chain_cs_esbocs.h | 12 ++ modules/type/blocks/dap_chain_cs_blocks.c | 139 ++++++++++++++++-- 4 files changed, 221 insertions(+), 45 deletions(-) diff --git a/modules/chain/include/dap_chain.h b/modules/chain/include/dap_chain.h index a0b865f378..d60ccae140 100644 --- a/modules/chain/include/dap_chain.h +++ b/modules/chain/include/dap_chain.h @@ -120,6 +120,7 @@ typedef dap_list_t *(*dap_chain_callback_get_list)(dap_chain_t *a_chain, size_t typedef dap_list_t *(*dap_chain_callback_get_poa_certs)(dap_chain_t *a_chain, size_t *a_auth_certs_count, uint16_t *count_verify); typedef void (*dap_chain_callback_set_min_validators_count)(dap_chain_t *a_chain, uint16_t a_new_value); typedef uint256_t (*dap_chain_callback_get_minimum_fee)(dap_chain_t *a_chain); +typedef uint256_t (*dap_chain_callback_get_collectiong_level)(dap_chain_t *a_chain); typedef dap_enc_key_t* (*dap_chain_callback_get_signing_certificate)(dap_chain_t *a_chain); typedef void (*dap_chain_callback_load_from_gdb)(dap_chain_t *a_chain); typedef uint256_t (*dap_chain_callback_calc_reward)(dap_chain_t *a_chain, dap_hash_fast_t *a_block_hash, dap_pkey_t *a_block_sign_pkey); @@ -199,6 +200,7 @@ typedef struct dap_chain { dap_chain_callback_get_poa_certs callback_get_poa_certs; dap_chain_callback_set_min_validators_count callback_set_min_validators_count; dap_chain_callback_get_minimum_fee callback_get_minimum_fee; + dap_chain_callback_get_collectiong_level callback_get_collectiong_level; dap_chain_callback_get_signing_certificate callback_get_signing_certificate; dap_chain_callback_calc_reward callback_calc_reward; dap_chain_callback_load_from_gdb callback_load_from_gdb; diff --git a/modules/consensus/esbocs/dap_chain_cs_esbocs.c b/modules/consensus/esbocs/dap_chain_cs_esbocs.c index 02cd42e366..237b60df38 100644 --- a/modules/consensus/esbocs/dap_chain_cs_esbocs.c +++ b/modules/consensus/esbocs/dap_chain_cs_esbocs.c @@ -79,6 +79,7 @@ static int s_callback_created(dap_chain_t *a_chain, dap_config_t *a_chain_net_cf static size_t s_callback_block_sign(dap_chain_cs_blocks_t *a_blocks, dap_chain_block_t **a_block_ptr, size_t a_block_size); static int s_callback_block_verify(dap_chain_cs_blocks_t *a_blocks, dap_chain_block_t *a_block, size_t a_block_size); static uint256_t s_callback_get_minimum_fee(dap_chain_t *a_chain); +static uint256_t s_callback_get_collectiong_level(dap_chain_t *a_chain); static dap_enc_key_t *s_callback_get_sign_key(dap_chain_t *a_chain); static void s_callback_set_min_validators_count(dap_chain_t *a_chain, uint16_t a_new_value); static void s_db_change_notifier(dap_store_obj_t *a_obj, void * a_arg); @@ -202,6 +203,7 @@ static int s_callback_new(dap_chain_t *a_chain, dap_config_t *a_chain_cfg) l_esbocs->chain = a_chain; a_chain->callback_set_min_validators_count = s_callback_set_min_validators_count; a_chain->callback_get_minimum_fee = s_callback_get_minimum_fee; + a_chain->callback_get_collectiong_level = s_callback_get_collectiong_level; a_chain->callback_get_signing_certificate = s_callback_get_sign_key; l_esbocs->_pvt = DAP_NEW_Z(dap_chain_esbocs_pvt_t); @@ -309,8 +311,7 @@ static void s_check_db_collect_callback(dap_global_db_instance_t UNUSED_ARG *a_d } log_it(L_NOTICE, "The block %s was successfully added to autocollect %s list", a_key, l_fee_collect ? "fee" : "reward"); assert(a_value_size == sizeof(uint256_t)); - dap_chain_esbocs_session_t *l_session = a_arg; - dap_chain_esbocs_pvt_t *l_esbocs_pvt = PVT(l_session->esbocs); + dap_chain_esbocs_block_collect_t *l_block_collect_params = a_arg; bool l_level_reached = false; uint256_t l_value_total = uint256_0; size_t l_objs_count = 0; @@ -318,7 +319,7 @@ static void s_check_db_collect_callback(dap_global_db_instance_t UNUSED_ARG *a_d if (l_objs_count >= 10) { for (size_t i = 0; i < l_objs_count; i++) { SUM_256_256(l_value_total, *(uint256_t*)l_objs[i].value, &l_value_total); - if (compare256(l_value_total, l_esbocs_pvt->collecting_level) >= 0) { + if (compare256(l_value_total, l_block_collect_params->collecting_level) >= 0) { l_level_reached = true; break; } @@ -331,13 +332,13 @@ static void s_check_db_collect_callback(dap_global_db_instance_t UNUSED_ARG *a_d dap_chain_hash_fast_from_hex_str(l_objs[i].key, &block_hash); l_block_list = dap_list_append(l_block_list, DAP_DUP(&block_hash)); } - dap_chain_cs_blocks_t *l_blocks = DAP_CHAIN_CS_BLOCKS(l_session->chain); + dap_chain_cs_blocks_t *l_blocks = DAP_CHAIN_CS_BLOCKS(l_block_collect_params->chain); char *l_tx_hash_str = l_fee_collect ? - dap_chain_mempool_tx_coll_fee_create(l_blocks, l_esbocs_pvt->blocks_sign_key, - l_esbocs_pvt->collecting_addr, l_block_list, l_esbocs_pvt->minimum_fee, "hex") + dap_chain_mempool_tx_coll_fee_create(l_blocks, l_block_collect_params->blocks_sign_key, + l_block_collect_params->collecting_addr, l_block_list, l_block_collect_params->minimum_fee, "hex") : - dap_chain_mempool_tx_reward_create(l_blocks, l_esbocs_pvt->blocks_sign_key, - l_esbocs_pvt->collecting_addr, l_block_list, l_esbocs_pvt->minimum_fee, "hex"); + dap_chain_mempool_tx_reward_create(l_blocks, l_block_collect_params->blocks_sign_key, + l_block_collect_params->collecting_addr, l_block_list, l_block_collect_params->minimum_fee, "hex"); if (l_tx_hash_str) { log_it(L_NOTICE, "%s collect transaction successfully created, hash = %s", l_fee_collect ? "Fee" : "Reward", l_tx_hash_str); @@ -346,60 +347,95 @@ static void s_check_db_collect_callback(dap_global_db_instance_t UNUSED_ARG *a_d log_it(L_ERROR, "%s collect transaction creation error", l_fee_collect ? "Fee" : "Reward"); dap_global_db_del_sync(a_group, NULL); } + DAP_DELETE(l_block_collect_params); dap_global_db_objs_delete(l_objs, l_objs_count); } -static void s_new_atom_notifier(void *a_arg, dap_chain_t *a_chain, dap_chain_cell_id_t a_id, - void *a_atom, size_t a_atom_size) +void dap_chain_esbocs_add_block_collect(dap_chain_block_t *a_block_ptr, size_t a_block_size, + dap_chain_esbocs_block_collect_t *a_block_collect_params,int a_type) { - dap_chain_esbocs_session_t *l_session = a_arg; - assert(l_session->chain == a_chain); - pthread_mutex_lock(&l_session->mutex); - dap_chain_hash_fast_t l_last_block_hash; - dap_chain_get_atom_last_hash(l_session->chain, a_id, &l_last_block_hash); - if (!dap_hash_fast_compare(&l_last_block_hash, &l_session->cur_round.last_block_hash)) - s_session_round_new(l_session); - pthread_mutex_unlock(&l_session->mutex); - if (!PVT(l_session->esbocs)->collecting_addr) - return; - dap_sign_t *l_sign = dap_chain_block_sign_get(a_atom, a_atom_size, 0); - if (dap_pkey_match_sign(PVT(l_session->esbocs)->block_sign_pkey, l_sign)) { - dap_chain_cs_blocks_t *l_blocks = DAP_CHAIN_CS_BLOCKS(a_chain); + dap_hash_fast_t l_last_block_hash; + dap_chain_get_atom_last_hash(a_block_collect_params->chain, &l_last_block_hash,a_block_collect_params->cell_id); + dap_chain_t *l_chain = a_block_collect_params->chain; + dap_sign_t *l_sign = dap_chain_block_sign_get(a_block_ptr, a_block_size, 0); + if (dap_pkey_match_sign(a_block_collect_params->block_sign_pkey, l_sign)&&(!a_type||a_type==1)) { + dap_chain_esbocs_block_collect_t *l_block_collect_params = DAP_NEW_Z(dap_chain_esbocs_block_collect_t); + l_block_collect_params->collecting_level = a_block_collect_params->collecting_level; + l_block_collect_params->minimum_fee = a_block_collect_params->minimum_fee; + l_block_collect_params->chain = a_block_collect_params->chain; + l_block_collect_params->blocks_sign_key = a_block_collect_params->blocks_sign_key; + l_block_collect_params->block_sign_pkey = a_block_collect_params->block_sign_pkey; + l_block_collect_params->collecting_addr = a_block_collect_params->collecting_addr; + + dap_chain_cs_blocks_t *l_blocks = DAP_CHAIN_CS_BLOCKS(l_chain); dap_chain_block_cache_t *l_block_cache = dap_chain_block_cache_get_by_hash(l_blocks, &l_last_block_hash); assert(l_block_cache); - dap_chain_net_t *l_net = dap_chain_net_by_id(a_chain->net_id); + dap_chain_net_t *l_net = dap_chain_net_by_id(l_chain->net_id); assert(l_net); uint256_t l_value_fee = uint256_0; dap_list_t *l_list_used_out = dap_chain_block_get_list_tx_cond_outs_with_val( l_net->pub.ledger, l_block_cache, &l_value_fee); if (!IS_ZERO_256(l_value_fee)) { - char *l_fee_group = dap_chain_cs_blocks_get_fee_group(a_chain->net_name); + char *l_fee_group = dap_chain_cs_blocks_get_fee_group(l_chain->net_name); dap_global_db_set(l_fee_group, l_block_cache->block_hash_str, &l_value_fee, sizeof(l_value_fee), - false, s_check_db_collect_callback, l_session); + false, s_check_db_collect_callback, l_block_collect_params); DAP_DELETE(l_fee_group); } dap_list_free_full(l_list_used_out, NULL); } - if (dap_chain_block_sign_match_pkey(a_atom, a_atom_size, PVT(l_session->esbocs)->block_sign_pkey)) { - dap_chain_cs_blocks_t *l_blocks = DAP_CHAIN_CS_BLOCKS(a_chain); + if (dap_chain_block_sign_match_pkey(a_block_ptr, a_block_size, a_block_collect_params->block_sign_pkey)&&(!a_type||a_type==2)) { + dap_chain_esbocs_block_collect_t *l_block_collect_params = DAP_NEW_Z(dap_chain_esbocs_block_collect_t); + l_block_collect_params->collecting_level = a_block_collect_params->collecting_level; + l_block_collect_params->minimum_fee = a_block_collect_params->minimum_fee; + l_block_collect_params->chain = a_block_collect_params->chain; + l_block_collect_params->blocks_sign_key = a_block_collect_params->blocks_sign_key; + l_block_collect_params->block_sign_pkey = a_block_collect_params->block_sign_pkey; + l_block_collect_params->collecting_addr = a_block_collect_params->collecting_addr; + + dap_chain_cs_blocks_t *l_blocks = DAP_CHAIN_CS_BLOCKS(l_chain); dap_chain_block_cache_t *l_block_cache = dap_chain_block_cache_get_by_hash(l_blocks, &l_last_block_hash); assert(l_block_cache); - dap_chain_net_t *l_net = dap_chain_net_by_id(a_chain->net_id); + dap_chain_net_t *l_net = dap_chain_net_by_id(l_chain->net_id); assert(l_net); if (!dap_ledger_is_used_reward(l_net->pub.ledger, &l_block_cache->block_hash, - &l_session->my_signing_addr.data.hash_fast)) { - uint256_t l_value_reward = a_chain->callback_calc_reward(a_chain, &l_block_cache->block_hash, - PVT(l_session->esbocs)->block_sign_pkey); + &l_block_collect_params->collecting_addr->data.hash_fast)) { + uint256_t l_value_reward = l_chain->callback_calc_reward(l_chain, &l_block_cache->block_hash, + l_block_collect_params->block_sign_pkey); if (!IS_ZERO_256(l_value_reward)) { - char *l_reward_group = dap_chain_cs_blocks_get_reward_group(a_chain->net_name); + char *l_reward_group = dap_chain_cs_blocks_get_reward_group(l_chain->net_name); dap_global_db_set(l_reward_group, l_block_cache->block_hash_str, &l_value_reward, sizeof(l_value_reward), - false, s_check_db_collect_callback, l_session); + false, s_check_db_collect_callback, l_block_collect_params); DAP_DELETE(l_reward_group); } } } } +static void s_new_atom_notifier(void *a_arg, dap_chain_t *a_chain, dap_chain_cell_id_t a_id, + void *a_atom, size_t a_atom_size) +{ + dap_chain_esbocs_session_t *l_session = a_arg; + assert(l_session->chain == a_chain); + pthread_mutex_lock(&l_session->mutex); + dap_chain_hash_fast_t l_last_block_hash; + dap_chain_get_atom_last_hash(l_session->chain, a_id, &l_last_block_hash); + if (!dap_hash_fast_compare(&l_last_block_hash, &l_session->cur_round.last_block_hash)) + s_session_round_new(l_session); + pthread_mutex_unlock(&l_session->mutex); + if (!PVT(l_session->esbocs)->collecting_addr) + return; + dap_chain_esbocs_block_collect_t l_block_collect_params = (dap_chain_esbocs_block_collect_t){ + .collecting_level = PVT(l_session->esbocs)->collecting_level, + .minimum_fee = PVT(l_session->esbocs)->minimum_fee, + .chain = a_chain, + .blocks_sign_key = PVT(l_session->esbocs)->blocks_sign_key, + .block_sign_pkey = PVT(l_session->esbocs)->block_sign_pkey, + .collecting_addr = PVT(l_session->esbocs)->collecting_addr, + .cell_id = a_id + }; + dap_chain_esbocs_add_block_collect(a_atom, a_atom_size, &l_block_collect_params,0); +} + bool dap_chain_esbocs_get_autocollect_status(dap_chain_net_id_t a_net_id) { dap_chain_esbocs_session_t *l_session; @@ -637,6 +673,15 @@ static uint256_t s_callback_get_minimum_fee(dap_chain_t *a_chain) return l_esbocs_pvt->minimum_fee; } +static uint256_t s_callback_get_collectiong_level(dap_chain_t *a_chain) +{ + dap_chain_cs_blocks_t *l_blocks = DAP_CHAIN_CS_BLOCKS(a_chain); + dap_chain_esbocs_t *l_esbocs = DAP_CHAIN_ESBOCS(l_blocks); + dap_chain_esbocs_pvt_t *l_esbocs_pvt = PVT(l_esbocs); + + return l_esbocs_pvt->collecting_level; +} + static dap_enc_key_t *s_callback_get_sign_key(dap_chain_t *a_chain) { dap_chain_cs_blocks_t *l_blocks = DAP_CHAIN_CS_BLOCKS(a_chain); diff --git a/modules/consensus/esbocs/include/dap_chain_cs_esbocs.h b/modules/consensus/esbocs/include/dap_chain_cs_esbocs.h index ab8eb9743b..a1e8c4e4dc 100644 --- a/modules/consensus/esbocs/include/dap_chain_cs_esbocs.h +++ b/modules/consensus/esbocs/include/dap_chain_cs_esbocs.h @@ -210,6 +210,16 @@ typedef struct dap_chain_esbocs_session { struct dap_chain_esbocs_session *prev, *next; } dap_chain_esbocs_session_t; +typedef struct dap_chain_esbocs_block_collect{ + uint256_t collecting_level; + uint256_t minimum_fee; + dap_chain_t *chain; + dap_enc_key_t * blocks_sign_key; + dap_pkey_t * block_sign_pkey; + dap_chain_addr_t * collecting_addr; + dap_chain_cell_id_t cell_id; +}dap_chain_esbocs_block_collect_t; + #define DAP_CHAIN_ESBOCS(a) ((dap_chain_esbocs_t *)(a)->_inheritor) int dap_chain_cs_esbocs_init(); @@ -221,5 +231,7 @@ void dap_chain_esbocs_start_timer(dap_chain_net_id_t a_net_id); dap_pkey_t *dap_chain_esbocs_get_sign_pkey(dap_chain_net_id_t a_net_id); uint256_t dap_chain_esbocs_get_fee(dap_chain_net_id_t a_net_id); bool dap_chain_esbocs_get_autocollect_status(dap_chain_net_id_t a_net_id); +void dap_chain_esbocs_add_block_collect(dap_chain_block_t *a_block_ptr, size_t a_block_size, + dap_chain_esbocs_block_collect_t *a_block_collect_params,int a_type); bool dap_chain_esbocs_add_validator_to_clusters(dap_chain_net_id_t a_net_id, dap_stream_node_addr_t *a_validator_addr); bool dap_chain_esbocs_remove_validator_from_clusters(dap_chain_net_id_t a_net_id, dap_stream_node_addr_t *a_validator_addr); diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c index 98ed880f12..142af2e219 100644 --- a/modules/type/blocks/dap_chain_cs_blocks.c +++ b/modules/type/blocks/dap_chain_cs_blocks.c @@ -202,7 +202,13 @@ int dap_chain_cs_blocks_init() "Rewards and fees autocollect status:\n" "block -net <net_name> -chain <chain_name> autocollect status\n" "\t\t Show rewards and fees automatic collecting status (enabled or not)." - " Show prepared blocks for collecting rewards and fees if status is enabled\n" + " Show prepared blocks for collecting rewards and fees if status is enabled\n\n" + + "Rewards and fees autocollect renew:\n" + "block -net <net_name> -chain <chain_name> autocollect renew\n" + " -cert <priv_cert_name> -addr <addr>\n" + "\t\t Update reward and fees block table." + " Automatic collection of commission in case of triggering of the setting\n\n" ); if( dap_chain_block_cache_init() ) { log_it(L_WARNING, "Can't init blocks cache"); @@ -1039,7 +1045,7 @@ static int s_cli_blocks(int a_argc, char ** a_argv, void **a_str_reply) return -21; } // NOTE: This call will modify source string - l_block_list = s_block_parse_str_list((char *)l_hash_str, &l_hashes_count, l_chain); + l_block_list = s_block_parse_str_list((char *)l_hash_str, &l_hashes_count, l_chain); if (!l_block_list || !l_hashes_count) { dap_cli_server_cmd_set_reply_text(a_str_reply, "Block fee collection requires at least one hash to create a transaction"); @@ -1062,15 +1068,126 @@ static int s_cli_blocks(int a_argc, char ** a_argv, void **a_str_reply) }break; case SUBCMD_AUTOCOLLECT: { - if (dap_cli_server_cmd_check_option(a_argv, arg_index, a_argc, "status") == -1) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'block autocollect' requires subcommand 'status'"); - return -14; - } - dap_string_t *l_reply_str = dap_string_new(""); - s_print_autocollect_table(l_net, l_reply_str, "Fees"); - s_print_autocollect_table(l_net, l_reply_str, "Rewards"); - dap_cli_server_cmd_set_reply_text(a_str_reply, "%s", l_reply_str->str); - dap_string_free(l_reply_str, true); + const char * l_cert_name = NULL, * l_addr_str = NULL; + dap_pkey_t * l_pub_key = NULL; + dap_hash_fast_t l_pkey_hash = {}; + dap_chain_addr_t *l_addr = NULL; + size_t l_block_count = 0; + int fl_renew = dap_cli_server_cmd_check_option(a_argv, arg_index,a_argc, "renew"); + if(fl_renew != -1) + { + dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-cert", &l_cert_name); + dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-addr", &l_addr_str); + l_addr = dap_chain_addr_from_str(l_addr_str); + if(!l_cert_name) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'block autocollect renew' requires parameter '-cert'", l_subcmd_str); + return -20; + } + if (!l_addr_str) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'block autocollect renew' requires parameter '-addr'", l_addr_str); + return -20; + } + dap_cert_t *l_cert = dap_cert_find_by_name(l_cert_name); + if (!l_cert) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't find \"%s\" certificate", l_cert_name); + return -20; + } + l_pub_key = dap_pkey_from_enc_key(l_cert->enc_key); + if (!l_pub_key) { + dap_cli_server_cmd_set_reply_text(a_str_reply, + "Corrupted certificate \"%s\" have no public key data", l_cert_name); + return -20; + } + dap_chain_esbocs_block_collect_t l_block_collect_params = (dap_chain_esbocs_block_collect_t){ + .collecting_level = l_chain->callback_get_collectiong_level, + .minimum_fee = l_chain->callback_get_minimum_fee, + .chain = l_chain, + .blocks_sign_key = l_cert->enc_key, + .block_sign_pkey = l_pub_key, + .collecting_addr = l_addr + }; + //Cleare gdb + size_t l_objs_fee_count = 0; + size_t l_objs_rew_count = 0; + char *l_group_fee = dap_chain_cs_blocks_get_fee_group(l_net->pub.name); + char *l_group_rew = dap_chain_cs_blocks_get_reward_group(l_net->pub.name); + dap_global_db_obj_t *l_objs_fee = dap_global_db_get_all_sync(l_group_fee, &l_objs_fee_count); + dap_global_db_obj_t *l_objs_rew = dap_global_db_get_all_sync(l_group_rew, &l_objs_rew_count); + if(l_objs_fee_count)dap_global_db_objs_delete(l_objs_fee,l_objs_fee_count); + if(l_objs_rew_count)dap_global_db_objs_delete(l_objs_rew,l_objs_rew_count); + DAP_DELETE(l_group_fee); + DAP_DELETE(l_group_rew); + dap_string_t *l_str_tmp = dap_string_new(NULL); + + for (dap_chain_block_cache_t *l_block_cache = PVT(l_blocks)->blocks; l_block_cache; l_block_cache = l_block_cache->hh.next) { + dap_time_t l_ts = l_block_cache->block->hdr.ts_created; + dap_sign_t *l_sign = dap_chain_block_sign_get(l_block_cache->block, l_block_cache->block_size, 0); + if (!l_pub_key) { + dap_hash_fast_t l_sign_pkey_hash; + dap_sign_get_pkey_hash(l_sign, &l_sign_pkey_hash); + if (!dap_hash_fast_compare(&l_pkey_hash, &l_sign_pkey_hash)) + continue; + } else if (!dap_pkey_compare_with_sign(l_pub_key, l_sign)) + continue; + for (size_t i = 0; i < l_block_cache->datum_count; i++) { + if (l_block_cache->datum[i]->header.type_id != DAP_CHAIN_DATUM_TX) + continue; + dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t *)l_block_cache->datum[i]->data; + int l_out_idx_tmp = 0; + if (NULL == dap_chain_datum_tx_out_cond_get(l_tx, DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE, &l_out_idx_tmp)) + continue; + if (!dap_ledger_tx_hash_is_used_out_item(l_net->pub.ledger, l_block_cache->datum_hash + i, l_out_idx_tmp, NULL)) { + dap_chain_esbocs_add_block_collect(l_block_cache->block, l_block_cache->block_size, &l_block_collect_params,1); + char l_buf[50]; + dap_time_to_str_rfc822(l_buf, 50, l_ts); + dap_string_append_printf(l_str_tmp, "fee - \t%s: ts_create=%s\n", l_block_cache->block_hash_str, l_buf); + l_block_count++; + break; + } + } + if (l_ts < DAP_REWARD_INIT_TIMESTAMP) + continue; + + if (!l_pub_key) { + bool l_found = false; + for (size_t i = 0; i < l_block_cache->sign_count ; i++) { + dap_sign_t *l_sign = dap_chain_block_sign_get(l_block_cache->block, l_block_cache->block_size, i); + dap_hash_fast_t l_sign_pkey_hash; + dap_sign_get_pkey_hash(l_sign, &l_sign_pkey_hash); + if (dap_hash_fast_compare(&l_pkey_hash, &l_sign_pkey_hash)) { + l_found = true; + break; + } + } + if(!l_found) + continue; + } else if (!dap_chain_block_sign_match_pkey(l_block_cache->block, l_block_cache->block_size, l_pub_key)) + continue; + if (dap_ledger_is_used_reward(l_net->pub.ledger, &l_block_cache->block_hash, &l_pkey_hash)) + continue; + dap_chain_esbocs_add_block_collect(l_block_cache->block, l_block_cache->block_size, &l_block_collect_params,2); + { + char l_buf[50]; + dap_time_to_str_rfc822(l_buf, 50, l_ts); + dap_string_append_printf(l_str_tmp, "rewards - \t%s: ts_create=%s\n", l_block_cache->block_hash_str, l_buf); + l_block_count++; + } + } + dap_string_append_printf(l_str_tmp, "%s.%s: Have %"DAP_UINT64_FORMAT_U" blocks\n", + l_net->pub.name, l_chain->name, l_block_count); + dap_cli_server_cmd_set_reply_text(a_str_reply, "%s", l_str_tmp->str); + dap_string_free(l_str_tmp, true); + }else{ + if (dap_cli_server_cmd_check_option(a_argv, arg_index, a_argc, "status") == -1) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'block autocollect' requires subcommand 'status'"); + return -14; + } + dap_string_t *l_reply_str = dap_string_new(""); + s_print_autocollect_table(l_net, l_reply_str, "Fees"); + s_print_autocollect_table(l_net, l_reply_str, "Rewards"); + dap_cli_server_cmd_set_reply_text(a_str_reply, "%s", l_reply_str->str); + dap_string_free(l_reply_str, true); + } } break; case SUBCMD_UNDEFINED: -- GitLab