您絕對沒有連到內容農場!水電工協會保證您還在正確的網頁!這種充滿喜感的標題只是筆者看了一時手癢不得不用罷了!本期和大家談的就是區塊鏈的安全性,所以用輕鬆嬉鬧的標題,肯定可讓讀者有愉快的心情跳下這個火坑。
首先這是個標題殺人法,其實在 DAO 事件發生時,以太鏈的不可逆神話並沒有被打破,所有交易都符合區塊鏈基本交易原則!發生問題的是 DAO Token 所屬的智慧合約,且發生的問題本質在於智慧合約程式有問題,讓駭客找到機會無限制把 DAO 代幣放到自創的一個子項目,嚴格說來它和區塊鏈被破有很大一段差距,不過許多媒體朋友都超譯,導致這類標題滿天飛,讓筆者不得不跟進,不然文章就無法收錄到內容農場……呃,是無法得到好的點閱率,日子真是太難過了……再慢著,那麼以太幣的處理方法難道不是否認那些攻擊發生時的所有區塊嗎?當然,所有區塊鏈都使用共識型協議,只要多數參與者表決成功,安裝新程式,整個鏈就可否決掉部分交易肯定沒錯,但這種可逆性是受控且一樣需要共識,和區塊鏈安全性被逆轉還是有很大差距。不過以太坊這種做法仍被多數礦工批評為無法無天、偽幣政策……這也讓我們看到一件事:區塊鏈的安全性是否真的無敵?
共識型演算法的缺點共識型協議最大的問題在於一旦沒有共識就完了,比如這次比特幣擴容硬分叉,這件事一直到紐約協議完成後才穩下來,在此之前比特幣的價格一路下滑,基本上大家有共識兩個方案各行其路,就會讓比特幣區塊鏈一分為二,所有人在兩個新區塊鏈的資產及紀錄完全不變,就像股票分割,如果分割後股價又漲回原點,等於大家的資產都增加了一倍!這也是水電工協會寫本系列文章之初,一直在講分裂有點像假議題。比方說筆者在分裂前買了 10 個比特幣,當時約值 16,000 美元,現在總值已是10×4,500+10×600 =51,000 美元了,所以只要程式或參與者有共識,價值一定不會被破壞(以上比方純屬虛構,如有雷同請國稅局不要來查)。
要達成共識需花時間及某些成本,有些駭客即是精研此道,想破壞區塊鏈安全性。針對共識決議的攻擊有幾項比較知名的,比如 Double Spend,或是 Greed Miner 等都有可能破壞區塊鏈的完整性。在這之前,我們先來看看最笨的攻擊法有沒有可能真的破壞最傳統的比特幣。
1/2 Good Miner,PoW 的優缺點一般而言談到 Proof of Works,直覺上被教育成要有二分之一過半的壞人,比特幣的安全性才會受破壞,但事實上我們要很小心定義這個最典型的問題,精確來說是:在一個區塊產生的時間內,造假一個大家非得封進去的資料,需要有超過二分之一的計算力才有 100% 成功率。
這句話本身就有一堆可思考的問題:如果我沒有過半,但是不小心有四分之一的計算力會如何?(基本上有些大礦池真的在某些時段可接近二分之一計算力)
回顧一下之前提的鏈長度競爭問題,目前的共識型協議是如果某人的鏈比較長,且 Hash 值接得起來沒有問題,其他挖礦機就會把他公布的鏈收進來替代本來區塊,所以如果舊區塊沒有再檢查或有些檢查上的漏洞,或是您封裝的資料不是流水帳無法一一檢查(好比說智慧合約事件),那麼是有機會在第 N 個區塊產生時造假第 N-1 個區塊的資料。要達成這件事的首要目標就是要有連續兩個區塊都由攻擊者解出來。這個機率有多高?如果有一個大礦場被駭,剛好它有四分之一計算力,那麼成功率就是十六分之一;若它有三分之一計算力,成功率高達九分之一。所以並不是沒有一個壞人突破二分之一計算力時,區塊鏈就絕對安全。基本上過去區塊鏈安全主要還是因為大家都抱著發財夢,因此守護幣值是大家共同的信念。美國礦工每次都在罵中國計算力過高一定會出事,比特幣不可信……但這麼久以來,反而中國礦工更有「職業道德」,畢竟在強國講到賺錢獲利,那才是硬道理!說到這,我們回頭看看比特幣原始社群的堅持,事實上很有道理!比特幣主力社群開發者堅持:
小型電腦就可以挖礦、不希望有巨大礦池、人人都可以當管理者
事實上就是確保比特幣安全性的最大保證!在這個堅持下,每台設備好一點的家用電腦就可以挖礦(參與區塊鏈管理),不必特別的硬體、有多種不同系統,沒有人的算力特別大,對攻擊者來講,這真是一個取得計算力的地獄!對想利用現金資源強占比特幣社群的企業而言,更是鐵板一塊!
如果真有人成功塞進假的不合法交易資訊進比特幣區塊,會造成極大損失嗎?當然是可能的,不過也沒那麼簡單,目前最有可能的做法也只有 Double Spend,也就是帳戶裡只有 1 元但是連續花用多次(當然還是會稽核出來,但有可能已造成損失)。如果要假造某個大帳戶發送轉帳信息,筆者認為不可能,因為駭客無法變造數位簽名,一旦他想要花偷來的錢,就會稽核出來。而 PoW 的好處是:即便如此,過去的歷史文本仍無法改變。PoW 的區塊鏈只要一旦封存成功,沒有被鏈競爭打掉,基本上無法改變,除非所有參與者都被駭客入侵,更改程式或刪除資料。
我們接下來看看各種基於共識型協議天生的危險性而出現的攻擊手法:
Race Attack(Double Spend)競速攻擊法?抱歉這個名詞一開始就翻得很難理解,事實上就是搶錢攻擊法。當 A 用戶轉帳給 B 用戶時,發了一條交易到區塊鏈網路,當然大家都知道訊息一發出去就不可能修改,但也不太可能馬上封進區塊鏈,所以短時間之後,如果 A 用戶再發一條訊息轉大量的帳(好比 A 本來只有 2 個比特幣,結果轉給 B 0.1 個,1 秒後他又發一條訊息要轉 2 個比特幣給用戶 C,而用戶 C 多半是用戶 A 的另一個帳號),大家猜會發生什麼事?結果是在比特幣鏈上,前一條交易會視為非法,後一條交易被視為合法。如果您在買賣中,為了節省時間而不願多等幾個區塊產生,那在您一手交貨之後,看到的轉帳資訊恐怕會是您的收入轉帳被取消了。這有點像空頭支票,不同的是比特幣是自比為現金的流水帳,因此早期安全性論文一直告訴大家,所有交易至少要等幾個 confirm 才能成立,也就是真正安全的交易恐怕得等上 1 小時。其他貨幣有的比較快,但也要等足好多分鐘才算安全,因此這些等待的成本都變成數位貨幣無法取代現金法幣的主因之一。
Vector 76(Double Spend)這個手法同樣是 Double spend 只是複雜不少。首先駭客必需有兩台挖礦機,其中一台 A 只連到受害者(好比某個買賣比特幣的網站),一台 B 真正在挖礦。挖礦機本身有一定的平均中奬率,好比如果駭客當時買到最新 ASIC 挖礦機,恐怕不用一天就可挖到一個區塊,而駭客只要不斷透過 A 主機向買賣網站發轉帳信息,再透過 B 主機發另一個轉帳信息讓前筆交易為假(原理如上個攻擊,如果你只有 50BTC 卻轉了 50.1 總量出去,第一筆就會被廢)。當運氣來時,A 主機發了轉帳 50BTC 後,B 主機也挖到礦了,B 主機就可在公告該區塊後再發第二條轉帳信息,此時,交易網站看到的情況是:駭客透過 A 主機公告轉帳進來 50BTC,等 10 分鐘後,有一個 confirm 了(因為 B 主機發表了一個新挖到的區塊),如果交易網站不想多等,就讓這筆轉帳視為合法,那麼駭客就有 10 分鐘左右時間可把這 50BTC 賣掉換成美元,下個區塊出來時大家才會發現這筆交易不合法,會被取消,但網站已受損失了。所以自從這個攻擊被發現後,連一個 confirm 都不太夠。
Alternative history attack這個手法就是前段分析過的:要改變歷史需要的計算力及機率。如果有一個駭客在第 N 個區塊放了假交易,他自己放個程式在主機上記錄這個軟分叉(因為此時若是發表就一定會被查出來而作廢),等到他發現再經過 C 個區塊後,他自己的軟分叉鏈竟然比主網路的鏈長了一筆交易,他就可以發布自己的分叉版本,大家多半只能同意。
我們可以再看一次:如果只想改變一個區塊的歷史,而您有全網 X 分之一的計算力,您成功的機率就是 X 分之一的平方;要改變二個區塊,您成功的機率就是 X 分之一的 3 次方;如果要改到 6 個區塊,機率就降到 X 分之一的 7 次方。基本上,就算成都某大礦場這樣,在某時期曾有高達近二分之一計算力的主機被駭,成功機率也會降到一百二十八分之一以下。至於在全網較平衡的情況下,一般挖礦主機大約都僅有全網算力的 1%,大礦場應在 5%~20% 間,所以等待 6 個區塊(confirms)還算是合理推斷。
Ethereum DAO 事件以太鏈使用的協議是 GHOST,是個非常愛鬧鬼的組織,具備快速反應能力,因此交易速度快過比特幣甚多,大多情況下 1 分至 2 分一定有一個新區塊產生,也因此不同步的安全問題會很嚴重。為了提高安全性,GHOST 使用 Uncle 鏈技術讓主鏈在短時間內可以有多層次分叉,但終究還是會整合回主鏈,這中間各種智慧合約事件也因系統不同步性,或多或少有作弊空間,DAO 就是最出名的案例。DAO 雖說只是個代幣,但大家都知道它是以太幣創始社群自己搞出來的,且一開始還是比特幣的,所以 DAO 雖然只是智慧合約問題,但卻涉及以太幣的價值及可能牽連到比特幣。總之大家光看內容農場都可以知道發生什麼事:DAO 代幣被駭客利用 split 函數的漏洞不斷從 DAO 管理者帳戶轉走,轉到數十個不同的以太幣帳戶,而以太幣上所有代幣都要用以太幣換,也就是代幣就可換回以太幣,所以一堆錢就這麼被偷走了。
筆者一向懶得跟風去寫什麼事件始末,不過以太坊社群的處理方法及後續,倒有很多可討論的地方。
- 一段錯誤的歷史應不應該維持,以向世界證明區塊鏈絕對不可逆?以太幣這次動用到終極武器 Hard Fork,讓這段歷史完全消失了,使許多以太坊用戶非常失望。雖然不是因為技術問題讓區塊鏈歷史改變,但終究顯示區塊鏈加智慧合約,可能導致不可挽回、非得砍掉重來的大問題。
- 如果不讓歷史消失,那麼這種大犯罪行為要如何解決?事實上根本無解。現實世界中如果法幣被偷了還可以報案想辦法拿回來,數位貨幣大概只能開個公審大會請駭客轉回來了,問題是根本不可能。唯一的方法還真的只有讓歷史消失(當然捉到犯人以法律手法強制令其轉回也可以,不過犯罪者大多會採取多層轉帳方式分開金流)。
- 像以太坊這種全球性的公開區塊鏈,應不應該有什麼世界警察或系統機制來處理一些破壞體系的駭客行為?當然有的話很好,但如果不是基於共識型協議發展出來的,那麼就會回到集中管理的問題,先不談權力集中在少數人的政治問題,光是這樣,駭客又有新題材可玩了:要玩死以太鏈,只要針對那幾個控制節點就好了,多方便!
- 同樣的這件事情,讓我們看到智慧合約的複雜性,絕對不是找個程式設計師寫寫就可以。大額智慧合約未來一定要有專門的人才負責撰寫及測試。
硬分叉後續來點內容農場很少提到的事好了。以太鏈在處理 DAO 問題硬分叉後,其實新版的挖礦程式有點問題,因為新增刪除空戶的功能,但刪除空戶一樣動用到 GAS,反正在以太鏈上做什麼都要瓦斯,結果遇到系統太忙 out-of-gas 時就完了,因為主流挖礦程式有兩個,一個是 Geth 一個是 Parity,Geth 根本不管有沒有 GAS 可執行就把帳戶給刪了,但 Parity 會照章行事,等系統有 GAS 可用才准刪除。就為了這個鳥問題,以太幣剛硬分叉完又來一次,被大家笑稱是超不可信的貨幣、偽幣,足足到最近比特幣因多家金融機構打算發行相關 ETF 引進資金投資大漲後,以太幣才又登上價格新高。
以太坊力圖改進 CASPER這個很愛鬧鬼的團體最近一直在討論 PoW 有多麻煩、礦工有多貪心不聽話、人多嘴雜又吃掉一整個國家的電力……blahblah,於是乎進一步想走向 Proof of Stake。本欄至今大部分時間都在講 Proof-of-works,基本上 Proof-of-Works 就是利用天量的運算找到一個你永遠無法輕易再製的 hash 解(除非你也有天量的運算力),當然利用演算法決定區塊正確性也可達到一定程度的安全性,包括 Proof-of-Stake、拜占庭容錯法等都是相關技術。我們這次也就順便來看看 PoW 和 PoS 的安全性及能耗比較。(未完待續)
(首圖來源:shutterstock)