diff --git a/modules/chain/dap_chain_cell.c b/modules/chain/dap_chain_cell.c index 22b9da768090a6afea53981fa20fb1ecadaf2f26..5df2bb4331c452557430d6fa950bcb1300380387 100644 --- a/modules/chain/dap_chain_cell.c +++ b/modules/chain/dap_chain_cell.c @@ -233,18 +233,17 @@ int dap_chain_cell_load(dap_chain_t *a_chain, dap_chain_cell_t *a_cell) break; } l_read = fread((void *)l_element, 1, l_el_size, l_cell_file); - if (l_read == l_el_size) { - dap_chain_atom_verify_res_t l_res = a_chain->callback_atom_add(a_chain, l_element, l_el_size); // !!! blocking GDB call !!! - if (l_res == ATOM_PASS || l_res == ATOM_REJECT) { - DAP_DELETE(l_element); - } - ++q; - } else { + if (l_read != l_el_size) { log_it(L_ERROR, "Read only %lu of %zu bytes, stop cell loading", l_read, l_el_size); DAP_DELETE(l_element); l_ret = -6; break; } + dap_chain_atom_verify_res_t l_res = a_chain->callback_atom_add(a_chain, l_element, l_el_size); // !!! blocking GDB call !!! + if (l_res == ATOM_PASS || l_res == ATOM_REJECT) { + DAP_DELETE(l_element); + } + ++q; } if (l_ret < 0) { log_it(L_INFO, "Couldn't load all atoms, %lu only", q); diff --git a/modules/consensus/esbocs/dap_chain_cs_esbocs.c b/modules/consensus/esbocs/dap_chain_cs_esbocs.c index 507d328cfa1ae2f8c98e31f134fa4b85b4dbe03d..29e2abf30762dc2d425c9ba1117cc9fd63529c65 100644 --- a/modules/consensus/esbocs/dap_chain_cs_esbocs.c +++ b/modules/consensus/esbocs/dap_chain_cs_esbocs.c @@ -120,18 +120,6 @@ DAP_STATIC_INLINE char *s_get_penalty_group(dap_chain_net_id_t a_net_id) return dap_strdup_printf(DAP_CHAIN_ESBOCS_GDB_GROUPS_PREFIX".%s.penalty", l_net->pub.gdb_groups_prefix); } -DAP_STATIC_INLINE char *s_get_fee_group(dap_chain_net_id_t a_net_id) -{ - dap_chain_net_t *l_net = dap_chain_net_by_id(a_net_id); - return dap_strdup_printf("local." DAP_CHAIN_ESBOCS_GDB_GROUPS_PREFIX ".%s.penalty", l_net->pub.gdb_groups_prefix); -} - -DAP_STATIC_INLINE char *s_get_reward_group(dap_chain_net_id_t a_net_id) -{ - dap_chain_net_t *l_net = dap_chain_net_by_id(a_net_id); - return dap_strdup_printf("local." DAP_CHAIN_ESBOCS_GDB_GROUPS_PREFIX ".%s.penalty", l_net->pub.gdb_groups_prefix); -} - DAP_STATIC_INLINE size_t s_get_esbocs_message_size(dap_chain_esbocs_message_t *a_message) { return sizeof(*a_message) + a_message->hdr.sign_size + a_message->hdr.message_size; @@ -384,7 +372,7 @@ static void s_new_atom_notifier(void *a_arg, dap_chain_t *a_chain, dap_chain_cel 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 = s_get_fee_group(a_chain->net_id); + char *l_fee_group = dap_chain_cs_blocks_get_fee_group(a_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); DAP_DELETE(l_fee_group); @@ -402,7 +390,7 @@ static void s_new_atom_notifier(void *a_arg, dap_chain_t *a_chain, dap_chain_cel uint256_t l_value_reward = a_chain->callback_calc_reward(a_chain, &l_block_cache->block_hash, PVT(l_session->esbocs)->block_sign_pkey); if (!IS_ZERO_256(l_value_reward)) { - char *l_reward_group = s_get_reward_group(a_chain->net_id); + char *l_reward_group = dap_chain_cs_blocks_get_reward_group(a_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); DAP_DELETE(l_reward_group); diff --git a/modules/net/dap_chain_ledger.c b/modules/net/dap_chain_ledger.c index 81942bfe71ab54b9f9125b19757667ff4dbab8d7..6478ed5be02713f5e5fafe1dce829a2164bacbfc 100644 --- a/modules/net/dap_chain_ledger.c +++ b/modules/net/dap_chain_ledger.c @@ -319,7 +319,6 @@ typedef struct dap_ledger_private { dap_list_t *bridged_tx_notifiers; dap_list_t *tx_add_notifiers; - bool load_mode; dap_ledger_cache_tx_check_callback_t cache_tx_check_callback; // TPS section dap_timerfd_t *tps_timer; @@ -436,11 +435,6 @@ void dap_ledger_handle_free(dap_ledger_t *a_ledger) } -void dap_ledger_load_end(dap_ledger_t *a_ledger) -{ - PVT(a_ledger)->load_mode = false; -} - struct json_object *wallet_info_json_collect(dap_ledger_t *a_ledger, dap_ledger_wallet_balance_t *a_bal) { struct json_object *l_json = json_object_new_object(); json_object_object_add(l_json, "class", json_object_new_string("Wallet")); @@ -1812,7 +1806,7 @@ int dap_ledger_token_load(dap_ledger_t *a_ledger, byte_t *a_token, size_t a_toke { dap_chain_datum_token_t *l_token = dap_chain_datum_token_read(a_token, &a_token_size); - if (PVT(a_ledger)->load_mode) { + if (dap_chain_net_get_load_mode(a_ledger->net)) { dap_ledger_token_item_t *l_token_item = s_ledger_find_token(a_ledger, l_token->ticker); if (l_token_item && l_token->type != DAP_CHAIN_DATUM_TOKEN_TYPE_UPDATE @@ -2948,7 +2942,7 @@ dap_ledger_stake_lock_item_t *s_emissions_for_stake_lock_item_find(dap_ledger_t int dap_ledger_token_emission_load(dap_ledger_t *a_ledger, byte_t *a_token_emission, size_t a_token_emission_size, dap_hash_fast_t *a_token_emission_hash) { - if (PVT(a_ledger)->load_mode) { + if (dap_chain_net_get_load_mode(a_ledger->net)) { dap_ledger_token_emission_item_t *l_token_emission_item; dap_ledger_token_item_t *l_token_item, *l_item_tmp; pthread_rwlock_rdlock(&PVT(a_ledger)->tokens_rwlock); @@ -3415,7 +3409,7 @@ int dap_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx log_it(L_DEBUG, "NULL transaction, check broken"); return DAP_LEDGER_TX_CHECK_NULL_TX; } - if (!PVT(a_ledger)->load_mode && !a_from_threshold) { + if (!dap_chain_net_get_load_mode(a_ledger->net) && !a_from_threshold) { dap_ledger_tx_item_t *l_ledger_item; pthread_rwlock_rdlock(&PVT(a_ledger)->ledger_rwlock); HASH_FIND(hh, PVT(a_ledger)->ledger_items, a_tx_hash, sizeof(dap_chain_hash_fast_t), l_ledger_item); @@ -3753,6 +3747,7 @@ int dap_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx l_tx_prev_hash = &l_tx_in->header.tx_prev_hash; if (dap_hash_fast_is_blank(l_tx_prev_hash)) { DAP_DELETE(l_bound_item); + l_list_bound_items = dap_list_remove_link(l_list_bound_items, dap_list_last(l_list_bound_items)); continue; // old base tx compliance } l_tx_prev_out_idx = l_tx_in->header.tx_out_prev_idx; @@ -4681,7 +4676,7 @@ static bool s_ledger_tps_callback(void *a_arg) int dap_ledger_tx_load(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_chain_hash_fast_t *a_tx_hash) { - if (PVT(a_ledger)->load_mode) { + if (dap_chain_net_get_load_mode(a_ledger->net)) { if (PVT(a_ledger)->cache_tx_check_callback) PVT(a_ledger)->cache_tx_check_callback(a_tx_hash); dap_ledger_tx_item_t *l_tx_item; @@ -4694,10 +4689,9 @@ int dap_ledger_tx_load(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_c return DAP_LEDGER_TX_ALREADY_CACHED; } HASH_FIND_BYHASHVALUE(hh, PVT(a_ledger)->threshold_txs, a_tx_hash, sizeof(dap_chain_hash_fast_t), l_hash_value, l_tx_item); - if (l_tx_item) { - pthread_rwlock_unlock(&PVT(a_ledger)->ledger_rwlock); + pthread_rwlock_unlock(&PVT(a_ledger)->ledger_rwlock); + if (l_tx_item) return DAP_CHAIN_CS_VERIFY_CODE_TX_NO_PREVIOUS; - } } return dap_ledger_tx_add(a_ledger, a_tx, a_tx_hash, false); } diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index ebeddd4c23de0f732de47dd8ae4ee5ae25c2c315..4574f24bb453d70352ed06d550db2394771f7c6a 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -2454,8 +2454,6 @@ int s_net_load(dap_chain_net_t *a_net) } l_net_pvt->load_mode = false; - if (l_net->pub.ledger) - dap_ledger_load_end(l_net->pub.ledger); l_net_pvt->balancer_http = !dap_config_get_item_bool_default(l_cfg, "general", "use_dns_links", false); diff --git a/modules/net/include/dap_chain_ledger.h b/modules/net/include/dap_chain_ledger.h index 2f1d084ca93978302bdd20984f96257043caf2f3..e3639fbc66b38715895835c94d85bc8c1f1629ae 100644 --- a/modules/net/include/dap_chain_ledger.h +++ b/modules/net/include/dap_chain_ledger.h @@ -269,11 +269,6 @@ int dap_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx */ void dap_ledger_purge(dap_ledger_t *a_ledger, bool a_preserve_db); -/** - * End of load mode with no chackes for incoming datums - */ -void dap_ledger_load_end(dap_ledger_t *a_ledger); - /** * Return number transactions from the cache */ diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c index c4a1e1696455fa394f7bdf2459d1b1422552f4a3..99a453e40597f4007d470b9481a9c3c5b0eabdf6 100644 --- a/modules/type/blocks/dap_chain_cs_blocks.c +++ b/modules/type/blocks/dap_chain_cs_blocks.c @@ -196,6 +196,9 @@ int dap_chain_cs_blocks_init() "block -net <net_name> -chain <chain_name> reward collect" " -cert <priv_cert_name> -addr <addr> -hashes <hashes_list> -fee <value>\n" "\t\t Take reward\n\n" + + "Rewards and comission autocollect status:\n" + "block -net <net_name> -chain <chain_name> autocollect status\n\n" ); if( dap_chain_block_cache_init() ) { log_it(L_WARNING, "Can't init blocks cache"); @@ -440,6 +443,30 @@ static void s_cli_meta_hex_print( dap_string_t * a_str_tmp, const char * a_meta DAP_DELETE(l_data_hex); } +static void s_print_autocollect_table(dap_chain_net_t *a_net, dap_string_t *a_reply_str, const char *a_table_name) +{ + dap_string_append_printf(a_reply_str, "\n=== %s ===\n", a_table_name); + size_t l_objs_count = 0; + char *l_group = dap_strcmp(a_table_name, "Fees") ? dap_chain_cs_blocks_get_reward_group(a_net->pub.name) + : dap_chain_cs_blocks_get_fee_group(a_net->pub.name); + dap_global_db_obj_t *l_objs = dap_global_db_get_all_sync(l_group, &l_objs_count); + DAP_DELETE(l_group); + uint256_t l_total_value = uint256_0; + for (size_t i = 0; i < l_objs_count; i++) { + dap_global_db_obj_t *l_obj_cur = l_objs + i; + char *l_value_str = dap_chain_balance_to_coins(*(uint256_t *)l_obj_cur->value); + dap_string_append_printf(a_reply_str, "%s\t%s\n", l_obj_cur->key, l_value_str); + DAP_DEL_Z(l_value_str); + } + if (l_objs_count) { + dap_global_db_objs_delete(l_objs, l_objs_count); + char *l_total_str = dap_chain_balance_to_coins(l_total_value); + dap_string_append_printf(a_reply_str, "Total prepared value: %s %s\n", l_total_str, a_net->pub.native_ticker); + DAP_DEL_Z(l_total_str); + } else + dap_string_append(a_reply_str, "Empty\n"); +} + /** * @brief s_cli_blocks * @param argc @@ -461,7 +488,8 @@ static int s_cli_blocks(int a_argc, char ** a_argv, char **a_str_reply) SUBCMD_LIST, SUBCMD_FEE, SUBCMD_DROP, - SUBCMD_REWARD + SUBCMD_REWARD, + SUBCMD_AUTOCOLLECT, } l_subcmd={0}; const char* l_subcmd_strs[]={ @@ -475,6 +503,7 @@ static int s_cli_blocks(int a_argc, char ** a_argv, char **a_str_reply) [SUBCMD_FEE]="fee", [SUBCMD_DROP]="drop", [SUBCMD_REWARD] = "reward", + [SUBCMD_AUTOCOLLECT] = "autocollect", [SUBCMD_UNDEFINED]=NULL }; const size_t l_subcmd_str_count=sizeof(l_subcmd_strs)/sizeof(*l_subcmd_strs); @@ -978,8 +1007,20 @@ static int s_cli_blocks(int a_argc, char ** a_argv, char **a_str_reply) dap_list_free_full(l_block_list, NULL); }break; - default: - case SUBCMD_UNDEFINED: { + case SUBCMD_AUTOCOLLECT: { + if (dap_cli_server_cmd_check_option(a_argv, arg_index, a_argc, "status") >= 0) { + 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("Autocollect tables content for:\n"); + 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: + default: { dap_cli_server_cmd_set_reply_text(a_str_reply, "Undefined block subcommand \"%s\" ", l_subcmd_str); diff --git a/modules/type/blocks/include/dap_chain_cs_blocks.h b/modules/type/blocks/include/dap_chain_cs_blocks.h index f771a659d55d6cf77c23280dff2b4970a4d42bea..9a26538756d4d259dabb9a3a2ef3f979e8730f0a 100644 --- a/modules/type/blocks/include/dap_chain_cs_blocks.h +++ b/modules/type/blocks/include/dap_chain_cs_blocks.h @@ -68,3 +68,13 @@ typedef int (*dap_chain_blocks_block_callback_ptr_t)(dap_chain_cs_blocks_t *, da int dap_chain_cs_blocks_init(); void dap_chain_cs_blocks_deinit(); dap_chain_block_cache_t *dap_chain_block_cache_get_by_hash(dap_chain_cs_blocks_t *a_blocks, dap_chain_hash_fast_t *a_block_hash); + +DAP_STATIC_INLINE char *dap_chain_cs_blocks_get_fee_group(const char *a_net_name) +{ + return dap_strdup_printf("local.%s.fees", a_net_name); +} + +DAP_STATIC_INLINE char *dap_chain_cs_blocks_get_reward_group(const char *a_net_name) +{ + return dap_strdup_printf("local.%s.rewards", a_net_name); +}