diff --git a/modules/net/dap_chain_net_decree.c b/modules/net/dap_chain_net_decree.c
index 5d7402d711339ae71fdb3d28ab7b3464a2616394..1a4e189900f773d12a794d86fe30a59c1c6ccf97 100644
--- a/modules/net/dap_chain_net_decree.c
+++ b/modules/net/dap_chain_net_decree.c
@@ -183,47 +183,9 @@ int dap_chain_net_decree_verify(dap_chain_datum_decree_t *a_decree, dap_chain_ne
         return -100;
     }
 
-    // Concate all signs in array
-    uint32_t l_signs_count = 0;
-    size_t l_tsd_offset = dap_sign_get_size(l_signs_block);
-    size_t l_signs_arr_size = 0;
-    dap_sign_t *l_signs_arr = DAP_NEW_Z_SIZE(dap_sign_t, l_tsd_offset);
-    memcpy(l_signs_arr, l_signs_block, l_tsd_offset);
-    l_signs_arr_size += l_tsd_offset;
-    l_signs_count++;
-    while (l_tsd_offset < l_signs_size)
-    {
-        dap_sign_t *cur_sign = (dap_sign_t *)((byte_t*)l_signs_block + l_tsd_offset);
-        size_t l_sign_size = dap_sign_get_size(cur_sign);
-
-        if (l_sign_size > a_decree->header.signs_size)
-        {
-            log_it(L_WARNING,"Sign size greather than decree datum signs size. May be data is corrupted.");
-            DAP_DELETE(l_signs_arr);
-            return -105;
-        }
-
-        dap_sign_t *l_signs_arr_temp = (dap_sign_t *)DAP_REALLOC(l_signs_arr, l_signs_arr_size + l_sign_size);
-
-        if (!l_signs_arr_temp)
-        {
-            log_it(L_WARNING,"Memory allocate fail");
-            DAP_DELETE(l_signs_arr);
-            return -105;
-        }
-
-        l_signs_arr = l_signs_arr_temp;
-        memcpy((byte_t *)l_signs_arr + l_signs_arr_size, cur_sign, l_sign_size);
-
-
-        l_signs_arr_size += l_sign_size;
-        l_tsd_offset += l_sign_size;
-        l_signs_count++;
-    }
-
     // Find unique pkeys in pkeys set from previous step and check that number of signs > min
     size_t l_num_of_unique_signs = 0;
-    dap_sign_t **l_unique_signs = dap_sign_get_unique_signs(l_signs_arr, l_signs_arr_size, &l_num_of_unique_signs);
+    dap_sign_t **l_unique_signs = dap_sign_get_unique_signs(l_signs_block, l_signs_size, &l_num_of_unique_signs);
 
     uint16_t l_min_signs = a_net->pub.decree->min_num_of_owners;
     if (l_num_of_unique_signs < l_min_signs) {
@@ -233,6 +195,8 @@ int dap_chain_net_decree_verify(dap_chain_datum_decree_t *a_decree, dap_chain_ne
 
     // Verify all keys and its signatures
     uint16_t l_signs_size_for_current_sign = 0, l_signs_verify_counter = 0;
+    l_decree->header.signs_size = 0;
+    size_t l_verify_data_size = l_decree->header.data_size + sizeof(dap_chain_datum_decree_t);
 
     for(size_t i = 0; i < l_num_of_unique_signs; i++)
     {
@@ -240,20 +204,25 @@ int dap_chain_net_decree_verify(dap_chain_datum_decree_t *a_decree, dap_chain_ne
         if (s_verify_pkey(l_unique_signs[i], a_net))
         {
             // 3. verify sign
-            size_t l_verify_data_size = l_decree->header.data_size + sizeof(dap_chain_datum_decree_t);
-            l_decree->header.signs_size = l_signs_size_for_current_sign;
             if(!dap_sign_verify_all(l_unique_signs[i], l_sign_max_size, l_decree, l_verify_data_size))
             {
                 l_signs_verify_counter++;
             }
+        } else {
+            dap_hash_fast_t l_sign_hash = {0};
+            dap_hash_fast(l_unique_signs[i], l_sign_max_size, &l_sign_hash);
+            char *l_sign_hash_str = dap_hash_fast_to_str_new(&l_sign_hash);
+            log_it(L_WARNING, "Signature [%zu] %s failed public key verification.", i, l_sign_hash_str);
+            DAP_DELETE(l_sign_hash_str);
         }
-            // Each sign change the sign_size field by adding its size after signing. So we need to change this field in header for each sign.
-            l_signs_size_for_current_sign += l_sign_max_size;
+        // Each sign change the sign_size field by adding its size after signing. So we need to change this field in header for each sign.
+        l_signs_size_for_current_sign += l_sign_max_size;
+        l_decree->header.signs_size = l_signs_size_for_current_sign;
     }
 
-    l_decree->header.signs_size = l_signs_size_for_current_sign;
+    l_decree->header.signs_size = l_signs_size;
 
-    DAP_DELETE(l_signs_arr);
+//    DAP_DELETE(l_signs_arr);
     DAP_DELETE(l_unique_signs);
 
     if (l_signs_verify_counter < l_min_signs) {