區塊鏈論文9 FlyClient-加密貨幣的超輕客戶端

本文首發於本人的知乎專欄《區塊鏈技術最前沿》 https://zhuanlan.zhihu.com/p/95927454

 

本文的主要內容來自斯坦福的論文《FlyClient: Super-Light Clients for Cryptocurrencies》2019 10.

論文所解決的問題

這篇論文主要針對本人所講到的上一篇論文的改進,鏈接在下面,兩篇論文所要解決的問題基本是一致的,都是想讓加密貨幣的客戶端更加輕。所以,具體的問題描述就不累贅了。

SweetCandy:區塊鏈論文8,NIPoPoWs,非交互工作量證明之證明​zhuanlan.zhihu.com

在上一篇論文中提到NIPooPoWs有下面幾個缺點:

  1. 只適用挖礦的困難度不能改變的區塊鏈。
  2. 最長鏈的所有礦工都需是誠信的或者賄賂攻擊。如果有某一些惡意的礦工他們雖然不私底下在分叉鏈中挖礦,但是他們把所挖到的v很大的區塊扔掉,只廣播v很小的區塊。這樣就會導致最長鏈區塊的v值偏小。這樣的話在上面所述計算Bs長度的時候,誠信區塊鏈就沒有優勢。導致雖然誠信鏈的區塊個數最多,但是Bs長度卻不是最長的。致使攻擊成立。

本文所提出的方法除了解決上面兩個問題之外,還進一步減少了證明者和驗證者之間的通信開銷。

知識準備

這篇論文用到了下面兩個知識,預先了解一下有利於理解這篇論文,這裏給出鏈接,都是本人寫的文章。

這個鏈接中的文章所講到的方法,本論文用來將證明過程變成非交互式的。

SweetCandy:Fiat–Shamir啓發式 非交互式零知識證明​zhuanlan.zhihu.com

使用下面的方法將整個區塊鏈歸納成一棵可以追加和朔源的merkle樹。

SweetCandy:Merkle山脈(Merkle Mountain Range)詳解​zhuanlan.zhihu.com

NIPooPoWs希望客戶端通過判斷哪個完整節點的區塊鏈是最長的來驗證哪個完整節點是誠信的。而本論文flyclient的思路是通過隨機抽樣區塊頭的方式,通過找到無效的區塊頭,來判斷哪個完整節點是惡意的。雖然兩篇論文最終索要解決的問題都是讓客戶端更輕,但是使用到的技術是不一樣的,個人覺得,flyclient比NIPooPoWs更優秀。

如何朔源?

所謂的朔源,就是區塊鏈中的任何一個節點都能夠通過鏈式的方式追朔到genesis block。這是一個區塊是否有效的最基本要求。flyclient使用Merkle Mountain Range (MMR)來達到快速朔源。比如,區塊鏈有了MMR的構造之後,如下圖所示,通過向客戶端發送少量的證明數據,客戶端自己就能夠驗證block3和block0是否在同一個區塊鏈中,這裏block0是genesis block。

 

另一個問題是如何讓客戶端驗證出無效的區塊?

如果客戶端能夠從一個完整節點所發來的區塊頭中發現無效的區塊頭,那麼客戶端就能夠斷定這個完整節點是惡意的。現在假設有兩個完整節點,至少一個是誠信的。一個客戶端都收到了這兩個完整節點發來的證明信息。在比特幣的區塊鏈中,雖然在某一刻可能有多個分叉鏈,但是最長的那個纔是大家公認有效的。因爲惡意節點的挖礦算力少於其他所有誠信節點的算力之和,所以惡意節點的分叉鏈肯定比有效鏈短。但是,爲了不讓客戶端發現這一點,於是惡意節點就往自己的鏈裏面加入無效的區塊,使得長度和有效鏈長度一樣,甚至更長。現在客戶端無法直接通過區塊鏈的長度來判別哪一個是有效的,於是,他採取抽樣區塊頭的方式,通過驗證所抽樣的區塊頭的無效性來判定惡意完整節點。怎麼抽樣呢?

[block0] <- [block1] <- [block2] <- [block3] <- [block4] <- [block5] <- [block6]

 

比如上面所示的區塊鏈,左邊block0是genesis block。(1)從整個區塊鏈中抽取k個區塊頭。(2)從1/2區塊鏈的右邊部分抽取k個區塊頭。(3)從區塊鏈右邊的1/4的部分中抽取k個區塊頭。(4)一直重複,直到剩下的鏈的長度是min(L, k)。其中L是鏈的分叉部分的長度。抽樣結果如下圖所示,其中k=5。

按照這樣的抽樣方式的話,能夠發現一個無效區塊的概率密度函數爲下圖的s(x)部分所示。其中x座標表示距離genesis block的相對距離;y座標軸表示發現無效區塊的概率。這個圖呈現指數遞增分佈,因爲從上面的抽樣方法中知道,抽樣的密度越來越大。

現在我們是通過log(n)次抽樣,每次抽取k個,得到的結果,那麼我們是否能夠計算出一個概率密度函數,且該函數滿足上圖s(x)的分佈。根據這個函數,我們通過多次樣本抽取,也能達到前面抽樣方法的效果。論文還找到了最優的抽樣分佈,讓發現無效區塊頭的概率不會受到交叉區塊距離genesis block的位置的影響。

不同的挖礦難度

爲了讓flyclient適用挖礦難度變化的區塊鏈,論文在MMR的節點中保存了額外的信息,比如下圖所示的當前區塊的挖礦難度值。父節點的值是左右子節點值的和。現在假設要查找0.4位置的區塊,那麼該區塊爲下圖紅色長方形圈住的節點。具體算法爲70*0.4=28,然後從所有葉子的左邊第一個開始相加,第一個大於28的葉子節點便是目標區塊,即13 + 13 + 5 > 28。論文中除了保存挖礦苦難值之外,還保存了其他值。這裏不具體將了。

以上便是這篇論文的主要內容。

歡迎大家指出文章中的問題,謝謝!

 

還可以參考

https://www.youtube.com/watch?v=vuzYwutBqjY​www.youtube.com

 

 

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章