Overflow

不明白為什麼這個溢出恢復

  • November 11, 2022

我對 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

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