Solidity
儲存陣列在區塊鏈上是否具有唯一地址?
標題中的問題有點模糊,所以我會在這裡嘗試解釋一下。
假設我與儲存陣列簽訂了契約:
pragma solidity 0.4.24; contract MyContract { uint256[10] public myArray; constructor() public { myArray[0] = ...; myArray[1] = ...; myArray[2] = ...; myArray[3] = ...; myArray[4] = ...; myArray[5] = ...; myArray[6] = ...; myArray[7] = ...; myArray[8] = ...; myArray[9] = ...; } }
當我部署這個合約時,我們可以說它
myArray
分配在一個特定的地址,並且myArray
從那個地址開始佔用一個連續的記憶體塊(在上面的例子中,一個 320 字節的塊)嗎?如果是,是否保證沒有其他狀態變數將駐留在同一地址範圍內,並且與該記憶體塊(全部或部分)重疊?
如果上述所有問題的答案都是肯定的,我如何才能獲得 Solidity 中的地址空間(或至少是基地址)
myArray
?當在 Solidity 中應用 C 或 C++ 等本地語言時,它的等效性類似於
address(myArray)
,我沒有嘗試過,但我很確定它不會工作。謝謝!
您的標題問題(以及隨後的假設)的答案是否定的。
合約中的所有變數都儲存在合約地址下的儲存樹中。儲存沒有自己的乙太坊地址。
似乎您想要做的是訪問契約儲存的特定部分,您可以使用
web3.eth.getStorageAt
. 也許像本教程這樣的東西會有所幫助:如何閱讀乙太坊合約儲存本質上,每個變數佔用 256 個字節,並且一個接一個地儲存。因此,如果您想要數組中的第 4 項,您只需呼叫:
web3.eth.getStorageAt(contractAddress, 3)
如果您在數組之前初始化其他變數,您只需將儲存索引向上移動那麼多。