MimbleWimble 和 Grin 簡介

買賣虛擬貨幣
MimbleWimble是一個區塊鏈格式和協議,依託於健壯的加密原語,提供非常好的可擴充套件性、隱私和可替代性。它解決了當前幾乎所有實現的區塊鏈(與現實需求之間)差距。Grin是一個實現MimbleWimble區塊鏈的開源軟體專案,並填補了(MimbleWimble協議所缺失的)實現一個完整的區塊鏈和加密貨幣必需的一些東西。Grin 專案的主要目的和特性如下:· 隱私保護的預設特性。 這使它具備了完全可替代性,且保留了按需選擇性披露資訊的能力。· 區塊大小與交易量相適配,歷史交易僅保留約100位元組的交易核(transaction kernel), 相比其它區塊鏈節省了大量空間。· 強大且經過驗證的密碼學。 MimbleWimble只採用橢圓曲線密碼,該密碼技術已經過了數十年的試用和測試。
· 簡單的設計使得日後的程式碼審查和維護變得容易。· 社羣驅動。採用一種抗拒ASIC的挖礦演算法(Cuckoo Cycle演算法),藉此來鼓勵去中心化的挖礦。Tongue Tying for Everyone備註:MimbleWimble 出自《哈利波特》中的一句咒語,這個標題的涵義應該是希望所有讀到這篇介紹的人都可以來為這個開放社羣做點貢獻,真心希望如此。本文針對的讀者是已經瞭解過區塊鏈並瞭解一些基本的密碼學知識的人群。我們嘗試解釋MimbleWimble的技術構建,以及它如何應用於Grin。我們希望這篇介紹能夠淺顯易懂,我們的目的是鼓勵您對Grin產生興趣,並加入Grin的開放社羣,以任何您可能的方式對其做出貢獻。為了實現這個目標,我們將介紹一個主要概念:Grin是一個MimbleWimble實現。我們將從橢圓曲線密碼(ECC)的簡短描述開始,這是Grin的重要基礎。然後描述MimbleWimble區塊鏈交易和區塊的所有關鍵要素。
橢圓曲線簡介我們首先簡要介紹一下橢圓曲線密碼學(後面簡稱為:ECC),只是簡單說明一下理解MimbleWimble如何工作所必需瞭解的ECC屬性,這裡並不深入研究和討論ECC。用於密碼學目的的橢圓曲線只是一大組我們稱之為 C 的點。這些點可以被加、減或乘以整數(也稱為標量)。 給定一個整數 k 並使用標量乘法運算,我們可以計算k * H,這也是曲線 C 上的一個點。 給定另一個整數 j,我們也可以計算(k + j)* H,它等於k * H + j * H。 橢圓曲線上的加法和標量乘法運算保持加法和乘法的交換率和結合律:(k+j)*H = k*H + j*H在ECC中,如果我們選擇一個非常大的數字 k 作為私鑰,則k * H被作為相應的公鑰。 即使人們知道公鑰k * H的值,推導 k 幾乎不可能(或者換句話說,橢圓曲線點的乘法計算是微不足道的,然而曲線點的“除法”計算確極其困難。先前的公式(k + j)* H = k * H + j * H中, k 和 j 都是私鑰,演示了從兩個私鑰的加和獲取公鑰(k + j)* H,等價於每個私鑰的對應公鑰加和(k * H + j * H)。在比特幣區塊鏈中,分層確定性錢包(HD Wallets/BIP32)嚴重依賴於這個原則。 MimbleWimble和Grin也是如此。MimbleWimble 交易
交易結構的設計顯示了MimbleWimble的一個關鍵原則:強大的隱私性和保密性。MimbleWimble的交易確認依賴於兩個基本屬性:· 0和驗證。 輸出總和減去輸入總是等於零,證明交易沒有憑空創造新的資金,而且不會顯示實際金額。· 擁有私鑰即擁有交易輸出的所有權。 像大多數其他加密貨幣一樣,交易輸出透過擁有ECC私鑰來保證其所有權。 然而,在MimbleWimble中,證明一個所有者擁有這些私鑰並不是透過直接簽署交易來實現的。下面介紹賬戶餘額、所有權、變更和證明,並藉此說明上面的這兩個基本屬性是如何得以實現的。等式平衡
基於上面描述的ECC的屬性,可以在交易資料中掩蓋實際交易值。如果 v 是交易輸入或輸出的值,而 H 是橢圓曲線,我們可以簡單地在交易中嵌入v * H而不是 v。 這是因為使用ECC操作,我們仍然可以驗證交易的輸出總和等於輸入總和:v1 + v2 = v3  =>  v1*H + v2*H = v3*H驗證每筆交易的這個屬性允許協議驗證交易不會憑空創造出金錢,而無需瞭解實際的交易值是多少。但是,可用數值是有限的,攻擊者可以嘗試每一個可能的數值來猜測你的交易值。 另外,知道v1(來自 上面的交易示例)和v1 * H,就等於在整個區塊鏈中揭露了等於v1的交易。 出於這些原因,我們引入了第二個橢圓曲線 G(實際上 G 只是與 H 相同的曲線組上的另一個發生器點)和私鑰 r 用作致盲因子。交易中的輸入或輸出值可以表示為:r*G + v*H其中:· r 是一個私鑰,用作致盲因子, G 是一個橢圓曲線點,他們的乘積 r*G 是 r 在 G 上的公鑰。
· v 是輸入或輸出值,H 是另一個橢圓曲線點。無論是 v 還是 r 都不能被推匯出來,從而利用了橢圓曲線密碼學的基本屬性。 r * G + v * H被稱為 Pedersen Commitment 。作為一個例子,我們假設我們想用兩個輸入和一個輸出建立一筆交易。 我們有(忽略費用):· vi1 和 vi2 作為輸入值· vo3 作為輸出值滿足:vi1 + vi2 = vo3
為每個輸入值生成一個私鑰作為致盲因子,將上面的等式替換每個值為他們各自的 Pedersen Commitments,我們獲得:(ri1*G + vi1*H) + (ri2*G + vi2*H) = (ro3*G + vo3*H)並且要求:ri1 + ri2 = ro3這是MimbleWimble的第一個支柱:驗證交易的算術運算可以在完全不知道任何實際交易值的情況下完成。補充最後一點說明,這個想法實際上派生自Greg Maxwell的機密交易,機密交易本身是從Adam Back提出的用於比特幣的同態值提議中發展而來。所有權在前面的章節中,我們介紹了一個私鑰作為致盲因子來掩蓋實際交易值。MimbleWimble的第二個見解就是這個私鑰可以用來證明值的所有權。
Alice 給你發了3個幣並且隱藏了這個數字,你選擇了28作為你的致盲因子(請注意,在實踐中,致盲因子是一個私鑰,是一個非常大的數字)。 區塊鏈上的某處顯示以下交易輸出,並只能由你來用(做交易輸入):X = 28*G + 3*HX, 上述加法的輸出值,是對所有人可見的。 但是值3只有你和 Alice 知道,而28就只有你自己知道了。為了再次轉移這3個幣,協議要求(交易者)以某種方式知道28。 為了演示這是如何工作的,假設你想將這3個相同的幣轉移給Carol。 您需要構建一個簡單的交易,以便:Xi => Y其中 Xi 是一個輸入,它花掉你之前得到的輸出值 X ,而 Y 是 Carol 的輸出。如果不知道你的私鑰28,就沒有辦法建立這筆交易。的確,如果Carol要平衡這個交易,她既需要知道傳送的值,也需要知道你的私鑰, 以便:Y - Xi = (28*G + 3*H) - (28*G + 3*H) = 0*G + 0*H透過檢查一切已被清零,我們可以再次確認沒有創造新的金錢。等等! 停一下! 現在你知道了 Carol的輸出中的私鑰(在上面的情況下,它必須與你的相同,為了讓等式兩邊平衡),所以你可以把錢從Carol那裡偷回來!
為了解決這個問題,我們允許Carol增加她選擇的另一個值。 113,最後在區塊鏈上的結果變成了:Y - Xi = (113*G + 3*H) - (28*G + 3*H) = 85*G + 0*H現在交易不會再歸零了,我們在_G_上有一個 excess value(85),這是所有致盲因子總和的結果。 但是因為85 * G是橢圓曲線 G 上的有效公鑰,85, 對於任何x和y,只有y = 0是 G 上的x * G + y * H有效公鑰。因此,協議需要驗證的其實就是:(Y - Xi)是_G_上的一個有效公鑰,以及交易者知道私鑰(我們與Carol的交易中的85)。最簡單的方法就是要求使用excess value(85)進行簽名,然後驗證:· 交易者知道這個交易輸出的私鑰· 交易輸出的和,減去輸入,加起來等於0這個關聯到每筆交易的簽名,附加一些額外資料(比如交易費),被稱為交易核(transaction kernel)。
一些更深入的細節本節闡述建立交易,透過討論交易的找零機制和範圍證明的要求以便所有值都被證明為非負。 這些都不是瞭解MimbleWimble和Grin的必需內容,所以如果你想快速瞭解,隨時可以直接跳過本節內容,直接到Putting It All Together.找零在上面的例子中,你必須分享你的私人金鑰(致盲因子)給Carol。 一般來說,即使私鑰永遠不會被重用,這也不是一個十分可取的方法。 實際上,這不是問題,因為交易包括找零輸出。比方說,你只想從你收到的來自Alice的3個幣裡送出2個幣給Carol。你簡單地生成另一個私鑰(比如12)作為一個致盲因子來保護你的找零輸出,並告訴Carol 你正在傳送2個幣給她。Carol像以前一樣使用自己的私鑰:Your change output:  12*G + 1*H
Carol's output:      113*G + 2*H最終,鏈中發生的交易基本上就是上述這種過程。簽名使用_excess value_,例如這個例子當中就是97。(12*G + 1*H) + (113*G + 2*H) - (28*G + 3*H) = 97*G + 0*H範圍證明(Range Proofs)在所有上述計算中,我們都依賴交易值始終為正值。如果可能的話,引入負值將是非常有問題的,由於可以在每筆交易中憑空捏造新的金錢。例如,可以建立一個輸入為2並且輸出為5和-3的交易,並且依照前面章節中的定義仍然可以獲得平衡的事務。 這是不容易被檢測到的,因為即使x是負數,ECDSA曲線上的對應點x.H看起來也是任何值。
為了解決這個問題,MimbleWimble利用了另一個加密概念(也來自機密交易),稱為範圍證明:一個數字落在給定範圍內的證明,而不會洩露數字。 我們不會詳細說明範圍證明,您只需要知道,對於任何r.G + v.H,我們都可以建立一個證明,證明 v 大於零且不會溢位。同樣重要的是要注意,為了從上面的示例中建立有效的範圍證明,必須知道在建立和簽署excess value時使用的值113和28。小結MimbleWimble交易包括以下內容:· 一組輸入,參考和花費一組以前的輸出。· 一組新的輸出包括:
   · 一個值和一個致盲因子(它只是一個新的私鑰)在曲線上相乘並相加為r.G + v.H.   · 範圍證明顯示v是非負的。· 明確的交易費用。· 一個簽名,透過採取excess value(所有輸出加費用之和減去輸入)並將其用作私鑰來計算。區塊狀態和鏈狀態我們已經在上面解釋了MimbleWimble交易如何在保持有效區塊鏈所需的屬性的同時提供強大的匿名性保證,即交易不會憑空捏造出貨幣,並且透過私鑰建立所有權證明。
MimbleWimble區塊格式透過引入一個附加概念來構建:核銷(cut-through)。 有了這個補充,一個MimbleWimble鏈可獲得:· 極大的可擴充套件性,因為絕大部分交易資料主體可以隨時間消除,而不會影響安全性。· 透過混合和刪除交易資料進一步匿名。· 新節點能夠非常高效地與網路其餘部分同步。交易聚合(Transaction Aggregation)回顧一下一筆交易的組成:
· 一系列交易輸入,用來引用並花掉一系列以前的交易輸出· 一些列新的交易輸出(Pedersen commitments)· 一個交易核,包含:   · kernel excess,用來確保等式平衡   · 交易簽名(採用kernel excess作為簽名公鑰)例如:(42*G + 1*H) + (99*G + 2*H) - (113*G + 3*H) = 28*G + 0*H
這個例子中使用的簽名公鑰是 28*G。任何一筆交易必須滿足以下條件: (為了描述簡便,這裡忽略掉交易費部分)sum(outputs) - sum(inputs) = kernel_excess這個條件同樣適用於區塊,因為區塊只是一系列聚合的交易輸入、交易輸出和交易核。我們可以把所有的交易輸出加起來,減去所有的交易輸入,將結果與所有交易核中的kernel excess之和做比較:sum(outputs) - sum(inputs) = sum(kernel_excess)簡單來說,(依然忽略交易費部分)我們可以認為,對MimbleWimble區塊的處理方法和對MimbleWimble交易的處理方法是嚴格一致的。交易核偏移因子(Kernel Offsets)
上面描述的MimbleWimble區塊和交易設計有一個小問題,有可能從一個區塊中的資料來重建交易(即找出一筆或幾筆完整的交易,分辨哪一筆交易輸入對應哪一筆交易輸出)。這個對於隱私而言當然是不好的事情。這個問題也被稱為子集問題("subset" problem) - 給定一系列交易輸入、交易輸出和交易核,有可能能夠從中分辨出一個子集來重新拼出對應的完整的交易(很像拼圖遊戲)。例如,假如有下面的兩筆交易:(in1, in2) -> (out1), (kern1)(in3) -> (out2), (kern2)我們能夠聚合它們並構建下面的區塊(或一筆聚合交易(aggregate transaction)):(in1, in2, in3) -> (out1, out2), (kern1, kern2)很容易利用等式平衡關係用窮舉法試驗所有可能的組合,從而找出原始的交易關係:(in1, in2) -> (out1), (kern1)
只要找出了一筆交易,那麼剩下的當然也是符合等式平衡關係的,於是很容易就拼湊出另一筆交易:(in3) -> (out2), (kern2)為了大幅降低這個拼湊的可能性,從而緩解這個問題的不利影響,我們設計一個交易核偏移因子(kernel offset)給每一個交易核。 這也是一個致盲因子(或者說一個私鑰),它需要加到kernel excess當中用於驗證等式平衡關係:sum(outputs) - sum(inputs) = kernel_excess + kernel_offset當我們聚合這些交易到區塊的時候,我們在區塊頭中儲存一個(且僅一個)聚合偏移因子(aggregate offset)(即所有交易核偏移因子的總和)。這樣一來,因為我們一個區塊只有一個偏移因子,再也不可能將其分拆對應到每一筆交易的交易核偏移因子了,從而也就不可能再從區塊中拼湊出任何一筆交易了。sum(outputs) - sum(inputs) = sum(kernel_excess) + kernel_offset具體的實現方法就是,在建立交易時將 k 分割成 k1+k2。 對於交易核 (k1+k2)*G,我們在交易核中釋出出去的是 k1*G (稱之為:the excess),以及 k2(稱為:the offset),並跟以前一樣使用 k1*G 作為公鑰來對交易進行簽名。 在礦工構建區塊的時候,我們對打包的所有交易的k2(the offset)求和,以生成一個單個的聚合值(aggregate k2 offset)用於該區塊所打包的所有交易。一旦區塊打包完成併發布和被鏈所接受,其原始的對應每筆交易的k2 (the offset)即成為不可恢復的。核銷(Cut-through)
區塊讓礦工將多個交易組合成一個單個集合新增到鏈中。 在下面的區塊表示中,包含3個交易,我們只顯示交易的輸入和輸出。 輸入關聯其花費的輸出。 前一個區塊中包含的輸出標記為小寫字母x。I1(x1) --- O1        |- O2I2(x2) --- O3I3(O2) -|I4(O3) --- O4
        |- O5我們注意到以下兩個屬性:· 在這個區塊內,一些輸出直接被包含的輸入消耗(I3花費O2並且I4花費O3)。· 每筆交易的結構並不重要。 由於所有的單個交易均歸於零,因此所有交易輸入和輸出的總和也必須為零。與單個交易類似,所有需要在一個區塊中進行檢查的是所有權已經被證實(來自交易核心 transaction kernels),並且整個區塊沒有增加任何貨幣供應(除了coinbase所允許的之外)。 因此,匹配輸入和輸出可以被消除,因為它們對總和的貢獻被抵消了。 這導致了以下更緊湊的塊:I1(x1) | O1
I2(x2) | O4       | O5請注意,所有的交易結構已被消除,輸入和輸出的順序已不再成問題。 但是,該塊中所有輸出的總和減去輸入,仍然保證為零。一個塊的建立來自:· 塊頭。· 核銷(cut-through) 後剩餘的輸入列表。
· 核銷(cut-through) 後剩餘的輸出列表。· 每個交易的交易核(transaction kernels)包含:   · 從所有commitments總和中獲得的公鑰r * G。   · 使用excess value生成的簽名。   · 挖礦費用 (fee)。當區塊以這種方式構建時,MimbleWimble區塊提供了非常好的隱私保證:
· 更多的交易可能已經完成,但不會顯式出現(在區塊中)。· 所有的輸出看起來都是一樣的:只是一些非常大的數字,不可能相互區分。 如果有人想排除某些輸出,他們將不得不排除所有輸出。· 所有的交易結構已被刪除,使得區分哪個輸出與哪個輸入匹配成為不可能任務。然而,區塊仍然可驗證!儘可能多地核銷(Cut-through)回到前面的示例塊,I1和I2花費的輸出x1和x2必須先前出現在區塊鏈中。因此,在新增此區塊後,這些輸出以及I1和I2也可以從整體鏈中移除,因為它們不會影響整體總和。
總而言之,我們得出結論:任何時間點的鏈狀態(不包括區塊頭)都可以透過這些資訊來概括:1. 鏈中採礦產生的硬幣總量。2. 未使用的交易輸出(即UTXO)的完整集合。3. 每筆交易的交易核心。第一條資訊可以使用塊高度(與起始塊的距離)推匯出來。未使用的輸出和交易核心都非常緊湊。這有兩個重要的後果:· MimbleWimble區塊鏈中給定的節點需要維護的狀態非常小(對於比特幣大小的區塊鏈,幾個G位元組大小的數量級,可能最佳化到幾百兆位元組)。
· 當新節點加入構建MimbleWimble鏈的網路時,需要傳輸的資訊量也非常小。另外,未使用的交易輸出(即UTXO)組成的完整集是不可篡改的,即使只是想去新增或刪除一些交易輸出。這樣做會導致交易核心中所有致盲因因子的總和與輸出中致盲因素的總和不同。結論在本文中,我們介紹了基於MimbleWimble區塊鏈的基本原則。 透過使用橢圓曲線密碼的附加屬性,我們能夠構建完全不透明但仍可以正確驗證的交易。 透過將這些屬性,我們可以消除大量區塊鏈資料,從而實現新對等點的大規模部署和快速同步。更多區塊鏈資訊:www.qukuaiwang.com.cn/news

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;