Solidity

為什麼常量變數值會發生變化?

  • August 13, 2022

我用solidity寫了一個簡單的合約。常量變數的值可以在Yul(彙編)中改變。但它如何以及為什麼會發生變化?

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

contract changeConstant {
   uint256 private constant v = 5;
   function increment() public {
       assembly{   
           sstore(v, add(sload(v), 1))
       }
   }
   function getValue() public view returns(uint256 result){
       assembly {
           result := sload(v)
       }
   }
}

文件解釋:

對於常量變數,分配給它的表達式被複製到所有訪問它的地方,並且每次都重新計算

您不會更改常量,而是寫入儲存槽v = 5並從中讀取。

正如在Assembly Docs中所讀到的,該sstore命令採用參數 p 和 v,其中 p 是指向儲存位置的指針,v 是要儲存的值。

sstore(p, v) -> storage[p] := v
sload(p) -> storage[p]

這可以通過對您的程式碼進行一些小的更改來確認:

//SPDX license identifier: MIT
pragma solidity ^0.8.7;

contract ChangeConstant {

uint256 public constant v = 5;

uint256 public emptySlot0;
uint256 public emptySlot1;
uint256 public emptySlot2;
uint256 public emptySlot3;
uint256 public emptySlot4;

uint256 public writtenSlot;

   function increment() public {
       assembly{
           sstore(v, add(sload(v), 1))
       }
   }
   function getValue() public view returns(uint256 result){
       assembly {
           result := sload(v)
       }
   }

}

當用solidity編寫程式碼時,每個狀態變數都儲存在一個由儲存佈局規則決定的槽中。這就是為什麼我必須定義emptySlot0-emptySlot4. 內聯彙編允許您選擇要寫入或讀取的任何插槽。

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