從去年底開始,筆者就一直很關(guān)心MimbleWimble這個新的隱私協(xié)議的發(fā)展,不只是因為Grin主網(wǎng)上線的緣故,或者Litecoin即將采用MimbleWimble協(xié)議的關(guān)系,而是因為他是很多隱私協(xié)議的結(jié)晶體,他巧妙地結(jié)合了許多隱私協(xié)議,而且讓隱私交易變的可以實行,甚至具有擴(kuò)容的效果,因此,一直很想再寫一篇文章,把MimbleWimble的機(jī)制運(yùn)作講的更仔細(xì),同時也力求好懂。
一、MimbleWimble怎么來
MimbleWimble的發(fā)展過程有點類似于比特幣,是個千呼萬喚始出來的成果,也就是某個議題,或者某種需求討論了好久,終于有個人或者某篇論文,把一路上零零總總的研究成果,結(jié)合成一套可以運(yùn)行的協(xié)議:在比特幣問世以前,很多人在討論去中心化的電子現(xiàn)金,例如Wei Dai;還有Adam Beck研究出「雜湊現(xiàn)金」Hash Cash,還有對于時間戳記(timestamp)、公私鑰等等的研究成果,加上Satoshi在共識演算法上的突破--Nakamoto Consensus,而有了比特幣;在MimbleWimble協(xié)議產(chǎn)生以前,其實很多在比特幣核心開發(fā)組織中的成員,開始認(rèn)為比特幣的確實現(xiàn)了「點對點的現(xiàn)金交易」,但卻不夠能維護(hù)「點對點交易的隱私」,有許多研究者已經(jīng)能夠從交易圖和網(wǎng)路爬蟲等方式,來圖像化分析某個或多個帳號的歷史交易,并接近精準(zhǔn)的推測交易的人或者群體可能是誰。因此在比特幣交易中暴露交易雙方帳號、交易金額以及交易可追蹤等特性會威脅了交易匿名性(anonymity),而本身交易可追蹤的特性又讓貨幣本身不具有可替代性(fungibility),也是被人所詬病的特點。
于是,在比特幣核心社群Bitcoin Core中,陸續(xù)有很多人提出了各種協(xié)議,或者新的方法,想要促進(jìn)比特幣能夠更具有隱私性,但都比較像是個別專案的性質(zhì),而不是一套馬上能夠讓某種貨幣直接使用的區(qū)塊鏈系統(tǒng)。直到有一天,在比特幣的IRC(Internet Relay Chat) channel中,有位化名為Tom Elvis Jedusor(法文版的佛地魔)透過Tor網(wǎng)絡(luò)放了一份txt檔,也就是后來大家俗稱的白皮書,他在里面命名了一個叫做MimbleWimble的協(xié)議(哈利波特里面的鎖舌咒語,念了你會說不出話~~),并且推測了,透過Confidential Transactions(機(jī)密交易,簡稱CT)、CoinJoin 、One-way aggregate signatures(單向聚合簽名,OWAS)等三種方式,可以完成「隱私交易」,并且透過cut-through的方式處理資料大量增加「產(chǎn)生的狀態(tài)增長問題」。他在留了這份名為MimbleWimble的白皮書后就人間蒸發(fā)了,然而他的白皮書仍然留下了很多問題,而且沒有完善的數(shù)學(xué)證明他的想法的可行性,是最后由BlockStream的Andrew Poelstra將這篇文章完善,提出了一篇較為完整版的論文。(對了,后面還會一直看到BlockStream,沒有這間公司的人,我認(rèn)為也不會有MW協(xié)議)。
所以整體來說,MimbleWimble是在比特幣社群中,有長期關(guān)心隱私問題的專家和愛好者們,不斷的提出各種改進(jìn)方法,最后有人統(tǒng)整這些方法,并且被人驗證后所產(chǎn)生的產(chǎn)物,和比特幣構(gòu)成的過程有點相似,但是他是一個協(xié)議,實際的實作還必須等到Grin還有BEAM這兩種隱私加密貨幣的出現(xiàn)。
從比特幣的交易中,可以去分析個別的群體分別可能為何
某個比特幣帳號在R語言下呈現(xiàn)的交易圖
二、解構(gòu)MimbleWimble三大零件
Mimblewimble是個由很多個零件拼裝起來的變形金剛,在這個章節(jié)我會來介紹,MW的各種零件是如何運(yùn)作來完成這套協(xié)議,根據(jù)協(xié)議,我認(rèn)為MW的隱私貨幣交易有三個交易的特性。
1.沒有交易金額
2.沒有交易雙方地址
3.在一個區(qū)塊中,多筆交易是被合并的,沒辦法看到每個單筆交易的細(xì)節(jié)
要完成這樣的特性:必須分別由三個大零件:
1.Confidential Transactions(機(jī)密交易,簡稱CT)
2.CoinJoin(混幣交易)
3.One-way Aggregate Signatures(單向聚合簽名,OWAS)
透過這三大重要的主要協(xié)議,來完成隱私交易,最后透過Cut-through,來回應(yīng)已確認(rèn)的鏈狀態(tài)大量累積的問題,這也是MimbleWimble比Zcash和Monero等仍需要儲存許多狀態(tài)資料的隱私幣還出色的地方。
既然他是一個專門為隱私幣所創(chuàng)造的區(qū)塊鏈協(xié)議,那么還是先來介紹一個區(qū)塊中的內(nèi)容物:
1.經(jīng)ECDSA加密過的交易輸入和范圍證明的merkle tree
2.經(jīng)ECDSA加密過的交易輸出和范圍證明的merkle tree
3.交易內(nèi)核:一個剩余值excess value(s)和總和的kernel offsets、挖礦費(fèi)用。
4.區(qū)塊頭、區(qū)塊高度
其實應(yīng)該在這里就能夠看出來MW和其他區(qū)塊鏈的區(qū)塊有結(jié)構(gòu)上的差別了,在此也開始解構(gòu)MimbleWimble的所有零件:
1、Confidential Transactions機(jī)密交易
首先先介紹Confidential Transactions(以下簡稱CT),CT最早是blockstream的Adam Back提議添加「加法同態(tài)」的性質(zhì)在比特幣交易中而產(chǎn)生,后來這個方法被Gregory Maxwell以Confidential Transactions的名義發(fā)出來,最后被匿名的佛地魔加到了MW協(xié)議中,他的最基礎(chǔ)的概念就是要將任何協(xié)議中的交易輸出及交易輸出都以橢圓曲線的方式進(jìn)行加密。
所以在MimbleWimble之中,每個交易輸入和交易輸出都會以Pedersen Commitment的形式寫成:
C=r*G + v*H
Maxwell的文章中是這樣寫:commitment = SHA256( blinding_factor || data )
如上所寫,我們可以知道C( Pedersen Commitment,Pedersen 可能是從TP Pedersen的論文而來)是一個讓交易金額v通過ECDSA( 橢圓曲線數(shù)字簽名算法, Elliptic Curve Digital Signature Algorithm,縮寫ECDSA)而產(chǎn)生的值,這個值眾人皆知,然而透過橢圓曲線后所看到的輸入值將不再是單純的金額,我把上面算式內(nèi)容分成以下三點解說:
1. r是所謂的致盲因子(blinding_factor),作為私鑰使用,是不能被其他任何人知道的,這個私鑰也代表你對這個交易值的所有權(quán)。
2. G和H則是在橢圓曲線上的兩個點,而r*G則是r在G上的公鑰,我們沒辦法透過r*G而知道r值,這是所謂的離散對數(shù)問題,我們不會因為知道公鑰,就因此而知道私鑰,切記不要把這里說的乘法和5*6=30這種單純的乘法搞混。
3. v則是交易的數(shù)額,只有交易的另一方也會知道,但是礦工與其他人則不會知道。在這里橢圓曲線確保了一件事,交易金額v和致盲因子r不會被透過逆推的方式而知道。
現(xiàn)在你知道一筆交易的長相如何了,我們趕緊來看怎么樣可以讓這筆交易怎么被驗證。
1-1、 隱藏交易數(shù)額的魔法:加法同態(tài)(Additively Homomorphic)
在MimbleWimble中,每筆交易仍然遵守UTXO( Unspent Transaction Output)的概念,如果對比特幣有點了解,應(yīng)該還有印象當(dāng)我們說某用戶的錢包“收到”比特幣時,意思是說這個錢包發(fā)現(xiàn)一個可以使用該錢包控制的密鑰來花費(fèi)的UTXO,你可以將他簡化成輸入=輸出。
假設(shè)今天在比特幣交易中,你的帳戶有10BTC,你用了7BTC給賣家,3BTC是找零(為了簡化先不管手續(xù)費(fèi))。
輸入1(10)=輸出1(7)+輸出2(3)
可是今天我們在MW的交易中,數(shù)額是不能被外人知道的,這時候交易仍要遵守V1+V2=V3的形式,這時候同態(tài)加密( Homomorphic Encryption )就派上用場了,在CT中遵守的只是同態(tài)加密中的加法同態(tài)( additively homomorphic ),加法同態(tài)的意思,就是先加密再相加=先相加再加密,因此,我們能夠看到算式演變?nèi)缦拢?/p>
V1+V2=V3
=》 V1*H+V2*H=(V1+V2)*H=V3*H
這時候加法同態(tài)的性質(zhì)巧妙的驗證了一件事情,那就是我們不需要知道原本v1和v2,以及v3的值是多少,只需要知道V1*H+V2*H=V3*H就可以驗證v1+v2=v3了,也因此他能夠成功地去隱藏交易數(shù)額。
但是這里會存在另外一個問題,就是我們?nèi)绾卧谳斎?輸出的情況下,不讓交易的另一方,以及后來的驗證者不知道我的私鑰,同時又可以讓他們驗證我知道私鑰呢?
可能看完你還不一定知道問題在哪里,讓我們先來看看這個問題:
今天Alice假設(shè)有24個幣,致盲因子為81,則他的Pedersen Commitment會是
81*G+24*H
那要是Alice傳給Bob數(shù)量為7的幣,那么算式會變成(ps.在此我們先忽略礦工手續(xù)費(fèi))
A-B=(81*G + 24*H)-(81*G + 7*H)=0*G-17*H
這樣就會變成說,Bob將會知道致盲因子是81,如此一來你的私鑰就被曝光了。所以在真實的MW交易中,不能讓這種事情發(fā)生,否則連你找零的花費(fèi)都有可能被取走,因此當(dāng)Alice要和Bob交易時,必須再另外為所找零的錢所設(shè)立一個致盲因子,例如我們將另個致盲因子設(shè)為8,記住這個8還是不能讓他知道的,同時,當(dāng)你傳給Bob時,Bob也會指定一個私鑰數(shù)字(這里假設(shè)Bob的致盲因子是23),雖然這時候Bob不會知道你的致盲因子是多少,但我們能夠利用等式兩邊數(shù)值相減為零的特性,來去驗證你給的致盲因子之差的正確性。所以這個時候的算式變成這個樣子:
Alice(24)-Alice(17)-AlicetoBob(7)
81*G+24*H-(8*G+17*H)-(23*G+7*H)=50*G+0*H
這時候此筆交易中,驗證的礦工會收到50*G的余項,這時候的excess value值就是50,50*G(余項)和50(致盲因子差)則剛好可以作為公鑰與私鑰。(記得這部分的交易內(nèi)容中,沒有算到礦工手續(xù)費(fèi))。
1-2、避免多余金錢被制造的魔法:范圍證明(Range Proof)
今天我們已經(jīng)可以確定交易數(shù)額可以透過加法同態(tài)的方式去隱藏,并且讓驗證的礦工能夠驗證交易等式兩邊是相等的,但這時卻還有一個影響交易有效性的問題,就是即使等式兩端相等,還是有可能憑空創(chuàng)造出來的金錢,可能一時之間比較難想像,那你能夠先看下面這組輸入與輸出的算式:
輸入=輸出1+輸出2
5=(-10)+15
今天以上的算式,也符合輸入等于輸出的條件,但我卻能夠發(fā)現(xiàn)到,原本的5塊變成15塊,中間的10塊是因為是被憑空創(chuàng)造出來的金錢。而且這個時候負(fù)數(shù),在橢圓曲線上對應(yīng)的可能也是任何值,因此不太會被檢測出來。這時候在機(jī)密交易中用了另外一種零件,稱作范圍證明(Range Proof)。Range Proof最早由blockstream的Gregory Maxwell所提出,Range Proof會附掛在每筆交易輸入與輸出中,他透過簡單的零知識證明,可以確保在不知道數(shù)額為多少的情況下,還能證明每個單筆的輸入輸出都是一個0
然而,每筆輸入與輸出都必須附帶的零知識證明的size大小,卻是相對于交易本身要來的更大,而且礦工如果要同步于整個區(qū)塊,就必須從頭到尾都進(jìn)行驗證每筆交易的Range Proof驗證,因此Range Proof本身的大小,也成為必須去改進(jìn)的對象。因此,后來Stanford的學(xué)生Benedikt Bünz又在他的基礎(chǔ)上開發(fā)出了所占的容量更小,運(yùn)算速度更快的Bulletproof,在i7–6820HQ的系統(tǒng)系統(tǒng)下實測只有688bytes的大小,較原本Maxwell開發(fā)出來的有5kb左右的Range Proof已經(jīng)有非常大的容量改善,但和每筆交易差度不多33bytes相比仍然非常大。
到現(xiàn)在我們可以有一個概念,以了解不用知道金額的交易如何被有效驗證:
1.礦工透過Pedersen Commitment的加法同態(tài)性,確保在不知道交易金額的情況下,還能確定等式左右兩邊輸入等于輸出
2.透過Range Proof來確定某個不知道數(shù)額的交易輸入或輸出,確實大于零,以避免被憑空創(chuàng)造出新錢。
2、CoinJoin 混合交易
在過去有許多人認(rèn)為在比特幣的交易圖上,能夠看到「哪筆輸數(shù)對應(yīng)到哪筆輸出」是一件非常容易暴露隱私的地方,因此Gregory Maxwell(是的,又是他)題出了一個叫做CoinJoin的概念,他要做的事情非常簡單,就是將兩筆交易混合。
在MW協(xié)議以錢,有許多錢包或者額外的服務(wù),就有配置CoinJoin的服務(wù)于其間,例如WasabiWallet和Tumblebit、JoinMarket,然而單靠Coinjoin卻依舊是不安全的,大家仍舊可以從交易數(shù)額中試圖去還原,同時因為是個別的服務(wù),參與的人數(shù)太少,在資金匹配上也需要花一定的時間。這時候佛地魔在MW協(xié)議中將CoinJoin的技術(shù),結(jié)合機(jī)密交易(CT),就能夠避免交易能夠從「數(shù)字」方面去被推敲出來,同時在交易路徑上也可以透過CoinJoin的技術(shù)被混淆。
而且和過去個別使用CoinJoin的服務(wù)不同的地方,是這次Mimblewimble,徹底把CoinJoin寫在了協(xié)議層,如此一來不需要靠第三方的錢包或者服務(wù)幫忙就能完成這一件事情,而且有機(jī)會讓混合交易變的更有效率。
但現(xiàn)在就要開心的慶祝隱私交易的魔法能夠?qū)崿F(xiàn),就還太早了,因為即使混合交易數(shù)額,我們還是能夠知道交易雙方的公鑰,并且能透過這些公鑰址去嘗試重構(gòu)每一筆交易,因此在這樣的情境下,我們必須要有新的公私鑰系統(tǒng),來確保隱私安全。
3、OWAS ( One-way Aggregate Signatures,單向聚合簽名)
Jedusor在他的初略版白皮書中,提出了可以用Yuan Horas Mouton的單向聚合簽名( One-way Aggregate Signatures,簡稱OWAS)的方式去完成,比較有趣的一點是在Andrew Poelstra在他詳細(xì)版的白皮書中,卻沒有用到OWAS這個詞,而是在Sinking Signature還有compact chain中去驗證這個技術(shù),甚至連后來開發(fā)Grin的Ignotus Peverell的Github的MW簡介中,也沒出現(xiàn)OWAS這個詞,而是直接說Transaction Aggregation(交易聚合),不知道這個專有名詞,為什么在這個三個重要的MW文件中,出現(xiàn)的方式會略有不同,但在此還是以O(shè)WAS去代稱(我知道在之前已經(jīng)有如Boneh等學(xué)者在研究聚合簽名 )。
所謂的聚合簽名,就是指當(dāng)你看到很多交易的輸入以及輸出時,我們將不能再把這些輸入及輸出的公鑰重新拆解,并且拼湊出一個完整的交易順序,因此我們將所有簽名聚合在一起,并且不能使他逆向被還原。
OWAS由兩個部分組成,一是Kernel Excess(內(nèi)核剩余),一是Kernel Offsets(交易核偏移因子),還記得我們所說的致盲因子之差嗎?對的,就是Alice既要傳送錢給Bob,又不希望Bob知道他的私鑰(致盲因子),于是他給他了(致盲因子差)*G,這時候我們?yōu)榱吮苊馊思覐慕灰字械墓€推測出交易途徑,我們用了單向聚合簽名的方式來降低大家知道這個值的可能性,因此我們產(chǎn)生了以下算式
輸出的Confidential Transactions總額-輸出的Confidential Transactions總額= Kernal_excess + kernel_offset
透過這種方式,我們就可以將最后作為的公鑰的余項(例如剛才上面在講機(jī)密交易時的50*G)拆分成兩部分,例如X*G拆成(x1+x2)*G ,這時候大家能構(gòu)讓外界看到的值x1*G就是所謂的Kernel Excess,你可以把它看作是公鑰;而另外一部分就是x2*G,稱作Kernel Offsets,他會和這個區(qū)塊中所有交易的Kernel Offsets一起被相加,而當(dāng)他們這么多個Kernel Offsets被相加后,你也就看不出來,哪個Kernel Offset是哪一筆交易中的了,所以這個方法才會被叫做單向聚合簽名,因為他沒辦法在做逆向工程了。因此,當(dāng)一筆MW上的交易在給礦工驗證時,我們可以想像Kernel Excess就是公鑰,而Kernel Offsets是私鑰。
到此,隱私交易的部分就徹底完成了,我們在此簡短重復(fù)一次
1-1、機(jī)密交易-加法同態(tài):確保在不知道交易金額的情況下驗證等式兩邊成立
1-2、機(jī)密交易-范圍證明:確保在零知識證明下,每個輸入輸出值大于零,避免憑空創(chuàng)造多余金錢。
2、混幣交易:讓我們無法從交易數(shù)額中去回推交易路徑
3、單向聚合簽名:讓交易的公鑰不會被暴露出交易路徑
三、Cut-through核銷:減少礦工儲存狀態(tài)
cut-through是MimbleWimble中一個針對礦工的精巧設(shè)計,他能夠確保的是礦工不需要長期存儲這么多的交易狀態(tài),而cut-through的概念就是在一筆交易已經(jīng)被確定其所有權(quán)的情況下(也就是被驗證)后,只要能夠維持輸入等于輸出(input=output),那么過程中多余的內(nèi)容都可以被刪除。
例如原本的幾個交易可能長這個樣子
Input1+Output1=Ouput1+Change1+Output2+Change2
=》Cut through之后(Output1等式兩邊都有因此可以被刪去)
Input1=Change1+Output2+Change2
然而在這里必須特別說明,我認(rèn)為Cut-through的概念并非能夠在目前實作的兩個項目中(Grin&BEAM),達(dá)到很好的隱私,例如在Grin中,其實Cut-through的功能是能夠被關(guān)掉的,只要將~/.grin/main/grin-server.tomlar的archive_mode從
archive_mode = false
變成
archive_mode = true
in ~/.grin/main/grin-server.toml
如此一來礦工的節(jié)點就不會執(zhí)行核銷的動作。因此我認(rèn)為目前部分外界人士,可能認(rèn)為Cut-through能夠透過刪除資料來解決隱私,就目前的實作來看可能會是一個誤解。
四、MinbleWimble的后續(xù)效應(yīng)與限制
MimbleWimble不但是一個許多隱私協(xié)議所組成的隱私幣區(qū)塊鏈協(xié)議,更是許多過去比特幣社群所遇到問題時,一些原本在比特幣上無法實現(xiàn)的好方法被應(yīng)用的好場景,然而MimbleWimble也像是練就了某種神功后,具有某些后遺癥的武者,因此在最后,我試圖去探討,MimbleWimble會產(chǎn)生什么后續(xù)的影響,以及發(fā)展可能有什么樣的限制。
1.挑戰(zhàn)其他隱私幣的地位和公鏈設(shè)計原則
筆者認(rèn)為,MimbleWimble協(xié)議所影響的,首先是挑戰(zhàn)既有隱私幣的地位,例如Monero和Zcash,MW協(xié)議中不但不需要為了驗證交易的合法性,而保留以驗證的交易作廢清單,同時Cut-through的功用,也讓礦工能夠減少儲存已驗證的狀態(tài)這種較為不合理的手法。另外,我認(rèn)為MW協(xié)議也是少數(shù),用減少資料儲存來達(dá)到可擴(kuò)展性的公鏈設(shè)計手法,同時他也減少了許多區(qū)塊鏈中應(yīng)該要被礦工所記載的內(nèi)容,在MW中,一筆交易里面礦工要知道什么:最主要的就是交易有效性與通貨膨脹,可能會影響未來不具高度智能合約需求的貨幣項目,往這樣的方向去發(fā)展。
2.限制
雖然MW在隱私協(xié)議上采取了非常巧妙的手法,去實現(xiàn)了匿名交易。但其本身依舊有某一些限制,在此我將他分為三點:一是Range Proof所占的容量影響交易狀態(tài)儲存的容量;二是交易實作上的使用體驗;三則是智能合約等等貨幣交易以外的區(qū)塊鏈功能實現(xiàn)能力。
2-1、Range Proof所占的容量影響交易狀態(tài)儲存的容量
上文曾經(jīng)說過,透過Cut-through,我們能夠減少礦工的儲存內(nèi)容物,避免狀態(tài)大量累積的問題,然而,在MW區(qū)塊鏈中,無法被刪減的,是每筆輸入與輸出中的范圍證明(range proof),Range Proof是一個簡單的零知識證明(688bytes),容量相較于交易訊息本身(單個交易約33bytes),相較而言其實是非常大的差距,這也是會影響未來礦工儲存資料,以及未來可擴(kuò)展性的關(guān)鍵。
2-2、共同構(gòu)建交易的實作體驗
在MW協(xié)議下的交易,我們必須要交易雙方共同去將一筆交易完成,例如Alice寄錢給Bob,Bob必須證明他知道交易金額,并且在回傳訊息給Alice,最后交易經(jīng)過Alice驗證運(yùn)算后才完成,這樣的過程不需要同步在線上完成,但需要交易雙方共同構(gòu)建,和比特幣、以太坊等等密碼貨幣那種只需一方傳送金額簽章到區(qū)塊鏈上的概念較為不同,因此目前例如在Grin上,有兩種方式可以進(jìn)行交易:
· 寄送檔案: Bob需要收到交易檔案( transaction file),并且生成一個回應(yīng)的檔案(response file),并且寄回給Alice。
· 網(wǎng)頁(HTTP): Bob的Grin錢包必須要監(jiān)聽一個端口。無論Alice的錢包什么時候寄給他,Bob的錢包都會自動執(zhí)行既有的步驟。但這卻有一個比較苛刻的條件,就是錢包需要在一個固定的IP地址下,并且你的錢包客戶端要持續(xù)運(yùn)作才能完成。
這些過程其實都是非常不人性,很難在未來普及使用。目前Grin有開發(fā)一個新錢包grinbox,目標(biāo)是能夠像比特幣一樣的交易,但很持續(xù)在開發(fā)中,如果未來有任何消息,我會持續(xù)更新。
2-3、貨幣交易之外如智能合約等功能的擴(kuò)展現(xiàn)制
MimbleWimble和比特幣較為不同的是其較難支持區(qū)塊鏈中的交易腳本,這也導(dǎo)致了如比特幣可以實現(xiàn)的簡單智能合約、或者閃電網(wǎng)絡(luò)等等,然而,我認(rèn)為這或許是大家已經(jīng)不太震驚的MW缺點所在了,而且目前就筆者所見,已經(jīng)有一些有趣的專案被展開,例如精確版MW白皮書的撰寫人:Blockstream的Andrew Poelstra,目前正在研究透過無腳本腳本 ( scriptless-scripts)的方式來創(chuàng)造MimbleWimble上簡單的應(yīng)用,同時也有人實現(xiàn)了Grin上的原子交換?;蛟S未來可能有更輕巧的智能合約實現(xiàn)方式出現(xiàn)。
評論
查看更多