Contract-Development

如何從內聯彙編中讀取高級儲存變數?

  • August 30, 2021

此程式碼無法編譯:

pragma solidity >=0.8.0;

contract MyContract {
   uint256 public foo = 314;

   function myFunction() external view returns (uint256 result) {
       assembly {
           result := foo
       }
   }
}

拋出此錯誤:

TypeError:僅支持局部變數。要訪問儲存變數,請使用“.slot”和“.offset”後綴。

我像這樣修改了我的程式碼:

result := foo.slot

但我得到的結果是“1”而不是“314”。如何在內聯彙編中訪問此儲存變數?

請參閱文件中的訪問外部變數、函式和庫部分。

解決方案是使用該sload函式並將插槽作為唯一參數傳遞:

assembly {
   result := sload(foo.slot)
}

注意事項:

  • 如果您正在讀取的值的跨度不是正好 256 位(例如address),請小心。您不能假設不屬於編碼的位將為零。
  • 對於像數組這樣的動態數據類型,您必須使用.offsetand.length除此之外.slot.

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