大白導讀:上周六推送“警報!一大波DAG公鏈正在接近!”,介紹了不用區塊來記錄數據的一類公鏈,在用真金白銀投資這類項目之前,有必要先花十分鐘深入了解。

本文作者:湯強,橫跨中英文世界的區塊鏈觀察家。
2017年9月7日,麻省理工學院(MIT)發表公開信:數字貨幣IOTA存在嚴重漏洞,2個月前MIT私信過IOTA團隊,希望他們改代碼。
但IOTA團隊沒有理會,最終MIT選擇把漏洞公之于眾。這個漏洞究竟是什么?一切,要從IOTA的數據結構DAG說起。
一、什么是DAG?
DAG:Directed Acyclic Graph,中文意為“有向無環圖”。
有向無環圖是一種存儲數據的方式。“有向”指所有數據順著同一方向存儲;“無環”指數據結構間不構成循環。像條毛線織的圍巾,可以一直編下去。

圖1 DAG 有向無環圖(纏結 Tangle)
你可以這樣理解:區塊鏈是每個區塊記多筆交易,而DAG是每個區塊存一筆交易,所以它們的本質相同。在IOTA白皮書里,把結扎在一起的交易稱為纏結(Tangle),如圖1。
你可能會奇怪,這些交易為什么要連線、標箭頭?因為使用者每發起一筆交易,必須驗證之前的兩筆交易。
這很像讓一個孤兒自己選擇養父母。DAG是孤兒的世界,每筆交易天生是孤兒,但養父母不能隨便亂選,他們必須根正苗紅,否則孤兒自己就不會被下一代選為父母,不被選擇意味著從此消失。
如果一筆交易不被后來的交易所驗證,它就會變成真正的孤兒,從此在賬本里失去合法性。
纏結圖的本質上是訂在一起的賬本,而交易發起者的驗證就是訂書釘,可他們用什么方式驗證交易?
答案是我們熟悉的工作量證明:POW
交易發起者自己選擇兩筆合法交易,花2秒鐘找出一個隨機數,讓“隨機數+信息”的哈希值符合系統要求。
驗證所需的工作量與前手交易權重成正比,交易權重相當于驗證難度,難度越高驗證時間越長。IOTA中,權重是以3為底的指數增長:3的1次方、3的2次方、3的3次方……被驗證次數越多的交易權重越大。
所以,如果你擔心驗證完兩筆正確交易卻沒人來驗證你,那這種擔心是多余的,因為驗證新鮮交易更容易,如果驗證靠前的陳舊交易,工作量會指數級地翻上去:本來2秒鐘能驗證完的交易,現在要花2小時,何必?
另外,你可能會問,DAG下為什么不能只驗證一筆交易,必須是兩筆或兩筆以上?
因為如果只往前驗證一筆,網絡會被大算力操控。
算力強者很容易抬高交易權重,拉長尾巴,以堵死后面的驗證通路,讓隨后的誠實交易不得不屈從大算力;可驗太多交易又會耗時過長。
所以,驗兩筆能兼顧安全和效率。
于是,發起者一邊提交自己的交易,一邊驗證別人的交易,以此編織著一個去中心化網絡。注意:這個網絡不是纏結圖,纏結圖里的點是交易記錄,而網絡指參與交易的所有節點。
可是DAG下會不會發生雙重支付呢?
會。
二、DAG下如何保證賬本安全?
假如我轉你價值100萬元的IOTA,你非常高興,確認后把100萬元貨物交給我,但此時我心生歹念。
我靠算力發起攻擊,用一筆權重更大的交易驗證合法交易之前的交易。

圖2 大權重攻擊
只要超過主體誠實的DAG,隨后的交易都會接在我的DAG后面生長,這樣我就賴掉之前的交易,白白從你手里拿走100萬元的貨。
關鍵問題是,我得匯聚多少算力才能實現雙重支付?
需要全網34%的算力。
IOTA團隊說,網絡還沒成熟,所以先找個協管員看場子,這名協管員就是一臺名叫Coordinator的服務器。所有交易是否合法,暫時全由這位協管員拍板,拍板后告訴其他節點,該驗證哪些交易。
官方說,2018年會撤下協管員,這也意味著,目前IOTA暫時并非一個去中心化的網絡。可如何能確保賬本安全,中心化并非是不可行的方案。
影響賬本安全的另一個因素是數字簽名,因為攻擊者無法使用他們沒有的私鑰簽出和你一樣的數字簽名,而保障這件事的是哈希算法,它具有一個特征:哈希不同文本能得出不同結果。如果哈希不同文本出現同樣的結果,這種情況稱為“碰撞”。
MIT報告指出:
IOTA使用了自己開發的哈希算法curl,但是curl算法的哈希值極易發生碰撞,于是就能偽造數字簽名。
IOTA的DAG是靠后手保護前手,一旦攻擊者成功偽造數字簽名,后手挑不出偽造者的錯,非法交易就能大搖大擺地通過驗證,這意味著別人用其他私鑰也能撬走你賬戶里的錢。
現在IOTA有協管員保護,但如果撤下協管員,簽名能否會被仿冒,就完全得寄希望于攻擊者沒有哈希出和你一樣的簽名。
你可能認為,有協管員的情況下這不會成為一個問題,因為協管員會公正地驗證所有交易,至少它能取消不合法交易,但事情并非這么簡單。
因為協管員自己也有私鑰,一旦泄露,造成的結果將比服務器電源插座被拔還要嚴重,因為此時持有私鑰者具備改動任意交易的技術可能,這就是集中管賬的風險。
現在有協管員看家,技術上的確能過濾惡意,可IOTA的最終目標終究是脫離協管員、全網自治,除了面臨偽造數字簽名的問題,還要面臨一道難題:
34%攻擊。
防止這種攻擊的一個辦法是招募礦工,但由于IOTA無手續費,所有沒有礦工會響應,與此同時,IOTA還面臨著拒絕服務攻擊的可能,就像不收物業費的小區,靠業主自治很難掃清不法份子,甚至掃不凈地上的落葉。
包括IOTA團隊在內,暫時沒有人給出解決方案。當然,讓人垂淚的棘手問題還不止這些。
三、用戶私鑰問題
本段與DAG無關,但由于采用DAG的加密貨幣不多,而IOTA又是持有范圍較大的幣種,所以寫下這段,僅作安全提示。
IOTA用戶的私鑰由種子生成,種子長這樣:
KJGH9YZXCYVYOWTV9YULOVYASDL99YGIAEQWEDFGHNSLNGHJFGHIJPCIYEC9GWOLMFGHGQ99Y9HNMRQASF
一共81位,看起來很長,但其實只有大寫字母和數字9,人們除了質疑為什么不用小寫字母和其他數字壓縮種子長度之外,還有兩點關鍵的質疑:種子如何憑空產生?種子如何生成私鑰?
IOTA團隊沒有公開種子和私鑰的生成算法。
《區塊鏈資產樸素安全課》中提過,比特幣的私鑰是一個隨機數,由256個0或1組成,文末配有轉換工具網址,那就是公開的私鑰生成算法。
但IOTA的私鑰只能用官網錢包生成,如果私鑰生成算法不公開,用戶就無法驗證眼前的是否是只有1000種可能的偽隨機數私鑰。
所以,IOTA用戶的私鑰有兩層風險:
受curl算法的影響,私鑰被冒簽的風險;
受私鑰生成算法未公開的影響,私鑰被破解的風險。
如果還有第三層風險,那就是每次劃轉錢后,必須把余額轉至新的地址,否則余額不保。
這源自于能抵抗量子攻擊的溫特尼茨單次簽名(Winternitz one-time signature)的特性:每簽一次,私鑰就會暴露一半。這讓每個私鑰變成一根一次性筷子,每用一次都會被污染半截。
不知何時,IOTA才能平息這些質疑。
結語
DAG是一種數據存儲結構,從它被發明的30多年來一直都有人使用,本身并沒有問題。但它和區塊鏈的區別在于DAG沒有傳統意義上的共識,每筆交易的可信與否取決于相信這筆交易的人數。
所以采用DAG技術的核心問題在于如何保護全網達成的一致?
IOTA使用了中心化方案:先協管員看護,以后慢慢放開。同樣采用DAG的另一種加密貨幣Byteball就很淳樸,12名礦工通過收交易手續費的方式保護系統安全。
DAG曾經作為比特幣擴容的方案,但最終沒被采用,因為基于DAG的分布式網絡在保護共識方面很難比區塊更有效。
作為一種創新的存儲方式,DAG和采用區塊記錄交易的方式相比,盡管很有趣,但它暫時沒有明顯的優勢,這就是為什么很多區塊鏈項目沒有選擇DAG的原因。
IOTA現在還沒有解開自己的纏結,但作為旁觀者的我們,有一點值得我們警醒。
加密數字貨幣的技術復雜度遠超我們想象,但并非不可理解,只要我們投入足夠的時間,一定可以理清思路,理性決策。
最受傷的人,恰恰是在局勢未明朗時,僅憑日漲一寸的K線圖就匆忙入場者,他們生怕承受錯過的痛苦,甚至會有人因為纏結圖和物聯網長得像而看好DAG在物聯網領域的發揮。
未經深入思考的投資者很可憐,捧著一摞血汗錢走進天羅地網,他們哪里會想到,編織這張網的可能不是別人的惡意,而恰恰是自己的認知偏差。
千萬別眼紅那些跑步進場、月賺10倍的朋友,他們可能有驚人的浮盈,但由于跑步進場這個動作本身就是未經深入思考的結果,于是,在邁出腿的一瞬間,就已經注定了大概率的結局。
投資大神喬伊·格林布雷(Joel Greenblatt)有個著名的類比:
買了股票但不知道買了什么,就如同手持火把穿過一個炸藥工廠,你可能活下來,但你依然是一個傻子。
所以,拿出你的儲備知識,啟動你的邏輯鏈條,把思路里的纏結整理成區塊,烘干認知偏差,時刻讓自己的投資邏輯保持干爽。
主要參考資料 |
1. Serguei Popov*:The Tangle(IOTA官網白皮書v1.3)
2. MIT:Cryptographic vulnerabilities in IOTA 2017-9-7
3. Ivan:https://youtu.be/QsdZVnq4G60
4. Palmer:https://youtu.be/LtWUJtnQbKs
5. Richard Heart:https://youtu.be/w8_1JFE_9dI
——End——