diff --git a/modules/chain/include/dap_chain.h b/modules/chain/include/dap_chain.h index 8fbfd403e882c9a78dd8cc58848d385ce1770f62..264b68bb25cf30ce73c6a39d2b5d93d2cf58344b 100644 --- a/modules/chain/include/dap_chain.h +++ b/modules/chain/include/dap_chain.h @@ -99,6 +99,8 @@ typedef dap_list_t *(*dap_chain_callback_get_poa_certs)(dap_chain_t *a_chain, si typedef void (*dap_chain_callback_set_min_validators_count)(dap_chain_t *a_chain, uint16_t a_new_value); +typedef bool (*dap_chain_callback_check_tx_fee)(dap_chain_t *a_chain, uint256_t fee_value); + typedef enum dap_chain_type { CHAIN_TYPE_FIRST, @@ -133,8 +135,6 @@ typedef struct dap_chain { uint16_t autoproc_datum_types_count; uint16_t *autoproc_datum_types; - uint256_t minimum_commission; - // To hold it in double-linked lists struct dap_chain * next; struct dap_chain * prev; @@ -177,6 +177,8 @@ 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_check_tx_fee callback_check_tx_fee; + dap_list_t * atom_notifiers; // dap_chain_callback_notify_t callback_notify; // void *callback_notify_arg; diff --git a/modules/common/dap_chain_datum_tx.c b/modules/common/dap_chain_datum_tx.c index dbf6de247a3dbd7cf70b399f7de01069b55272ab..7225f047fd46fa337df49c55c0a8187951f60292 100644 --- a/modules/common/dap_chain_datum_tx.c +++ b/modules/common/dap_chain_datum_tx.c @@ -158,6 +158,21 @@ int dap_chain_datum_tx_add_fee_item(dap_chain_datum_tx_t **a_tx, uint256_t a_val return -1; } +int dap_chain_datum_tx_get_fee_value (dap_chain_datum_tx_t *a_tx, uint256_t *a_value) +{ + dap_list_t *l_items_list = dap_chain_datum_tx_items_get(a_tx, TX_ITEM_TYPE_OUT_COND, NULL); + + for(dap_list_t *l_item=l_items_list; l_item; l_item=l_item->next){ + dap_chain_tx_out_cond_t *l_out_item = (dap_chain_tx_out_cond_t*)l_item->data; + if (l_out_item->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE){ + *a_value = l_out_item->header.value; + return 0; + } + } + + return -1; +} + /** * Create 'out' item and insert to transaction * diff --git a/modules/common/include/dap_chain_datum_tx.h b/modules/common/include/dap_chain_datum_tx.h index 4bf630486508a9984afa6d9bc99e611edd97e4a0..96290f8d01bba0dfebf15800a5f4d4a6a79e724c 100644 --- a/modules/common/include/dap_chain_datum_tx.h +++ b/modules/common/include/dap_chain_datum_tx.h @@ -137,3 +137,5 @@ int dap_chain_datum_tx_add_sign_item(dap_chain_datum_tx_t **a_tx, dap_enc_key_t int dap_chain_datum_tx_verify_sign(dap_chain_datum_tx_t *a_tx); json_object *dap_chain_datum_tx_to_json(dap_chain_datum_tx_t *a_tx); + +int dap_chain_datum_tx_get_fee_value (dap_chain_datum_tx_t *a_tx, uint256_t *a_value); diff --git a/modules/consensus/esbocs/dap_chain_cs_esbocs.c b/modules/consensus/esbocs/dap_chain_cs_esbocs.c index fd554d7a15e31e8d9baeaa5efb1b0647a137cc3b..715c4868a06c8853c50a2ed558e2b8c6472c3bc2 100644 --- a/modules/consensus/esbocs/dap_chain_cs_esbocs.c +++ b/modules/consensus/esbocs/dap_chain_cs_esbocs.c @@ -51,6 +51,7 @@ static void s_callback_delete(dap_chain_cs_blocks_t *a_blocks); static int s_callback_created(dap_chain_t *a_chain, dap_config_t *a_chain_net_cfg); 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 bool s_callback_check_tx_fee(dap_chain_t *a_chain, uint256_t l_fee); static void s_callback_set_min_validators_count(dap_chain_t *a_chain, uint16_t a_new_value); static int s_cli_esbocs(int argc, char ** argv, char **str_reply); @@ -88,6 +89,7 @@ typedef struct dap_chain_esbocs_pvt { uint16_t round_attempt_timeout; // PoA section dap_list_t *poa_validators; + uint256_t minimum_commission; } dap_chain_esbocs_pvt_t; #define PVT(a) ((dap_chain_esbocs_pvt_t *)a->_pvt) @@ -128,12 +130,15 @@ static int s_callback_new(dap_chain_t *a_chain, dap_config_t *a_chain_cfg) l_esbocs->_pvt = DAP_NEW_Z(dap_chain_esbocs_pvt_t); dap_chain_esbocs_pvt_t *l_esbocs_pvt = PVT(l_esbocs); + a_chain->callback_check_tx_fee = s_callback_check_tx_fee; + l_esbocs_pvt->debug = dap_config_get_item_bool_default(a_chain_cfg, "esbocs", "consensus_debug", false); l_esbocs_pvt->poa_mode = dap_config_get_item_bool_default(a_chain_cfg, "esbocs", "poa_mode", false); l_esbocs_pvt->round_start_sync_timeout = dap_config_get_item_uint16_default(a_chain_cfg, "esbocs", "round_start_sync_timeout", 15); l_esbocs_pvt->new_round_delay = dap_config_get_item_uint16_default(a_chain_cfg, "esbocs", "new_round_delay", 10); l_esbocs_pvt->round_attempts_max = dap_config_get_item_uint16_default(a_chain_cfg, "esbocs", "round_attempts_max", 4); l_esbocs_pvt->round_attempt_timeout = dap_config_get_item_uint16_default(a_chain_cfg, "esbocs", "round_attempt_timeout", 10); + l_esbocs_pvt->minimum_commission = dap_chain_coins_to_balance(dap_config_get_item_str_default(a_chain_cfg, "esbocs", "minimum_commission", "1.0")); int l_ret = 0; l_esbocs_pvt->min_validators_count = dap_config_get_item_uint16(a_chain_cfg, "esbocs", "min_validators_count"); @@ -277,6 +282,18 @@ static int s_callback_created(dap_chain_t *a_chain, dap_config_t *a_chain_net_cf return 0; } +static bool s_callback_check_tx_fee(dap_chain_t *a_chain, uint256_t l_fee) +{ + 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); + + if (compare256(l_fee, l_esbocs_pvt->minimum_commission) < 0) + return false; + + return true; +} + static void s_callback_delete(dap_chain_cs_blocks_t *a_blocks) { dap_chain_esbocs_t *l_esbocs = DAP_CHAIN_ESBOCS(a_blocks); diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index 024ef53ba54004773e4ab791b622fc6e80ddca39..9ee41eed88fb9f663ec5cb7f117eaa2fa6a1bd89 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -2532,8 +2532,7 @@ int s_net_load(const char * a_net_name, uint16_t a_acl_idx) l_chain = dap_chain_load_from_cfg(l_net->pub.ledger, l_net->pub.name, l_net->pub.id, l_chain_prior->chains_path); - if(l_chain) {//add minimum commission from to which the master node agrees. if present (default = 1.0) - l_chain->minimum_commission = dap_chain_coins_to_balance(dap_config_get_item_str_default(l_cfg , "general" ,"minimum_commission","1.0")); + if(l_chain) { DL_APPEND(l_net->pub.chains, l_chain); // add a callback to monitor changes in the chain diff --git a/modules/net/dap_chain_node.c b/modules/net/dap_chain_node.c index d7cd6b9be46face7dd15e6cef9b3643e673c2bae..48f9ae685afd1e06c949a69d61d943713ab7a560 100644 --- a/modules/net/dap_chain_node.c +++ b/modules/net/dap_chain_node.c @@ -240,6 +240,23 @@ void dap_chain_node_mempool_process_all(dap_chain_t *a_chain, bool a_force) continue; dap_chain_datum_t *l_datum = (dap_chain_datum_t *)l_objs[i].value; if (dap_chain_node_mempool_need_process(a_chain, l_datum)) { + + if (l_datum->header.type_id == DAP_CHAIN_DATUM_TX && + a_chain->callback_check_tx_fee){ + uint256_t l_tx_fee = {}; + + if (dap_chain_datum_tx_get_fee_value ((dap_chain_datum_tx_t*)l_datum->data, &l_tx_fee)) + { + log_it(L_WARNING, "Can't get fee value from tx"); + continue; + } + + if(!a_chain->callback_check_tx_fee(a_chain, l_tx_fee)){ + log_it(L_WARNING, "Fee is lower than minimum fee value"); + continue; + } + } + if (dap_chain_node_mempool_process(a_chain, l_datum)) { // Delete processed objects dap_global_db_del(l_gdb_group_mempool, l_objs[i].key, NULL, NULL); diff --git a/modules/net/dap_chain_node_cli.c b/modules/net/dap_chain_node_cli.c index 000cfb73c1ab10ac299de607368e026a4a3718f5..2b455b996337a5d2afae0b48a122a354a913348c 100644 --- a/modules/net/dap_chain_node_cli.c +++ b/modules/net/dap_chain_node_cli.c @@ -242,7 +242,8 @@ int dap_chain_node_cli_init(dap_config_t * g_config) "mempool_check -net <net_name> -datum <datum hash>\n"); dap_cli_server_cmd_add ("mempool_proc", com_mempool_proc, "Proc mempool entrie with specified hash for selected chain network", - "mempool_proc -net <net_name> -datum <datum hash>\n"); + "mempool_proc -net <net_name> -datum <datum hash>\n" + "CAUTION!!! This command will process transaction with any comission! Parameter minimum_comission will not be taken into account!"); dap_cli_server_cmd_add ("mempool_proc_all", com_mempool_proc_all, "Proc mempool all entries for selected chain network", "mempool_proc_all -net <net_name> -chain <chain_name>\n");