Synchronization

與 ETH 主網的 RPC 連接

  • June 5, 2019

目前我正在使用 GETH,但嘗試同步卻沒有成功,需要 4~5 天!

我可以知道任何其他可以提供 RPC 連接並能夠快速與主網同步的 ETH 客戶端嗎?!?

同步不是通過 RPC 完成的,RPC 僅用於 web3 api。

同步是使用乙太坊協議完成的。

您是否將區塊鏈儲存在 SSD 磁碟上?如果沒有,這可能是緩慢的原因。

您可以使用 MyEtherWallet 節點或 Infura 伺服器,但僅作為客戶端,您將無法使用它們進行同步。

同步乙太坊本身就是一個痛點,這不是 geth 或任何客戶端的問題。您可以使用 Infura 等其他服務,然後他們已經為您同步了主網。您只需要 rpc 連接到提供的端點。

有關乙太坊同步的更多詳細資訊,您可以轉到以下連結

https://github.com/ethereum/go-ethereum/issues/17515#issuecomment-416146227

同步乙太坊對許多人來說是一個痛點,所以我將嘗試詳細說明幕後發生的事情,這樣可能會減少一些混亂。

Geth 目前的預設同步模式稱為快速同步。不是從創世塊開始並重新處理曾經發生的所有交易(可能需要數週時間),而是快速同步下載塊,並且只驗證相關的工作量證明。下載所有塊是一個簡單而快速的過程,並且會相對快速地重新組裝整個鏈。

許多人錯誤地認為,因為他們有塊,他們是同步的。不幸的是,情況並非如此,因為沒有執行任何交易,所以我們沒有任何可用的賬戶狀態(即餘額、隨機數、智能合約程式碼和數據)。這些需要單獨下載並與最新塊進行交叉檢查。這個階段稱為狀態 trie 下載,它實際上與塊下載同時執行;唉,現在比下載塊需要更長的時間。

那麼,什麼是狀態嘗試?在乙太坊主網中,已經有大量賬戶,用於跟踪每個使用者/合約的餘額、nonce 等。然而,賬戶本身不足以執行節點,它們需要以加密方式連結到每個塊,以便節點可以實際驗證賬戶沒有被篡改。這種加密連結是通過在賬戶之上創建一個樹資料結構來完成的,每一層將它下面的層聚合成一個更小的層,直到你到達單個根。這個包含所有帳戶和中間加密證明的巨大資料結構稱為狀態樹。

好的,那麼為什麼這會造成問題?這種 trie 資料結構是數億個微小密碼證明(trie 節點)的錯綜複雜的互連。要真正擁有一個同步節點,您需要下載所有帳戶數據以及所有微小的加密證明,以驗證網路中沒有人試圖欺騙您。這本身就已經是數量驚人的數據項。更混亂的部分是這些數據在不斷變化:在每個塊(15 秒),從這個樹中刪除大約 1000 個節點,並添加大約 2000 個新節點。這意味著您的節點需要同步每秒更改 200 次的數據集。最糟糕的是,當你在同步時,網路正在向前移動,並且你開始下載的狀態可能會在你下載時消失,因此,您的節點需要在嘗試收集所有最新數據的同時不斷關注網路。但在您真正收集所有數據之前,您的本地節點無法使用,因為它無法以加密方式證明任何帳戶的任何資訊。

如果你看到你落後於主網 64 個區塊,那麼你還沒有同步,甚至還沒有關閉。您剛剛完成了塊下載階段,並且仍在執行狀態下載。您可以通過看似無窮無盡的 Imported 狀態條目自己看到這一點

$$ … $$日誌流。在您的節點真正上線之前,您也需要等待。 問:節點只是掛在導入狀態實體上?!

A:節點沒有掛起,它只是不知道狀態樹有多大,所以它不斷地繼續前進,直到它發現並下載整個東西。

原因是乙太坊中的一個塊只包含狀態根,即根節點的單個雜湊。當節點開始同步時,它只知道 1 個節點並嘗試下載它。該節點最多可以引用 16 個新節點,因此在下一步中,我們將了解 16 個新節點並嘗試下載它們。隨著下載的進行,大多數節點都會引用我們之前不知道的新節點。這就是為什麼您可能會認為它停留在相同的數字上的原因。它不是,而是在發現和下載 trie 的過程中。

問:我被困在主網後面 64 個街區?!

A:如上所述,您並沒有卡住,只是完成了塊下載階段,等待狀態下載階段也完成。如今,後一個階段比僅僅獲得塊花費的時間要長得多。

Q:為什麼下載狀態需要這麼長時間,我有很好的頻寬?

A:狀態同步主要受磁碟 IO 限制,而不是頻寬。

乙太坊中的狀態樹包含數億個節點,其中大多數採用單個雜湊的形式,最多引用 16 個其他雜湊。這是一種在磁碟上儲存數據的可怕方式,因為其中幾乎沒有結構,只是引用更多隨機數的隨機數。這會使任何底層數據庫哭泣,因為它無法以任何有意義的方式優化儲存和查找數據。

不僅儲存數據非常不理想,而且由於每秒 200 次修改和對過去數據的修剪,我們甚至無法下載它,這是一種適當的預處理方式,可以使其導入速度更快,而無需底層數據庫對其進行過多的改組。最終結果是,即使是現在的快速同步也會產生巨大的磁碟 IO 成本,這對於機械硬碟驅動器來說太過分了。

問:等等,所以我不能在 HDD 上執行完整節點?

答:很遺憾沒有。在 HDD 上進行快速同步將花費比您願意等待目前數據模式更多的時間。即使您確實等待,HDD 也無法跟上主網上交易處理的讀/寫要求。

但是,您應該能夠在 HDD 上執行輕客戶端,而對系統資源的影響最小。但是,如果您希望執行完整節點,SSD 是您唯一的選擇。

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