diff --git a/modules/consensus/block-poa/dap_chain_cs_block_poa.c b/modules/consensus/block-poa/dap_chain_cs_block_poa.c index c44f4c93034320d726373daa89e1a500bcdf05a0..f77f7395b21357b9a8a35c093d1119ad4648ca50 100644 --- a/modules/consensus/block-poa/dap_chain_cs_block_poa.c +++ b/modules/consensus/block-poa/dap_chain_cs_block_poa.c @@ -22,6 +22,7 @@ along with any DAP SDK based project. If not, see <http://www.gnu.org/licenses/>. */ +#include "dap_chain_net.h" #include "dap_common.h" #include "dap_strfuncs.h" #include "dap_enc_base58.h" @@ -32,7 +33,6 @@ #include "dap_chain_block_cache.h" #include "dap_chain_cs_blocks.h" #include "dap_chain_cs_block_poa.h" -#include "dap_chain_net.h" #include "dap_chain_node_cli.h" #include "dap_chain_node_cli_cmd.h" #include "dap_chain_global_db.h" diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index 7f162283f3d75df03394617c1a256a4d5bc943f2..f88a0e90499f55b5bc0e5629b333182a77ba6ed0 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -263,6 +263,8 @@ static dap_global_db_obj_callback_notify_t s_srv_callback_notify = NULL; */ int dap_chain_net_init() { + dap_stream_ch_chain_init(); + dap_stream_ch_chain_net_init(); dap_chain_node_client_init(); dap_chain_node_cli_cmd_item_create ("net", s_cli_net, "Network commands", "net list [chains -n <chain net name>]" diff --git a/modules/net/dap_chain_node.c b/modules/net/dap_chain_node.c index c4f73594b6b4d1e1a59d7f398fb2c398b29eab27..99f969470903e36c9082db9d739f9b10dfd89f74 100644 --- a/modules/net/dap_chain_node.c +++ b/modules/net/dap_chain_node.c @@ -225,7 +225,7 @@ dap_chain_node_info_t* dap_chain_node_info_read( dap_chain_net_t * a_net,dap_cha return node_info; }*/ -bool dap_chain_node_mempool_process(dap_chain_t *a_chain, dap_chain_node_role_t a_role, dap_chain_datum_t *a_datum) +int dap_chain_node_mempool_process(dap_chain_t *a_chain, dap_chain_node_role_t a_role, dap_chain_datum_t *a_datum) { bool l_need_process = false; for (uint16_t j = 0; j < a_chain->autoproc_datum_types_count; j++) { @@ -235,24 +235,20 @@ bool dap_chain_node_mempool_process(dap_chain_t *a_chain, dap_chain_node_role_t } } if (!l_need_process) - return false; + return -1; if (a_datum->header.type_id == DAP_CHAIN_DATUM_TX) { dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t *)a_datum->data; dap_chain_tx_in_t *l_tx_in = (dap_chain_tx_in_t *)dap_chain_datum_tx_item_get(l_tx, NULL, TX_ITEM_TYPE_IN, NULL); // Is not it a base transaction? if (l_tx_in && !dap_hash_fast_is_blank(&l_tx_in->header.tx_prev_hash)) { if (a_role.enums == NODE_ROLE_ROOT) { - return false; + return -1; } } } - if (a_chain->callback_add_datums(a_chain, &a_datum, 1) != 1) { - return false; - } - return true; + return (int)a_chain->callback_add_datums(a_chain, &a_datum, 1); } -static bool s_mempool_auto = false; /** * @brief @@ -263,7 +259,7 @@ static bool s_mempool_auto = false; bool dap_chain_node_mempool_autoproc_init() { uint16_t l_net_count; - bool l_mempool_auto_default = false; + bool l_mempool_auto_default = false, l_ret = false; dap_chain_net_t **l_net_list = dap_chain_net_list(&l_net_count); for (uint16_t i = 0; i < l_net_count; i++) { dap_chain_node_role_t l_role = dap_chain_net_get_role(l_net_list[i]); @@ -276,10 +272,12 @@ bool dap_chain_node_mempool_autoproc_init() l_mempool_auto_default = true; break; default: + l_mempool_auto_default = false; break; } - s_mempool_auto = dap_config_get_item_bool_default(g_config, "mempool", "auto_proc", l_mempool_auto_default); - if (s_mempool_auto) { + l_net_list[i]->pub.mempool_autoproc = dap_config_get_item_bool_default(g_config, "mempool", "auto_proc", l_mempool_auto_default); + if (l_net_list[i]->pub.mempool_autoproc) { + l_ret = true; dap_chain_t *l_chain; DL_FOREACH(l_net_list[i]->pub.chains, l_chain) { if (!l_chain) { @@ -291,12 +289,13 @@ bool dap_chain_node_mempool_autoproc_init() dap_global_db_obj_t *l_objs = dap_chain_global_db_gr_load(l_gdb_group_mempool, &l_objs_size); if (l_objs_size) { for (size_t i = 0; i < l_objs_size; i++) { - // Delete processed objects - dap_chain_global_db_gr_del(dap_strdup(l_objs[i].key), l_gdb_group_mempool); if (!l_objs[i].value_len) continue; dap_chain_datum_t *l_datum = (dap_chain_datum_t *)l_objs[i].value; - dap_chain_node_mempool_process(l_chain, l_role, l_datum); + if (dap_chain_node_mempool_process(l_chain, l_role, l_datum) >= 0) { + // Delete processed objects + dap_chain_global_db_gr_del(dap_strdup(l_objs[i].key), l_gdb_group_mempool); + } } dap_chain_global_db_objs_delete(l_objs, l_objs_size); } @@ -305,7 +304,7 @@ bool dap_chain_node_mempool_autoproc_init() } } DAP_DELETE(l_net_list); - return s_mempool_auto; + return l_ret; } /** @@ -313,17 +312,18 @@ bool dap_chain_node_mempool_autoproc_init() */ void dap_chain_node_mempool_autoproc_deinit() { - s_mempool_auto = false; } void dap_chain_node_mempool_autoproc_notify(void *a_arg, const char a_op_code, const char *a_group, const char *a_key, const void *a_value, const size_t a_value_len) { UNUSED(a_value_len); - if (!a_arg || !a_value || !s_mempool_auto || a_op_code != 'a') { + if (!a_arg || !a_value || a_op_code != 'a') { return; } dap_chain_net_t *l_net = (dap_chain_net_t *)a_arg; + if (!l_net->pub.mempool_autoproc) + return; dap_chain_t *l_chain; DL_FOREACH(l_net->pub.chains, l_chain) { if (!l_chain) { @@ -333,7 +333,7 @@ void dap_chain_node_mempool_autoproc_notify(void *a_arg, const char a_op_code, c if (!strcmp(a_group, l_gdb_group_str)) { dap_chain_datum_t *l_datum = (dap_chain_datum_t *)a_value; dap_chain_node_role_t l_role = dap_chain_net_get_role(l_net); - if (dap_chain_node_mempool_process(l_chain, l_role, l_datum)) { + if (dap_chain_node_mempool_process(l_chain, l_role, l_datum) >= 0) { dap_chain_global_db_gr_del(dap_strdup(a_key), l_gdb_group_str); } } diff --git a/modules/net/include/dap_chain_net.h b/modules/net/include/dap_chain_net.h index e7e40be7532b8207727a0bd53802a41410b9b4cc..7579cbdb979ee6e7608285806811289447d3944c 100644 --- a/modules/net/include/dap_chain_net.h +++ b/modules/net/include/dap_chain_net.h @@ -75,6 +75,7 @@ typedef struct dap_chain_net{ // checks bool token_emission_signs_verify; + bool mempool_autoproc; dap_chain_t * chains; // double-linked list of chains dap_chain_t * default_chain; diff --git a/modules/net/include/dap_chain_node.h b/modules/net/include/dap_chain_node.h index 216d6a4261c130a77397d44fc5eecd8cc75856af..6b6a810667a10eec933d95262cdc46dcc79d23a4 100644 --- a/modules/net/include/dap_chain_node.h +++ b/modules/net/include/dap_chain_node.h @@ -144,7 +144,7 @@ inline static char* dap_chain_node_addr_to_hash_str(dap_chain_node_addr_t *addre return a_key; } -bool dap_chain_node_mempool_process(dap_chain_t *a_chain, dap_chain_node_role_t a_role, dap_chain_datum_t *a_datum); +int dap_chain_node_mempool_process(dap_chain_t *a_chain, dap_chain_node_role_t a_role, dap_chain_datum_t *a_datum); bool dap_chain_node_mempool_autoproc_init(); void dap_chain_node_mempool_autoproc_deinit(); void dap_chain_node_mempool_autoproc_notify(void *a_arg, const char a_op_code, const char *a_group, diff --git a/modules/type/blocks/dap_chain_block.c b/modules/type/blocks/dap_chain_block.c index 4bc564e15eb26fe7d0e5691dfaf8902ae829b98a..cd45d3bf89248d2d0d6564934a813a668b4dfcd9 100644 --- a/modules/type/blocks/dap_chain_block.c +++ b/modules/type/blocks/dap_chain_block.c @@ -22,10 +22,10 @@ */ #include <stddef.h> #include "string.h" +#include "dap_chain_net.h" #include "dap_common.h" #include "dap_config.h" #include "dap_hash.h" -#include "dap_chain_net.h" #include "dap_chain_block.h" #include "dap_chain_block_cache.h"