diff --git a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c index ff25920ff09e6046d81f1f6977b2452dff2d0e17..280795fc482adf9089c425562ed24ecfd857649a 100644 --- a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c +++ b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c @@ -822,6 +822,7 @@ static int s_callback_event_round_sync(dap_chain_cs_dag_t * a_dag, const char a_ l_event_new_hash_hex_str = dap_chain_hash_fast_to_str_new(&l_event_new_hash); if (dap_chain_cs_dag_event_gdb_set(a_dag, l_event_new_hash_hex_str, l_event, l_event_size_new, l_round_item, a_group)) { + // a_dag->callback_broadcast(a_dag, l_round_item); // dap_chain_global_db_gr_del(a_key, a_group); // Delete old event } bool l_event_is_ready = s_round_event_ready_minimum_check(a_dag, l_event, l_event_size_new, diff --git a/modules/service/stake/dap_chain_net_srv_stake.c b/modules/service/stake/dap_chain_net_srv_stake.c index 08a60601aa7e3e57e8e2f175492e19363ff0c4e4..9edc1f3b0720df6149bc499006f7d1c166a88772 100644 --- a/modules/service/stake/dap_chain_net_srv_stake.c +++ b/modules/service/stake/dap_chain_net_srv_stake.c @@ -68,7 +68,9 @@ int dap_chain_net_srv_stake_init() "srv_stake invalidate -net <net name> -tx <transaction hash> -wallet <wallet name>\n" "\tInvalidate requested stake transaction by hash within net name and return stake to specified wallet\n" ); + s_srv_stake = DAP_NEW_Z(dap_chain_net_srv_stake_t); + uint16_t l_net_count; dap_chain_net_t **l_net_list = dap_chain_net_list(&l_net_count); for (uint16_t i = 0; i < l_net_count; i++) { @@ -150,11 +152,16 @@ void dap_chain_net_srv_stake_deinit() static void s_stake_update(dap_chain_tx_out_cond_t *a_cond, dap_chain_datum_tx_t *a_tx, bool a_authorized) { dap_chain_net_srv_stake_item_t *l_stake; - if (a_cond) + if (a_cond) { HASH_FIND(hh, s_srv_stake->itemlist, &a_cond->subtype.srv_stake.signing_addr, sizeof(dap_chain_addr_t), l_stake); - else + } + else { l_stake = DAP_NEW_Z(dap_chain_net_srv_stake_item_t); - assert(l_stake); + } + // assert(l_stake); + if (!l_stake) { + return; + } dap_chain_tx_out_cond_t *l_out_cond = (dap_chain_tx_out_cond_t *)dap_chain_datum_tx_item_get(a_tx, NULL, TX_ITEM_TYPE_OUT_COND, NULL); if (!l_out_cond || l_out_cond->header.subtype != DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE) { // Stake tx is used out @@ -167,7 +174,8 @@ static void s_stake_update(dap_chain_tx_out_cond_t *a_cond, dap_chain_datum_tx_t // New stake transaction memcpy(&l_stake->signing_addr, &l_out_cond->subtype.srv_stake.signing_addr, sizeof(dap_chain_addr_t)); HASH_ADD(hh, s_srv_stake->itemlist, signing_addr, sizeof(dap_chain_addr_t), l_stake); - } else if (memcmp(&a_cond->subtype.srv_stake.signing_addr, &l_out_cond->subtype.srv_stake.signing_addr, sizeof(dap_chain_addr_t))) { + } + else if (memcmp(&a_cond->subtype.srv_stake.signing_addr, &l_out_cond->subtype.srv_stake.signing_addr, sizeof(dap_chain_addr_t))) { HASH_DEL(s_srv_stake->itemlist, l_stake); dap_chain_net_srv_stake_item_t *l_stake_cur = NULL; HASH_FIND(hh, s_srv_stake->itemlist, &l_out_cond->subtype.srv_stake.signing_addr, sizeof(dap_chain_addr_t), l_stake_cur); @@ -179,8 +187,9 @@ static void s_stake_update(dap_chain_tx_out_cond_t *a_cond, dap_chain_datum_tx_t if (l_stake_cur) HASH_ADD(hh, s_srv_stake->itemlist, signing_addr, sizeof(dap_chain_addr_t), l_stake); } - if (a_authorized) + if (a_authorized) { l_stake->is_active = true; + } memcpy(&l_stake->addr_hldr, &l_out_cond->subtype.srv_stake.hldr_addr, sizeof(dap_chain_addr_t)); memcpy(&l_stake->addr_fee, &l_out_cond->subtype.srv_stake.fee_addr, sizeof(dap_chain_addr_t)); l_stake->fee_value = l_out_cond->subtype.srv_stake.fee_value; @@ -233,11 +242,17 @@ static bool s_stake_conditions_calc(dap_chain_tx_out_cond_t *a_cond, dap_chain_d bool dap_chain_net_srv_stake_verificator(dap_chain_tx_out_cond_t *a_cond, dap_chain_datum_tx_t *a_tx, bool a_owner) { + if (!s_srv_stake) { + return false; + } return s_stake_conditions_calc(a_cond, a_tx, a_owner, false); } bool dap_chain_net_srv_stake_updater(dap_chain_tx_out_cond_t *a_cond, dap_chain_datum_tx_t *a_tx, bool a_owner) { + if (!s_srv_stake) { + return false; + } return s_stake_conditions_calc(a_cond, a_tx, a_owner, true); } @@ -416,7 +431,8 @@ static bool s_stake_tx_put(dap_chain_datum_tx_t *a_tx, dap_chain_net_t *a_net) // Put the transaction to mempool or directly to chains size_t l_tx_size = dap_chain_datum_tx_get_size(a_tx); dap_chain_datum_t *l_datum = dap_chain_datum_create(DAP_CHAIN_DATUM_TX, a_tx, l_tx_size); - DAP_DELETE(a_tx); + // don't delete a_tx because in s_cli_srv_stake() after this function calc hash this tx + // DAP_DELETE(a_tx); dap_chain_t *l_chain = dap_chain_net_get_chain_by_chain_type(a_net, CHAIN_TYPE_TX); if (!l_chain) { return false; @@ -1246,7 +1262,8 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, char **a_str_reply) dap_chain_wallet_close(l_wallet); if (l_success) { dap_chain_node_cli_set_reply_text(a_str_reply, "Stake successfully returned to owner"); - HASH_DEL(s_srv_stake->itemlist, l_stake); + // don't delete stake here because it delete in s_stake_update after invalidate tx approve + // HASH_DEL(s_srv_stake->itemlist, l_stake); } else { dap_chain_node_cli_set_reply_text(a_str_reply, "Can't invalidate transaction %s", l_tx_hash_str); return -21; diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c index 05b6d6e5d7ce2d57d3dba31bb2305f74d9fcf48f..c43ae400ba1f4d20ceae5041b33bec4c9f1a466e 100644 --- a/modules/type/dag/dap_chain_cs_dag.c +++ b/modules/type/dag/dap_chain_cs_dag.c @@ -171,7 +171,7 @@ void dap_chain_cs_dag_deinit(void) } static void s_history_callback_round_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_size) + const char *a_key, const void *a_value, const size_t a_value_size) { dap_chain_cs_dag_t *l_dag = (dap_chain_cs_dag_t *)a_arg; if (a_arg && !l_dag->broadcast_disable){ @@ -192,11 +192,16 @@ static void s_history_callback_round_notify(void *a_arg, const char a_op_code, c else if ( a_op_code == DAP_DB$K_OPTYPE_DEL ) { dap_chain_cs_new_event_add_datums(l_dag->chain, true); } - dap_chain_cs_dag_event_broadcast(l_dag, a_op_code, a_group, - a_key, a_value, a_value_size); } } +static void s_dag_chain_cs_event_round_broadcast(dap_chain_cs_dag_t *a_dag, + dap_chain_cs_dag_event_round_item_t *a_round_item, const char *a_key) { + size_t l_round_item_size = dap_chain_cs_dag_event_round_item_get_size(a_round_item); + dap_chain_cs_dag_event_broadcast(a_dag, DAP_DB$K_OPTYPE_ADD, a_dag->gdb_group_events_round_new, + a_key, a_round_item, l_round_item_size); +} + /** * @brief dap_chain_cs_dag_new * @param a_chain @@ -276,6 +281,7 @@ int dap_chain_cs_dag_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) l_dag->datum_add_hashes_count = dap_config_get_item_uint16_default(a_chain_cfg,"dag","datum_add_hashes_count",1); l_dag->use_event_round_info = false; l_dag->callback_cs_set_event_round_info = s_dag_chain_cs_set_event_round_info; + l_dag->callback_broadcast = s_dag_chain_cs_event_round_broadcast; char * l_round_new_str = dap_strdup( dap_config_get_item_str_default(a_chain_cfg,"dag","gdb_group_events_round_new", "new")); dap_chain_net_t *l_net = dap_chain_net_by_id(a_chain->net_id); diff --git a/modules/type/dag/dap_chain_cs_dag_event.c b/modules/type/dag/dap_chain_cs_dag_event.c index 994c451d996678f17d5de963bd1abd4b7236da5a..c020316381993712c5dffc91c91940886aa8f2c9 100644 --- a/modules/type/dag/dap_chain_cs_dag_event.c +++ b/modules/type/dag/dap_chain_cs_dag_event.c @@ -314,6 +314,7 @@ bool dap_chain_cs_dag_event_gdb_set(dap_chain_cs_dag_t *a_dag, char *a_event_has dap_chain_cs_dag_event_round_item_get_size(l_round_item), a_group); + a_dag->callback_broadcast(a_dag, l_round_item, a_event_hash_str); DAP_DELETE(l_round_item); return ret; } diff --git a/modules/type/dag/include/dap_chain_cs_dag.h b/modules/type/dag/include/dap_chain_cs_dag.h index 9431e95de1313c80756843337b6cae14d9458378..d96bb74b1f52ed67d096a7ac2f1d358f9a01e6c4 100644 --- a/modules/type/dag/include/dap_chain_cs_dag.h +++ b/modules/type/dag/include/dap_chain_cs_dag.h @@ -29,6 +29,8 @@ typedef struct dap_chain_cs_dag dap_chain_cs_dag_t; typedef void (*dap_chain_cs_dag_callback_t)(dap_chain_cs_dag_t *); +typedef void (*dap_chain_cs_dag_callback_broadcast_t)(dap_chain_cs_dag_t *, + dap_chain_cs_dag_event_round_item_t *, const char *a_key); typedef int (*dap_chain_cs_dag_callback_event_t)(dap_chain_cs_dag_t *, dap_chain_cs_dag_event_t *,size_t); typedef dap_chain_cs_dag_event_t * (*dap_chain_cs_dag_callback_event_create_t)(dap_chain_cs_dag_t *, @@ -66,6 +68,7 @@ typedef struct dap_chain_cs_dag char *gdb_group_datums_queue; dap_chain_cs_dag_callback_t callback_delete; + dap_chain_cs_dag_callback_broadcast_t callback_broadcast; dap_chain_cs_dag_callback_event_create_t callback_cs_event_create; dap_chain_cs_dag_callback_event_t callback_cs_verify; dap_chain_cs_dag_callback_get_round_info_t callback_cs_get_round_info;