深入 Geth- 為什麼 同步 以太 坊 節點 會 這麼 慢? – STAR BIT

這篇 文章 將 進一步 解釋 一些 同步 以太 坊 節點 時 的 細節。 關於 同步 效率 , 相信 是 許多 部署 以太 坊 (節點) 的 人 都曾 遭遇 困難。 當前 Geth 預設 的 同步 模式 稱為 快速 同步 (sincronización rápida)從 理由 是 與其 從 génesis 區塊 開始 並 重新 處理 所有 發生 的 交易 (可能 需要 數 週 時間) , 選擇 快速 同步 可以 很快 的 下載 完 區塊 且 僅需 驗證 相關 的 工作 證明。 下載 所有 區塊 是 一個相對 簡單 且 快速 的 過程 , 許多 人 錯誤 地 認為 因為 他們 的 節點 已 下載 了 所有 區塊 , 所以 他們 目前 的 狀態 是 同步 的。

然而 實際 情況 並非 如此 , 因為 這 是 一個 還 沒有 執行 過 任何 交易 (即 沒有 執行 任何 交易 以 驗證 此 區塊 鏈 的 有效性) 的 新 節點 , 因此 沒有 任何 有效 的 的 帳戶 狀態 (即 餘額 , 隨機 數, 智能 合約 代碼 等 資料)。 這些 資訊 需要 另外 下載 並 與 最新 的 區塊 交叉 檢查 , 這個 階段 我們 稱為 descarga de estado trie , 它 實際上 與 區塊 的 下載 同時 進行 , 但 需要 比 下載 區塊 花 更久 的 時間。

T state trie 究竟 是 什麼? 我們 首先 需要 了解 以太 坊 的 網路 結構。 目前 以太 坊 主 網 中 存在 大量 的 帳戶 並可 追蹤 該 地址 或是 合約 的 餘額 、 隨機 值 (sustantivo) 等 資訊。

但 單靠 帳戶 本身 並 不足以 執行 一個 節點 , 帳戶 還 需要 以 加密 方式 連接 到 區塊 , 以便 節點 可以 實際 驗證 該 帳戶 資訊 是否 被 篡改。 這個 加密 連接 是 透過 在 帳戶 上方 建立 一個 樹狀 資料 結構 來Root 的 , 該 結構 的 每個 層級 都 將 其 下一 層級 匯聚成 更 小 的 一層 , 一直 持續 到此 樹狀 結構 的 唯一 根 (raíz) 為止。 這個 包含 所有 帳戶 和 中間 加密 證明 的 龐大 資料 結構 被稱為 Estado Trie。

Rie Trie 這樣 的 資料 結構 是 由 無數 個 加密 證明 (又 稱作 Nodos Trie) 相互 連結 而 構成。 因此 要 真正 擁有 同步 節點 , 我們 還 需要 下載 所有 的 帳戶 資料 以及 所有 的 加密 證明 以 驗證 網路 的 正確性。 所以 其 本身 就 已經 是 一個 相當 複雜 的 資料 集。

更 麻煩 的 是 , 這個 資料 集 的 狀態 仍在 持續 地 改變 ; 以太 坊 每 生成 一個 新 的 區塊 (平均 15 秒) 就會 從 這個 trie 中 剔除 約 1000 個 節點 , 並 加入 大約 2000 個 新 節點。這 代表 節點 需要 具有 能 以 每秒 200 次 的 速度 修改 此 conjunto de datos 的 能力 才能 完成 同步。

當 我們 正在進行 同步 時 , 以太 坊 網路 仍在 不停 更新 , 因此 我們 在 初期 獲得 的 狀態 可能 會 在 下載 進行 途中 消失 , 進而 導致 節點 需要 不斷 地 追蹤 網路 狀態 , 同時 嘗試 收集 所有 最新 資料。

很多 人 發現 當 同步 已 進行 到 只 落後 主 網 最新 高度 後 幾個 區塊 , 卻不 知道 這 僅僅 是 完成 了 區塊 鏈 的 主要 下載 階段 且 仍在 執行 前面 提到 的 狀態 下載。 若要 確認 真實同步 進度 , 需要 透過 日誌 中 (或是 nohup 日誌) 導入 的 狀態 條目 去 觀察。 由於 節點 無法 事先 預知 estado trie 有 多大 , 所以 它 只能 持續 地 執行 , 直到 搜索 及 下載 完 所有 的 資訊。

原因 是 以太 坊 中 的 區塊 僅 包含 狀態 根 (raíz del estado), 也 就是 根節點 (nodo raíz) 的 一個 雜 湊 值。 啟動 同步 後 節點 會 開始 從 另一個 節點 下載 區塊 , 該 節點 最多 可以 再 引用其他 16 個 新 節點。 在 下一 階段 , 初始 節點 將 連結 到 約 16 個 新 節點 並 嘗試 下載。 在 下載 進行 的 同時 , 這 16 個 節點 之中 的 多數 節點 將 繼續 引入 其他 新 的 節點。 這 就是 為什麼Rie 會 發現 區塊 的 同步 值 一直 停頓 在 相同 的 數字。 事實上 是 它 仍 正在 搜尋 和 下載 trie。 這個 狀態 同步 的 過程 主要 受 於 儲存 裝置 本身 I / O 的 限制 , 而 不是 網路 的 頻寬。

7.200 RPM SATA3 A Serial ATA) 的 主流 硬碟 在 容量 上 已經 可 達到 3–4TB 空間 大小 , 售價 相比 SSD 通常 也 非常 便宜 , 但 在 效能 表現 方面 , 亦即 IOPS 數值 , 則 大約 落在 75 左右SAS 而 15,000 RPM SAS (SCSI conectado en serie) 主流 硬碟 容量 為 300–900 GB, 雖然 售價 是 SATA 硬碟 的 好 幾倍 , 並且 空間 也 小 很多 , 但是 其 IOPS 效能 數值 大約 可達 175 左右。

以太 坊 中 的 state trie 結構 包含 數億 個 節點 , 其中 大多數 節點 採用 單一 雜 湊 的 形式 , 允許 引用 其他 最多 16 個 雜 湊。 這 是 將 資料 儲存 在 硬碟 上 的 一種 可怕 方式 , 因為 它 幾乎 沒有 結構(僅 是 隨機 數 引用 更多 的 隨機 數)。 關於 這 點 , 恐怕 任何 的 底層 資料 庫 都會 哭泣 , 因為 它 幾乎 無法 以 任何 有意義 的 方式 去 優化 資料 存儲 與 搜尋。

近 資料 的 存儲 非常 不 理想 , 且 由於 每秒 近 200 次 的 資料 修改 , 我們 甚至 無法 將 其 以 任何 一種 正確 的 預處理 方式 去 下載 , 使其 能 更快 地 被 導入 , 同時 讓 資料 庫 也不O 頻繁 地 反覆 修改。 最終 的 結果 是 , 即使 是 採用 快速 同步 , 也會 產生 巨大 的 硬碟 IO 成本 , 這 對 一般 機械 式 硬碟 是 相當 大 的 負荷。

對照 SSD 接近 6000 IOPS 的 效能 執行 表現 , 加上 自身 反應 延遲 極低 , 這些 都是 HDD 沒有 的 優勢 , 這 也是 為什麼 我們 很難 在 單一 機械 式 硬碟 上 執行 並 同步 一個 全 節點。 機械 式 硬碟D 快速 同步 事實上 將 花費 非常 非常 久 的 時間。 即使 你 願意 等待 到 同步 完成 , HDD 恐怕 也 無法 滿足 目前 主 網 對 交易 處理 的 IOPS 請求。

除了 硬碟 的 類型 及 轉速 影響 IOPS 效能 數值 外 , 還有 磁碟 陣列 (Matriz redundante de discos independientes , RAID) 的 Penalización 和 Caché 部分 需要 考量 , 因為 不同 類型 的 磁碟 陣列 RAID 模式 , 仍會 影響 到 整體IOPS 效能 數值。

/ 不 考慮 透過 磁碟 陣列 提升 I / O 的 的 情況 下 , 機械 式 硬碟 唯一 的 選擇 就是 執行 對 系統 資源 影響 最低 的 輕 節點。 但 就 執行 全 節點 來說 , SSD 目前 是 唯一 選擇。