Solidity
為什麼訪問不可變變數的函式不是純函式?
我的理解是
immutable
變數基本上等同於constant
變數,但是前者在聲明中初始化,constructor
而後者在聲明中,但是兩者都被插入到字節碼中,因此無論何時使用它們都不會產生額外的氣體,因為它們沒有儲存在狀態中,因此做不必從狀態中讀取。那麼為什麼不能考慮訪問不可變變數的
pure
函式而訪問constant
變數的函式呢?pragma solidity ^0.8.0; contract Immutable { uint constant number1 = 1; uint immutable number2; constructor() { number2 = 2; } // compiles fine function getNumber1() pure external returns(uint) { return number1; } // compile error function getNumber2() pure external returns(uint) { return number2; } }
不讀取儲存並不是成為純函式的唯一必要條件。
總結GitHub 上關於這個主題的討論,
pure
意味著可以在沒有任何狀態的情況下計算輸出,除了函式本身。純函式
可以聲明函式
pure
,在這種情況下它們承諾不讀取或修改狀態。特別是,應該可以pure
在編譯時評估一個函式,只給它的輸入 和msg.data
,但不知道目前的區塊鏈狀態。這意味著從immutable
變數中讀取可能是非純操作。引用基督的話:
在以下範例中,不可變的值取決於區塊鏈狀態:
contract C { uint immutable x = block.number; }
在不同時間部署的合約副本將具有不同的價值。純函式的想法是,如果您再次編譯它並將其放入不同的合約中,它將返回相同的值,如果它訪問上面範例中的不可變對象,則不會返回相同的值。