Contract-Development
如何從內聯彙編中讀取高級儲存變數?
此程式碼無法編譯:
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
),請小心。您不能假設不屬於編碼的位將為零。- 對於像數組這樣的動態數據類型,您必須使用
.offset
and.length
除此之外.slot
.