Solidity

使用 ABIEncoderV2 時是否可以從內聯彙編 (Yul) 訪問結構欄位?

  • October 28, 2020

是否可以從 Yul 訪問 struct 欄位?理想情況下,它可能如下所示:

pragma solidity ^0.7.0;
pragma experimental ABIEncoderV2;

contract Sample {
   struct S {
       uint256 n;
       bytes b;
   }
   function foo(S memory s) external {
       uint256 len;
       assembly {
           len := mload(s.b);
       }
   }
}

如果不是,那麼訪問s.b欄位的最佳方式是什麼?

  1. 在solidity中定義變數:bytes memory localB = s.b;
  2. 別的辦法。

是的,通過使用mload操作碼:

pragma solidity ^0.7.4;
pragma experimental ABIEncoderV2;

contract Sample {
   
   struct S {
       uint256 n;
       bytes b;
   }
   
   function foo(S memory s) external pure returns (uint256 _x, bytes memory _y) {
       assembly {
           _x := mload(s)
           _y := mload(add(s,0x20))
       }
   }
}

要在 Remix 中測試函式,您可以使用以下元組:[1, "0xaa00ff"].

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