Contract-Development

契約內聯彙編 - 使用彙編返回數組部分

  • September 30, 2020

我有幾個問題。

  1. mload 函式返回駐留在我們傳遞給 mload 的地址上的數據。它是否正確 ?
  2. add 函式用於為我們提供從 0 到我們傳遞的任何地址的地址。add(arr, 64) 將從 arr + 64 字節返回地址。正確的。?
  3. 我想用儲存變數(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))
   }
}

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