diff --git a/modules/net/dap_chain_ledger.c b/modules/net/dap_chain_ledger.c index afcaa437bf6f89243d4178528a2b1d17b661eea7..f34623c7374165ec6fdaa625f6603e234a8ea3ed 100644 --- a/modules/net/dap_chain_ledger.c +++ b/modules/net/dap_chain_ledger.c @@ -3279,6 +3279,41 @@ dap_hash_fast_t *dap_ledger_get_final_chain_tx_hash(dap_ledger_t *a_ledger, dap_ return l_tx_hash; } +dap_hash_fast_t* dap_ledger_get_first_chain_tx_hash(dap_ledger_t *a_ledger, dap_chain_datum_tx_t * a_tx, dap_chain_tx_out_cond_t *a_cond_out) +{ + dap_hash_fast_t *l_ret_hash = NULL; + + if (!a_ledger || !a_cond_out || !a_tx){ + log_it(L_ERROR, "Argument is NULL in dap_ledger_get_first_chain_tx_hash()"); + return NULL; + } + + dap_chain_tx_out_cond_subtype_t l_type = a_cond_out->header.subtype; + + int l_item_idx = 0; + dap_chain_datum_tx_t * l_prev_tx = a_tx; + byte_t *l_tx_item_temp = NULL; + dap_hash_fast_t l_hash = {}; + while((l_tx_item_temp = dap_chain_datum_tx_item_get(l_prev_tx, &l_item_idx, TX_ITEM_TYPE_IN_COND , NULL)) != NULL){ + dap_chain_tx_in_cond_t * l_in_cond_temp = (dap_chain_tx_in_cond_t *) l_tx_item_temp; + dap_chain_datum_tx_t *l_prev_tx_temp = dap_ledger_tx_find_by_hash(a_ledger, &l_in_cond_temp->header.tx_prev_hash); + dap_chain_tx_out_cond_t *l_out_cond_temp = dap_chain_datum_tx_out_cond_get(l_prev_tx_temp, l_type, NULL); + if (l_out_cond_temp){ + l_item_idx = l_in_cond_temp->header.tx_out_prev_idx; + l_prev_tx = l_prev_tx_temp; + l_hash = l_in_cond_temp->header.tx_prev_hash; + } + } + + if(l_prev_tx && !dap_hash_fast_is_blank(&l_hash)){ + l_ret_hash = DAP_NEW_SIZE(dap_hash_fast_t, sizeof(dap_hash_fast_t)); + *l_ret_hash = l_hash; + } + + return l_ret_hash; +} + + /** * Check whether used 'out' items (local function) */ @@ -3954,14 +3989,25 @@ int dap_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx l_err_num = DAP_LEDGER_TX_CHECK_PREV_OUT_ITEM_MISSTYPED; break; } + dap_chain_tx_out_cond_t *l_tx_prev_out_cond = NULL; + l_tx_prev_out_cond = (dap_chain_tx_out_cond_t *)l_tx_prev_out; + + // Get owner tx + dap_hash_fast_t *l_owner_tx_hash = dap_ledger_get_first_chain_tx_hash(a_ledger, l_tx_prev, l_tx_prev_out_cond); + dap_chain_datum_tx_t *l_owner_tx = l_tx_prev; + if (l_owner_tx_hash){ + l_owner_tx = dap_ledger_tx_find_by_hash(a_ledger, l_owner_tx_hash); + DAP_DEL_Z(l_owner_tx_hash); + } + // 5a. Check for condition owner dap_chain_tx_sig_t *l_tx_prev_sig = (dap_chain_tx_sig_t *)dap_chain_datum_tx_item_get(l_tx_prev, NULL, TX_ITEM_TYPE_SIG, NULL); dap_sign_t *l_prev_sign = dap_chain_datum_tx_item_sign_get_sig((dap_chain_tx_sig_t *)l_tx_prev_sig); dap_chain_tx_sig_t *l_tx_sig = (dap_chain_tx_sig_t *)dap_chain_datum_tx_item_get(a_tx, NULL, TX_ITEM_TYPE_SIG, NULL); dap_sign_t *l_sign = dap_chain_datum_tx_item_sign_get_sig((dap_chain_tx_sig_t *)l_tx_sig); + dap_chain_tx_sig_t *l_owner_tx_sig = (dap_chain_tx_sig_t *)dap_chain_datum_tx_item_get(l_owner_tx, NULL, TX_ITEM_TYPE_SIG, NULL); + dap_sign_t *l_owner_sign = dap_chain_datum_tx_item_sign_get_sig((dap_chain_tx_sig_t *)l_owner_tx_sig); - dap_chain_tx_out_cond_t *l_tx_prev_out_cond = NULL; - l_tx_prev_out_cond = (dap_chain_tx_out_cond_t *)l_tx_prev_out; bool l_owner = false; l_owner = dap_sign_compare_pkeys(l_prev_sign, l_sign); diff --git a/modules/net/include/dap_chain_ledger.h b/modules/net/include/dap_chain_ledger.h index c5bac731d154567365400cf3be1fb6574508e740..0a6ca76a6848995b5551189341841dc773e2446e 100644 --- a/modules/net/include/dap_chain_ledger.h +++ b/modules/net/include/dap_chain_ledger.h @@ -317,6 +317,7 @@ uint256_t dap_ledger_calc_balance_full(dap_ledger_t *a_ledger, const dap_chain_a dap_chain_datum_tx_t* dap_ledger_tx_find_by_hash(dap_ledger_t *a_ledger, dap_chain_hash_fast_t *a_tx_hash); dap_chain_datum_tx_t* dap_ledger_tx_unspent_find_by_hash(dap_ledger_t *a_ledger, dap_chain_hash_fast_t *a_tx_hash); dap_hash_fast_t *dap_ledger_get_final_chain_tx_hash(dap_ledger_t *a_ledger, dap_chain_tx_item_type_t a_cond_type, dap_chain_hash_fast_t *a_tx_hash); +dap_hash_fast_t *dap_ledger_get_first_chain_tx_hash(dap_ledger_t *a_ledger, dap_chain_datum_tx_t * a_tx, dap_chain_tx_out_cond_t *a_cond_out); // Get the transaction in the cache by the addr in out item dap_chain_datum_tx_t* dap_ledger_tx_find_by_addr(dap_ledger_t *a_ledger, const char * a_token, diff --git a/modules/service/xchange/dap_chain_net_srv_xchange.c b/modules/service/xchange/dap_chain_net_srv_xchange.c index 34063782682bb2572d2f07d8964374499adf1609..24c3ffe620ec8446dc615de693feffd578232a8f 100644 --- a/modules/service/xchange/dap_chain_net_srv_xchange.c +++ b/modules/service/xchange/dap_chain_net_srv_xchange.c @@ -87,7 +87,7 @@ static dap_chain_net_srv_xchange_t *s_srv_xchange; static bool s_debug_more = true; /** - * @brief dap_stream_ch_vpn_init Init actions for VPN stream channel + * @brief dap_chain_net_srv_xchange_init Init actions for xchanger stream channel * @return 0 if everything is okay, lesser then zero if errors */ int dap_chain_net_srv_xchange_init() @@ -189,7 +189,6 @@ void dap_chain_net_srv_xchange_deinit() static bool s_xchange_verificator_callback(dap_ledger_t *a_ledger, dap_chain_tx_out_cond_t *a_tx_out_cond, dap_chain_datum_tx_t *a_tx_in, bool a_owner) { - return true;//for tests if (a_owner) return true; if(!a_tx_in || !a_tx_out_cond) @@ -262,14 +261,12 @@ static bool s_xchange_verificator_callback(dap_ledger_t *a_ledger, dap_chain_tx_ * a_cond->subtype.srv_xchange.buy_value * (a_cond->header.value - new_cond->header.value) */ - uint256_t l_sell_val, l_buyer_mul, l_seller_mul; + uint256_t l_sell_val, l_buyer_val_expected; if (compare256(l_sell_again_val, a_tx_out_cond->header.value) >= 0) return false; SUBTRACT_256_256(a_tx_out_cond->header.value, l_sell_again_val, &l_sell_val); - MULT_256_256(a_tx_out_cond->header.value, l_buy_val, &l_seller_mul); - -// MULT_256_256(a_tx_out_cond->subtype.srv_xchange.buy_value, l_sell_val, &l_buyer_mul); - if (compare256(l_seller_mul, l_buyer_mul) < 0) + MULT_256_COIN(l_sell_val, a_tx_out_cond->subtype.srv_xchange.rate, &l_buyer_val_expected); + if (compare256(l_buyer_val_expected, l_buy_val) > 0) return false; /* Check the condition for fee verification success