Solidity
如何檢索超過 31 字節的儲存字節數組的地址?
如果我在 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
儲存的地址。