區塊鏈分叉帶來的安全挑戰

區塊鏈分叉分為軟分叉和硬分叉。 本文主要探討的是硬分叉,一種不支持向後相容的軟體升級管道。硬分叉是共識的分裂或者改變,共識就是區塊鏈系統中各節點達成數據一致性的算灋,正常情况下每個節點需要運行相同規則的算灋,例如比特幣運行的是基於PoW(工作量證明)共識,乙太坊曾經也是PoW共識,最近通過“The Merge”切換到了PoS共識算灋。

分叉的原因有很多,在區塊鏈當中是一種很常見的現象,通常是短距離的分叉,這和共識算灋有關,同一個高度上有時會出現相互競爭的區塊,但最終有的區塊會被放弃,只保留一個區塊。 但硬分叉不同,這一種是有計劃有目的的分叉,一些節點用戶端部署了與原網絡不同的程式版本,生產出的區塊只能在分叉鏈上通過驗證,無法被原網絡接受,也不接受原網絡的區塊。 例如近期熱門的EthereumPoW(ETHW)分叉。

如果要成功分叉一條區塊鏈並不容易,並非直接複製原網絡的程式碼即可,需要進行基本的修改才能保證它安全運行,為此,我們總結了幾種常見的安全問題及防護方法。

網路層

由於分叉鏈是獨立於原網絡的區塊鏈,首先需要在網路層(P2P)進行隔離:

1、種子節點

種子節點,也稱bootnode或者seednode,是區塊鏈啟動時網絡首先會嘗試進行連接的節點。 分叉鏈在啟動時首先連接種子節點清單裏的節點,從而進一步發現網絡中其它的對等節點,然後才能進一步同步區塊,達成共識。 因而必須要修改種子節點清單,防止連接到原網絡的節點。

2、异形攻擊

即使種子節點清單改變了,但並不代表分叉網絡不會連接到原網絡,因為雙方的P2P協定是相同的,如果有一個節點無意中添加了另外一個網絡的節點連接,那麼兩個節點將成功握手,並將對方添加到節點地址池。 不僅如此,雙方節點還會將自己節點裏的地址分享給對方,進而造成雙邊網絡節點池互相污染。 關於這個問題,慢霧此前曾單獨披露過《沖突的公鏈!來自P2P協議的异形攻擊漏洞》。

為了解决地址池互相污染的問題,需要在通信協議上做網絡識別。 早期的乙太坊並不支持網絡分隔,但後續的版本中在協定裏加入了NetworkID做為網絡區分的標誌,NetworkID通常是每個鏈的ChainID,例如乙太坊主網的NetworkID和ChainID都為1,而ETHW初始版本中並未對NetworkID進行分叉,可能存在异形攻擊漏洞。

在比特幣網絡中,使用的是Magic值來標識不同的網絡,通常在chainparams裏進行定義,例如比特幣主網值為F9BEB4D9,測試網值為FABFB5DA。

共識層

1、交易隔離

通常與區塊鏈互動時,我們需要用自己的私密金鑰簽署一筆交易,隨後這筆交易被廣播到網絡,並被礦工或者出塊節點打包到區塊中。 但如果區塊鏈出現分叉,這筆交易可能會被兩個網絡分別打包到不同的區塊當中,假設這是一筆原鏈上的轉帳,那麼分叉鏈上也會有相同的一筆轉帳,顯然這是一個非預期行為,會造成資產損失。

這時就需要對交易進行重放保護,在早期乙太坊的版本中沒有做這樣的保護,後來EIP155之後在交易結構中加入了ChainID,確保用戶簽署的交易只用於當前網絡。 如果對乙太坊進行分叉,那麼也需要對ChainID進行重新定義,當然這並不是只修改配寘裏的ChainID這麼簡單,因為分叉鏈需要對舊的區塊做相容,所以需要在分叉高度之後使用新的ChainID,才能保證分叉鏈正常運行。

比特幣的交易結構中不存在ChainID,那麼它是如何做重放保護的呢? 比特幣使用了一種叫做UTXO的模型,簡單說它是對一筆交易(UTXO)進行花費,而不是對帳號進行花費,通常全新啟動的網絡不會存在相同的兩筆交易,也就不存在重放的場景。

但是在硬分叉的情况下,還是會存在交易重放的問題,例如2017年的BCH分叉以及後來的BSV分叉。 BCH通過在交易數據簽名添加SIGHASH_ FORKID(0x40),使得BCH上的交易和BTC的交易不再互相相容,從而達到重放保護的目的。

2、算力調整

在分叉前,原鏈佔有全網所有的算力,那麼依據PoW共識算灋,它的出塊計算難度也是比較高的。 分叉後,算力分散到不同的區塊鏈上,那麼分叉鏈由於共識不足通常無法獲得足够的算力去生產新的區塊,區塊的增長會陷入停滯。 這時有必要降低分叉後的初始計算難度,給分叉鏈贏得一個快速調整算力的時間視窗。

3、防範51%攻擊

網絡和交易都隔離開了,區塊鏈分叉了,新區塊順利產出,一切都看似正常。 然而安全問題依舊突出,它依舊存在一種更普遍、更難以防禦的攻擊:51%攻擊。

挖礦是逐利的,當出現分叉幣時,哪邊的挖礦收益高礦工就會把算力切換到那個網絡,但現實是分叉幣往往幣價低,導致整體的算力十分低。 以ETHW分叉為例,我們從2miners上看到,原ETH網絡算力峰值最高超過900TH/s,而在寫稿時ETHW的算力只有30TH/s左右,大量算力消失並不是好事,它隨時可以對ETHW發起51%攻擊。

對於這種51%攻擊的防範幾乎沒有什麼很好的方法,只能通過新增確認數來防範。

應用層

我們把建立在交易上的應用,如基於虛擬機器的智慧合約,統歸為應用層。 區塊鏈在分叉時,也會對運行在區塊鏈上的應用產生巨大影響。

1、簽名重放

簽名重放與上文提到的交易重放是相同道理的,有一些合約,例如Gnosis Safe,它會在合約裏驗證用戶的簽名,如果簽名裏沒有包含ChainID,那麼這個簽名非常可能可以在兩個鏈上重放,導致資產損失。

2、預言機失效

分叉後的區塊鏈多數智慧合約依舊可以正常運行,例如Token合約、AMM合約,這些自運行系統不依賴於鏈下數據就可以穩定運行,但類似MakerDAO等借貸系統,高度依賴預言機的價格數據,在失去鏈下喂價支持後,它將無法繼續運行下去。

3、價格劇變

區塊鏈分叉了,一個應用同時運行在兩個鏈上,用戶該使用哪個鏈上的應用? 哪個算是“正統”的呢? 這個問題又回到了共識上,通常哪個區塊鏈擁有正統的共識,那麼它上面的資產就會保留原有的價值共識,而另一個區塊鏈上的資產會在瞬間失去價值。

這種價格上的劇烈變化,會導致DeFi應用徹底崩潰,借貸應用永遠無法平倉,有一些有識之士會抓住分叉的時間視窗,把“歸零”的資產通過AMM等應用兌換成主鏈代幣,從而保留了一些價值,在ETHW分叉事件中,我們觀察到了大量分叉鏈上的套利行為。

總結

至此,我們從網路層、共識層和應用層對區塊鏈分叉的安全性進行了分析,可以看到其中存在的科技風險,對於分叉我們需要十分審慎地對待。 並且,不少分叉的背後不僅僅是科技變革的需要,有的可能存在商業上的直接利益,例如發起方在分叉中直接獲取大量的分叉幣,這些都需要用戶準確認識,避免不必要的損失。

區塊鏈是一種去中心化的系統,它的陞級不依賴于單一個人或組織,囙此分叉在區塊鏈裏難以避免,雖然給社區用戶帶來混亂,但也促進了系統向前發展以更好地服務社會。