Solidity
如何在沒有算術溢出的情況下計算 10 美元的 ETH
我正在使用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
.