Solidity

儲存陣列在區塊鏈上是否具有唯一地址?

  • December 23, 2018

標題中的問題有點模糊,所以我會在這裡嘗試解釋一下。

假設我與儲存陣列簽訂了契約:

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)

如果您在數組之前初始化其他變數,您只需將儲存索引向上移動那麼多。

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