袁超
(四川大學電子信息學院,成都610065)
區塊鏈技術近年來得到迅速的發展和廣泛的應用。作為區塊鏈技術的底層實現,中本聰提出的分布式記賬系統比特幣,可以在無權限設置的情況下利用POW(工作量證明)達成共識。但是比特幣的缺點也很明顯,在比特幣中,塊大小限制為1MB,平均塊挖掘時間為10分鐘。單個事務的大小在200字節到1K字節之間。在這些限制下,比特幣每秒只能驗證3-7個事務[1],存在嚴重的網絡擁堵情況。為了解決該問題,一方面,比特幣Core開發組提出了隔離驗證[2]和閃電網絡[3]鎖定區塊大小為1M的解決方案,另一方面,BitcoinABC開發組認為隔離驗證和閃電網絡確實是不錯的技術,但并不是成熟的技術,解決不了現階段比特幣網絡擁堵的問題。把區塊大小鎖定為1M也讓主鏈變得毫無價值,閃電網絡也會導致非常嚴重的中心化問題。主張將區塊大小進行擴容,將區塊上限由1MB提升為32MB。然而這些大區塊支持者中的激進派發現在比特幣上實現大區塊無望,Core開發組是不會做出妥協的。一些開發者決定在2017年8月1日對比特幣進行硬分叉創造一種新型的數字貨幣——比特幣現金BCH。BCH修改了比特幣的代碼,刪除了隔離驗證(SegWit),取消了區塊大小1M的限制,提升了交易速度、降低轉賬費用。這產生了比特幣的第一次硬分叉,并誕生了BCH(比特幣現金)。
歷史總是有驚人的相似之處,僅僅15個月后,BCH的硬分叉也已經到來。實際上,這兩次硬分叉,都是源于社區的分裂。而兩次社區分裂的背后,都是改革派與“原教旨主義派”之爭。這一次改革派,是比特大陸為首的Bitcoin ABC社群陣營?!霸讨贾髁x派”,是CSW(Craig Steven Wright)主導的Bitcoin SV社群陣營。比特大陸投資的Bitcoin ABC開發團隊認為,在維持區塊大小在32MB的情況下,應該讓BCH往基礎建設公鏈發展。這樣一來,BCH便能像以太坊一樣,開拓出更多應用場景。以CSW主導的Bitcoin SV社群陣營,則希望BCH仍像當年中本聰論文描述的那樣,對操作碼嚴格限制,專注在轉賬交易本身,并希望將區塊最終擴容為128MB。最終,BCH于11月16日進行了分叉創建出bchabc和bchsv兩條平行的區塊鏈,然而過程并不順利,在分叉期間整個區塊充斥著粉塵交易攻擊,會影響礦池的內存池,從而導致大量的事務堆積和更高的采礦費。更為嚴重的是重放交易攻擊。是主鏈分叉時候出現的一種特殊情況,分叉中兩條鏈上的地址和私鑰算法相同,交易格式也完全相同,導致在其中一條鏈上的交易在另一條鏈上很可能是完全合法的。所以當在其中一條鏈上發起的交易,放到另一條鏈上去重新廣播,可能也會得到確認。導致同一筆數字貨幣產生了兩次交易。
現有的研究中目前存在的論文主要是針對51%攻擊造成的重放攻擊,并提出解決方案,對于分叉過程中的重放攻擊最直接的方法就是分叉后對不同的鏈上的財產進行轉移,不要存在分叉前的地址里。對于警惕性較低的用戶目前存在較大的威脅。
對于粉塵攻擊,現有的研究中暫未出現相關的論文,解決粉塵攻擊需要礦工們達成共識,拒絕打包交易量過低的垃圾交易,為了區塊鏈的價值更多地打包有意義的交易。然而目前并沒有一套有效的共識方案來解決這個問題。為了區塊鏈的健康發展,需要對礦工節點進行改進。
2008年,中本聰提出一種完全通過點對點技術實現的電子現金系統(比特幣)。該方案的核心價值在于基于工作量證明的解決方案,使現金系統在點對點環境下運行,并能夠防止雙花攻擊。如今比特幣已經誕生十年,大量數字貨幣誕生,但對雙花攻擊的討論仍然停留在比特幣51%攻擊上。研究發現,數字貨幣雙花攻擊還有很多種形式。本文介紹硬分叉途中產生的雙花攻擊,即區塊鏈上的重放攻擊,如:在BCH分叉完成后,BCH ABC公鏈出現3筆總計超5,000萬USDT超大額轉賬。凌晨02:41,開頭為qqfq7hhtp的地址向開頭為qzemyvck5的地址轉帳48009枚BCH;凌晨3點13分,開頭為qzdr8muc9的地址收到開頭為qr8e7zcay等地址轉來的80000枚BCH。值得一提的是,安全人員監測到這兩筆大額轉賬在BCH SV公鏈上存在同樣交易,并且第一筆的交易哈希值完全一樣。此次雙花攻擊并沒有調用51%的算力,但是依舊會產生雙花。與區塊鏈內發生的重放攻擊51%攻擊不同,這是存在分叉幣的情況下才會出現的重放攻擊。在進行分叉產生新幣之后,代碼修改較少,導致在其中一條鏈上的交易在另一條鏈上很可能是完全合法的。所以在其中一條鏈上發起的交易,攻擊者可以復制到另一條鏈上重新廣播,也會得到確認。這就是區塊鏈特色的“重放攻擊”。
普通用戶在主鏈分叉為兩條鏈時,同時擁有兩條鏈的資產,分叉鏈上的重放攻擊可能導致一條鏈上的資產被盜取。在交易所中的分叉幣之間,不斷存取一種幣,可能會導致另一種分叉幣無故流失,這也可以通過重放攻擊實現。圖1描述了對用戶賬戶的重放攻擊。

圖1 在分叉鏈上進行的重放攻擊
由于硬分叉的特性,普通的用戶賬戶會得到空投的分叉代幣,攻擊者通過在分叉區塊鏈上重放交易,從而在未經用戶許可的情況下獲取用戶的分叉代幣。
在觀察區塊鏈BCH分叉過程中,除了重放攻擊外,還存在一種區塊鏈的攻擊——粉塵攻擊,惡意用戶使用低價值的粉塵交易充斥網絡,使礦工的mempool被快速占用,導致新的正常交易轉發到礦工節點時無法處理,造成區塊的長時間堵塞;與此同時,為了搶占交易被打包的機會,市場會自發抬高交易手續費。
由區塊鏈瀏覽器數據顯示,BCH在區塊高度556767處發生分叉。由于持續不斷的粉塵攻擊,區塊大小明顯擴大,礦工節點mempool和采礦費大小呈正相關擴大。通過繪制圖來說明交易數量,mempool大小和平均交易費的關系,顯示攻擊的效果。這些數據是通過爬取2018年11月6號556734區塊到556833 bch區塊瀏覽器上記錄的區塊大小,支付給礦工平均費用和mempool大小,通過簡化,數據范圍在[0-1],并繪制出交易數,mempool和采礦費的關系圖。如圖1所示。
從圖2中可以看出粉塵攻擊造成的高交易數和mempool大小、采礦費正相關??梢钥闯龇蹓m攻擊造成的影響是合法的用戶提出的交易在攻擊期間將支出更高的采礦費,此外還會導致整個區塊的堵塞,需要確認的交易將由于區塊堵塞停留在區塊鏈中。

圖2 交易數、mempool和采礦費
實現粉塵攻擊有多重手段,有的是作為交易的發起者,在全網發送很多手續費高,但是轉賬金額非常小的無意義交易,礦工就會優先打包這些交易,從而堵塞區塊鏈,此攻擊成本較高,技術要求較低,此次硬分叉期間就存在大量的高手續費的無意義交易。還有一種成本較低的攻擊方案,攻擊者擁有比特幣網絡中的一個完整節點,在其機器上有完整的區塊鏈和一個mempool,假設攻擊者錢包中的余額足夠大,可以分成大量的小額交易,每個小額交易都能支付采礦費。攻擊者還控制了一組sybils賬戶(被惡意操控進行協同攻擊的虛假賬戶),每個賬戶都有多個公共地址,攻擊者和sybil賬戶知道彼此的公共地址。此外攻擊者和sybils有客戶端軟件和腳本[1]能夠發起大量的“原始交易”[2]。當具備這些條件后,將完整節點中挖掘出來的交易都分散輸入進sybil的UTXO(未花費的交易輸出)里,然后,所有的sybil賬戶都會生成“原始交易”以最小的價值進行相互交換。交易率將遠遠高于網絡的吞吐量,導致交易積壓,從而增加了mempools的大小。
重放攻擊能成功的關鍵在于,兩條分叉鏈的代碼修改較少,同一條交易可能在兩條鏈上都是合法的。
比較高效的解決方案是開啟重放保護,通過添加隨機數、時間戳,或者流水號,在兩條鏈間形成保護,讓一條鏈上的事務在另一條鏈上無效被識別,以確保兩條數據共享鏈保持獨立運行狀態,并防止兩鏈間出現相互多次識別的情況。所以在區塊鏈發生硬分叉時除了用戶對鏈上的財產進行轉移之外,還可以通過開啟重放保護的方式防御。
為了對抗粉塵攻擊,提出一系列對于采礦節點的改進。當采礦節點正常運行時,接收incoming transactions并存入mempool,當檢測到 incoming transactions異常增多時,不直接存入mempool,而是存入本地緩存,進行篩選。由于不同區塊鏈的大小不同,能夠抵御粉塵攻擊的程度也不同,bch區塊最大容量8MB,大約是40000筆交易。btc區塊最大容量1MB,大約3000比交易。由于單筆交易大小范圍在100byte-4000byte不等,以區塊容量的變化速率作為是否受到粉塵攻擊的標準,2018年11月6號發生粉塵攻擊開始時區塊556765至556767中交易數由952迅速變成13202后變成20861,區塊大小也由0.3MB迅速變成4MB,所以本防御方案設定當檢測到區塊大小變化超過5倍時(倍數越小檢測越嚴格),判定為可能受到粉塵攻擊?;蛘邊^塊大小達到最大容量80%時判定可能受到了粉塵攻擊。同樣當發現區塊大小變化縮小超過5倍,或者區塊小于最大容量20%時判斷為恢復到正常區塊狀態。當判定疑似遭受粉塵攻擊時,將incoming transactions存入緩存,并篩選。
篩選方法上,首先檢測incoming transactions是否屬于無意義交易(發起人與接收人一致),如果屬于無意義在區塊擁堵結束前將不會轉入mempool,在剔除掉無意義交易之后,提出了三種進一步篩選設計:基于費用、基于確認數,以及基于驗證碼的篩選設計。
(1)基于費用的設計
在基于費用的設計中,針對攻擊者的兩種攻擊策略,對轉發費和采礦費設置最低和最高的閾值,最低閾值可以通過允許接受低手續的粉塵交易來抵制攻擊者的策略,最終目的是將其挖掘到區塊中。最高閾值可以過濾掉高手續費的粉塵交易來抵制攻擊者的策略,過濾掉攻擊者的粉塵交易,從而減少mempool的大小。主要設計流程如圖3所示。

圖3 基于費用的設計
(2)基于確認數的設計
在基于確認值的設計中,主要針對的是攻擊者低手續費的攻擊策略,如圖4所示對每個傳入的交易,計算其父交易的數量,設置average age并將其初始化為0,接下來,通過每個父交易的確認數總和除以父交易的總數來計算事務的平均確認數。對每個進入的交易獲得平均確認數之后,申請一個mempool上的最小平均確認數過濾器,最小平均確認數可以取任何大于0的數。根據比特幣開發者指南[3],確認數為6時被認為是最合適的。任何交易只有滿足最小平均確認數,才會被mempool接收。通過這種方式攻擊者控制的采礦節點和Sybil節點生成的所有未確認交易將會被mempool拒絕,如果攻擊者仍想要對網絡進行粉塵攻擊,將不得不開采自己發出的所有交易并等待獲得符合要求的確認值。因此,這增加了攻擊的成本并且減少了可以發起攻擊的時間窗口。

圖4 基于確認年齡的設計
(3)基于驗證碼的設計
在基于驗證碼的設計中,主要是針對攻擊腳本的防御,當采礦節點接收到由普通賬戶發起的交易時,為了保證是用戶發起而不是攻擊腳本批量發起,需要向賬戶客戶端發送6位的隨機驗證碼,只要用戶接收到驗證碼并將驗證碼正確的返回給采礦節點,采礦節點便將交易轉入mempool。通過添加一步驗證碼的方法,使攻擊者的腳本失效,從而使攻擊者發起的粉塵攻擊無法進入mempool。流程設計如圖5所示。

圖5 基于驗證碼的設計
進行了三個實驗分別測試三種方案的防御效果。生成了1800個符合區塊鏈格式的交易,其中300個是發起者等于接收者的無意義交易,300個是高額采礦費率的惡意占用區塊資源的交易,300個是以最低費率惡意占用mempool的交易,剩余的900個合法交易采礦費分布在最小和最大采礦費的范圍內。
使用混淆矩陣,把合法交易定義為正面,惡意交易定義為負面,分別統計了不同采礦費率下,不同平均年齡下的TP TN FN FP并計算出精準度,準確率和召回率,如圖6-圖8。

圖6 基于采礦費的設計

圖7 基于平均年齡的設計

圖8 基于驗證碼的設計
在丟棄粉塵攻擊數量上,基于驗證碼的設計效果最好,并且對合法用戶影響最小,但是實現較麻煩,需要同時改進采礦節點和SPV錢包節點。
在設計上更容易實現的是基于采礦費的設計和基于平均年齡的設計。當攻擊不嚴重時,基于費用的設計在mempool大小的優化中更有效,但是,會影響攻擊者和合法用戶。當攻擊嚴重時,基于時間的設計幫助合法用戶同時丟棄最大量的粉塵交易更有效。
在本文中,提出了區塊鏈硬分叉中的重放攻擊和粉塵攻擊,其中重放攻擊最有效的應對方法是在硬分叉前通過隨機數、時間戳,或者流水號區分開兩條區塊鏈。對于粉塵攻擊設計了三種防御方案,其中基于驗證碼的設計,對粉塵攻擊防御效果最好,但兼容性較差。相對兼容性較好的基于費用的設計和基于平均年齡的設計中,當攻擊不嚴重時基于費用的設計防御效果更有效,但是會影響正常用戶,相反當攻擊嚴重時,基于時間的設計防御效果更有效。