From 286a6ecad50c7147edfa306a5de56b7a20bc74ce Mon Sep 17 00:00:00 2001 From: Aleksey Feoktistov <aleksey@synestproject.com> Date: Mon, 29 Nov 2021 17:24:13 +0500 Subject: [PATCH] [*] minor fixes --- dap-sdk/core/include/dap_math_ops.h | 23 ++-- modules/chain/dap_chain_ledger.c | 186 +++++++++------------------- 2 files changed, 74 insertions(+), 135 deletions(-) diff --git a/dap-sdk/core/include/dap_math_ops.h b/dap-sdk/core/include/dap_math_ops.h index 036d134156..f3f3061f34 100755 --- a/dap-sdk/core/include/dap_math_ops.h +++ b/dap-sdk/core/include/dap_math_ops.h @@ -49,17 +49,15 @@ typedef union int128 { typedef int128_t _dap_int128_t; -typedef struct uint256_t { +typedef struct uint256 { uint128_t hi; uint128_t lo; +} uint256_t; - } uint256_t; - -typedef struct uint512_t { +typedef struct uint512 { uint256_t hi; uint256_t lo; - - } uint512_t; +} uint512_t; #endif //defined(__GNUC__) || defined (__clang__) @@ -125,7 +123,12 @@ static inline bool EQUAL_128(uint128_t a_128_bit, uint128_t b_128_bit){ return a_128_bit.lo==b_128_bit.lo && a_128_bit.hi==b_128_bit.hi; #endif } - + + +static inline bool IS_ZERO_128(uint128_t a_128_bit){ + return EQUAL_128(a_128_bit, uint128_0); +} + static inline bool EQUAL_256(uint256_t a_256_bit, uint256_t b_256_bit){ #ifdef DAP_GLOBAL_IS_INT128 @@ -139,6 +142,12 @@ static inline bool EQUAL_256(uint256_t a_256_bit, uint256_t b_256_bit){ #endif } +static inline bool IS_ZERO_256(uint256_t a_256_bit){ + + return a_256_bit.lo == (uint128_t)0; +} + + static inline uint128_t AND_128(uint128_t a_128_bit,uint128_t b_128_bit){ #ifdef DAP_GLOBAL_IS_INT128 diff --git a/modules/chain/dap_chain_ledger.c b/modules/chain/dap_chain_ledger.c index cbec8de39d..7602f91439 100644 --- a/modules/chain/dap_chain_ledger.c +++ b/modules/chain/dap_chain_ledger.c @@ -1801,20 +1801,6 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t dap_hash_fast(l_pkey_ser, l_pkey_ser_size, &l_hash_pkey); // hash of public key in 'out' item of previous transaction - //uint8_t *l_prev_out_addr_key = NULL; - // switch (l_type) { - // case TX_ITEM_TYPE_256_OUT: - // l_prev_out_addr_key = bound_item->out.tx_prev_out_256->addr.data.key; break; - // case TX_ITEM_TYPE_OUT: - // l_prev_out_addr_key = bound_item->out.tx_prev_out->addr.data.key; break; - // case TX_ITEM_TYPE_256_OUT_EXT: - // l_prev_out_addr_key = bound_item->out.tx_prev_out_ext_256->addr.data.key; break; - // case TX_ITEM_TYPE_OUT_EXT: - // l_prev_out_addr_key = bound_item->out.tx_prev_out_ext->addr.data.key; break; - // default: - // log_it(L_DEBUG, "Unknown item type %d", l_type); - // break; - // } uint8_t *l_prev_out_addr_key = (l_type == TX_ITEM_TYPE_OUT || l_type == TX_ITEM_TYPE_256_OUT) ? bound_item->out.tx_prev_out->addr.data.key : bound_item->out.tx_prev_out_ext->addr.data.key; @@ -1844,13 +1830,6 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t break; } - // if (l_type == TX_ITEM_TYPE_OUT || l_type == TX_ITEM_TYPE_256_OUT) { - // l_value = bound_item->out.tx_prev_out->header.value; - // } else { - // l_value = bound_item->out.tx_prev_out_ext->header.value; - // l_token = bound_item->out.tx_prev_out_ext->token; - // } - } else { // TX_ITEM_TYPE_IN_COND dap_chain_tx_item_type_t l_type = *(uint8_t *)l_tx_prev_out; if( l_type != TX_ITEM_TYPE_OUT_COND && l_type != TX_ITEM_TYPE_256_OUT_COND) { @@ -1872,19 +1851,11 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t size_t l_pkey_ser_size = 0; const uint8_t *l_pkey_ser = dap_sign_get_pkey(l_sign, &l_pkey_ser_size); - //dap_chain_tx_out_cond_t *l_tx_prev_out_cond = NULL; - //dap_chain_256_tx_out_cond_t *l_tx_prev_out_cond_256 = NULL; // 256 dap_chain_tx_out_cond_t *l_tx_prev_out_cond = (dap_chain_tx_out_cond_t *)l_tx_prev_out; l_is_type_256 = l_type == TX_ITEM_TYPE_256_OUT_COND ? true : false; - // if ( l_type == TX_ITEM_TYPE_256_OUT_COND ) { // 256 - // l_is_type_256 = true; - // l_tx_prev_out_cond_256 = (dap_chain_256_tx_out_cond_t *)l_tx_prev_out; - // } else { - // l_tx_prev_out_cond = (dap_chain_tx_out_cond_t *)l_tx_prev_out; - // } if (l_pkey_ser_size != l_prev_pkey_ser_size || memcmp(l_prev_pkey_ser, l_pkey_ser, l_prev_pkey_ser_size)) { @@ -1892,11 +1863,6 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t dap_chain_ledger_verificator_t *l_verificator; int l_tmp = (int)l_tx_prev_out_cond->header.subtype; - // if ( l_type == TX_ITEM_TYPE_256_OUT_COND ) { // 256 - // l_tmp = (int)l_tx_prev_out_cond_256->header.subtype; - // } else { - // l_tmp = (int)l_tx_prev_out_cond->header.subtype; - // } pthread_rwlock_rdlock(&s_verificators_rwlock); HASH_FIND_INT(s_verificators, &l_tmp, l_verificator); @@ -1908,7 +1874,6 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t break; } if (l_verificator->callback(l_tx_prev_out_cond, a_tx) == false) { -// && l_verificator->callback(l_tx_prev_out_cond_256, a_tx) == false ) { l_err_num = -14; break; } @@ -1916,11 +1881,8 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t bound_item->out.tx_prev_out_cond = l_tx_prev_out_cond; if ( l_type == TX_ITEM_TYPE_256_OUT_COND ) { // 256 - // bound_item->out.tx_prev_out_cond_256 = l_tx_prev_out_cond_256; - // calculate sum of values from previous transactions l_value_256 = l_tx_prev_out_cond->header.value_256; } else { - //bound_item->out.tx_prev_out_cond = l_tx_prev_out_cond; l_value = l_tx_prev_out_cond->header.value; } l_token = NULL; @@ -1972,21 +1934,6 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t } } - // HASH_FIND_STR(l_values_from_prev_tx, l_token, l_value_cur); - // if (!l_value_cur) { - // l_value_cur = DAP_NEW_Z(dap_chain_ledger_tokenizer_t); - // strcpy(l_value_cur->token_ticker, l_token); - // HASH_ADD_STR(l_values_from_prev_tx, token_ticker, l_value_cur); - - // if ( l_is_type_256 ) { // 256 - // l_value_cur->type_256 = true; - // SUM_256_256(l_value_cur->sum_256, l_value_256, &l_value_cur->sum_256); - // }else { - // l_value_cur->type_256 = false; - // l_value_cur->sum += l_value; - // } - // } - if ( l_is_type_256 ) { // 256 HASH_FIND_STR(l_values_from_prev_tx_256, l_token, l_value_cur_256); if (!l_value_cur_256) { @@ -2028,7 +1975,7 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t // 6. Compare sum of values in 'out' items in the current transaction and in the previous transactions // Calculate the sum of values in 'out' items from the current transaction bool l_multichannel = false; - if (HASH_COUNT(l_values_from_prev_tx) > 1){ //|| HASH_COUNT(l_values_from_prev_tx_256) > 1) { + if (HASH_COUNT(l_values_from_prev_tx) > 1){ l_multichannel = true; } else { l_value_cur = DAP_NEW_Z(dap_chain_ledger_tokenizer_t); @@ -2135,19 +2082,6 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t l_list_tx_out = dap_list_append(l_list_tx_out, l_tx_out); } - // if (l_multichannel) { - // HASH_FIND_STR(l_values_from_cur_tx, l_token, l_value_cur); - // if (!l_value_cur) { - // l_value_cur = DAP_NEW_Z(dap_chain_ledger_tokenizer_t); - // strcpy(l_value_cur->token_ticker, l_token); - // HASH_ADD_STR(l_values_from_cur_tx, token_ticker, l_value_cur); - // } - // } - // if (l_is_type_256) // 256 - // SUM_256_256(l_value_cur_256->sum, l_value_256, &l_value_cur_256->sum); - // else - // l_value_cur->sum += l_value; - if (l_is_type_256) { // 256 if (l_multichannel) { HASH_FIND_STR(l_values_from_cur_tx_256, l_token, l_value_cur_256); @@ -2218,7 +2152,6 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t while (l_is_first_transaction && !l_err_num) { if (l_ledger_priv->check_token_emission) { // Check the token emission dap_chain_datum_token_emission_t * l_token_emission = dap_chain_ledger_token_emission_find(a_ledger, l_token, l_emission_hash); - //dap_chain_datum_256_token_emission_t * l_token_emission_256 = dap_chain_ledger_token_emission_256_find(a_ledger, l_token, l_emission_hash); if (l_token_emission) { if (l_token_emission->hdr.value != l_value_cur->sum && !EQUAL_256(l_token_emission->hdr.value_256, l_value_cur_256->sum) ) { @@ -2455,13 +2388,6 @@ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_chain_ledger_tx_item_t *l_prev_item_out = bound_item->item_out; - // if ( *l_prev_item_out->cache_data.token_tiker ) - // l_ticker_trl = dap_stpcpy(l_token_ticker, l_prev_item_out->cache_data.token_tiker); - // else if ( l_out_type == TX_ITEM_TYPE_256_OUT || l_out_type == TX_ITEM_TYPE_256_OUT_EXT ) // 256 - // l_ticker_trl = dap_stpcpy(l_token_ticker, bound_item->out.tx_prev_out_ext_256->token); - // else - // l_ticker_trl = dap_stpcpy(l_token_ticker, bound_item->out.tx_prev_out_ext->token); - l_ticker_trl = *l_prev_item_out->cache_data.token_tiker ? dap_stpcpy(l_token_ticker, l_prev_item_out->cache_data.token_tiker) : dap_stpcpy(l_token_ticker, bound_item->out.tx_prev_out_ext->token); @@ -2481,16 +2407,6 @@ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, //dap_chain_addr_t *l_addr = NULL; uint256_t l_value = uint256_0; - // switch (l_out_type) { - // case TX_ITEM_TYPE_256_OUT: l_addr = &bound_item->out.tx_prev_out_256->addr; break; - // case TX_ITEM_TYPE_OUT: l_addr = &bound_item->out.tx_prev_out->addr; break; - // case TX_ITEM_TYPE_256_OUT_EXT: l_addr = &bound_item->out.tx_prev_out_ext_256->addr; break; - // case TX_ITEM_TYPE_OUT_EXT: l_addr = &bound_item->out.tx_prev_out_ext->addr; break; - // default: - // log_it(L_DEBUG, "Unknown item type %d", l_type); - // break; - // } - dap_chain_addr_t *l_addr = (l_out_type == TX_ITEM_TYPE_OUT || l_out_type == TX_ITEM_TYPE_256_OUT) ? &bound_item->out.tx_prev_out->addr : &bound_item->out.tx_prev_out_ext->addr; @@ -2501,9 +2417,6 @@ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, HASH_FIND_STR(PVT(a_ledger)->balance_accounts, l_wallet_balance_key, wallet_balance); pthread_rwlock_unlock(&PVT(a_ledger)->balance_accounts_rwlock); if (wallet_balance) { - // uint64_t l_value = (l_out_type == TX_ITEM_TYPE_OUT) ? - // bound_item->out.tx_prev_out->header.value : - // bound_item->out.tx_prev_out_ext->header.value; switch (l_out_type) { case TX_ITEM_TYPE_256_OUT: l_value = bound_item->out.tx_prev_out->header.value_256; break; case TX_ITEM_TYPE_OUT: l_value = GET_256_FROM_64(bound_item->out.tx_prev_out->header.value); break; @@ -2517,9 +2430,6 @@ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, if(s_debug_more) log_it(L_DEBUG,"SPEND %s from addr: %s", dap_chain_u256tostr(l_value), l_wallet_balance_key); - //uint128_t l_sub = dap_chain_uint128_from(l_value); - //uint128_t l_sub = dap_chain_uint128_from_uint256(l_value_256); - //wallet_balance->balance = dap_uint128_substract(wallet_balance->balance, l_sub); SUBTRACT_256_256(wallet_balance->balance, l_value, &wallet_balance->balance); // Update the cache @@ -2603,9 +2513,7 @@ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, } dap_chain_tx_out_t *l_out_item = NULL; - // dap_chain_256_tx_out_t *l_out_item_256 = NULL; dap_chain_tx_out_ext_t *l_out_item_ext = NULL; - // dap_chain_256_tx_out_ext_t *l_out_item_ext_256 = NULL; switch (l_type) { case TX_ITEM_TYPE_256_OUT: l_out_item = l_tx_out->data; break; @@ -2623,17 +2531,6 @@ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, &l_out_item->addr : &l_out_item_ext->addr; - // dap_chain_addr_t *l_addr; - // switch (l_type) { - // case TX_ITEM_TYPE_256_OUT: l_addr = &l_out_item->addr; break; // _256 - // case TX_ITEM_TYPE_OUT: l_addr = &l_out_item->addr; break; - // case TX_ITEM_TYPE_256_OUT_EXT: l_addr = &l_out_item_ext->addr; break; // _256 - // case TX_ITEM_TYPE_OUT_EXT: l_addr = &l_out_item_ext->addr; break; - // default: - // log_it(L_DEBUG, "Unknown item type %d", l_type); - // break; - // } - char *l_addr_str = dap_chain_addr_to_str(l_addr); //log_it (L_DEBUG, "Check unspent %.03Lf %s for addr %s", @@ -2659,16 +2556,14 @@ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, // l_value = (l_type == TX_ITEM_TYPE_OUT || l_type == TX_ITEM_TYPE_256_OUT) ? l_out_item->header.value : l_out_item_ext->header.value; if(s_debug_more) - log_it (L_DEBUG,"GOT %"DAP_UINT64_FORMAT_U" to addr: %s", dap_chain_uint256_to(l_value_256), l_wallet_balance_key); + log_it (L_DEBUG,"GOT %s to addr: %s", dap_chain_u256tostr(l_value_256), l_wallet_balance_key); pthread_rwlock_rdlock(&l_ledger_priv->balance_accounts_rwlock); HASH_FIND_STR(PVT(a_ledger)->balance_accounts, l_wallet_balance_key, wallet_balance); pthread_rwlock_unlock(&l_ledger_priv->balance_accounts_rwlock); if (wallet_balance) { if(s_debug_more) log_it(L_DEBUG, "Balance item is present in cache"); - // uint128_t l_add = dap_chain_uint128_from(l_value); - // uint128_t l_add = dap_chain_uint128_from_uint256(l_value); - // wallet_balance->balance = dap_uint128_add(wallet_balance->balance, l_add); + SUM_256_256(wallet_balance->balance, l_value_256, &wallet_balance->balance); DAP_DELETE (l_wallet_balance_key); // Update the cache @@ -2677,10 +2572,7 @@ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, wallet_balance = DAP_NEW_Z(dap_ledger_wallet_balance_t); wallet_balance->key = l_wallet_balance_key; strcpy(wallet_balance->token_ticker, l_token_ticker); - //uint128_t l_add = dap_chain_uint128_from(l_value); - - // uint128_t l_add = dap_chain_uint128_from_uint256(l_value); - // wallet_balance->balance = dap_uint128_add(wallet_balance->balance, l_add); + SUM_256_256(wallet_balance->balance, l_value_256, &wallet_balance->balance); if(s_debug_more) @@ -3375,6 +3267,7 @@ dap_list_t *dap_chain_ledger_get_list_tx_outs_with_val(dap_ledger_t *a_ledger, c dap_list_t *l_list_used_out = NULL; // list of transaction with 'out' items dap_chain_hash_fast_t l_tx_cur_hash = { 0 }; uint64_t l_value_transfer = 0; + //uint256_t l_value_transfer = uint256_0; while(l_value_transfer < a_value_need) { // Get the transaction in the cache by the addr in out item @@ -3388,34 +3281,70 @@ dap_list_t *dap_chain_ledger_get_list_tx_outs_with_val(dap_ledger_t *a_ledger, c uint32_t l_out_idx_tmp = 0; // current index of 'out' item for (dap_list_t *l_list_tmp = l_list_out_items; l_list_tmp; l_list_tmp = dap_list_next(l_list_tmp), l_out_idx_tmp++) { dap_chain_tx_item_type_t l_type = *(uint8_t *)l_list_tmp->data; - if (l_type == TX_ITEM_TYPE_OUT_COND) { + if (l_type == TX_ITEM_TYPE_OUT_COND || l_type == TX_ITEM_TYPE_256_OUT_COND) { continue; } - uint64_t l_value; - if (l_type == TX_ITEM_TYPE_OUT) { - dap_chain_tx_out_t *l_out = (dap_chain_tx_out_t *)l_list_tmp->data; - if (!l_out->header.value || memcmp(a_addr_from, &l_out->addr, sizeof(dap_chain_addr_t))) { - continue; - } - l_value = l_out->header.value; - } else { // TX_ITEM_TYPE_OUT_EXT - dap_chain_tx_out_ext_t *l_out_ext = (dap_chain_tx_out_ext_t *)l_list_tmp->data; - if (!l_out_ext->header.value || memcmp(a_addr_from, &l_out_ext->addr, sizeof(dap_chain_addr_t)) || - strcmp((char *)a_token_ticker, l_out_ext->token)) { - continue; - } - l_value = l_out_ext->header.value; + // uint64_t l_value; + uint256_t l_value = uint256_0; + switch (l_type) { + case TX_ITEM_TYPE_OUT: { + dap_chain_tx_out_t *l_out = (dap_chain_tx_out_t *)l_list_tmp->data; + if (!l_out->header.value || memcmp(a_addr_from, &l_out->addr, sizeof(dap_chain_addr_t))) { + continue; + } + l_value = GET_256_FROM_64(l_out->header.value); + } break; + case TX_ITEM_TYPE_256_OUT: { + dap_chain_tx_out_t *l_out = (dap_chain_tx_out_t *)l_list_tmp->data; + if ( IS_ZERO_256(l_out->header.value_256) || memcmp(a_addr_from, &l_out->addr, sizeof(dap_chain_addr_t))) { + continue; + } + l_value = l_out->header.value_256; + } break; + case TX_ITEM_TYPE_OUT_EXT: { + dap_chain_tx_out_ext_t *l_out_ext = (dap_chain_tx_out_ext_t *)l_list_tmp->data; + if (!l_out_ext->header.value || memcmp(a_addr_from, &l_out_ext->addr, sizeof(dap_chain_addr_t)) || + strcmp((char *)a_token_ticker, l_out_ext->token)) { + continue; + } + l_value = GET_256_FROM_64(l_out_ext->header.value); + } break; + case TX_ITEM_TYPE_256_OUT_EXT: { + dap_chain_tx_out_ext_t *l_out_ext = (dap_chain_tx_out_ext_t *)l_list_tmp->data; + if ( IS_ZERO_256(l_out_ext->header.value_256) || memcmp(a_addr_from, &l_out_ext->addr, sizeof(dap_chain_addr_t)) || + strcmp((char *)a_token_ticker, l_out_ext->token)) { + continue; + } + l_value = l_out_ext->header.value_256; + } break; } + // if (l_type == TX_ITEM_TYPE_OUT) { + // dap_chain_tx_out_t *l_out = (dap_chain_tx_out_t *)l_list_tmp->data; + // if (!l_out->header.value || memcmp(a_addr_from, &l_out->addr, sizeof(dap_chain_addr_t))) { + // continue; + // } + // l_value = l_out->header.value; + // } else { // TX_ITEM_TYPE_OUT_EXT + // dap_chain_tx_out_ext_t *l_out_ext = (dap_chain_tx_out_ext_t *)l_list_tmp->data; + // if (!l_out_ext->header.value || memcmp(a_addr_from, &l_out_ext->addr, sizeof(dap_chain_addr_t)) || + // strcmp((char *)a_token_ticker, l_out_ext->token)) { + // continue; + // } + // l_value = l_out_ext->header.value; + // } // Check whether used 'out' items + if (!dap_chain_ledger_tx_hash_is_used_out_item (a_ledger, &l_tx_cur_hash, l_out_idx_tmp)) { list_used_item_t *item = DAP_NEW(list_used_item_t); memcpy(&item->tx_hash_fast, &l_tx_cur_hash, sizeof(dap_chain_hash_fast_t)); item->num_idx_out = l_out_idx_tmp; - item->value = l_value; + item->value = dap_chain_uint256_to(l_value); // this is temporary for compatibility :-) l_list_used_out = dap_list_append(l_list_used_out, item); l_value_transfer += item->value; + //SUM_256_256(l_value_transfer, item->value, &l_value_transfer); // already accumulated the required value, finish the search for 'out' items if (l_value_transfer >= a_value_need) { + //if (compare256(l_value_transfer, a_value_need) >= 0) { break; } } @@ -3425,6 +3354,7 @@ dap_list_t *dap_chain_ledger_get_list_tx_outs_with_val(dap_ledger_t *a_ledger, c // nothing to tranfer (not enough funds) if(!l_list_used_out || l_value_transfer < a_value_need) { + // if(!l_list_used_out || compare256(l_value_transfer, a_value_need) < 0) { dap_list_free_full(l_list_used_out, free); return NULL; } -- GitLab