Storage
儲存和獲取數據如何在智能合約中工作
請幫我解決這些問題。
1)合約將數據儲存在哪裡?
2)當我們訪問合約的變數形式的值時,它如何檢索到最新的值?
- 變數的新值如何與原始契約聯繫起來?會發生什麼?
簡短的回答
部署到乙太坊區塊鏈中的每個智能合約都有自己的個人數據庫,稱為智能合約儲存。該數據庫能夠儲存由 32 字節鍵定址的 32 字節值。智能合約可以通過操作碼寫入其儲存
SSTORE
並通過SLOAD
.長答案
每個乙太坊節點,不包括所謂的“輕”節點,都維護著一個保存區塊鏈數據的大型數據庫。基本上,這些數據由兩部分組成:區塊數據和區塊鏈狀態。
第一部分,即區塊數據,基本上是所有已開采的活躍區塊的集合。活塊是作為區塊鏈一部分的塊,即在鏈重組期間沒有被丟棄。節點彼此下載塊,因此每個人都可以輕鬆獲得此資訊。每個區塊都包含一個有序的交易列表,只要區塊本身是有序的,區塊數據就可以被認為是在乙太坊中執行的所有交易的一個大日誌。
第二部分,即區塊鏈狀態,基本上是將所有交易以正確的順序應用到眾所周知的初始狀態的結果。區塊鏈狀態包含諸如賬戶餘額、已部署智能合約的字節碼以及所有實時智能合約的儲存等資訊。
每個區塊都包含區塊鏈狀態的散列,因為它應該是在應用來自該區塊的所有交易之後。因此,每個節點可以通過將區塊的交易應用到與前一個區塊對應的區塊鏈狀態,計算得到的區塊鏈狀態的雜湊值,並與包含在新區塊中的雜湊值進行比較來驗證新區塊。這保證了所有節點以相同的方式執行所有事務,即使它們使用不同的軟體。
通常,節點不直接交換區塊鏈狀態,但在“快速”同步模式下,節點能夠從其他節點下載區塊鏈狀態的快照。但是,這種情況只發生一次,當“快速”節點初始化其數據庫時。
所以對於你的問題:
- 智能合約將數據儲存在其自己的區塊鏈狀態私有部分,每個非輕節點都有該狀態的副本,並且,雖然通常不直接交換區塊鏈狀態,但節點使用雜湊來確保它們的區塊鏈狀態副本是同步的。
- 當智能合約訪問其狀態變數時,執行相應交易的節點會從區塊鏈狀態的本地副本中讀取該變數的值。
- 區塊鏈狀態被組織為所謂的Merkle Patricia 樹,其中從根到葉的路徑定義了乙太坊地址,葉數據包含地址狀態。對於智能合約地址,葉子數據包含目前餘額、隨機數、智能合約字節碼以及對保存該智能合約的單獨 Merkle Patricia 樹的引用。在這另一棵 Merke Patricia 樹中,從根到葉的路徑定義了 32 字節的密鑰,葉數據是 32 字節的值。