今天要來(lái)簡(jiǎn)單介紹一下,門羅幣是怎么達(dá)到匿名交易的。本篇文章會(huì)牽涉到橢圓曲線的原理,如果不懂,可以先參考「加密技術(shù)核心算法之安全快捷的ECC算法」。簡(jiǎn)單來(lái)說(shuō)就是要知道這樣的關(guān)系:
p = k*G ,
p:公鑰
k:私鑰
G:曲線上的基準(zhǔn)點(diǎn)
門羅隱匿交易包含了三個(gè)技術(shù):Ring Signature(環(huán)簽名) , Ring Confidential Transactions (RingCT,環(huán)保密交易)跟Stealth Address(隱地址)。在Digital Asset Research的文章中這張圖解釋了各個(gè)技術(shù)所使用的地方,本篇文章,就是要介紹這三個(gè)技術(shù)。
在介紹之前,先了解門羅一些基本概念。在門羅中有兩把key(其實(shí)是4把,因?yàn)楦饔兴借€跟公鑰),一把是view key另一把是spend key。顧名思義,一把是拿來(lái)看的自己余額的(在鏈上找隱匿位址),一把是拿來(lái)花的(做環(huán)簽名)。由spend key可以產(chǎn)生key image(金鑰映像),用來(lái)做預(yù)防雙花的證明,有點(diǎn)像zcash的nullifier。
Ring Signature (環(huán)簽名)
環(huán)簽名有點(diǎn)像混幣,就是把好幾筆交易混在一起,不過(guò)還是有差異。
那實(shí)際上怎么做呢?!假設(shè)一個(gè)初始值v,跟一串隨機(jī)數(shù)(y1, y2, …, yn),然后把v跟隨機(jī)數(shù)經(jīng)由Ek做加密,再把加密過(guò)的值跟下一個(gè)隨機(jī)數(shù)做運(yùn)算(xor)再加密,如:Ek ( y 2⊕ Ek ( y1 ⊕ v )),所以函數(shù)如下
Ck , v ( y 1, y 2,…, yn )= Ek ( y 1⊕ Ek ( y 2⊕ Ek (… Ek ( yn ⊕ v ))))
接著使Ck , v ( y 1, y 2,…, yn ) = v,也就是v經(jīng)過(guò)一連串的計(jì)算后,最后會(huì)等于自己,這就是環(huán)簽名的基本概念,如下圖形成一個(gè)環(huán)
實(shí)際應(yīng)用場(chǎng)景會(huì)像這樣:
m:訊息
P1, P2, …, Pn:為任意的一組公鑰
1.計(jì)算加密金鑰k = Hash(m)
2.選擇隨機(jī)數(shù)v
3.為所有的公鑰選擇隨機(jī)數(shù)(x1, x2, …, xn)(不包含自己xs),接著計(jì)算
yi = gi( xi)。( gi = xi^{Pi} mod Ni )
*也就是上述的隨機(jī)數(shù)yi,使用公鑰來(lái)產(chǎn)生
4.藉由Ck,v(y1, y2, …, yn)來(lái)求得自己的ys
5.接著利用自己的私鑰算出xs,xs = gs^{-1}(ys)
6.最終,輸出環(huán)簽名σ = (x1, x2, …, xs, …, xn, v)
驗(yàn)證
1.計(jì)算yi = gi(xi), i = 1, 2, …, n
2.計(jì)算加密金鑰k = Hash(m)
3.驗(yàn)證Ck,v(y1,y2,…,yn) ?= v
因?yàn)関跟ys是相關(guān)的,而只有擁有私鑰的人才能從ys算出xs,因此其他人無(wú)法假造簽名。而環(huán)簽名有個(gè)特性,就是少了某一項(xiàng),可以用其他項(xiàng)來(lái)算出少的那一項(xiàng)。因?yàn)楹灻换旌线^(guò)了,所以礦工無(wú)法直接驗(yàn)證交易是否花過(guò)了,要怎么確保雙花的問(wèn)題?就要借助到金鑰映像(key image)的幫助,實(shí)際怎么運(yùn)作,后面的隱地址一起介紹。
Ring Confidential Transactions(環(huán)保密交易)
在RingCT(環(huán)保密交易)出現(xiàn)之前,因?yàn)榄h(huán)簽名的限制,混合環(huán)簽名的金額必須一樣,所以交易金額都必須被拆成固定面額,例如要交易12.5 XMR,就需要拆成10, 2 , 0.5三種面額,雖然發(fā)送方的資訊有環(huán)簽名做保護(hù),但是交易的金額就暴露給所有人了。
環(huán)保密交易出現(xiàn)后(新版的環(huán)簽名”A Multi-layered Linkable Spontaneous Anonymous Group signature”所支援),金額將會(huì)被遮罩住,因此不必拆成已知面額,進(jìn)而可以達(dá)到隱匿的作用。
Stealth Address(隱地址)
記得上面提到,每個(gè)人有兩把key(view key跟spend key)。假設(shè)Alice要轉(zhuǎn)錢給Bob,首先,Alice要利用Bob的public view key跟public spend key組成一次性的公鑰,計(jì)算如下
P = H(rA)G + B
r: Alice選的隨機(jī)數(shù)
A:Bob‘s public view key
B:Bob’s public spend key
G:橢圓曲線中的基準(zhǔn)點(diǎn)
H:hash function
然后計(jì)算R = rG。接著把交易送到P所產(chǎn)生的位址,并將R值放入交易的內(nèi)容。所以整個(gè)網(wǎng)路都會(huì)知道P跟R。
因?yàn)閞 是隨機(jī)數(shù),每次產(chǎn)生出的一次性公鑰P都會(huì)是不同的,而由公鑰P產(chǎn)生出門羅的地址就叫做隱地址(stealth address)。Alice把交易送到隱匿地址后,Bob要怎么知道這筆交易呢?
Bob有view key跟spend key對(duì)應(yīng)的私鑰(a, b),Bob計(jì)算
P′ = H(aR) + B
因?yàn)閍R = arG = rA,所以可得P‘ = H(aR) + B = H(rA) + B = P
所以若P’==P就代表這筆交易是給自己的,而這個(gè)計(jì)算需要a : private view key,所以也就只有Bob可以計(jì)算得出來(lái)。Bob找到交易后可以算出對(duì)應(yīng)的私鑰x = H(aR) + b,就可以動(dòng)用這筆交易了!而這種方式,對(duì)于收款人來(lái)說(shuō)是麻煩的,因?yàn)橐S時(shí)掃描鏈上的交易,才知道有沒有自己的。(有一種方式,是把自己的view key給第三方,由第三方幫你掃描,不過(guò)你的資產(chǎn)就會(huì)曝光,但是依然只有自己能動(dòng)用)
回到雙花的問(wèn)題上,上面有提到金鑰映像,先來(lái)看金鑰映像的算法
I = xH(P)
基本上是由一次性的公鑰P跟私鑰x 組成,每一筆交易P只會(huì)對(duì)應(yīng)到一把私鑰x,所以對(duì)于每筆交易P其金鑰映像I都是固定的,因此礦工只需要去驗(yàn)證I 是否有重復(fù),就可以驗(yàn)證是否雙花。
門羅的最新協(xié)議Bulletproof,是一種range proof,主要用于環(huán)保密交易(RingCT),藉由Bulletproof可以大大減少了驗(yàn)證資料的大小,讓交易資料變小,而手續(xù)費(fèi)得以減少,有機(jī)會(huì)再來(lái)深入探討B(tài)ulletproof。
擴(kuò)展性(scalability)是門羅的一個(gè)大問(wèn)題,主要是保密交易使用的rang proof的資料量龐大,使得交易的資料量很大,約是比特幣的10倍(使用bulletproof后),每次交易也都會(huì)有新的金鑰映像提供查詢,所有歷史交易的紀(jì)錄都需要保留,無(wú)法像比特幣有些技巧可以省略某些交易。這或許對(duì)門羅幣是個(gè)挑戰(zhàn),但是另一派的說(shuō)法,門羅幣的交易量不是重點(diǎn),而是他提供的隱私性。
評(píng)論
查看更多