Contract-Development
契約內聯彙編 - 使用彙編返回數組部分
我有幾個問題。
- mload 函式返回駐留在我們傳遞給 mload 的地址上的數據。它是否正確 ?
- add 函式用於為我們提供從 0 到我們傳遞的任何地址的地址。add(arr, 64) 將從 arr + 64 字節返回地址。正確的。?
- 我想用儲存變數(x_slot 和 x_offset)實現相同的目標。我有以下程式碼。
uint[] storageArr; function assembly2() public view returns (uint a, uint b, uint c) { storageArr.push(111); storageArr.push(222); storageArr.push(333); assembly { a := sload(0) b := sload(32) c := sload(64) } }
這將返回 {3, 0, 0,}。第一個(插槽)是 3,因為它儲存數組的長度。為什麼第二個和第三個是 0 ?
由於它們不可預測的大小,動態大小的數組類型使用 Keccak-256 雜湊計算來查找數組數據的起始位置。
所以在你的例子中:
- 的位置
storageArr[0]
在keccak256(uint256(0)) + 0
- 的位置
storageArr[1]
在keccak256(uint256(0)) + 1
- 的位置
storageArr[2]
在keccak256(uint256(0)) + 2
以下是如何將其放入程式碼中:
function assembly2() public view returns (uint a, uint b, uint c) { uint index = uint(keccak256(abi.encode(uint(0)))); assembly { a := sload(add(index, 0)) b := sload(add(index, 1)) c := sload(add(index, 2)) } }