From 20f2f229cbd2738af2e395964fda2e5918e59a4c Mon Sep 17 00:00:00 2001
From: "pavel.uhanov" <pavel.uhanov@demlabs.net>
Date: Fri, 14 Mar 2025 17:09:14 +0300
Subject: [PATCH 1/5] [*] add generation

---
 modules/chain/include/dap_chain_policy.h | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/modules/chain/include/dap_chain_policy.h b/modules/chain/include/dap_chain_policy.h
index 5184524ab7..2285955f3d 100644
--- a/modules/chain/include/dap_chain_policy.h
+++ b/modules/chain/include/dap_chain_policy.h
@@ -52,13 +52,14 @@ typedef struct dap_chain_policy_activate {
         dap_chain_id_t chain_id;
         dap_chain_t *chain;
     } chain_union;
+    uint16_t generation;
 } DAP_ALIGN_PACKED dap_chain_policy_activate_t;
 
 typedef struct dap_chain_policy_deactivate {
     uint64_t flags;
     uint32_t count;
     uint32_t nums[];
-} dap_chain_policy_deactivate_t;
+} DAP_ALIGN_PACKED dap_chain_policy_deactivate_t;
 
 typedef struct dap_chain_policy {
     uint16_t version;
-- 
GitLab


From 6966b37a961969e7915ba243a9557c3ebcaa7efe Mon Sep 17 00:00:00 2001
From: "pavel.uhanov" <pavel.uhanov@demlabs.net>
Date: Fri, 14 Mar 2025 19:58:27 +0300
Subject: [PATCH 2/5] [*] add comulative effect from cond

---
 modules/chain/dap_chain_policy.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/modules/chain/dap_chain_policy.c b/modules/chain/dap_chain_policy.c
index 4094f761fc..241f75b007 100644
--- a/modules/chain/dap_chain_policy.c
+++ b/modules/chain/dap_chain_policy.c
@@ -225,7 +225,11 @@ bool dap_chain_policy_activated(uint32_t a_policy_num, uint64_t a_net_id)
     dap_list_t *l_list_item = dap_list_find(l_net_item->policies, l_to_search, s_policy_num_compare);
     DAP_DELETE(l_to_search);
     if (l_list_item && s_policy_is_cond((dap_chain_policy_t *)l_list_item->data)) {
-        return s_policy_cond_activated((dap_chain_policy_activate_t *)((dap_chain_policy_t *)(l_list_item->data))->data);
+        dap_chain_policy_activate_t *l_activate = (dap_chain_policy_activate_t *)((dap_chain_policy_t *)(l_list_item->data))->data;
+        bool l_ret = s_policy_cond_activated(l_activate);
+        if (l_ret)
+            l_net_item->last_num_policy = dap_max(l_activate->num, l_net_item->last_num_policy);
+        return l_ret;
     }
     // cumulative return
     return a_policy_num <= l_net_item->last_num_policy;
-- 
GitLab


From b39f2ae8a1dc1fdd02e897aba3b5171cb232fb0d Mon Sep 17 00:00:00 2001
From: Pavel Uhanov <pavel.uhanov@demlabs.net>
Date: Mon, 17 Mar 2025 10:47:00 +0300
Subject: [PATCH 3/5] [*] remove policy stos

---
 modules/chain/dap_chain_policy.c          | 28 ++++++----------
 modules/chain/include/dap_chain_policy.h  | 25 ++++++---------
 modules/ledger/dap_chain_ledger_decree.c  |  2 +-
 modules/net/dap_chain_net.c               |  4 +--
 modules/node-cli/dap_chain_node_cli.c     |  6 ++--
 modules/node-cli/dap_chain_node_cli_cmd.c | 39 ++++-------------------
 6 files changed, 30 insertions(+), 74 deletions(-)

diff --git a/modules/chain/dap_chain_policy.c b/modules/chain/dap_chain_policy.c
index 241f75b007..cb74f4b10a 100644
--- a/modules/chain/dap_chain_policy.c
+++ b/modules/chain/dap_chain_policy.c
@@ -69,24 +69,24 @@ DAP_STATIC_INLINE int s_policy_num_compare(dap_list_t  *a_list1, dap_list_t  *a_
 DAP_STATIC_INLINE bool s_policy_is_cond(dap_chain_policy_t *a_policy)
 {
     return a_policy->type == DAP_CHAIN_POLICY_ACTIVATE &&
-        (DAP_FLAG_CHECK(((dap_chain_policy_activate_t *)(a_policy->data))->flags, DAP_CHAIN_POLICY_FLAG_ACTIVATE_BY_TS) ||
-        DAP_FLAG_CHECK(((dap_chain_policy_activate_t *)(a_policy->data))->flags, DAP_CHAIN_POLICY_FLAG_ACTIVATE_BY_BLOCK_NUM));
+        (DAP_FLAG_CHECK(a_policy->flags, DAP_CHAIN_POLICY_FLAG_ACTIVATE_BY_TS) ||
+        DAP_FLAG_CHECK(a_policy->flags, DAP_CHAIN_POLICY_FLAG_ACTIVATE_BY_BLOCK_NUM));
 }
 
-static bool s_policy_cond_activated(dap_chain_policy_activate_t *a_policy_activate)
+static bool s_policy_cond_activated(dap_chain_policy_activate_t *a_policy_activate, uint64_t a_flags)
 {
     bool l_ret = false;
-    if (DAP_FLAG_CHECK(a_policy_activate->flags, DAP_CHAIN_POLICY_FLAG_ACTIVATE_BY_TS)) {
+    if (DAP_FLAG_CHECK(a_flags, DAP_CHAIN_POLICY_FLAG_ACTIVATE_BY_TS)) {
         time_t l_current_time = dap_time_now();
-        if (l_current_time >= a_policy_activate->ts_start && (!a_policy_activate->ts_stop || l_current_time <= a_policy_activate->ts_stop))
+        if (l_current_time >= a_policy_activate->ts_start)
         l_ret |= true;
     }
-    if (DAP_FLAG_CHECK(a_policy_activate->flags, DAP_CHAIN_POLICY_FLAG_ACTIVATE_BY_BLOCK_NUM)) {
+    if (DAP_FLAG_CHECK(a_flags, DAP_CHAIN_POLICY_FLAG_ACTIVATE_BY_BLOCK_NUM)) {
         if (!a_policy_activate->chain_union.chain) {
             log_it(L_ERROR, "Chain is null in policy item with upped DAP_CHAIN_POLICY_FLAG_ACTIVATE_BY_BLOCK_NUM flag");
             return l_ret;
         }
-        if ( a_policy_activate->chain_union.chain->atom_num_last >= a_policy_activate->block_start && (!a_policy_activate->block_stop || a_policy_activate->chain_union.chain->atom_num_last <= a_policy_activate->block_stop))
+        if ( a_policy_activate->chain_union.chain->atom_num_last >= a_policy_activate->block_start)
             l_ret |= true;
     }
     return l_ret;
@@ -226,7 +226,7 @@ bool dap_chain_policy_activated(uint32_t a_policy_num, uint64_t a_net_id)
     DAP_DELETE(l_to_search);
     if (l_list_item && s_policy_is_cond((dap_chain_policy_t *)l_list_item->data)) {
         dap_chain_policy_activate_t *l_activate = (dap_chain_policy_activate_t *)((dap_chain_policy_t *)(l_list_item->data))->data;
-        bool l_ret = s_policy_cond_activated(l_activate);
+        bool l_ret = s_policy_cond_activated(l_activate, ((dap_chain_policy_t *)l_list_item->data)->flags);
         if (l_ret)
             l_net_item->last_num_policy = dap_max(l_activate->num, l_net_item->last_num_policy);
         return l_ret;
@@ -289,7 +289,7 @@ json_object *dap_chain_policy_list(uint64_t a_net_id)
         if (dap_list_find(l_net_item->exception_list, (const void *)(uintptr_t)l_policy_activate->num, NULL))
             continue;
         if (s_policy_is_cond((dap_chain_policy_t *)(l_iter->data))) {
-            if (s_policy_cond_activated(l_policy_activate))
+            if (s_policy_cond_activated(l_policy_activate, ((dap_chain_policy_t *)(l_iter->data))->flags))
                 dap_string_append_printf(l_active_str, "CN-%u ", l_policy_activate->num);
             else
                 dap_string_append_printf(l_inactive_str, "CN-%u ", l_policy_activate->num);
@@ -326,16 +326,8 @@ json_object *dap_chain_policy_json_collect(dap_chain_policy_t *a_policy)
             } else {
                 json_object_object_add(l_ret, "ts_start", json_object_new_int(0));
             }
-            if (l_policy_activate->ts_stop) {
-                char l_time[DAP_TIME_STR_SIZE] = {};
-                dap_time_to_str_rfc822(l_time, DAP_TIME_STR_SIZE - 1, l_policy_activate->ts_stop);
-                json_object_object_add(l_ret, "ts_stop", json_object_new_string(l_time));
-            } else {
-                json_object_object_add(l_ret, "ts_stop", json_object_new_int(0));
-            }
             json_object_object_add(l_ret, "block_start", json_object_new_uint64(l_policy_activate->block_start));
-            json_object_object_add(l_ret, "block_stop", json_object_new_uint64(l_policy_activate->block_stop));
-            if (l_policy_activate->block_start || l_policy_activate->block_stop) {
+            if (l_policy_activate->block_start) {
                 if (!l_policy_activate->chain_union.chain) {
                     json_object_object_add(l_ret, "chain", json_object_new_string("ERROR pointer chain is NULL"));
                 } else {
diff --git a/modules/chain/include/dap_chain_policy.h b/modules/chain/include/dap_chain_policy.h
index 2285955f3d..ddd74af333 100644
--- a/modules/chain/include/dap_chain_policy.h
+++ b/modules/chain/include/dap_chain_policy.h
@@ -37,17 +37,20 @@ along with any CellFrame SDK based project.  If not, see <http://www.gnu.org/lic
 #define DAP_CHAIN_POLICY_OUT_EXT_USE_ENSURE                 0x2
 
 typedef enum {
-    DAP_CHAIN_POLICY_ACTIVATE = 0,
-    DAP_CHAIN_POLICY_DEACTIVATE
+    DAP_CHAIN_POLICY_DEACTIVATE = 0,
+    DAP_CHAIN_POLICY_ACTIVATE
 } dap_chain_policy_type_t;
 
+typedef struct dap_chain_policy_deactivate {
+    uint32_t count;
+    uint32_t nums[];
+} DAP_ALIGN_PACKED dap_chain_policy_deactivate_t;
+
+
 typedef struct dap_chain_policy_activate {
-    uint64_t flags;
     uint32_t num;
     int64_t ts_start;
-    int64_t ts_stop;
     uint64_t block_start;
-    uint64_t block_stop;
     union {
         dap_chain_id_t chain_id;
         dap_chain_t *chain;
@@ -55,15 +58,10 @@ typedef struct dap_chain_policy_activate {
     uint16_t generation;
 } DAP_ALIGN_PACKED dap_chain_policy_activate_t;
 
-typedef struct dap_chain_policy_deactivate {
-    uint64_t flags;
-    uint32_t count;
-    uint32_t nums[];
-} DAP_ALIGN_PACKED dap_chain_policy_deactivate_t;
-
 typedef struct dap_chain_policy {
     uint16_t version;
     uint16_t type;
+    uint64_t flags;
     uint64_t data_size;
     uint8_t data[];
 } DAP_ALIGN_PACKED dap_chain_policy_t;
@@ -84,11 +82,6 @@ DAP_STATIC_INLINE size_t dap_chain_policy_deactivate_calc_size(size_t a_deactiva
     return sizeof(dap_chain_policy_t) + sizeof(dap_chain_policy_deactivate_t) + sizeof(uint32_t) * a_deactivate_count;
 }
 
-DAP_STATIC_INLINE size_t dap_chain_policy_activate_calc_size()
-{
-    return sizeof(dap_chain_policy_t) + sizeof(dap_chain_policy_activate_t);
-}
-
 DAP_STATIC_INLINE size_t dap_chain_policy_get_size(dap_chain_policy_t *a_policy)
 {
     return a_policy ? sizeof(dap_chain_policy_t)  + a_policy->data_size : 0;
diff --git a/modules/ledger/dap_chain_ledger_decree.c b/modules/ledger/dap_chain_ledger_decree.c
index 3c84131a0c..5db69b6a74 100644
--- a/modules/ledger/dap_chain_ledger_decree.c
+++ b/modules/ledger/dap_chain_ledger_decree.c
@@ -672,7 +672,7 @@ const char *l_ban_addr;
             l_policy = DAP_DUP_SIZE_RET_VAL_IF_FAIL(l_policy, dap_chain_policy_get_size(l_policy), -106);
             if (l_policy->type == DAP_CHAIN_POLICY_ACTIVATE) {
                 dap_chain_policy_activate_t *l_policy_activate = (dap_chain_policy_activate_t *)l_policy->data;
-                if(DAP_FLAG_CHECK(l_policy_activate->flags, DAP_CHAIN_POLICY_FLAG_ACTIVATE_BY_BLOCK_NUM))
+                if(DAP_FLAG_CHECK(l_policy->flags, DAP_CHAIN_POLICY_FLAG_ACTIVATE_BY_BLOCK_NUM))
                     l_policy_activate->chain_union.chain = dap_chain_find_by_id(a_net->pub.id, l_policy_activate->chain_union.chain_id);
             }
             return dap_chain_policy_add(l_policy, a_net->pub.id.uint64);
diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index 1adccf4576..342b3adbec 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -781,10 +781,10 @@ static dap_chain_net_t *s_net_new(const char *a_net_name, dap_config_t *a_cfg)
             log_it(L_ERROR, "Can't add policy CN-%"DAP_UINT64_FORMAT_U, l_policy_num);
         } else {
             dap_chain_policy_t *l_new_policy = NULL;
-            l_new_policy = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(dap_chain_policy_t, dap_chain_policy_activate_calc_size(), NULL, l_ret->pub.name, l_ret); 
+            l_new_policy = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(dap_chain_policy_t, sizeof(dap_chain_policy_activate_t), NULL, l_ret->pub.name, l_ret); 
             l_new_policy->version = DAP_CHAIN_POLICY_VERSION;
             ((dap_chain_policy_activate_t *)(l_new_policy->data))->num = l_policy_num;
-            ((dap_chain_policy_activate_t *)(l_new_policy->data))->flags = DAP_FLAG_ADD(((dap_chain_policy_activate_t *)(l_new_policy->data))->flags, DAP_CHAIN_POLICY_FLAG_ACTIVATE_BY_CONFIG);
+            l_new_policy->flags = DAP_FLAG_ADD(l_new_policy->flags, DAP_CHAIN_POLICY_FLAG_ACTIVATE_BY_CONFIG);
             dap_chain_policy_add(l_new_policy, l_ret->pub.id.uint64);
         }
     }
diff --git a/modules/node-cli/dap_chain_node_cli.c b/modules/node-cli/dap_chain_node_cli.c
index 55b6ab876f..e8f9a63abd 100644
--- a/modules/node-cli/dap_chain_node_cli.c
+++ b/modules/node-cli/dap_chain_node_cli.c
@@ -388,10 +388,8 @@ int dap_chain_node_cli_init(dap_config_t * g_config)
                 "\t-net <net_name>\n"
                 "\t-num <policy_num>\n"
                 "\t[-ts_start <dd/mm/yy-H:M:S>] - date to start policy\n"
-                "\t[-ts_stop <dd/mm/yy-H:M:S>] - date to stop policy\n"
-                "\t{\n\t\t[-block_start <block_num>] - block num to start policy\n"
-                "\t\t[-block_stop <block_num>] - block num to stop policy\n"
-                "\t\t-chain <chain_name> - chain name to check blocks num\n\t}\n"
+                "\t[{\n\t\t-block_start <block_num> - block num to start policy\n"
+                "\t\t-chain <chain_name> - chain name to check blocks num\n\t}]\n"
                 "\t-certs <cert1[,cert2,...,certN]> - list signing certs\n"
                 "policy deactivate - prepare policy deactivate decree\n"
                 "\t[execute] - used to create policy decree, otherwise show policy decree draft\n"
diff --git a/modules/node-cli/dap_chain_node_cli_cmd.c b/modules/node-cli/dap_chain_node_cli_cmd.c
index cd17255678..9906e998ea 100644
--- a/modules/node-cli/dap_chain_node_cli_cmd.c
+++ b/modules/node-cli/dap_chain_node_cli_cmd.c
@@ -6133,14 +6133,13 @@ int com_policy(int argc, char **argv, void **reply) {
         *l_deactivate_str = NULL,
         *l_chain_str = NULL,
         *l_ts_start_str = NULL,
-        *l_ts_stop_str = NULL,
         *l_block_start_str = NULL,
-        *l_block_stop_str = NULL,
         *l_certs_str = NULL;
     size_t
         l_deactivate_count = 0,
         l_certs_count = 0;
     dap_cert_t **l_certs = NULL;
+    uint64_t l_flags = 0;
     bool l_execute = false;
 
     enum { CMD_NONE = 0, CMD_ACTIVATE, CMD_DEACTIVATE, CMD_FIND, CMD_LIST };  
@@ -6236,9 +6235,7 @@ int com_policy(int argc, char **argv, void **reply) {
 
     dap_cli_server_cmd_find_option_val(argv, l_arg_index, argc, "-chain", &l_chain_str);
     dap_cli_server_cmd_find_option_val(argv, l_arg_index, argc, "-ts_start", &l_ts_start_str);
-    dap_cli_server_cmd_find_option_val(argv, l_arg_index, argc, "-ts_stop", &l_ts_stop_str);
     dap_cli_server_cmd_find_option_val(argv, l_arg_index, argc, "-block_start", &l_block_start_str);
-    dap_cli_server_cmd_find_option_val(argv, l_arg_index, argc, "-block_stop", &l_block_stop_str);
     dap_cli_server_cmd_find_option_val(argv, l_arg_index, argc, "-deactivate", &l_deactivate_str);
     dap_cli_server_cmd_find_option_val(argv, l_arg_index, argc, "-certs", &l_certs_str);
     l_execute = dap_cli_server_cmd_find_option_val(argv, l_arg_index, argc, "execute", NULL);
@@ -6275,38 +6272,13 @@ int com_policy(int argc, char **argv, void **reply) {
                 DAP_DELETE(l_policy_activate);
                 return -13;
             }
-        }
-
-        if (l_ts_stop_str) {
-            l_policy_activate->ts_stop = dap_time_from_str_custom(l_ts_stop_str, "%d/%m/%y-%H:%M:%S");
-            if (!l_policy_activate->ts_stop) {
-                dap_json_rpc_error_add(*a_json_arr_reply, -14, "Can't read ts_stop \"%s\"", l_ts_stop_str);
-                DAP_DELETE(l_policy_activate);
-                return -14;
-            }
-            if (l_policy_activate->ts_stop <= l_policy_activate->ts_start) {
-                dap_json_rpc_error_add(*a_json_arr_reply, -12, "ts_start should less than ts_stop");
-                DAP_DELETE(l_policy_activate);
-                return -12;
-            }
-        }
-
-        if (l_policy_activate->ts_start || l_policy_activate->ts_stop) {
-            l_policy_activate->flags = DAP_FLAG_ADD(l_policy_activate->flags, DAP_CHAIN_POLICY_FLAG_ACTIVATE_BY_TS);
+            l_flags = DAP_FLAG_ADD(l_flags, DAP_CHAIN_POLICY_FLAG_ACTIVATE_BY_TS);
         }
 
         if (l_block_start_str)
             l_policy_activate->block_start = strtoull(l_block_start_str, NULL, 10);
-        if (l_block_stop_str) {
-            l_policy_activate->block_stop = strtoull(l_block_stop_str, NULL, 10);
-            if (l_policy_activate->block_stop <= l_policy_activate->block_start) {
-                dap_json_rpc_error_add(*a_json_arr_reply, -13, "block_start should less than block_stop");
-                DAP_DELETE(l_policy_activate);
-                return -13;
-            }
-        }
         
-        if (l_policy_activate->block_start || l_policy_activate->block_stop) {
+        if (l_policy_activate->block_start) {
             if (!l_chain_str) {
                 dap_json_rpc_error_add(*a_json_arr_reply, -8, "Command policy create with -block_start or -block_stop require args -chain");
                 DAP_DELETE(l_policy_activate);
@@ -6319,9 +6291,9 @@ int com_policy(int argc, char **argv, void **reply) {
                 return -9;
             }
             l_policy_activate->chain_union.chain = l_chain;
-            l_policy_activate->flags = DAP_FLAG_ADD(l_policy_activate->flags, DAP_CHAIN_POLICY_FLAG_ACTIVATE_BY_BLOCK_NUM);
+            l_flags = DAP_FLAG_ADD(l_flags, DAP_CHAIN_POLICY_FLAG_ACTIVATE_BY_BLOCK_NUM);
         }
-        if (!l_policy_activate->flags && l_policy_activate->num < l_last_num) {
+        if (!l_flags && l_policy_activate->num < l_last_num) {
             dap_json_rpc_error_add(*a_json_arr_reply, -16, "Specified policy already activated by CN-%u", l_last_num);
             DAP_DELETE(l_policy_activate);
             return -16;
@@ -6332,6 +6304,7 @@ int com_policy(int argc, char **argv, void **reply) {
     l_policy->data_size = l_data_size;
     l_policy->version = DAP_CHAIN_POLICY_VERSION;
     l_policy->type = l_policy_type;
+    l_policy->flags = l_flags;
     memcpy(l_policy->data, l_policy_data, l_policy->data_size);
     DAP_DELETE(l_policy_data);
     // if cmd none - only print preaparing result
-- 
GitLab


From bc8fdec9ef5c864b98e2339cde4437ca53640d2a Mon Sep 17 00:00:00 2001
From: Pavel Uhanov <pavel.uhanov@demlabs.net>
Date: Mon, 17 Mar 2025 10:56:42 +0300
Subject: [PATCH 4/5] [*] small fixes

---
 modules/chain/dap_chain_policy.c          | 6 ++----
 modules/node-cli/dap_chain_node_cli_cmd.c | 2 +-
 2 files changed, 3 insertions(+), 5 deletions(-)

diff --git a/modules/chain/dap_chain_policy.c b/modules/chain/dap_chain_policy.c
index cb74f4b10a..ee012886eb 100644
--- a/modules/chain/dap_chain_policy.c
+++ b/modules/chain/dap_chain_policy.c
@@ -78,16 +78,14 @@ static bool s_policy_cond_activated(dap_chain_policy_activate_t *a_policy_activa
     bool l_ret = false;
     if (DAP_FLAG_CHECK(a_flags, DAP_CHAIN_POLICY_FLAG_ACTIVATE_BY_TS)) {
         time_t l_current_time = dap_time_now();
-        if (l_current_time >= a_policy_activate->ts_start)
-        l_ret |= true;
+        l_ret |= l_current_time >= a_policy_activate->ts_start;
     }
     if (DAP_FLAG_CHECK(a_flags, DAP_CHAIN_POLICY_FLAG_ACTIVATE_BY_BLOCK_NUM)) {
         if (!a_policy_activate->chain_union.chain) {
             log_it(L_ERROR, "Chain is null in policy item with upped DAP_CHAIN_POLICY_FLAG_ACTIVATE_BY_BLOCK_NUM flag");
             return l_ret;
         }
-        if ( a_policy_activate->chain_union.chain->atom_num_last >= a_policy_activate->block_start)
-            l_ret |= true;
+        l_ret |= a_policy_activate->chain_union.chain->atom_num_last >= a_policy_activate->block_start;
     }
     return l_ret;
 }
diff --git a/modules/node-cli/dap_chain_node_cli_cmd.c b/modules/node-cli/dap_chain_node_cli_cmd.c
index 9906e998ea..5902d63dda 100644
--- a/modules/node-cli/dap_chain_node_cli_cmd.c
+++ b/modules/node-cli/dap_chain_node_cli_cmd.c
@@ -6280,7 +6280,7 @@ int com_policy(int argc, char **argv, void **reply) {
         
         if (l_policy_activate->block_start) {
             if (!l_chain_str) {
-                dap_json_rpc_error_add(*a_json_arr_reply, -8, "Command policy create with -block_start or -block_stop require args -chain");
+                dap_json_rpc_error_add(*a_json_arr_reply, -8, "Command policy create with -block_start require args -chain");
                 DAP_DELETE(l_policy_activate);
                 return -8;
             }
-- 
GitLab


From 901149676d7e9ae1282f83d013b4950a68cee3f4 Mon Sep 17 00:00:00 2001
From: Pavel Uhanov <pavel.uhanov@demlabs.net>
Date: Mon, 17 Mar 2025 12:45:29 +0300
Subject: [PATCH 5/5] [*] change list to hash table

---
 modules/chain/dap_chain_policy.c         | 62 +++++++++++++++---------
 modules/chain/include/dap_chain_policy.h |  1 +
 modules/net/dap_chain_net.c              |  5 +-
 3 files changed, 42 insertions(+), 26 deletions(-)

diff --git a/modules/chain/dap_chain_policy.c b/modules/chain/dap_chain_policy.c
index ee012886eb..2b6e06c41c 100644
--- a/modules/chain/dap_chain_policy.c
+++ b/modules/chain/dap_chain_policy.c
@@ -25,32 +25,32 @@ along with any CellFrame SDK based project.  If not, see <http://www.gnu.org/lic
 #include "dap_chain_policy.h"
 #include "dap_chain_datum_decree.h"
 #include "dap_list.h"
+#include "uthash.h"
 
 #define LOG_TAG "dap_chain_policy"
 
 typedef struct dap_chain_net dap_chain_net_t;
 
-struct policy_net_list_item {
+struct net_policy_item {
     uint64_t net_id;
     uint32_t last_num_policy;
     dap_list_t *exception_list;
     dap_list_t *policies;
+    UT_hash_handle hh;
 };
 
-static dap_list_t *s_net_list = NULL;
+static struct net_policy_item *s_net_policy_items = NULL;
 
 /**
  * @brief search net element in list by id
  * @param a_net_id
  * @return pointer if find, NULL if not
  */
-DAP_STATIC_INLINE struct policy_net_list_item *s_net_find(uint64_t a_net_id)
+DAP_STATIC_INLINE struct net_policy_item *s_net_item_find(uint64_t a_net_id)
 {
-    for (dap_list_t *l_iter = dap_list_first(s_net_list); l_iter; l_iter = l_iter->next) {
-        if ( ((struct policy_net_list_item *)(l_iter->data))->net_id == a_net_id)
-            return (struct policy_net_list_item *)(l_iter->data);
-    }
-    return NULL;
+    struct net_policy_item *l_item = NULL;
+    HASH_FIND_BYHASHVALUE(hh, s_net_policy_items, &a_net_id, sizeof(a_net_id), a_net_id, l_item);
+    return l_item;
 }
 
 DAP_STATIC_INLINE int s_policy_num_compare(dap_list_t  *a_list1, dap_list_t  *a_list2)
@@ -99,6 +99,22 @@ int dap_chain_policy_init()
     return 0;
 }
 
+/**
+ * @brief deinit policy commands
+ */
+void dap_chain_policy_deinit()
+{
+    struct net_policy_item
+        *l_temp = NULL,
+        *l_current = NULL;
+    HASH_ITER(hh, s_net_policy_items, l_current, l_temp) {
+        HASH_DEL(s_net_policy_items, l_current);
+        dap_list_free_full(l_current->policies, NULL);
+        dap_list_free(l_current->exception_list);
+        DAP_DELETE(l_current);
+    }
+}
+
 /**
  * @brief add new net to policies list
  * @param a_net_id
@@ -107,13 +123,13 @@ int dap_chain_policy_init()
 int dap_chain_policy_net_add(uint64_t a_net_id)
 {
     dap_return_val_if_pass(!a_net_id, -1);
-    if(s_net_find(a_net_id)) {
+    if(s_net_item_find(a_net_id)) {
         log_it(L_ERROR, "Net with id %"DAP_UINT64_FORMAT_X" already added", a_net_id);
         return -2;
     }
-    struct policy_net_list_item *l_new_item = DAP_NEW_Z_RET_VAL_IF_FAIL(struct policy_net_list_item, -3);
+    struct net_policy_item *l_new_item = DAP_NEW_Z_RET_VAL_IF_FAIL(struct net_policy_item, -3);
     l_new_item->net_id = a_net_id;
-    s_net_list = dap_list_append(s_net_list, l_new_item);
+    HASH_ADD_BYHASHVALUE(hh, s_net_policy_items, net_id, sizeof(l_new_item->net_id), l_new_item->net_id, l_new_item);
     return 0;
 }
 
@@ -125,17 +141,15 @@ int dap_chain_policy_net_add(uint64_t a_net_id)
 int dap_chain_policy_net_remove(uint64_t a_net_id)
 {
     dap_return_val_if_pass(!a_net_id, -1);
-    dap_list_t *l_net_item = dap_list_first(s_net_list);
-    for ( ; l_net_item && ((struct policy_net_list_item *)(l_net_item->data))->net_id != a_net_id; l_net_item = l_net_item->next) {};
-
+    struct net_policy_item *l_net_item = s_net_item_find(a_net_id);
     if (!l_net_item) {
         log_it(L_ERROR, "Can't find net %"DAP_UINT64_FORMAT_X" in policy list", a_net_id);
         return -2;
     }
-    s_net_list = dap_list_remove_link(s_net_list, l_net_item);
-    dap_list_free_full(((struct policy_net_list_item *)(l_net_item->data))->policies, NULL);
-    dap_list_free(((struct policy_net_list_item *)(l_net_item->data))->exception_list);
-    DAP_DEL_MULTY(l_net_item->data, l_net_item);
+    HASH_DEL(s_net_policy_items, l_net_item);
+    dap_list_free_full(l_net_item->policies, NULL);
+    dap_list_free(l_net_item->exception_list);
+    DAP_DELETE(l_net_item);
     return 0;
 }
 
@@ -148,7 +162,7 @@ int dap_chain_policy_net_remove(uint64_t a_net_id)
 int dap_chain_policy_add(dap_chain_policy_t *a_policy, uint64_t a_net_id)
 {
     dap_return_val_if_pass(!a_policy, -1);
-    struct policy_net_list_item *l_net_item = s_net_find(a_net_id);
+    struct net_policy_item *l_net_item = s_net_item_find(a_net_id);
     if (!l_net_item) {
         log_it(L_ERROR, "Can't find net %"DAP_UINT64_FORMAT_X" in policy list", a_net_id);
         return -2;
@@ -189,7 +203,7 @@ int dap_chain_policy_add(dap_chain_policy_t *a_policy, uint64_t a_net_id)
 int dap_chain_policy_add_to_exception_list(uint32_t a_policy_num, uint64_t a_net_id)
 {
     dap_return_val_if_pass(!a_policy_num, -1);
-    struct policy_net_list_item *l_net_item = s_net_find(a_net_id);
+    struct net_policy_item *l_net_item = s_net_item_find(a_net_id);
     if (!l_net_item) {
         log_it(L_ERROR, "Can't find net %"DAP_UINT64_FORMAT_X" in policy list", a_net_id);
         return -2;
@@ -211,7 +225,7 @@ int dap_chain_policy_add_to_exception_list(uint32_t a_policy_num, uint64_t a_net
 bool dap_chain_policy_activated(uint32_t a_policy_num, uint64_t a_net_id)
 {
     const bool l_ret_false = false;
-    struct policy_net_list_item *l_net_item = s_net_find(a_net_id);
+    struct net_policy_item *l_net_item = s_net_item_find(a_net_id);
     dap_return_val_if_pass(!l_net_item, l_ret_false);
     // exception list check
     if (dap_list_find(l_net_item->exception_list, (const void *)(uintptr_t)a_policy_num, NULL))
@@ -242,7 +256,7 @@ bool dap_chain_policy_activated(uint32_t a_policy_num, uint64_t a_net_id)
 dap_chain_policy_t *dap_chain_policy_find(uint32_t a_policy_num, uint64_t a_net_id)
 {
     dap_return_val_if_pass(!a_policy_num, NULL);
-    struct policy_net_list_item *l_net_item = s_net_find(a_net_id);
+    struct net_policy_item *l_net_item = s_net_item_find(a_net_id);
     dap_return_val_if_pass(!l_net_item, NULL);
 
     dap_chain_policy_t *l_to_search = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(dap_chain_policy_t, sizeof(dap_chain_policy_t) + sizeof(dap_chain_policy_activate_t), false);
@@ -264,7 +278,7 @@ dap_chain_policy_t *dap_chain_policy_find(uint32_t a_policy_num, uint64_t a_net_
  */
 DAP_INLINE uint32_t dap_chain_policy_get_last_num(uint64_t a_net_id)
 {
-    struct policy_net_list_item *l_net_item = s_net_find(a_net_id);
+    struct net_policy_item *l_net_item = s_net_item_find(a_net_id);
     dap_return_val_if_pass(!l_net_item, 0);
     return l_net_item->last_num_policy;
 }
@@ -272,7 +286,7 @@ DAP_INLINE uint32_t dap_chain_policy_get_last_num(uint64_t a_net_id)
 
 json_object *dap_chain_policy_list(uint64_t a_net_id)
 {
-    struct policy_net_list_item *l_net_item = s_net_find(a_net_id);
+    struct net_policy_item *l_net_item = s_net_item_find(a_net_id);
     dap_return_val_if_pass(!l_net_item, NULL);
     json_object *l_ret = json_object_new_object();
 
diff --git a/modules/chain/include/dap_chain_policy.h b/modules/chain/include/dap_chain_policy.h
index ddd74af333..0e5f9e0ca7 100644
--- a/modules/chain/include/dap_chain_policy.h
+++ b/modules/chain/include/dap_chain_policy.h
@@ -67,6 +67,7 @@ typedef struct dap_chain_policy {
 } DAP_ALIGN_PACKED dap_chain_policy_t;
 
 int dap_chain_policy_init();
+void dap_chain_policy_deinit();
 int dap_chain_policy_net_add(uint64_t a_net_id);
 int dap_chain_policy_net_remove(uint64_t a_net_id);
 int dap_chain_policy_add(dap_chain_policy_t *a_policy, uint64_t a_net_id);
diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index 342b3adbec..421600f318 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -780,8 +780,8 @@ static dap_chain_net_t *s_net_new(const char *a_net_name, dap_config_t *a_cfg)
         if (!dap_chain_policy_num_is_valid(l_policy_num)) {
             log_it(L_ERROR, "Can't add policy CN-%"DAP_UINT64_FORMAT_U, l_policy_num);
         } else {
-            dap_chain_policy_t *l_new_policy = NULL;
-            l_new_policy = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(dap_chain_policy_t, sizeof(dap_chain_policy_activate_t), NULL, l_ret->pub.name, l_ret); 
+            dap_chain_policy_t *l_new_policy = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(dap_chain_policy_t, sizeof(dap_chain_policy_activate_t), NULL, l_ret->pub.name, l_ret); 
+            l_new_policy->type = DAP_CHAIN_POLICY_ACTIVATE;
             l_new_policy->version = DAP_CHAIN_POLICY_VERSION;
             ((dap_chain_policy_activate_t *)(l_new_policy->data))->num = l_policy_num;
             l_new_policy->flags = DAP_FLAG_ADD(l_new_policy->flags, DAP_CHAIN_POLICY_FLAG_ACTIVATE_BY_CONFIG);
@@ -1792,6 +1792,7 @@ void dap_chain_net_deinit()
         dap_chain_net_delete(l_net);
     }
     dap_http_ban_list_client_deinit();
+    dap_chain_policy_deinit();
 }
 
 /**
-- 
GitLab