區(qū)塊鏈分叉帶來的安全挑戰(zhàn)
如果要成功分叉一條區(qū)塊鏈并不容易,并非直接復(fù)制原網(wǎng)絡(luò)的代碼即可,需要進行基本的修改才能保證它安全運行,為此,我們總結(jié)了幾種常見的安全問題及防護方法。

網(wǎng)絡(luò)層
由于分叉鏈?zhǔn)仟毩⒂谠W(wǎng)絡(luò)的區(qū)塊鏈,首先需要在網(wǎng)絡(luò)層(P2P)進行隔離:
1、種子節(jié)點
種子節(jié)點,也稱 bootnode 或者 seednode,是區(qū)塊鏈啟動時網(wǎng)絡(luò)首先會嘗試進行連接的節(jié)點。分叉鏈在啟動時首先連接種子節(jié)點列表里的節(jié)點,從而進一步發(fā)現(xiàn)網(wǎng)絡(luò)中其它的對等節(jié)點,然后才能進一步同步區(qū)塊,達(dá)成共識。因而必須要修改種子節(jié)點列表,防止連接到原網(wǎng)絡(luò)的節(jié)點。
2、異形攻擊
即使種子節(jié)點列表改變了,但并不代表分叉網(wǎng)絡(luò)不會連接到原網(wǎng)絡(luò),因為雙方的 P2P 協(xié)議是相同的,如果有一個節(jié)點無意中添加了另外一個網(wǎng)絡(luò)的節(jié)點連接,那么兩個節(jié)點將成功握手,并將對方添加到節(jié)點地址池。不僅如此,雙方節(jié)點還會將自己節(jié)點里的地址分享給對方,進而造成雙邊網(wǎng)絡(luò)節(jié)點池互相污染。關(guān)于這個問題,慢霧此前曾單獨披露過《沖突的公鏈!來自 P2P 協(xié)議的異形攻擊漏洞》。
為了解決地址池互相污染的問題,需要在通信協(xié)議上做網(wǎng)絡(luò)識別。早期的以太坊并不支持網(wǎng)絡(luò)分隔,但后續(xù)的版本中在協(xié)議里加入了 NetworkID 做為網(wǎng)絡(luò)區(qū)分的標(biāo)志,NetworkID 通常是每個鏈的 ChainID,例如以太坊主網(wǎng)的 NetworkID 和 ChainID 都為 1,而 ETHW 初始版本中并未對 NetworkID 進行分叉,可能存在異形攻擊漏洞。
在比特幣網(wǎng)絡(luò)中,使用的是 Magic 值來標(biāo)識不同的網(wǎng)絡(luò),通常在 chainparams 里進行定義,例如比特幣主網(wǎng)值為 F9BEB4D9,測試網(wǎng)值為 FABFB5DA。
共識層
1、交易隔離
通常與區(qū)塊鏈交互時,我們需要用自己的私鑰簽署一筆交易,隨后這筆交易被廣播到網(wǎng)絡(luò),并被礦工或者出塊節(jié)點打包到區(qū)塊中。但如果區(qū)塊鏈出現(xiàn)分叉,這筆交易可能會被兩個網(wǎng)絡(luò)分別打包到不同的區(qū)塊當(dāng)中,假設(shè)這是一筆原鏈上 的轉(zhuǎn)賬,那么分叉鏈上也會有相同的一筆轉(zhuǎn)賬,顯然這是一個非預(yù)期行為,會造成資產(chǎn)損失。
這時就需要對交易進行重放保護,在早期以太坊的版本中沒有做這樣的保護,后來 EIP155 之后在交易結(jié)構(gòu)中加入了 ChainID,確保用戶簽署的交易只用于當(dāng)前網(wǎng)絡(luò)。如果對以太坊進行分叉,那么也需要對 ChainID 進行重新定義,當(dāng)然這并不是只修改配置里的 ChainID 這么簡單,因為分叉鏈需要對舊的區(qū)塊做兼容,所以需要在分叉高度之后使用新的 ChainID,才能保證分叉鏈正常運行。
比特幣的交易結(jié)構(gòu)中不存在 ChainID,那么它是如何做重放保護的呢?比特幣使用了一種叫做 UTXO 的模型,簡單說它是對一筆交易(UTXO)進行花費,而不是對賬號進行花費,通常全新啟動的網(wǎng)絡(luò)不會存在相同的兩筆交易,也就不存在重放的場景。
但是在硬分叉的情況下,還是會存在交易重放的問題,例如 2017 年的 BCH 分叉以及后來的BSV分叉。BCH 通過在交易數(shù)據(jù)簽名添加SIGHASH_FORKID(0x40),使得 BCH 上的交易和 BTC 的交易不再互相兼容,從而達(dá)到重放保護的目的。
2、算力調(diào)整
在分叉前,原鏈占有全網(wǎng)所有的算力,那么依據(jù) PoW 共識算法,它的出塊計算難度也是比較高的。分叉后,算力分散到不同的區(qū)塊鏈上,那么分叉鏈由于共識不足通常無法獲得足夠的算力去生產(chǎn)新的區(qū)塊,區(qū)塊的增長會陷入停滯。這時有必要降低分叉后的初始計算難度,給分叉鏈贏得一個快速調(diào)整算力的時間窗口。
3、防范 51% 攻擊
網(wǎng)絡(luò)和交易都隔離開了,區(qū)塊鏈分叉了,新區(qū)塊順利產(chǎn)出,一切都看似正常。然而安全問題依舊突出,它依舊存在一種更普遍、更難以防御的攻擊:51% 攻擊。
挖礦是逐利的,當(dāng)出現(xiàn)分叉幣時,哪邊的挖礦收益高礦工就會把算力切換到那個網(wǎng)絡(luò),但現(xiàn)實是分叉幣往往幣價低,導(dǎo)致整體的算力十分低。以 ETHW 分叉為例,我們從 2miners 上看到,原 ETH 網(wǎng)絡(luò)算力峰值最高超過 900TH/s,而在寫稿時 ETHW 的算力只有 30TH/s 左右,大量算力消失并不是好事,它隨時可以對 ETHW 發(fā)起 51% 攻擊。
對于這種 51% 攻擊的防范幾乎沒有什么很好的方法,只能通過增加確認(rèn)數(shù)來防范。
應(yīng)用層
我們把建立在交易上的應(yīng)用,如基于虛擬機的智能合約,統(tǒng)歸為應(yīng)用層。區(qū)塊鏈在分叉時,也會對運行在區(qū)塊鏈上的應(yīng)用產(chǎn)生巨大影響。
1、簽名重放
簽名重放與上文提到的交易重放是相同道理的,有一些合約,例如 Gnosis Safe,它會在合約里驗證用戶的簽名,如果簽名里沒有包含 ChainID,那么這個簽名非常可能可以在兩個鏈上重放,導(dǎo)致資產(chǎn)損失。
2、預(yù)言機失效
分叉后的區(qū)塊鏈多數(shù)智能合約依舊可以正常運行,例如 Token 合約、AMM 合約,這些自運行系統(tǒng)不依賴于鏈下數(shù)據(jù)就可以穩(wěn)定運行,但類似 MakerDAO 等借貸系統(tǒng),高度依賴預(yù)言機的價格數(shù)據(jù),在失去鏈下喂價支持后,它將無法繼續(xù)運行下去。
3、價格劇變
區(qū)塊鏈分叉了,一個應(yīng)用同時運行在兩個鏈上,用戶該使用哪個鏈上的應(yīng)用?哪個算是“正統(tǒng)”的呢?這個問題又回到了共識上,通常哪個區(qū)塊鏈擁有正統(tǒng)的共識,那么它上面的資產(chǎn)就會保留原有的價值共識,而另一個區(qū)塊鏈上的資產(chǎn)會在瞬間失去價值。
這種價格上的劇烈變化,會導(dǎo)致 DeFi 應(yīng)用徹底崩潰,借貸應(yīng)用永遠(yuǎn)無法平倉,有一些有識之士會抓住分叉的時間窗口,把“歸零”的資產(chǎn)通過 AMM 等應(yīng)用兌換成主鏈代幣,從而保留了一些價值,在 ETHW 分叉事件中,我們觀察到了大量分叉鏈上的套利行為。
總結(jié)
至此,我們從網(wǎng)絡(luò)層、共識層和應(yīng)用層對區(qū)塊鏈分叉的安全性進行了分析,可以看到其中存在的技術(shù)風(fēng)險,對于分叉我們需要十分審慎地對待。并且,不少分叉的背后不僅僅是技術(shù)變革的需要,有的可能存在商業(yè)上的直接利益,例如發(fā)起方在分叉中直接獲取大量的分叉幣,這些都需要用戶準(zhǔn)確認(rèn)識,避免不必要的損失。
區(qū)塊鏈?zhǔn)且环N去中心化的系統(tǒng),它的升級不依賴于單一個人或組織,因此分叉在區(qū)塊鏈里難以避免,雖然給社區(qū)用戶帶來混亂,但也促進了系統(tǒng)向前發(fā)展以更好地服務(wù)社會。
























