Go-Ethereum

多個geth程序是否可以共享鏈數據?

  • January 17, 2019

我想知道是否有可能讓多個 geth 程序共享相同的鏈數據。

我目前有多個節點(用於私有鏈)通過 NFS 連接到同一個文件系統,並將它們的鏈數據託管在該文件系統上。他們每個人都有自己的數據庫,其中包含自己的鏈數據,但我希望他們共享相同的數據,因此我不需要為每個單獨的節點保留所有數據的單獨冗餘副本。這代表了儲存空間的大量節省。

將所有程序分配給同一個數據目錄的簡單方法會導致一個節點正常工作,而其他節點被鎖定在數據庫之外。

如果這是合理的但目前不可能的話,我願意分叉儲存庫並進行軟體修改,我很感激任何關於如何在必要時進行此操作的見解。

提前感謝您提供的任何幫助或建議。

編輯1:

  • 我的意圖不是讓網路上的所有節點共享相同的數據集,只是為了它們的某些集群。我的意圖是讓特定區域中的所有對等方共享鏈數據,但我會控制多個區域,並且也會有外部使用者連接到網路。
  • 我控制並信任所有將共享鏈數據的節點。我無法控制的其他網路對等點將管理他們自己的鏈數據。
  • 我得到的印像是它不太可能成為現有功能,但我仍然對修改軟體以實現這一點感興趣。如果由於 leveldb 和 geth 之類的工作方式的詳細資訊而無法做到這一點,我想了解原因。

我認為這是不可能的,因為它會完全破壞乙太坊網路的目標,並且可能(並且應該)破壞區塊鏈上交易和儲存數據的完整性和網路驗證。

讓節點共享相同的數據,會使通過網路傳遞交易進行驗證變得荒謬,因為所有節點都具有相同的共享數據,因此一個節點會添加交易,而另一個節點只會從相同的磁碟空間讀取相同的交易,並且驗證它是否相同(這是因為它是從一開始的。你基本上是在比較 1 到 1 )

當節點執行時,它會鎖定數據庫以保護數據的完整性。每次向數據庫添加新條目時,先前的數據都會失效,並且必須更改新的更新狀態。唯一可行的方法是如果數據庫以只讀方式訪問並且沒有被更改。

如果您想為每個節點訪問數據庫的不同部分(類似於分片),您必須能夠將數據分成不同的部分,這在目前結構中似乎是不可能的。您需要整個 trie 才能獲得一個帳戶的資訊。

為了解決這個問題,您必須查看整個數據庫結構。由於我們使用此處看到的 Radix trie:在此處輸入圖像描述

為了擁有兩個不同的 romane 和 rubens 鏈,您需要創建兩個重複的數據庫,一個具有 rom 的根節點,另一個具有 rub。您現在已將 trie 分割成兩個不同的嘗試。然後你可以讓一個節點處理所有以 rom 開頭的請求和一個以 rub 開頭的請求。

讓兩個節點分割所需工作的過程是您必須弄清楚的事情,但該方法將分割特里樹,以便讓多個節點處理一組數據。

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