Solidity

為什麼訪問不可變變數的函式不是純函式?

  • February 2, 2022

我的理解是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意味著可以在沒有任何狀態的情況下計算輸出,除了函式本身。

來自官方 Solidity 文件

純函式

可以聲明函式pure,在這種情況下它們承諾不讀取或修改狀態。特別是,應該可以pure在編譯時評估一個函式,只給它的輸入 和msg.data,但不知道目前的區塊鏈狀態。這意味著從immutable變數中讀取可能是非純操作。

引用基督的話

在以下範例中,不可變的值取決於區塊鏈狀態:

contract C {
 uint immutable x = block.number;
}

在不同時間部署的合約副本將具有不同的價值。純函式的想法是,如果您再次編譯它並將其放入不同的合約中,它將返回相同的值,如果它訪問上面範例中的不可變對象,則不會返回相同的值。

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