From c685a30e52d0be91b3c9d47295997ccddde056fd Mon Sep 17 00:00:00 2001
From: "roman.khlopkov" <roman.khlopkov@demlabs.net>
Date: Mon, 19 Aug 2024 17:05:09 +0300
Subject: [PATCH] [*] TSD iterations acceptable way choosed

---
 dap-sdk                                       |   2 +-
 modules/common/dap_chain_datum_anchor.c       |  19 +-
 modules/common/dap_chain_datum_decree.c       | 208 +-----------------
 .../common/include/dap_chain_datum_anchor.h   |   2 +-
 modules/net/dap_chain_ledger.c                |   5 -
 5 files changed, 7 insertions(+), 229 deletions(-)

diff --git a/dap-sdk b/dap-sdk
index 0bc8b39bb0..31ae342434 160000
--- a/dap-sdk
+++ b/dap-sdk
@@ -1 +1 @@
-Subproject commit 0bc8b39bb03244c4f9d25c0b1228848bf27c9fe8
+Subproject commit 31ae342434501e6097f1c44712e092d47b2d582d
diff --git a/modules/common/dap_chain_datum_anchor.c b/modules/common/dap_chain_datum_anchor.c
index b3b4ea6da8..d0e934bb72 100644
--- a/modules/common/dap_chain_datum_anchor.c
+++ b/modules/common/dap_chain_datum_anchor.c
@@ -30,22 +30,11 @@
 
 #define LOG_TAG "dap_chain_datum_anchor"
 
-int dap_chain_datum_anchor_get_hash_from_data(dap_chain_datum_anchor_t* a_anchor, dap_hash_fast_t * l_out_hash)
+int dap_chain_datum_anchor_get_hash_from_data(dap_chain_datum_anchor_t* a_anchor, dap_hash_fast_t *a_out_hash)
 {
-    if(!a_anchor){
-        log_it(L_WARNING,"Wrong arguments");
-        return -1;
-    }
-    dap_tsd_t *l_tsd; size_t l_tsd_size;
-    dap_tsd_iter(l_tsd, l_tsd_size, a_anchor->data_n_sign, a_anchor->header.data_size) {
-        if (l_tsd->type == DAP_CHAIN_DATUM_ANCHOR_TSD_TYPE_DECREE_HASH) {
-            if (l_tsd->size > sizeof(dap_hash_fast_t))
-                return log_it(L_WARNING,"Wrong fee tsd data size"), -1;
-            _dap_tsd_get_scalar(l_tsd, l_out_hash);
-            return 0;
-        }
-    }
-    return -2;
+    dap_return_val_if_fail(a_anchor && a_out_hash, -1);
+    dap_tsd_t *l_tsd = dap_tsd_find(a_anchor->data_n_sign, a_anchor->header.data_size, DAP_CHAIN_DATUM_ANCHOR_TSD_TYPE_DECREE_HASH);
+    return l_tsd && l_tsd->size == sizeof(dap_hash_fast_t) ? ( _dap_tsd_get_scalar(l_tsd, a_out_hash), 0 ) : 1;
 }
 
 void dap_chain_datum_anchor_certs_dump(dap_string_t * a_str_out, byte_t * a_signs, size_t a_certs_size, const char *a_hash_out_type)
diff --git a/modules/common/dap_chain_datum_decree.c b/modules/common/dap_chain_datum_decree.c
index 405ae8ffdc..5ef31fc6f9 100644
--- a/modules/common/dap_chain_datum_decree.c
+++ b/modules/common/dap_chain_datum_decree.c
@@ -71,12 +71,7 @@ int dap_chain_datum_decree_get_fee_addr(dap_chain_datum_decree_t *a_decree, dap_
 dap_list_t *dap_chain_datum_decree_get_owners(dap_chain_datum_decree_t *a_decree, uint16_t *a_owners_num)
 {
     dap_return_val_if_fail(a_decree && a_owners_num, NULL);
-    dap_list_t *l_ret = NULL;
-    dap_tsd_t *l_tsd; size_t l_tsd_size;
-    dap_tsd_iter(l_tsd, l_tsd_size, a_decree->data_n_signs, a_decree->header.data_size) {
-        if (l_tsd->type == DAP_CHAIN_DATUM_DECREE_TSD_TYPE_OWNER)
-            l_ret = dap_list_append( l_ret, DAP_DUP_SIZE(l_tsd->data, dap_pkey_get_size((dap_pkey_t*)l_tsd->data)) );
-    }
+    dap_list_t *l_ret = dap_tsd_find_all(a_decree->data_n_signs, a_decree->header.data_size, DAP_CHAIN_DATUM_DECREE_TSD_TYPE_OWNER);
     if (a_owners_num)
         *a_owners_num = (uint16_t)dap_list_length(l_ret);
     return l_ret;
@@ -154,207 +149,6 @@ int dap_chain_datum_decree_get_ban_addr(dap_chain_datum_decree_t *a_decree, cons
     return l_tsd ? ( *a_addr = dap_tsd_get_string_const(l_tsd), !dap_strcmp(*a_addr, DAP_TSD_CORRUPTED_STRING) ) : 1;
 }
 
-void dap_chain_datum_decree_dump(dap_string_t *a_str_out, dap_chain_datum_decree_t *a_decree, size_t a_decree_size, const char *a_hash_out_type)
-{
-    char *l_type_str = "";
-    switch(a_decree->header.type)
-    {
-        case DAP_CHAIN_DATUM_DECREE_TYPE_COMMON:
-            l_type_str = "DECREE_TYPE_COMMON";
-            break;
-        case DAP_CHAIN_DATUM_DECREE_TYPE_SERVICE:
-            l_type_str = "DECREE_TYPE_SERVICE";
-            break;
-        default:
-            l_type_str = "DECREE_TYPE_UNKNOWN";
-    }
-    dap_string_append_printf(a_str_out, "type: %s\n", l_type_str);
-    const char *l_subtype_str = dap_chain_datum_decree_subtype_to_str(a_decree->header.sub_type);
-    dap_string_append_printf(a_str_out, "subtype: %s\n", l_subtype_str);
-    dap_string_append_printf(a_str_out, "TSD:\n");
-    dap_tsd_t *l_tsd; size_t l_tsd_size;
-    dap_tsd_iter(l_tsd, l_tsd_size, a_decree->data_n_signs, a_decree->header.data_size) {
-        switch(l_tsd->type) {
-        case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_VALUE:
-            if (l_tsd->size != sizeof(uint256_t)){
-                dap_string_append_printf(a_str_out, "\tValue: <WRONG SIZE>\n");
-                break;
-            }
-            uint256_t l_value = uint256_0;
-            _dap_tsd_get_scalar(l_tsd, &l_value);
-            const char *l_value_str = dap_uint256_to_char(l_value, NULL);
-            dap_string_append_printf(a_str_out, "\tValue: %s\n", l_value_str);
-            break;
-        case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_SIGN:
-            break;
-        case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_FEE:
-            if (l_tsd->size != sizeof(uint256_t)){
-                dap_string_append_printf(a_str_out, "\tFee: <WRONG SIZE>\n");
-                break;
-            }
-            uint256_t l_fee_value = uint256_0;
-            _dap_tsd_get_scalar(l_tsd, &l_fee_value);
-            const char *l_fee_value_str = dap_uint256_to_char(l_fee_value, NULL);
-            dap_string_append_printf(a_str_out, "\tFee: %s\n", l_fee_value_str);
-            break;
-        case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_OWNER:
-            if (l_tsd->size != sizeof(dap_pkey_t)) {
-                dap_string_append_printf(a_str_out, "\tOwner fingerprint: <WRONG SIZE>\n");
-                break;
-            }
-            dap_pkey_t *l_owner_pkey = /*DAP_NEW_STACK_SIZE(dap_pkey_t, l_tsd->size);
-            memcpy(l_owner_pkey, l_tsd->data, l_tsd->size);*/ _dap_tsd_get_object(l_tsd, dap_pkey_t);
-            char *l_owner_pkey_str;
-            dap_get_data_hash_str_static(l_owner_pkey->pkey, l_owner_pkey->header.size, l_owner_pkey_str);
-            dap_string_append_printf(a_str_out, "\tOwner fingerprint: %s\n", l_owner_pkey_str);
-            break;
-        case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_MIN_OWNER:
-            if (l_tsd->size != sizeof(uint256_t)) {
-                dap_string_append_printf(a_str_out, "\tOwner min: <WRONG SIZE>\n");
-                break;
-            }
-            uint256_t l_owner_min = uint256_0;
-            _dap_tsd_get_scalar(l_tsd, &l_owner_min);
-            const char *l_owner_min_str = dap_uint256_to_char(l_owner_min, NULL);
-            dap_string_append_printf(a_str_out, "\tOwner min: %s\n", l_owner_min_str);
-            break;
-        case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_FEE_WALLET:
-            if (l_tsd->size != sizeof(dap_chain_addr_t)) {
-                dap_string_append_printf(a_str_out, "\tWallet for fee: <WRONG SIZE>\n");
-                break;
-            }
-            dap_chain_addr_t *l_addr_fee_wallet = /*{ };
-            _dap_tsd_get_scalar(l_tsd, &l_addr_fee_wallet);*/ _dap_tsd_get_object(l_tsd, dap_chain_addr_t);
-            dap_string_append_printf(a_str_out, "\tWallet for fee: %s\n", dap_chain_addr_to_str_static(l_addr_fee_wallet));
-            break;
-        case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_HASH:
-            if (l_tsd->size != sizeof(dap_hash_fast_t)) {
-                dap_string_append_printf(a_str_out, "\tHash: <WRONG SIZE>\n");
-                break;
-            }
-            dap_hash_fast_t *l_stake_tx = /*{ };
-            _dap_tsd_get_scalar(l_tsd, &l_stake_tx);*/ _dap_tsd_get_object(l_tsd, dap_hash_fast_t);
-            const char *l_stake_tx_hash = dap_strcmp(a_hash_out_type, "hex")
-                ? dap_enc_base58_encode_hash_to_str_static(l_stake_tx)
-                : dap_chain_hash_fast_to_str_static(l_stake_tx);
-            dap_string_append_printf(a_str_out, "\tHash: %s\n", l_stake_tx_hash);
-            break;
-        case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_STAKE_VALUE:
-            if (l_tsd->size != sizeof(uint256_t)){
-                dap_string_append_printf(a_str_out, "\tStake value: <WRONG SIZE>\n");
-                break;
-            }
-            uint256_t l_stake_value = uint256_0;
-            _dap_tsd_get_scalar(l_tsd, &l_stake_value);
-            const char *l_stake_value_str = dap_uint256_to_char(l_stake_value, NULL);
-            dap_string_append_printf(a_str_out, "\tStake value: %s\n", l_stake_value_str);
-            break;
-        case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_STAKE_SIGNING_ADDR:
-            if (l_tsd->size != sizeof(dap_chain_addr_t)) {
-                dap_string_append_printf(a_str_out, "\tSigning addr: <WRONG SIZE>\n");
-                break;
-            }
-            dap_chain_addr_t *l_stake_addr_signing = /*{ };
-            _dap_tsd_get_scalar(l_tsd, &l_stake_addr_signing);*/ _dap_tsd_get_object(l_tsd, dap_chain_addr_t);
-            dap_string_append_printf(a_str_out, "\tSigning addr: %s\n", dap_chain_addr_to_str_static(l_stake_addr_signing));
-            dap_chain_hash_fast_t l_pkey_signing = l_stake_addr_signing->data.hash_fast;
-            const char *l_pkey_signing_str = dap_strcmp(a_hash_out_type, "hex")
-                    ? dap_enc_base58_encode_hash_to_str_static(&l_pkey_signing)
-                    : dap_chain_hash_fast_to_str_static(&l_pkey_signing);
-            dap_string_append_printf(a_str_out, "\tSigning pkey fingerprint: %s\n", l_pkey_signing_str);
-        case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_NODE_ADDR:
-            if (l_tsd->size != sizeof(dap_chain_node_addr_t)){
-                dap_string_append_printf(a_str_out, "\tNode addr: <WRONG SIZE>\n");
-                break;
-            }
-            dap_chain_node_addr_t *l_node_addr = _dap_tsd_get_object(l_tsd, dap_chain_node_addr_t);
-            dap_string_append_printf(a_str_out, "\tNode addr: "NODE_ADDR_FP_STR"\n", NODE_ADDR_FP_ARGS(l_node_addr));
-            break;
-        case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_STAKE_MIN_VALUE:
-            if (l_tsd->size != sizeof(uint256_t)) {
-                dap_string_append_printf(a_str_out, "\tMin value: <WRONG SIZE>\n");
-                break;
-            }
-            uint256_t l_min_value = uint256_0;
-            _dap_tsd_get_scalar(l_tsd, &l_min_value);
-            const char *l_min_value_str = dap_uint256_to_char(l_min_value, NULL);
-            dap_string_append_printf(a_str_out, "\tMin value: %s\n", l_min_value_str);
-            break;
-        case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_STAKE_MIN_SIGNERS_COUNT:
-            if (l_tsd->size != sizeof(uint256_t)) {
-                dap_string_append_printf(a_str_out, "\tMin signers count: <WRONG SIZE>\n");
-                break;
-            }
-            uint256_t l_min_signers_count = uint256_0;
-            _dap_tsd_get_scalar(l_tsd, &l_min_signers_count);
-            const char *l_min_signers_count_str = dap_uint256_to_char(l_min_signers_count, NULL);
-            dap_string_append_printf(a_str_out, "\tMin signers count: %s\n", l_min_signers_count_str);
-            break;
-        case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_HOST:
-        case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_STRING:
-            dap_string_append_printf(a_str_out, "\tHost address: %s\n", dap_tsd_get_string(l_tsd));
-            break;
-        case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_ACTION:
-            if (l_tsd->size != sizeof(uint8_t)){
-                dap_string_append_printf(a_str_out, "\tAction: <WRONG SIZE>\n");
-                break;
-            }
-            uint8_t l_action = 0;
-            _dap_tsd_get_scalar(l_tsd, &l_action);
-            dap_string_append_printf(a_str_out, "\tAction: %s\n", l_action ? "add (enable)" : "delete (disable)");
-            break;
-        case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_SIGNATURE_TYPE:
-            if (l_tsd->size != sizeof(uint32_t)){
-                dap_string_append_printf(a_str_out, "\tSignature type: <WRONG SIZE>\n");
-                break;
-            }
-            uint32_t l_type = 0;
-            _dap_tsd_get_scalar(l_tsd, &l_type);
-            dap_sign_type_t l_sign_type = { .type = l_type };
-            dap_string_append_printf(a_str_out, "\tSignature type: %s\n", dap_sign_type_to_str(l_sign_type));
-            break;
-        default:
-            dap_string_append_printf(a_str_out, "\t<UNKNOWN_TYPE_TSD_SECTION>\n");
-            break;
-        }
-    }
-    dap_chain_datum_decree_certs_dump(a_str_out, a_decree->data_n_signs + a_decree->header.data_size,
-                                      a_decree->header.signs_size, a_hash_out_type);
-}
-
-void dap_chain_datum_decree_certs_dump(dap_string_t * a_str_out, byte_t * a_signs, size_t a_certs_size, const char *a_hash_out_type)
-{
-    dap_string_append_printf(a_str_out, "signatures: ");
-    if (!a_certs_size) {
-        dap_string_append_printf(a_str_out, "<NONE>\n");
-        return;
-    }
-
-    dap_string_append_printf(a_str_out, "\n");
-
-    size_t l_offset = 0;
-    for (int i = 1; l_offset < (a_certs_size); i++) {
-        dap_sign_t *l_sign = (dap_sign_t *) (a_signs + l_offset);
-        l_offset += dap_sign_get_size(l_sign);
-        if (l_sign->header.sign_size == 0) {
-            dap_string_append_printf(a_str_out, "<CORRUPTED - 0 size signature>\n");
-            continue;
-        }
-
-        dap_chain_hash_fast_t l_pkey_hash = {0};
-        if (dap_sign_get_pkey_hash(l_sign, &l_pkey_hash) == false) {
-            dap_string_append_printf(a_str_out, "<CORRUPTED - can't calc hash>\n");
-            continue;
-        }
-
-        const char *l_hash_str = dap_strcmp(a_hash_out_type, "hex")
-                ? dap_enc_base58_encode_hash_to_str_static(&l_pkey_hash)
-                : dap_chain_hash_fast_to_str_static(&l_pkey_hash);
-        dap_string_append_printf(a_str_out, "%d) %s, %s, %u bytes\n", i, l_hash_str,
-                                 dap_sign_type_to_str(l_sign->header.type), l_sign->header.sign_size);
-    }
-}
-
 void dap_chain_datum_decree_dump_json(json_object *a_json_out, dap_chain_datum_decree_t *a_decree, size_t a_decree_size, const char *a_hash_out_type)
 {
     char *l_type_str = "";
diff --git a/modules/common/include/dap_chain_datum_anchor.h b/modules/common/include/dap_chain_datum_anchor.h
index 16c1ab9159..79a0c48102 100644
--- a/modules/common/include/dap_chain_datum_anchor.h
+++ b/modules/common/include/dap_chain_datum_anchor.h
@@ -48,7 +48,7 @@ DAP_STATIC_INLINE size_t dap_chain_datum_anchor_get_size(dap_chain_datum_anchor_
     return sizeof(*a_datum_anchor) + a_datum_anchor->header.data_size + a_datum_anchor->header.signs_size;
 }
 
-int dap_chain_datum_anchor_get_hash_from_data(dap_chain_datum_anchor_t* a_anchor, dap_hash_fast_t * l_out_hash);
+int dap_chain_datum_anchor_get_hash_from_data(dap_chain_datum_anchor_t* a_anchor, dap_hash_fast_t * a_out_hash);
 void dap_chain_datum_anchor_certs_dump(dap_string_t * a_str_out, byte_t * a_signs,
                                        size_t a_certs_size, const char *a_hash_out_type);
 
diff --git a/modules/net/dap_chain_ledger.c b/modules/net/dap_chain_ledger.c
index e55e10c626..d10b144a15 100644
--- a/modules/net/dap_chain_ledger.c
+++ b/modules/net/dap_chain_ledger.c
@@ -608,10 +608,6 @@ static int s_token_tsd_parse(dap_ledger_token_item_t *a_item_apply_to, dap_chain
                   l_new_tx_send_allow, l_new_tx_send_block, \
                   l_new_pkeys, l_new_pkey_hashes);          \
     ret_code; })
-#if 0
-    dap_tsd_t *l_tsd; size_t l_tsd_size;
-    dap_tsd_iter(l_tsd, l_tsd_size, a_tsd, a_tsd_total_size) {
-#else
     uint64_t l_tsd_size = 0;
     dap_tsd_t *l_tsd = (dap_tsd_t *)a_tsd;
     for (uint64_t l_offset = 0; l_offset < a_tsd_total_size; l_offset += l_tsd_size) {
@@ -625,7 +621,6 @@ static int s_token_tsd_parse(dap_ledger_token_item_t *a_item_apply_to, dap_chain
             log_it(L_WARNING, "Wrong TSD size %zu, exiting TSD parse", l_tsd_size);
             return m_ret_cleanup(DAP_LEDGER_CHECK_INVALID_SIZE);
         }
-#endif
         switch (l_tsd->type) {
         // set flags
         case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_SET_FLAGS: {
-- 
GitLab