Solidity

如何在沒有算術溢出的情況下計算 10 美元的 ETH

  • December 17, 2021

我正在使用Chainlink 的 pricefeed來獲取最新的 ETHUSD 價格。

返回的值為10**8,即如果 ETHUSD 的價格為 ,3981.43則該值為398143000000

如何在不導致算術溢出錯誤的情況下計算 10 美元 ETH 的 WEI 值?

ETHUSD = 398143000000
$10 = 0.002511660383329608 ETH
$10 = 2511660383329608 WEI // How can I get this?

執行以下操作會導致“使用緊急程式碼 0x11 恢復(算術運算在未檢查塊之外下溢或溢出)”:

uint256 ethUsdPrice = 398143000000;
uint256 usdTicketPrice = 10;
uint256 ethTicketPrice = ticketPrice*(10**8) / ethUsdPrice*(10**18);

我希望因為我不分成小數,所以這沒問題。

在 JavaScript 中,您可以看到這是正確的計算:

// Dividing down into decimals and then up.
(10 / (398143000000 / 10**8)) * 10**18 = 2511660383329608
// Dividing without decimals.
10*(10**8) / 398143000000*(10**18) = 2511660383329608

我正在使用 Solidity 0.8.7

PS似乎有類似的問題,但它們也會導致溢出?

如果 ethUsdPrice 的值為 8 位小數,等於 1 個乙太幣,則表示:

1 ether = (ethUsdPrice / 10^8) dollars

我們從等式中分離出 1 美元並得到:

1 dollar = 1 ether * 10^8 / ethUsdPrice

在 Solidity 中,為了保持準確性,我們總是首先進行乘法運算,然後才進行除法運算 - 否則,我們將失去運算的餘數。例如 2/3 = 0。

因此,如果這是 1 美元的價值,我們只需將其乘以 usdTicketPrice (10),因此您的最終計算將是:

uint256 ethTicketPrice = usdTicketPrice * 1 ether * 10**8 / ethUsdPrice.

引用自:https://ethereum.stackexchange.com/questions/116749