Storage
智能合約儲存是永久的嗎?
我一直在研究乙太坊是如何工作的,並且(對我來說)很難找到有關智能合約儲存方式和位置的資訊,即智能合約內部的資料結構,用於實例化映射。它們是否也位於街區內?
這就引出了另一個問題:智能合約可以通過 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)對於自殺檢查這個答案: