Overflow
不明白為什麼這個溢出恢復
我對 ERC20 契約有一個時間鎖定,從第 0 年到第 9 年,它一直有效到第 4 年,但從第 5 年開始它會恢復。它在鑄造和檢查方面都失敗了(使用 52 秒而不是幾週進行測試):
constructor() ERC20("Coin", "C") { deploymentTime = block.timestamp; } function checkMintDate(uint8 year) public view returns (uint256){ return deploymentTime + 52 seconds * year; } function mint(uint8 year) public onlyOwner { require (year <= 9, "cannot claim for more than 10 years"); require(block.timestamp >= deploymentTime + 52 seconds * year, "Not that year yet"); require(!yearClaimed[year], "you already claimed that year"); yearClaimed[year] = true; _mint(msg.sender, yearlyMintAmount); }
當部署到測試網時,remix 會給出這個數據,也就是溢出的數據:
“程式碼”:“3”,“消息”:“執行恢復”,“輸出”:“0x4e487b7100000000000000000000000000000000000000000000000000000000000000011”
有什麼想法嗎,謝謝!
所以在第一次分析中,你在一年中沒有正確轉換
function checkMintDate(uint8 year) public view returns (uint256){ return deploymentTime + 52 weeks * year;}
並且對於要求相同:
require(block.timestamp >= deploymentTime + 52 weeks * year, "Not that year yet");
對於錯誤:0x11:如果算術運算導致未檢查 { … } 塊之外的下溢或溢出。
所以它是類型轉換問題 Uint8 最大值為 256 但 5*52 超過 260。
解決問題:最好的做法是在 uint256 中發送參數,它消耗更少的氣體並避免此錯誤。
如果不只是然後施法: ….52 秒 * uint256(year)…
在另一個論壇中解決,必須將年份更改為 uint256:
https://forum.openzeppelin.com/t/dont-understand-this-overflow-in-my-timelock/33075/4