Clients

乙太坊客戶端使用哪些數據庫,為什麼?

  • November 15, 2018

乙太坊客戶端(例如gethethpyethappethereumjethereumH)從它們的對等點下載乙太坊區塊鏈,然後將其副本儲存在本地,可能會在某種數據庫中建立索引以進行有效查找和檢索。客戶端中數據庫的其他用途可能包括儲存狀態、跟踪對等點等。

各個客戶使用哪些數據庫,選擇它們的原因是什麼?

Geth 使用 leveldb。選擇它的一些原因是:

  • 在程序數據庫(即我不需要執行額外的軟體)
  • Go 中的本機實現(即跨平台到 Go 支持的所有內容)
  • 鍵/值儲存(即值是任意二進制 blob,無模式約束)
  • 現代數據儲存(即磁碟上的多層,在後台組織)
  • 可靠的記錄(即許多公司和其他數據庫建立在上面)

但是,也有一些限制:

  • 乙太坊專門使用雜湊來辨識任何東西。但是,雜湊是均勻隨機分佈的標識符。Leveldb 使鍵在磁碟上按“字母順序”組織,因此訪問與散列相關的值非常昂貴。這主要體現在 state trie 上,它有數十萬個節點分散並指向整個磁碟。然而,如果沒有一個特定的數據庫對乙太坊樹進行設計建模,我看不出如何進一步優化。
  • Leveldb 最初由 Google 設計為磁碟支持的記憶體數據庫。只要它的大部分可以放入記憶體,它就表現得非常好,但是隨著越來越多的磁碟訪問需要,性能可能會下降。Facebook 的 RocksDB 試圖解決其中的一些問題 + 多執行緒後台壓縮,但它仍然是一個相當新的東西,並且使用 C 語言使得可移植性變得困難。

Parity 使用RocksDB作為它的數據庫。

這裡閱讀,似乎選擇它的原因是性能。在他們的測試中比 LevelDB 更快。

最近,儘管他們遇到了 RocksDB 的一些性能問題和許多損壞問題,並且正在開發一個專有數據庫以更好地適應 Parity,ParityDB。可以在本期跟踪進度。

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