Storage

智能合約儲存是永久的嗎?

  • July 27, 2021

我一直在研究乙太坊是如何工作的,並且(對我來說)很難找到有關智能合約儲存方式和位置的資訊,即智能合約內部的資料結構,用於實例化映射。它們是否也位於街區內?

這就引出了另一個問題:智能合約可以通過 selfdestruct 功能“殺死”,所以儲存在其中的所有數據也會被銷毀?或者更簡單,我們可以刪除一個數組,就像我們在 Solidity 的文件中看到的那樣。這並不違背區塊鏈“什麼都不能更改/刪除?”的原則。

提前致謝

這就引出了另一個問題:智能合約可以通過 selfdestruct 功能“殺死”,所以儲存在其中的所有數據也會被銷毀?

這取決於破壞的定義。

當資訊在區塊鏈上發佈時,幾乎可以假設它不能被取消發布,除非刪除所有 10,000 多個乙太坊節點。

存在於智能合約中的資料結構,用於映射。它們是否也位於街區內?

不,塊儲存在chaindata/ancient目錄中的平面文件中。

帳戶資訊(適合 128 個字節)以稱為 Merkle Patricia Trie(一棵樹)的結構儲存在磁碟上

// Account is the Ethereum consensus representation of accounts.
// These objects are stored in the main account trie.
type Account struct {
   Nonce    uint64
   Balance  *big.Int
   Root     common.Hash // merkle root of the storage trie
   CodeHash []byte
}

您在上面看到的Root欄位是合約儲存樹(另一棵樹)的雜湊。對於每個合約,都有一個儲存數據的 trie。所以,當你用solidity寫作時:

owner = address("0xabcd.....")

發生的事情是它將owner符號轉換為雜湊並將地址的值儲存在此合約儲存樹中。因此,如果您想讀取合約的所有變數,您只需逐個節點地遍歷 trie。(但沒有 API)

對於自殺檢查這個答案:

selfdestruct() 是如何工作的?

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