十分鐘講清楚IOTA和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. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;