From 6d1ce0228e259fe4df28a96ed8e05c35ef88ee48 Mon Sep 17 00:00:00 2001 From: "oljas.jarasbaev" <oljas.jarasbaev@demlabs.net> Date: Tue, 11 Feb 2025 11:27:12 +0000 Subject: [PATCH] Feature 14651 --- .../consensus/esbocs/dap_chain_cs_esbocs.c | 5 ++-- .../esbocs/include/dap_chain_cs_esbocs.h | 3 +- modules/datum/dap_chain_datum_decree.c | 22 ++++++++++++++ .../datum/include/dap_chain_datum_decree.h | 3 ++ modules/ledger/dap_chain_ledger_decree.c | 6 ++-- modules/ledger/dap_chain_ledger_tx.c | 29 ++++++++++++++++--- modules/ledger/include/dap_chain_ledger.h | 2 +- modules/net/dap_chain_node.c | 4 +-- modules/net/include/dap_chain_node.h | 2 +- modules/node-cli/dap_chain_node_cli_cmd.c | 24 +++++++++++++++ 10 files changed, 87 insertions(+), 13 deletions(-) diff --git a/modules/consensus/esbocs/dap_chain_cs_esbocs.c b/modules/consensus/esbocs/dap_chain_cs_esbocs.c index b512eb7616..733c7f3745 100644 --- a/modules/consensus/esbocs/dap_chain_cs_esbocs.c +++ b/modules/consensus/esbocs/dap_chain_cs_esbocs.c @@ -743,13 +743,14 @@ int dap_chain_esbocs_set_min_validators_count(dap_chain_t *a_chain, uint16_t a_n return 0; } -int dap_chain_esbocs_set_hardfork_prepare(dap_chain_t *a_chain, uint64_t a_block_num, dap_list_t *a_trusted_addrs) +int dap_chain_esbocs_set_hardfork_prepare(dap_chain_t *a_chain, uint64_t a_block_num, dap_list_t *a_trusted_addrs, json_object* a_changed_addrs) { uint64_t l_last_num = a_chain->callback_count_atom(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); l_esbocs->hardfork_from = dap_max(l_last_num, a_block_num); l_esbocs->hardfork_trusted_addrs = a_trusted_addrs; + l_esbocs->hardfork_changed_addrs = a_changed_addrs; return a_block_num && a_block_num < l_last_num ? 1 : 0; } @@ -1223,7 +1224,7 @@ static bool s_session_round_new(void *a_arg) if (l_cur_atom_count && l_cur_atom_count == a_session->esbocs->hardfork_from) { dap_time_t l_last_block_timestamp = 0; dap_chain_get_atom_last_hash_num_ts(a_session->chain, c_cell_id_hardfork, NULL, NULL, &l_last_block_timestamp); - dap_chain_node_hardfork_prepare(a_session->chain, l_last_block_timestamp, a_session->esbocs->hardfork_trusted_addrs); + dap_chain_node_hardfork_prepare(a_session->chain, l_last_block_timestamp, a_session->esbocs->hardfork_trusted_addrs, a_session->esbocs->hardfork_changed_addrs); } return false; } diff --git a/modules/consensus/esbocs/include/dap_chain_cs_esbocs.h b/modules/consensus/esbocs/include/dap_chain_cs_esbocs.h index d20028d139..a2dd6e2c70 100644 --- a/modules/consensus/esbocs/include/dap_chain_cs_esbocs.h +++ b/modules/consensus/esbocs/include/dap_chain_cs_esbocs.h @@ -124,6 +124,7 @@ typedef struct dap_chain_esbocs { dap_chain_cs_blocks_t *blocks; dap_chain_esbocs_session_t *session; uint64_t hardfork_from; + json_object *hardfork_changed_addrs; dap_list_t *hardfork_trusted_addrs; dap_time_t last_directive_vote_timestamp, last_directive_accept_timestamp, last_submitted_candidate_timestamp, last_accepted_block_timestamp; @@ -268,6 +269,6 @@ int dap_chain_esbocs_set_min_validators_count(dap_chain_t *a_chain, uint16_t a_n uint16_t dap_chain_esbocs_get_min_validators_count(dap_chain_net_id_t a_net_id); int dap_chain_esbocs_set_emergency_validator(dap_chain_t *a_chain, bool a_add, uint32_t a_sign_type, dap_hash_fast_t *a_validator_hash); int dap_chain_esbocs_set_signs_struct_check(dap_chain_t *a_chain, bool a_enable); -int dap_chain_esbocs_set_hardfork_prepare(dap_chain_t *a_chain, uint64_t a_block_num, dap_list_t *a_trusted_addrs); +int dap_chain_esbocs_set_hardfork_prepare(dap_chain_t *a_chain, uint64_t a_block_num, dap_list_t *a_trusted_addrs, json_object* a_changed_addrs); int dap_chain_esbocs_set_hardfork_complete(dap_chain_t *a_chain); void dap_chain_esbocs_change_debug_mode(dap_chain_t *a_chain, bool a_enable); diff --git a/modules/datum/dap_chain_datum_decree.c b/modules/datum/dap_chain_datum_decree.c index 0bca166c03..d0ce74b3d0 100644 --- a/modules/datum/dap_chain_datum_decree.c +++ b/modules/datum/dap_chain_datum_decree.c @@ -105,6 +105,13 @@ dap_list_t *dap_chain_datum_decree_get_owners(dap_chain_datum_decree_t *a_decree return l_ret; } +int dap_chain_datum_decree_get_hardfork_changed_addrs(dap_chain_datum_decree_t *a_decree, json_object **a_json_obj) +{ + dap_return_val_if_fail(a_decree && a_json_obj, -1); + dap_tsd_t *l_tsd = dap_tsd_find(a_decree->data_n_signs, a_decree->header.data_size, DAP_CHAIN_DATUM_DECREE_TSD_TYPE_HARDFORK_CHANGED_ADDRS); + return l_tsd ? (!dap_strcmp(dap_tsd_get_string_const(l_tsd), DAP_TSD_CORRUPTED_STRING) ? (*a_json_obj = json_tokener_parse(dap_tsd_get_string_const(l_tsd)), 0) : 1) : 1; +} + int dap_chain_datum_decree_get_min_owners(dap_chain_datum_decree_t *a_decree, uint256_t *a_min_owners_num) { dap_return_val_if_fail(a_decree && a_min_owners_num, -1); @@ -374,6 +381,20 @@ void dap_chain_datum_decree_dump_json(json_object *a_json_out, dap_chain_datum_d _dap_tsd_get_scalar(l_tsd, &l_type); json_object_object_add(a_json_out, "Signature type", json_object_new_uint64(l_num)); break; + + case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_HARDFORK_CHANGED_ADDRS: + if (l_tsd->size != sizeof(uint64_t)) { + json_object_object_add(a_json_out, "Wallet_addr_pair", json_object_new_string("WRONG SIZE")); + break; + } + json_object* l_json_obj = NULL; + if (!dap_strcmp(dap_tsd_get_string_const(l_tsd), DAP_TSD_CORRUPTED_STRING)) { + l_json_obj = json_tokener_parse(dap_tsd_get_string_const(l_tsd)); + } else { + l_json_obj = json_object_new_string("Can't parse json in Wallet_addr_pair"); + } + json_object_object_add(a_json_out, "Wallet_addr_pair", l_json_obj); + case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_POLICY_EXECUTE: if (l_tsd->size != dap_chain_policy_get_size((dap_chain_policy_t *)(l_tsd->data))) { json_object_object_add(a_json_out, "Policy num", json_object_new_string("WRONG SIZE")); @@ -381,6 +402,7 @@ void dap_chain_datum_decree_dump_json(json_object *a_json_out, dap_chain_datum_d } json_object_object_add(a_json_out, "Policy num", json_object_new_uint64(((dap_chain_policy_t *)(l_tsd->data))->activate.num)); break; + default: json_object_object_add(a_json_out, "UNKNOWN_TYPE_TSD_SECTION", json_object_new_string("")); break; diff --git a/modules/datum/include/dap_chain_datum_decree.h b/modules/datum/include/dap_chain_datum_decree.h index e037acdfe0..29b8c93fbc 100644 --- a/modules/datum/include/dap_chain_datum_decree.h +++ b/modules/datum/include/dap_chain_datum_decree.h @@ -96,6 +96,7 @@ DAP_STATIC_INLINE size_t dap_chain_datum_decree_get_size(dap_chain_datum_decree_ #define DAP_CHAIN_DATUM_DECREE_TSD_TYPE_STAKE_MIN_SIGNERS_COUNT 0x0112 #define DAP_CHAIN_DATUM_DECREE_TSD_TYPE_HOST 0x0113 #define DAP_CHAIN_DATUM_DECREE_TSD_TYPE_STRING 0x0115 +#define DAP_CHAIN_DATUM_DECREE_TSD_TYPE_HARDFORK_CHANGED_ADDRS 0x0116 #define DAP_CHAIN_DATUM_DECREE_TSD_TYPE_ACTION 0x010A #define DAP_CHAIN_DATUM_DECREE_TSD_TYPE_SIGNATURE_TYPE 0x010B #define DAP_CHAIN_DATUM_DECREE_TSD_TYPE_BLOCK_NUM 0x010C @@ -217,6 +218,8 @@ DAP_STATIC_INLINE const char *dap_chain_datum_decree_tsd_type_to_str(uint16_t a_ return "DAP_CHAIN_DATUM_DECREE_TSD_TYPE_HOST"; case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_STRING: return "DAP_CHAIN_DATUM_DECREE_TSD_TYPE_STRING"; + case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_HARDFORK_CHANGED_ADDRS: + return "DAP_CHAIN_DATUM_DECREE_TSD_TYPE_HARDFORK_CHANGED_ADDRS"; case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_ACTION: return "DAP_CHAIN_DATUM_DECREE_TSD_TYPE_ACTION"; case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_SIGNATURE_TYPE: diff --git a/modules/ledger/dap_chain_ledger_decree.c b/modules/ledger/dap_chain_ledger_decree.c index 48ea004963..d73cf55471 100644 --- a/modules/ledger/dap_chain_ledger_decree.c +++ b/modules/ledger/dap_chain_ledger_decree.c @@ -622,8 +622,10 @@ const char *l_ban_addr; dap_list_t *l_addrs = dap_tsd_find_all(a_decree->data_n_signs, a_decree->header.data_size, DAP_CHAIN_DATUM_DECREE_TSD_TYPE_NODE_ADDR, sizeof(dap_stream_node_addr_t)); dap_hash_fast(a_decree, dap_chain_datum_decree_get_size(a_decree), &l_chain->hardfork_decree_hash); - return dap_chain_esbocs_set_hardfork_prepare(l_chain, l_block_num, l_addrs); - case DAP_CHAIN_DATUM_DECREE_COMMON_SUBTYPE_POLICY: + dap_tsd_t* l_changed_addrs = dap_tsd_find(a_decree->data_n_signs, a_decree->header.data_size,DAP_CHAIN_DATUM_DECREE_TSD_TYPE_HARDFORK_CHANGED_ADDRS); + return dap_chain_esbocs_set_hardfork_prepare(l_chain, l_block_num, l_addrs, json_tokener_parse(l_changed_addrs->data)); + } + case DAP_CHAIN_DATUM_DECREE_COMMON_SUBTYPE_POLICY: { if (!a_apply) break; dap_chain_policy_t *l_policy = NULL; diff --git a/modules/ledger/dap_chain_ledger_tx.c b/modules/ledger/dap_chain_ledger_tx.c index e9d37f38c6..7b4af85b2b 100644 --- a/modules/ledger/dap_chain_ledger_tx.c +++ b/modules/ledger/dap_chain_ledger_tx.c @@ -2491,7 +2491,22 @@ static int s_aggregate_out_cond(dap_ledger_hardfork_condouts_t **a_ret_list, dap return 0; } -dap_ledger_hardfork_balances_t *dap_ledger_states_aggregate(dap_ledger_t *a_ledger, dap_time_t a_hardfork_decree_creation_time, dap_ledger_hardfork_condouts_t **l_cond_outs_list) +static dap_chain_addr_t* s_change_addr(struct json_object *a_json, dap_chain_addr_t *a_addr) +{ + if(!a_json || !a_addr) + return NULL; + const char * l_out_addr = dap_chain_addr_to_str_static(a_addr); + struct json_object *l_json = json_object_object_get(a_json, l_out_addr); + if(l_json && json_object_is_type(l_json, json_type_string)) { + char * l_change_str = json_object_get_string(l_json); + dap_chain_addr_t* l_ret_addr = dap_chain_addr_from_str(l_change_str); + DAP_DELETE(l_change_str); + return l_ret_addr; + } + return NULL; +} + +dap_ledger_hardfork_balances_t *dap_ledger_states_aggregate(dap_ledger_t *a_ledger, dap_time_t a_hardfork_decree_creation_time, dap_ledger_hardfork_condouts_t **l_cond_outs_list, json_object * a_changed_addrs) { dap_ledger_hardfork_balances_t *ret = NULL; dap_ledger_hardfork_condouts_t *l_cond_ret = NULL; @@ -2513,17 +2528,23 @@ dap_ledger_hardfork_balances_t *dap_ledger_states_aggregate(dap_ledger_t *a_ledg switch(l_tx_item_type) { case TX_ITEM_TYPE_OUT: { dap_chain_tx_out_t *l_out = (dap_chain_tx_out_t *)l_tx_item; - s_aggregate_out(&ret, a_ledger, it->cache_data.token_ticker, &l_out->addr, l_out->header.value, a_hardfork_decree_creation_time, l_trackers); + dap_chain_addr_t * l_change_addr = s_change_addr(a_changed_addrs, &l_out->addr); + s_aggregate_out(&ret, a_ledger, it->cache_data.token_ticker, l_change_addr ? l_change_addr : &l_out->addr, l_out->header.value, a_hardfork_decree_creation_time, l_trackers); + DAP_DELETE(l_change_addr); break; } case TX_ITEM_TYPE_OUT_OLD: { dap_chain_tx_out_old_t *l_out = (dap_chain_tx_out_old_t *)l_tx_item; - s_aggregate_out(&ret, a_ledger, it->cache_data.token_ticker, &l_out->addr, GET_256_FROM_64(l_out->header.value), a_hardfork_decree_creation_time, l_trackers); + dap_chain_addr_t * l_change_addr = s_change_addr(a_changed_addrs, &l_out->addr); + s_aggregate_out(&ret, a_ledger, it->cache_data.token_ticker, l_change_addr ? l_change_addr : &l_out->addr, GET_256_FROM_64(l_out->header.value), a_hardfork_decree_creation_time, l_trackers); + DAP_DELETE(l_change_addr); break; } case TX_ITEM_TYPE_OUT_EXT: { dap_chain_tx_out_ext_t *l_out = (dap_chain_tx_out_ext_t *)l_tx_item; - s_aggregate_out(&ret, a_ledger, l_out->token, &l_out->addr, l_out->header.value, a_hardfork_decree_creation_time, l_trackers); + dap_chain_addr_t * l_change_addr = s_change_addr(a_changed_addrs, &l_out->addr); + s_aggregate_out(&ret, a_ledger, l_out->token, l_change_addr ? l_change_addr : &l_out->addr, l_out->header.value, a_hardfork_decree_creation_time, l_trackers); + DAP_DELETE(l_change_addr); break; } case TX_ITEM_TYPE_OUT_COND: { diff --git a/modules/ledger/include/dap_chain_ledger.h b/modules/ledger/include/dap_chain_ledger.h index 8699fad203..0dd292916e 100644 --- a/modules/ledger/include/dap_chain_ledger.h +++ b/modules/ledger/include/dap_chain_ledger.h @@ -510,7 +510,7 @@ int dap_ledger_anchor_load(dap_chain_datum_anchor_t * a_anchor, dap_chain_t *a_c int dap_ledger_anchor_unload(dap_chain_datum_anchor_t * a_anchor, dap_chain_t *a_chain, dap_hash_fast_t *a_anchor_hash); dap_chain_datum_anchor_t *dap_ledger_anchor_find(dap_ledger_t *a_ledger, dap_hash_fast_t *a_anchor_hash); -dap_ledger_hardfork_balances_t *dap_ledger_states_aggregate(dap_ledger_t *a_ledger, dap_time_t a_hardfork_decree_creation_time, dap_ledger_hardfork_condouts_t **l_cond_outs_list); +dap_ledger_hardfork_balances_t *dap_ledger_states_aggregate(dap_ledger_t *a_ledger, dap_time_t a_hardfork_decree_creation_time, dap_ledger_hardfork_condouts_t **l_cond_outs_list, json_object* a_changed_addrs); dap_ledger_hardfork_anchors_t *dap_ledger_anchors_aggregate(dap_ledger_t *a_ledger); uint256_t dap_ledger_coin_get_uncoloured_value(dap_ledger_t *a_ledger, dap_hash_fast_t *a_voting_hash, dap_hash_fast_t *a_tx_prev_hash, int a_out_idx); diff --git a/modules/net/dap_chain_node.c b/modules/net/dap_chain_node.c index 61bb9a6187..5cb5a6a637 100644 --- a/modules/net/dap_chain_node.c +++ b/modules/net/dap_chain_node.c @@ -537,14 +537,14 @@ dap_chain_datum_t **s_service_state_datums_create(dap_chain_srv_hardfork_state_t return ret; } -int dap_chain_node_hardfork_prepare(dap_chain_t *a_chain, dap_time_t a_last_block_timestamp, dap_list_t *a_trusted_addrs) +int dap_chain_node_hardfork_prepare(dap_chain_t *a_chain, dap_time_t a_last_block_timestamp, dap_list_t *a_trusted_addrs, json_object * a_changed_addrs) { if (dap_strcmp(dap_chain_get_cs_type(a_chain), DAP_CHAIN_ESBOCS_CS_TYPE_STR)) return log_it(L_ERROR, "Can't prepare harfork for chain type %s is not supported", dap_chain_get_cs_type(a_chain)), -2; dap_chain_net_t *l_net = dap_chain_net_by_id(a_chain->net_id); assert(l_net); struct hardfork_states *l_states = DAP_NEW_Z_RET_VAL_IF_FAIL(struct hardfork_states, -1, NULL); - l_states->balances = dap_ledger_states_aggregate(l_net->pub.ledger, a_last_block_timestamp, &l_states->condouts); + l_states->balances = dap_ledger_states_aggregate(l_net->pub.ledger, a_last_block_timestamp, &l_states->condouts, a_changed_addrs); l_states->anchors = dap_ledger_anchors_aggregate(l_net->pub.ledger); l_states->fees = dap_chain_cs_blocks_fees_aggregate(a_chain); size_t l_state_size = 0; diff --git a/modules/net/include/dap_chain_node.h b/modules/net/include/dap_chain_node.h index 448f77f9c0..dd52eff134 100644 --- a/modules/net/include/dap_chain_node.h +++ b/modules/net/include/dap_chain_node.h @@ -113,7 +113,7 @@ void dap_chain_node_mempool_process_all(dap_chain_t *a_chain, bool a_force); bool dap_chain_node_mempool_autoproc_init(); inline static void dap_chain_node_mempool_autoproc_deinit() {} -int dap_chain_node_hardfork_prepare(dap_chain_t *a_chain, dap_time_t a_last_block_timestamp, dap_list_t *a_trusted_addrs); +int dap_chain_node_hardfork_prepare(dap_chain_t *a_chain, dap_time_t a_last_block_timestamp, dap_list_t *a_trusted_addrs, json_object * a_changed_addrs); int dap_chain_node_hardfork_process(dap_chain_t *a_chain); int dap_chain_node_hardfork_check(dap_chain_t *a_chain, dap_chain_datum_t *a_datum); int dap_chain_node_hardfork_confirm(dap_chain_t *a_chain, dap_chain_datum_t *a_datum); diff --git a/modules/node-cli/dap_chain_node_cli_cmd.c b/modules/node-cli/dap_chain_node_cli_cmd.c index 9f7cca4d54..0e3c347fd9 100644 --- a/modules/node-cli/dap_chain_node_cli_cmd.c +++ b/modules/node-cli/dap_chain_node_cli_cmd.c @@ -4121,6 +4121,30 @@ int cmd_decree(int a_argc, char **a_argv, void **a_str_reply) return -1; } + const char *l_addr_pairs = NULL; + if (dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-addr_pairs", &l_addr_pairs)) { + char **l_addrs = dap_strsplit(l_addr_pairs, ",", 256); + if (!l_addrs) { + dap_list_free_full(l_tsd_list, NULL); + log_it(L_ERROR, "Argument -addr_pairs require string <\"old_addr:new_addr\",\"old_addr1:new_addr1\"...>"); + return -200; + } + json_object* l_json_arr_addrs = json_object_new_object(); + for (uint16_t i = 0; l_addrs[i]; i++) { + char ** l_addr_pair = dap_strsplit(l_addrs[i], ":", 256); + if (!l_addr_pair || !l_addr_pair[0] || !l_addr_pair[1]) + continue; + json_object_object_add(l_json_arr_addrs, l_addr_pair[0], l_addr_pair[1]); + } + const char * l_addr_array_str = json_object_to_json_string(l_json_arr_addrs); + l_tsd = dap_tsd_create(DAP_CHAIN_DATUM_DECREE_TSD_TYPE_HARDFORK_CHANGED_ADDRS, l_addr_array_str, strlen(l_addr_array_str) + 1); + if (!l_tsd) { + log_it(L_CRITICAL, "%s", c_error_memory_alloc); + dap_list_free_full(l_tsd_list, NULL); + return -1; + } + l_tsd_list = dap_list_append(l_tsd_list, l_tsd); + } if (dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-trusted_addrs", &l_param_addr_str)) { char **l_addrs = dap_strsplit(l_param_addr_str, ",", 256); -- GitLab