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