作者:Johnny Wang / 來源:medium
當前 Geth 預設的同步模式稱為快速同步 ( fast sync )。理由是與其從 genesis 區塊開始并重新處理所有發生的交易 ( 可能需要數周時間 ),選擇快速同步可以很快的下載完區塊且僅需驗證相關的工作證明。下載所有區塊是一個相對簡單且快速的過程,許多人錯誤地認為因為他們的節點已下載了所有區塊,所以他們目前的狀態是同步的。
然而實際情況并非如此,因為這是一個還沒有執行過任何交易(即沒有執行任何交易以驗證此區塊鏈的有效性)的新節點,因此沒有任何有效的的帳戶狀態( 即余額,隨機數,智能合約代碼等資料)。這些資訊需要另外下載并與最新的區塊交叉檢查,這個階段我們稱為 state trie download,它實際上與區塊的下載同時進行,但需要比下載區塊花更久的時間。
那么 state trie 究竟是什么?我們首先需要了解以太坊的網路結構。目前以太坊主網中存在大量的帳戶并可追蹤該地址或是合約的余額、隨機值 ( nounce ) 等資訊。
但單靠帳戶本身并不足以執行一個節點,帳戶還需要以加密方式連接到區塊,以便節點可以實際驗證該帳戶資訊是否被篡改。這個加密連接是透過在帳戶上方建立一個樹狀資料結構來完成的,該結構的每個層級都將其下一層級匯聚成更小的一層,一直持續到此樹狀結構的唯一根( root )為止。這個包含所有帳戶和中間加密證明的龐大資料結構被稱為 State Trie。
像 Trie 這樣的資料結構是由無數個加密證明 ( 又稱作 Trie Nodes ) 相互連結而構成。因此要真正擁有同步節點,我們還需要下載所有的帳戶資料以及所有的加密證明以驗證網路的正確性。所以其本身就已經是一個相當復雜的資料集。
更麻煩的是,這個資料集的狀態仍在持續地改變;以太坊每生成一個新的區塊 ( 平均 15 秒 ) 就會從這個 trie 中剔除約 1000 個節點,并加入大約 2000 個新節點。這代表節點需要具有能以每秒 200 次的速度修改此 dataset 的能力才能完成同步。
當我們正在進行同步時,以太坊網路仍在不停更新,因此我們在初期獲得的狀態可能會在下載進行途中消失,進而導致節點需要不斷地追蹤網路狀態,同時嘗試收集所有最新資料。
很多人發現當同步已進行到只落后主網最新高度后幾個區塊,卻不知道這僅僅是完成了區塊鏈的主要下載階段且仍在執行前面提到的狀態下載。若要確認真實同步進度,需要透過日志中 ( 或是 nohup 日志 ) 導入的狀態條目去觀察。由于節點無法事先預知 state trie 有多大,所以它只能持續地執行,直到搜索及下載完所有的資訊。
原因是以太坊中的區塊僅包含狀態根 ( state root ),也就是根節點 ( root node ) 的一個雜湊值。啟動同步后節點會開始從另一個節點下載區塊,該節點最多可以再引用其他 16 個新節點。在下一階段,初始節點將連結到約 16 個新節點并嘗試下載。在下載進行的同時,這16個節點之中的多數節點將繼續引入其他新的節點。這就是為什么有時候會發現區塊的同步值一直停頓在相同的數字。事實上是它仍正在搜尋和下載 trie。這個狀態同步的過程主要受于儲存裝置本身 I/O 的限制,而不是網路的頻寬。
7,200 RPM SATA3(Serial ATA)的主流硬盤在容量上已經可達到3–4TB空間大小,售價相比SSD 通常也非常便宜,但在效能表現方面,亦即IOPS 數值,則大約落在75 左右。而 15,000 RPM SAS(Serial Attached SCSI)主流硬盤容量為 300–900 GB,雖然售價是 SATA 硬盤的好幾倍,并且空間也小很多,但是其 IOPS 效能數值大約可達 175 左右。
以太坊中的 state trie 結構包含數億個節點,其中大多數節點采用單一雜湊的形式,允許引用其他最多 16個雜湊。這是將資料儲存在硬盤上的一種可怕方式,因為它幾乎沒有結構 ( 僅是隨機數引用更多的隨機數 )。關于這點,恐怕任何的底層資料庫都會哭泣,因為它幾乎無法以任何有意義的方式去優化資料存儲與搜尋。
不僅資料的存儲非常不理想,且由于每秒近200次的資料修改,我們甚至無法將其以任何一種正確的預處理方式去下載,使其能更快地被導入,同時讓資料庫也不需要頻繁地反覆修改。最終的結果是,即使是采用快速同步,也會產生巨大的硬盤 IO 成本,這對一般機械式硬盤是相當大的負荷。
對照 SSD 接近 6000 IOPS 的效能執行表現,加上自身反應延遲極低,這些都是 HDD 沒有的優勢,這也是為什么我們很難在單一機械式硬盤上執行并同步一個全節點。機械式硬盤執行快速同步事實上將花費非常非常久的時間。即使你愿意等待到同步完成,HDD 恐怕也無法滿足目前主網對交易處理的 IOPS 請求。
除了硬盤的類型及轉速影響IOPS 效能數值外,還有磁碟陣列(Redundant Array of Independent Disks,RAID)的Penalty 和Cache 部分需要考量,因為不同類型的磁碟陣列RAID 模式,仍會影響到整體IOPS 效能數值。
在不考慮透過磁碟陣列提升 I/O 輸出的情況下,機械式硬盤唯一的選擇就是執行對系統資源影響最低的輕節點。但就執行全節點來說,SSD 目前是唯一選擇。