摘要:F: “這棵 Merkle Tree 有 11 層,所以你知道這個區塊中至多有 2^11 = 2048 筆交易。如果今天 Merkle Tree 深度爲 10 單位,所有交易(當然,第一筆交易除外)都只做了一次哈希計算,那麼我就能知道這個區塊有 513 筆交易。

觀點 | 關於 Fraud Proof 的沉思,Part-1

在我深入更多技術細節之前,爲了避免有人因爲聽不懂而掉隊,我將以故事的形式再次說明 “整個邏輯”。

3. 講個故事

故事由“ Fred ”(全節點),和“ Sally ”(SPV 節點)主演。 爲了簡化,故事聚焦於第一類缺陷和第二類缺陷。 第三類缺陷需要通過下載額外的數據來解決,第四類缺陷能夠轉化爲第一類缺陷(見第 7 章)。

對話 I

  • Fred: “這筆交易是你要找的嘛? Wow,這筆交易記錄了——轉給 Sally 300 btc!

  • Sally: “是的,我賣給 Peter Thiel 一艘太空船,他能去木星啦。

  • Fred: “贊哦。 這是你需要的 Merkle Branch,還要有最近一段時間的所有區塊頭。

  • Sally: “太好了,我可以簡單計算幾個哈希值來檢查 Merkle Branch,也能輕鬆確認這些區塊頭都滿足難度要求。 讚美中本聰!

  • F: “中本聰牛啤 !

  • S: “不過,我要怎麼確定這些區塊頭是合法的呢? 沒準這些區塊頭來自惡意 or 懈怠的礦工。 Peter Todd 說過 SPV 節點很爛……。

  • F: “噢,那你可能會對我的一些附加服務感興趣。

  • S: “說來聽聽?

對話 II

  • F: “第一項服務叫 ‘無效保險’(Invalidity Insurance),你需要支付 0.007 刀給我; 假如你通過 hashMerkleRoot 發現區塊中有無效(或雙花)交易,我會理賠你 1000 刀。

  • S: “任何區塊錯誤都會理賠嗎?

  • F: “沒錯,任何類型的無效區塊都能理賠。

  • S: “哇,看來你非常有把握缺陷不會發生,不然你不會願意這麼做的。

  • F: “因爲我已經用電腦檢查過所有區塊和其中的所有交易; 它們都是有效的。

  • S: “有意思!

  • F: “提醒一下,如果 12 小時內(72 個區塊之後)你沒有發現任何問題,你的保險也就到期啦。

  • S: “我明白了。 不過這個區塊會在 10 分鐘內完全傳播到整個網路中的全節點對吧?

  • F: “對,而且你要想想,12 小時可比 10 分鐘足足長了 72 倍呢。

  • S: “這麼說也是,只要全節點有動力將 “某區塊有缺陷” 的消息傳出去,12 個小時肯定足夠傳播給所有人了。

  • F: “對的,激勵的存在至關緊要!

對話 III

  • S: “等等,也許你給我的不是完整的區塊? 我聽說礦工有時候會無腦出塊,完全不管裏頭的內容是不是有效的! 如果他們這麼做會如何? 我們又有什麼方法能夠檢查呢?

  • F: “Hmmm,我這裏保存的的確是完整的區塊。

  • S: “真的嗎?

  • F: “千真萬確。

  • S: “你能不能提供證明?

  • F: “當然,實際上這是我提供的第二項服務。

  • S: “太棒了!

  • F: “首先給你這個,這是該區塊的最末尾交易。 你可以相信我,因爲這棵 Merkle Tree 始終向右下延伸; 如果出現了向左延伸的情況,那就說明我們給同一對象哈希了兩次,也就是在默克爾樹的那一層原本只有奇數個對象(爲了把 Merkle Tree 的完整而補了一個對象進去)。 你可以將這個 Merkle Branch 和我前面給你的 Merkle Branch 進行對比,他們會有相同的 Merkle Root。

  • S: “沒錯! 你給我的的確是這個 Merkle Branch (包含我的交易)中的最末尾交易。

對話 IV

  • F: “這棵 Merkle Tree 有 11 層,所以你知道這個區塊中至多有 2^11 = 2048 筆交易。 而且你知道自己對某對象做哈希運算的次數以及時間,所以你知道 Merkle Tree 的外觀。 尤其是,你知道它裏面裝着的東西的確切長度(大小)。

  • S: “Wow,原來我知道的事情比我想象得多! 我真的知道所有內容嗎?

  • F: “當然!

  • F: “Merkle Tree 中所有東西的位置必然相同,否則無法匹配——除非某人能找到一個 X ,對其進行兩次哈希計算所得到的哈希值要與一筆 “真實交易” 的哈希值相同; 換句話說,“uneven Merkle Tree ” 要求創建者找到這麼一個 X,使得 h(h(x)) = h(真實交易)。 但這就像要找到“哈希碰撞“(理論上行不通)——因此不可能找到 X。

有趣的是,有些內容無法既是 Sha256 又是合法的比特幣交易。 比特幣小白可能不知道: 最小的比特幣交易大小爲 60 bytes(比 32 byte 的哈希值體積要大得多)。

  • S: “我明白了——當不存在重複交易的時候,Merkle Tree 在幾何上就像個等腰三角形; 當最末尾交易被複制多次的時候,Merkle Tree 看起來像直角三角形。 最後一筆交易所在的深度,就是整棵 Merkle Tree 的高度,根據重複規則,我只要知道右邊緣啥樣,就能知道有多少底部元素(三角形最底層的元素)是重複的。

  • F: “包含你這筆 300 btc 交易的區塊,它的 Merkle Tree 深度爲 11 單位——也就是三角形高度是11層。 通過我給你的最末尾交易,你知道區塊只在最後進行了一次重複哈希計算。 這樣一來,你就能確定這個 Merkle Tree 包含了 2047 筆交易。

  • S: “噢,解釋的好清楚。 如果今天 Merkle Tree 深度爲 10 單位,所有交易(當然,第一筆交易除外)都只做了一次哈希計算,那麼我就能知道這個區塊有 513 筆交易!

  • F: “沒錯!

  • S: “Wow!

  • F: “假設我現在給你新的 Merkle Tree,以及帶了 Merkle Path = [A, (self), B, C, (self)] 的新的 “最末尾交易”,你能知道什麼?

  • S: “它有 5 層,而且共包含 23 個獨立的元素。

  • F: “完全正確!

  • S: “我真的學到好多。

  • F: “還有最後一件事: 每個最終的元素要麼已知,要麼未知; 在已知的情況下,這個元素可能是合法的交易或不是合法交易。 整理一下,區塊中包含的所有元素可以分爲【1】合法交易; 【2】非法交易; 【3】一條沒人能看見的消息。

  • S: “嗯,很直觀!

對話 V

  • F: “好的,現在你能看到你的區塊內有 L = 2047 筆交易。

  • S: “對!

  • F: “現在介紹我的第二項服務: 你只需要支付 0.0001 刀—— 比剛纔還少。 你可以隨機從 1 到 L 中挑選一串整數  5 ,然後我會給你對應的交易和 Merkle Path 。 如果我做不到,那我會賠償你一大筆錢。

  • S: “你好像很有自信呢!

  • F: “那當然! 你可以找你的智囊團,研究出我可能遺漏的交易。 不過我保證,你們絕對找不到。

  • S: “好,這個服務我也要了!

  • F: “還有件事要注意,如果我們達成協議,但你不告訴我你選的整數,別人還是會以爲我沒完成挑戰對吧。 我的意思是,我完全有能力展示你要看的交易,但你不說要看哪個,所以我沒法展示。 所以如果你沒有在規定的時間內給我你的選擇,我要收取全額的查詢費用,甚至更多!

  • S: “ Emmm,好吧,我想對於我這筆 300 btc 的交易,我不應該吝嗇於鎖定一定數額的查詢費用。

  • F: “相信我,你只需要鎖定幾秒鐘。 換做是我也不願意自己的錢在任何時間點,被毫無意義的鎖在某個通道里。

  • S: “ Ok!

  • F: “好的,現在我們的支付通道處於狀態 (A, B),你需要創建狀態 (C, D),等我們遷移過去之後再告訴我你選擇的整數串。

對話 VI

  • S: “好,我已經選好了一些 Rs(隨機數),也創建好了 C 和 D(支付通道的下一個狀態)。 來,我將 D 簽署給你,輪到你行動了。

  • F: “謝謝! Hmmm……看來你把所有內容都按照所需格式填寫正確了。

  • S: “給,這裏是我選擇的隨機數……“

  • F: “慢着,慢着! 你等會兒再給我啊!

  • S: “噢,不好意思。

  • F: “沒事。

  • S: “還有個問題,如果我向你展示的是 Rs 的哈希值 Hs,你有什麼方法確定 R 是否遵循規定呢? 我有可能不在(1,L)的範圍內選擇整數,我有可能不是選擇(5, 470, 4,……),而是無意義的隨機字符(‘ fish ’, 0x78965, ‘_’, 987987987, ……)。 當你拿到這樣的隨機數,你不可能返回對應隨機數 “fish” 的交易給我對吧!

  • F: “啊……這是個好問題。 事實上,有很多專業的密碼學家提出很多種方法應對這個事。 我會選擇其中一種方法,要求你要向我發送 “Gs” 而不是 “Rs”。

  • S: “好的,我已經用選擇的 Rs 生成了 Gs,給!

  • F: “嗯,從你給我的 Gs,我可以確定Hs的確是從範圍(1,L)選取的整數。 因爲我有所有的 L 條交易,我很自信能滿足你的挑戰。

  • S: “太棒了,那下一步呢?

對話 VII

  • F: “來,給,這是我簽過名的 C。 我已經把 B 棄用了(根據支付通道迭代規則)。

  • S: “好的,不需要我也作廢 A 嗎?

  • F: “需要,但即使你不這麼做,我還是能廣播 D。

  • S: “如果我搶先把 A 廣播出去呢?

  • F: “這就相當於這筆交易(300 btc)從沒發生過……”

  • S: “啊哈,我可以作弊啦! 既然你願意接受挑戰,那你肯定知道這個區塊是合法的!

  • F: “(攤手)啥意思?

  • S: “……(你要是不知道那個區塊是合法的,就不會願意接受挑戰了,那麼你一接受,我就已經得到了我想要的)也就是說,現在我已經得到想要的信息,而且不用支付任何費用啦!

  • F: “並不,雖然你知道我已經接受挑戰,但你無法確定我是不是真的有能力完成這個挑戰對吧。

  • S: “……(沉默)”

  • F: “你要明白,在開始這個過程之前,我只是 接受挑戰 而已。 看來你還有要學習的地方,不然我不明白你現在退出是圖什麼。

  • S: “……(沉默)”

  • F: “也許我猜到你會想退出,所以事先做了份假的審覈,實際上我根本不知道這個區塊的有效性。

  • S: “……(沉默)”

  • F: “對比一筆太空船的價格,萬分之一刀真的是少到不能再少了。

  • S: “好好好,我已經作廢 A 了。

對話 VII

  • F: “OK,你現在可以說出你的 Rs。

  • S: “我選擇的是 453、531、14,和 2011。

  • F: “選的好! 這裏是你要的交易 #453、#531、#14,和 #2011; 還有它們對應的Merkle Branch。 你可以看到,我的確有該區塊的完整交易。

  • S: “太酷啦! 我愛錯誤性證明。

我在介紹無效保障(Invalidity Insurance)和完整性審覈(Fullness Audits)之前,我想先回顧一下支付通道和閃電網絡。

4. 支付通道概述

A. 常規(無通道)支付

常規(無通道)支付的含義是,表示資金轉移的 “消息” 會在網絡中傳播,一旦消息被記錄到區塊鏈上,資金轉移即告完成。

就像現在朋友 A 發了封郵件,告訴你 “我的 12 個 btc 有 4 個是你的了”,然後你點擊 “回覆所有人”,聲明 “我的 4 個 btc 中有 2.7 個是老 Q 的了”。 一旦這些 “郵件” 的副本進入了區塊鏈,這些郵件對應的交易就被認爲已經發生了。

B. 支付通道

要使用支付通道,收付雙方首先要使用自己的 btc ——把錢 “存入”(或者說 “創建”、“開啓”)一個通道,然後再付還給自己。 例: 我拿出 90 btc 然後付還給自己,你拿出 15 btc 然後付還給自己,這些操作合併爲一筆交易,就像其他普通交易一樣廣播出去。

不過,雖然開啓通道的操作是類似的,參與者在通道中的收付行爲可能有所不同。

沿用上面的類比: 所謂的支付通道模式就是,在我們發送 “電子郵件” 之前,我們保留了多個未發送的 “郵件草稿”。 對於同一份草稿,始終存在兩個並行的版本——我手上會有一份對你更有利的版本,而你手上也會有對我更有利的一個版本——你已經對我手上的那份草稿簽過名,我自己還沒簽名; 反之亦然,你手上的那份草稿我已經簽名了,但你自己還沒這麼做(簽名)。

C. 更新支付通道

支付通道參與者將共同通過切換狀態(我稱之爲 “勢能(potential)” 狀態和 “動能(kinetic)” 狀態)來循環更新平行的草稿對。

通道大部分時間處於靜止、無變化的 “勢能” 狀態。 一旦有人要啓更新這個通道,狀態會切換成 “動能” 狀態,然後再快速切換回“勢能”狀態。

上圖: “動能” 狀態——2 btc(粉色,雙框)正等待被觸發,但實際上這個過程非常短暫。 通道大部分時間處於“勢能”狀態,反映了各方最新的 btc 餘額是多少。

如我前面提到的,如果 “區塊鏈” 記錄了這些“郵件”的副本,那這些交易就已經發生了。

但支付通道不一樣——當雙方共同從一對草稿 “轉移” 到新的草稿,這筆交易就被認爲是發生。 而且,“轉移” 過程本身也大不相同——並不是說我們一起創建、簽名、交換了新草稿的數據就算完成了 “轉移”; 我們還必須採取額外的步驟來創建、簽名和交換 ”表明棄用舊草稿對的信息“。 只有到那時候,付款纔算真正“發生”。

D. 哈希鎖定合約/閃電網絡

我們一般說的 “動能” 狀態,也稱爲“哈希鎖定合約(hash locked contract)”。 當部分動能狀態,通過支付通道的通路(即人際網絡)分享出去,就能建立起 “閃電網絡( Lightning Network )”。 細節如下:

  1. 有個 “顧客” 要付 10 btc 給 “店家”。

  2. 顧客創建一個祕密隨機數 R,以及 R 的可公開版本 H 。 H 就是 R 的哈希值,h(R)。

  3. 顧客找出一條能使自己與店家連接起來的支付路線,把 H 發送給這條支付路線上的所有人。

  4. 顧客沿着條 “通路”,向邊上的 “朋友 #1” 發出一個動能更新; 特別的是,顧客承諾,如果 “朋友 #1” 能猜出 R 是什麼,顧客會向他支付 10.004 btc。

  5. “朋友 #1” 不知道 R ,但是他確定很快這個 R 就會被公佈,而且他也不會有任何損失,因此朋友 #1 興沖沖的接下這個活。 這時候,【顧客,朋友 #1】間的支付通道就被激活了,從 “勢能” 狀態轉爲 “動能” 狀態。

  6. 接着“朋友 #1” 和 “朋友 #2” 重複上述行爲,在整條【顧客,店家】通路中,朋友 #2又比朋友 #1 更靠近店家。 如果朋友 #2 能夠猜出 R,朋友 #1 會向其支付 10.0003 btc。

  7. 整個過程繼續重複進行,朋友 #3 會得到 10.0002 btc、朋友 #4 會得到 10.0001 btc; 最後,只要商家能猜到 R是什麼,他就能從朋友 #4 那裏得到 10 btc。

  8. 現在整條通路已經完成了。 顧客把 R 發給商家,商家就能憑 R 向朋友 #4 索取 10 btc。

  9. 商家向顧客發貨。

  10. 商家和朋友 #4 不想用常規交易來支付(這會需要付交易手續費,而且要等待)。 因此商家向朋友 #4 展示 R ,要求更新支付通道的狀態。 接着支付通道狀態就從 “動能“ 狀態轉回 ”勢能“ 狀態,只不過在新的勢能狀態下,商家多了 10 btc,而朋友 #4 少了10 btc。

  11. 其他的通道對也重複進行步驟 10 。 (【朋友 #4,朋友 #3】、【朋友 #3,朋友 #2】、【朋友 #2,朋友 #1】、【朋友 #1,顧客】)(譯者注: 即每個從下家處拿到 R 的人都向上家要求兌現承諾,直至最後一箇中繼者(即 “朋友”)從 “顧客” 處得到最後一筆的支付)。

E. 伸縮性

有趣的是,動能交易可不止是 HTLC(即 “你給我出示 R 我就給你付款“)而已。 閃電網絡交易(LN-txn)能完成基於區塊鏈的一切行爲。

我們首先要求區塊鏈能做兩件事: “無效保障“和“完整性審覈”。 只要底層區塊鏈能夠支持這種 “智能合約”,我們就能將其應用到支付通道中。

F. 支付通道解決了什麼

支付通道能幫助實現錯誤性證明,因爲:

  1. 能以接近實時的速度進行需要的操作,幫助錯誤性證明在關鍵的 20-30 分鐘內“獲取足夠的信息”。

  2. 協助小額的交易(支付非常非常小的金額)。

  3. 可抵禦暫時的出塊錯誤(因爲它們有較長的 “挑戰窗口期”)。

  4. 通過以下行爲支持反向證明: 【1】索要某些信息,【2】爲此提供小額獎勵,【3】給對方足夠長的時間來提供它。 當然,如果他們沒有接受挑戰,那很有可能是因爲他們無法完成。

現在我們可以來介紹 “無效保障“ 和 “完整性審覈” 了。

- Max Pixel 的河流藝術作品-

注 5:實際上,Sally 和 Fred 可以一次只使用一個隨機數。這樣的話,在最糟糕的情境下的腳本大小會小一些,但他們需要執行多次交互。

(未完)

(未完)

(文內提供了許多超鏈接,請點擊閱讀原文到 EthFans 網站上獲取)

原文鏈接:

http://www.truthcoin.info/blog/fraud-proofs/

作者:  Paul Sztorc

翻譯 & 校對:IAN LIU & 阿劍

相關文章