Solidity
為什麼常量變數值會發生變化?
我用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
. 內聯彙編允許您選擇要寫入或讀取的任何插槽。