From 6f18ca54942aac172ce99f3f11ef4c3564ecc4a7 Mon Sep 17 00:00:00 2001 From: Roman Khlopkov <roman.khlopkov@demlabs.net> Date: Mon, 13 Mar 2023 17:38:38 +0300 Subject: [PATCH] [+] Init stakes with master certs for PoS start --- modules/chain/include/dap_chain.h | 4 +- .../consensus/esbocs/dap_chain_cs_esbocs.c | 77 ++++++++++--------- modules/net/dap_chain_net_decree.c | 2 +- .../dap_chain_net_srv_stake_pos_delegate.c | 18 ++--- .../dap_chain_net_srv_stake_pos_delegate.h | 3 +- 5 files changed, 52 insertions(+), 52 deletions(-) diff --git a/modules/chain/include/dap_chain.h b/modules/chain/include/dap_chain.h index 5bd9b5980d..8fbfd403e8 100644 --- a/modules/chain/include/dap_chain.h +++ b/modules/chain/include/dap_chain.h @@ -96,7 +96,7 @@ typedef void (*dap_chain_callback_notify_t)(void * a_arg, dap_chain_t *a_chain, typedef size_t(*dap_chain_callback_get_count)(dap_chain_t *a_chain); typedef dap_list_t *(*dap_chain_callback_get_list)(dap_chain_t *a_chain, size_t a_count, size_t a_page, bool a_reverse); typedef dap_list_t *(*dap_chain_callback_get_poa_certs)(dap_chain_t *a_chain, size_t *a_auth_certs_count, uint16_t *count_verify); -typedef void (*dap_chain_callback_set_min_esbocs_validators_count)(dap_chain_t *a_chain, uint16_t a_new_value); +typedef void (*dap_chain_callback_set_min_validators_count)(dap_chain_t *a_chain, uint16_t a_new_value); typedef enum dap_chain_type @@ -175,7 +175,7 @@ typedef struct dap_chain { dap_chain_callback_get_list callback_get_atoms; dap_chain_callback_get_poa_certs callback_get_poa_certs; - dap_chain_callback_set_min_esbocs_validators_count callback_set_min_esbocs_validators_count; + dap_chain_callback_set_min_validators_count callback_set_min_validators_count; dap_list_t * atom_notifiers; // dap_chain_callback_notify_t callback_notify; diff --git a/modules/consensus/esbocs/dap_chain_cs_esbocs.c b/modules/consensus/esbocs/dap_chain_cs_esbocs.c index 023eddb345..fd554d7a15 100644 --- a/modules/consensus/esbocs/dap_chain_cs_esbocs.c +++ b/modules/consensus/esbocs/dap_chain_cs_esbocs.c @@ -51,8 +51,10 @@ 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); -void dap_chain_esbocs_set_min_validators_count(dap_chain_t *a_chain, uint16_t a_new_value); +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); + DAP_STATIC_INLINE const char *s_voting_msg_type_to_str(uint8_t a_type) { switch (a_type) { @@ -118,7 +120,7 @@ static int s_callback_new(dap_chain_t *a_chain, dap_config_t *a_chain_cfg) l_session->chain = a_chain; l_session->esbocs = l_esbocs; - l_esbocs->chain->callback_set_min_esbocs_validators_count = dap_chain_esbocs_set_min_validators_count; + l_esbocs->chain->callback_set_min_validators_count = s_callback_set_min_validators_count; l_esbocs->session = l_session; l_blocks->_inheritor = l_esbocs; @@ -127,7 +129,6 @@ static int s_callback_new(dap_chain_t *a_chain, dap_config_t *a_chain_cfg) dap_chain_esbocs_pvt_t *l_esbocs_pvt = PVT(l_esbocs); 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); @@ -140,43 +141,49 @@ static int s_callback_new(dap_chain_t *a_chain, dap_config_t *a_chain_cfg) l_ret = -1; goto lb_err; } - if (l_esbocs_pvt->poa_mode) { // auth by certs in PoA mode - const char *l_auth_certs_prefix = dap_config_get_item_str(a_chain_cfg, "esbocs", "auth_certs_prefix"); - uint16_t l_node_addrs_count; - char **l_addrs = dap_config_get_array_str(a_chain_cfg, "esbocs", "validators_addrs", &l_node_addrs_count); - uint16_t l_auth_certs_count = l_node_addrs_count; - if (l_auth_certs_count < l_esbocs_pvt->min_validators_count) { - l_ret = -2; - goto lb_err; - } - char l_cert_name[512]; - dap_cert_t *l_cert_cur; - for (size_t i = 0; i < l_auth_certs_count; i++) { - dap_chain_esbocs_validator_t *l_validator = DAP_NEW(dap_chain_esbocs_validator_t); - snprintf(l_cert_name, sizeof(l_cert_name), "%s.%zu", l_auth_certs_prefix, i); + const char *l_auth_certs_prefix = dap_config_get_item_str(a_chain_cfg, "esbocs", "auth_certs_prefix"); + uint16_t l_node_addrs_count; + char **l_addrs = dap_config_get_array_str(a_chain_cfg, "esbocs", "validators_addrs", &l_node_addrs_count); + uint16_t l_auth_certs_count = l_node_addrs_count; + if (l_auth_certs_count < l_esbocs_pvt->min_validators_count) { + l_ret = -2; + goto lb_err; + } + char l_cert_name[512]; + dap_cert_t *l_cert_cur; + for (size_t i = 0; i < l_auth_certs_count; i++) { + snprintf(l_cert_name, sizeof(l_cert_name), "%s.%zu", l_auth_certs_prefix, i); + if ((l_cert_cur = dap_cert_find_by_name(l_cert_name)) == NULL) { + snprintf(l_cert_name, sizeof(l_cert_name), "%s.%zu.pub", l_auth_certs_prefix, i); if ((l_cert_cur = dap_cert_find_by_name(l_cert_name)) == NULL) { - snprintf(l_cert_name, sizeof(l_cert_name), "%s.%zu.pub", l_auth_certs_prefix, i); - if ((l_cert_cur = dap_cert_find_by_name(l_cert_name)) == NULL) { - log_it(L_ERROR, "ESBOCS: Can't find cert \"%s\"", l_cert_name); - DAP_DELETE(l_validator); - l_ret = -3; - goto lb_err; - } - } - log_it(L_NOTICE, "ESBOCS: Initialized auth cert \"%s\"", l_cert_name); - dap_chain_addr_fill_from_key(&l_validator->signing_addr, l_cert_cur->enc_key, a_chain->net_id); - - if (dap_chain_node_addr_from_str(&l_validator->node_addr, l_addrs[i])) { - log_it(L_ERROR,"ESBOCS: Wrong address format, should be like 0123::4567::89AB::CDEF"); - DAP_DELETE(l_validator); - l_ret = -4; + log_it(L_ERROR, "ESBOCS: Can't find cert \"%s\"", l_cert_name); + l_ret = -3; goto lb_err; } - log_it(L_MSG, "ESBOCS: add validator addr:"NODE_ADDR_FP_STR"", NODE_ADDR_FP_ARGS_S(l_validator->node_addr)); - + } + dap_chain_addr_t l_signing_addr; + log_it(L_NOTICE, "ESBOCS: Initialized auth cert \"%s\"", l_cert_name); + dap_chain_addr_fill_from_key(&l_signing_addr, l_cert_cur->enc_key, a_chain->net_id); + dap_chain_node_addr_t l_signer_node_addr; + if (dap_chain_node_addr_from_str(&l_signer_node_addr, l_addrs[i])) { + log_it(L_ERROR,"ESBOCS: Wrong address format, should be like 0123::4567::89AB::CDEF"); + l_ret = -4; + goto lb_err; + } + log_it(L_MSG, "ESBOCS: add validator addr:"NODE_ADDR_FP_STR"", NODE_ADDR_FP_ARGS_S(l_signer_node_addr)); + if (l_esbocs_pvt->poa_mode) { // auth by certs in PoA mode + dap_chain_esbocs_validator_t *l_validator = DAP_NEW(dap_chain_esbocs_validator_t); + l_validator->signing_addr = l_signing_addr; + l_validator->node_addr = l_signer_node_addr; l_validator->weight = uint256_1; l_esbocs_pvt->poa_validators = dap_list_append(l_esbocs_pvt->poa_validators, l_validator); + } else { + dap_hash_fast_t l_stake_tx_hash = {}; + dap_chain_net_t *l_net = dap_chain_net_by_id(a_chain->net_id); + uint256_t l_weight = dap_chain_net_srv_stake_get_allowed_min_value(); + dap_chain_net_srv_stake_key_delegate(l_net, &l_signing_addr, &l_stake_tx_hash, + l_weight, &l_signer_node_addr); } } l_blocks->chain->callback_created = s_callback_created; @@ -307,7 +314,7 @@ static void *s_callback_list_form(const void *a_srv_validator, UNUSED_ARG void * return l_validator; } -void dap_chain_esbocs_set_min_validators_count(dap_chain_t *a_chain, uint16_t a_new_value) +static void s_callback_set_min_validators_count(dap_chain_t *a_chain, uint16_t a_new_value) { dap_chain_cs_blocks_t *l_blocks = DAP_CHAIN_CS_BLOCKS(a_chain); dap_chain_esbocs_t *l_esbocs = DAP_CHAIN_ESBOCS(l_blocks); diff --git a/modules/net/dap_chain_net_decree.c b/modules/net/dap_chain_net_decree.c index c2ef071b61..17947ad2b5 100644 --- a/modules/net/dap_chain_net_decree.c +++ b/modules/net/dap_chain_net_decree.c @@ -433,7 +433,7 @@ static int s_common_decree_handler(dap_chain_datum_decree_t * a_decree, dap_chai log_it(L_WARNING,"Can't get min stake value from decree."); return -105; } - a_chain->callback_set_min_esbocs_validators_count(a_chain, (uint16_t)dap_chain_uint256_to(l_uint256_buffer)); + a_chain->callback_set_min_validators_count(a_chain, (uint16_t)dap_chain_uint256_to(l_uint256_buffer)); break; default: return -1; } diff --git a/modules/service/stake_pos_delegate/dap_chain_net_srv_stake_pos_delegate.c b/modules/service/stake_pos_delegate/dap_chain_net_srv_stake_pos_delegate.c index 976aa67b86..01989bfe19 100644 --- a/modules/service/stake_pos_delegate/dap_chain_net_srv_stake_pos_delegate.c +++ b/modules/service/stake_pos_delegate/dap_chain_net_srv_stake_pos_delegate.c @@ -88,18 +88,7 @@ int dap_chain_net_srv_stake_pos_delegate_init() ); 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++) { - size_t l_auth_certs_count = 0; - for (dap_chain_t *l_chain = l_net_list[i]->pub.chains; l_chain; l_chain = l_chain->next) - if ( (s_srv_stake->auth_cert_pkeys = l_chain->callback_get_poa_certs(l_chain, &l_auth_certs_count, NULL)) ) - break; - } - DAP_DELETE(l_net_list); s_srv_stake->delegate_allowed_min = dap_chain_coins_to_balance("1.0"); - s_srv_stake->initialized = true; return 0; } @@ -181,12 +170,17 @@ void dap_chain_net_srv_stake_set_allowed_min_value(uint256_t a_value) s_srv_stake->delegate_allowed_min = a_value; } +uint256_t dap_chain_net_srv_stake_get_allowed_min_value() +{ + assert(s_srv_stake); + return s_srv_stake->delegate_allowed_min; +} + bool dap_chain_net_srv_stake_key_delegated(dap_chain_addr_t *a_signing_addr) { assert(s_srv_stake); if (!a_signing_addr) return false; - while (!s_srv_stake->initialized); dap_chain_net_srv_stake_item_t *l_stake = NULL; HASH_FIND(hh, s_srv_stake->itemlist, a_signing_addr, sizeof(dap_chain_addr_t), l_stake); diff --git a/modules/service/stake_pos_delegate/include/dap_chain_net_srv_stake_pos_delegate.h b/modules/service/stake_pos_delegate/include/dap_chain_net_srv_stake_pos_delegate.h index 5d5a0e9ae7..e8173fd1ed 100644 --- a/modules/service/stake_pos_delegate/include/dap_chain_net_srv_stake_pos_delegate.h +++ b/modules/service/stake_pos_delegate/include/dap_chain_net_srv_stake_pos_delegate.h @@ -41,9 +41,7 @@ typedef struct dap_chain_net_srv_stake_item { } dap_chain_net_srv_stake_item_t; typedef struct dap_chain_net_srv_stake { - bool initialized; uint256_t delegate_allowed_min; - dap_list_t *auth_cert_pkeys; dap_chain_net_srv_stake_item_t *itemlist; } dap_chain_net_srv_stake_t; @@ -54,6 +52,7 @@ void dap_chain_net_srv_stake_key_delegate(dap_chain_net_t *a_net, dap_chain_addr uint256_t a_value, dap_chain_node_addr_t *a_node_addr); void dap_chain_net_srv_stake_key_invalidate(dap_chain_addr_t *a_signing_addr); void dap_chain_net_srv_stake_set_allowed_min_value(uint256_t a_value); +uint256_t dap_chain_net_srv_stake_get_allowed_min_value(); bool dap_chain_net_srv_stake_key_delegated(dap_chain_addr_t *a_addr); dap_list_t *dap_chain_net_srv_stake_get_validators(); -- GitLab