Solidity

視圖函式使用 block.number 引發錯誤

  • January 21, 2022

查看https://docs.soliditylang.org/en/v0.8.11/contracts.html#view-functions我了解 Solidityview函式可以與任何函式一起使用,除非它改變狀態、發出事件或執行任何其他可變操作。

同時,我注意到以下內容不起作用(至少在 Remix 中)。退回儲存blockNumberblock.number作品,但不退回差價blockNumber - block.number

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

contract ThrowsError {

   uint256 private blockNumber;

   constructor () {
       blockNumber = block.number;
   }

   function viewFunction() public view returns (uint256) {
       return blockNumber - block.number;
   }
}

這是 Remix Javascript VM 拋出的錯誤:

call to ThrowsError.viewFunction errored: VM error: revert.

revert
   The transaction has been reverted to the initial state.
Note: The called function should be payable if you send value and the value you send should be less than your current balance.
Debug the transaction to get more information.

功能上是否有更多限制view?Javascript VM可能有問題嗎?

隨著區塊被開採,block.number 將會增加。儲存的塊號將小於目前塊號。由於結果下溢(您可以將其視為負值),因此減去兩個還原。在 Solidity 中,預設情況下會恢復 0.8+ 下溢。

該錯誤與可見性無關,否則編譯器會警告您

希望有幫助

來自https://www.reddit.com/r/ethdev/comments/s9blc7/how_to_use_the_view_function_with_blocknumber/htlsyox/

您的問題與功能無關view。您在建構子時分配blockNumber,然後在稍後的某個時間點呼叫viewFunction,因此block.number將始終大於(或者如果在部署塊中完成等於)blockNumber。因此,如果您減去blockNumber - block.number並將其鍵入為 auint那麼這將導致下溢錯誤。

功能的所有限制view都可以在 Solidity 官方文件中找到:https ://docs.soliditylang.org/en/v0.8.11/contracts.html?highlight=view#view-functions

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