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