Solidity
視圖函式使用 block.number 引發錯誤
查看https://docs.soliditylang.org/en/v0.8.11/contracts.html#view-functions我了解 Solidity
view
函式可以與任何函式一起使用,除非它改變狀態、發出事件或執行任何其他可變操作。同時,我注意到以下內容不起作用(至少在 Remix 中)。退回儲存
blockNumber
或block.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+ 下溢。
該錯誤與可見性無關,否則編譯器會警告您
希望有幫助
您的問題與功能無關
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