Solidity

如何檢索超過 31 字節的儲存字節數組的地址?

  • March 28, 2017

如果我在 Remix 中部署以下合約,則字節數組測試將儲存在儲存中的地址 0x00。

contract parseBytes {
 bytes test = "\x20\x00\x10";
 function f() {
   assembly{
       test //should push address of test bytes array and offset to stack
       pop //should pop offset
   }
 }
}

如果我將字節數組擴展到超過 31 個字節,則儲存看起來:

0x0000000000000000000000000000000000000000000000000000000000000000:41 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563:a020001000100001000e238989d74a050072b08989d74a050040000f0204000000

所以似乎 32 字節儲存在其他地方(地址 0x290 …)。如何使用內聯彙編檢索此地址?執行堆棧上方的函式包含以下值:

0: 0x2d //不是字節數組在儲存中的地址

1:0x26121ff0

pragma solidity ^0.4.8;

contract parseBytes {
 bytes test = "\x20\x00\x10\x10\x10";
 function f(){
   bytes32 adr;
   assembly{
       adr := sha3(0, 32)
   }
 }
}

字節和字元串儲存在 sha3(slot) 的儲存中。所以在這種情況下,插槽是0. 在下面的程式碼adr中給出了test儲存的地址。

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