Leveldb

索引和查詢區塊鏈數據和levelDB

  • July 4, 2018

直接通過底層數據庫levelDB而不是使用提供的geth api查詢區塊鏈數據會不會更高效?怎麼可能?我可以只在 mysql 或 elasticsearch 中按發送者/接收者索引交易嗎?我看到 vulcanizeDB 這樣做

Geth 對數據庫執行三個操作,您在嘗試尋找替代方案時應該考慮這些操作。

  1. Geth 在 levelDB 中載入整個數據庫(我相信你想要做的)。
  2. Geth 然後使用RLP解密所有(或必需的)鍵值對。
  3. Geth 然後獲取這些鍵值對(它們是 merle patricia trie 上的節點)並創建merkle patricia try` 以了解區塊鏈的狀態。

LevelDB 開始工作並不是一個挑戰。您可以使用您喜歡的語言獲取任何實現Google 的 levelDB 的儲存庫。

如果你要解決這個問題,你必須完成所有這三個任務才能訪問區塊鏈上的數據。我曾嘗試使用自己的程式知識創建它,但無法使用 java 準確解碼複雜的 RLP(我建議使用 python),因為 RLP 結構的複雜性可能會有所不同,因此在 java 中創建的一種類型的固定數組已超出這個問題。GitHub 上有一些包試圖在某種程度上解碼 RLP。

形成 merkle patricia 嘗試也具有挑戰性。最好你會辨識樹的根。每個節點(除非葉節點)將包含對數據庫中另一個位置的引用。每棵樹的根都包含在塊頭中,塊頭的位置以特殊的字元序列開頭(如果您在小型 levelDB 中搜尋所有值以查找乙太坊,您會看到這些特殊情況)。那麼樹的遍歷就是每個賬戶的公共地址。

我不知道創建自己的解決方案會提高效率,這在很大程度上取決於您對黃皮書的真實程度以及您使用的語言。如果您有一個特殊情況要使用此數據庫(IE 搜尋智能合約或輸入),並且僅將這種情況的某些方面實現到您的程序中,那麼我相信您會看到非-完成 Geth 實現。

警告:這不是乙太坊的工作原理,但它給了你一個想法。將區塊鏈上的數據視為資訊串。您需要所有字元才能在區塊鏈上生成任何資訊字元串。然後乙太坊將每個字元儲存在一個巨大的數據庫中。如果您解碼任何字元,您將看到每個字元都指向另一個字元,如果您遵循路徑,您可以解碼一個字元串。問題是你想知道“狗”在區塊鏈中的儲存位置,但實際上是幾個位置。如果您知道它從哪裡開始(塊頭),那麼您可以使用步驟 2 和 3 建構資訊。

我自己試圖理解這些概念,所以如果我不在,或者需要澄清任何事情,請詢問!如果我沒有用冗長的回复嚇倒你,我希望你能順利完成這項工作!

這種方法存在固有的局限性:

  • 您無法從底層數據庫中獲取世界狀態,因為所有鍵都在那裡進行雜湊處理。這包括:

    • 賬戶及其餘額
    • 契約儲存
  • 您無法獲得內部交易,因為它需要執行塊交易。

您可以獲得的唯一數據是區塊和交易。是的,它比從 geth 客戶端讀取要快。

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