Solidity
如何在 leveldb 中儲存儲存 trie?
我想知道leveldb中儲存trie的結構及其資料結構,我讀了solidity storage。
我還有問題嗎?
- 黃皮書中說儲存根是256位整數和256位整數的映射,這個鍵值對是儲存在leveldb中的嗎?
- 如果我們想在一份合約的儲存樹中儲存一個值 V。在 solidity storage之後,我計算 V 的密鑰 K,並在 storage trie 中使用 K 插入 V(就像 K 是帳戶地址,V 是 state trie 中的帳戶狀態)。然後像 state trie 一樣更新儲存根。我對嗎?
- 如果問題 1 是對的,那麼我們用來在 leveldb 中儲存 V 的真正密鑰是什麼,是 K 還是 K 以及 SHA3 之後的什麼?我們如何獲取一些葉值節點的父雜湊,只使用 SHA3(value1, value2, …)?
我不是專家,但讓我分享一下我的理解。另外,請檢查這個問題:Ethereum Merkle Patricia Trie and Hashes
- trie 作為鍵值對儲存在 levelDB 中。每個散列(256 位整數)允許您訪問一個節點。該值對應於 RLP 編碼的節點(請參閱黃皮書中的附錄 D,了解不同的節點類型)。
- 如果您想儲存一個新的值 v,您可以在 RLP 中對值進行編碼並按照getStorageAt中的說明確定密鑰。然後插入一個新的葉節點或更新現有的葉節點。當然,直到根必須更新所有依賴的更高級別的節點散列。
- 正如solidity storage中所解釋的那樣,真正的關鍵是SHA3雜湊,基於您正在儲存的變數的儲存索引(對於靜態數據,儲存索引,對於映射它是
keccak256(k . p)
)我也建議查看以下連結:
參考資料: https ://easythereentropy.wordpress.com/2014/06/04/understanding-the-ethereum-trie/ https://wanderer.github.io/ethereum/nodejs/code/2014/05/21/using- ethereums-tries-with-node/ https://github.com/medvedev1088/ethereum-merkle-patricia-trie-example https://medium.com/cybermiles/diving-into-ethereums-world-state-c893102030ed