门罗隐匿交易的三个基础技术解析
扫描二维码
随时随地手机看文章
今天要来简单介绍一下,门罗币是怎么达到匿名交易的。本篇文章会牵涉到椭圆曲线的原理,如果不懂,可以先参考「加密技术核心算法之安全快捷的ECC算法」。简单来说就是要知道这样的关系:
p = k*G ,
p:公钥
k:私钥
G:曲线上的基准点
门罗隐匿交易包含了三个技术:Ring Signature(环签名) , Ring Confidential TransacTIons (RingCT,环保密交易)跟Stealth Address(隐地址)。在Digital Asset Research的文章中这张图解释了各个技术所使用的地方,本篇文章,就是要介绍这三个技术。
在介绍之前,先了解门罗一些基本概念。在门罗中有两把key(其实是4把,因为各有私钥跟公钥),一把是view key另一把是spend key。顾名思义,一把是拿来看的自己余额的(在链上找隐匿位址),一把是拿来花的(做环签名)。由spend key可以产生key image(金钥映像),用来做预防双花的证明,有点像zcash的nullifier。
Ring Signature (环签名)
环签名有点像混币,就是把好几笔交易混在一起,不过还是有差异。
那实际上怎么做呢?!假设一个初始值v,跟一串随机数(y1, y2, …, yn),然后把v跟随机数经由Ek做加密,再把加密过的值跟下一个随机数做运算(xor)再加密,如:Ek ( y 2⊕ Ek ( y1 ⊕ v )),所以函数如下
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经过一连串的计算后,最后会等于自己,这就是环签名的基本概念,如下图形成一个环
实际应用场景会像这样:
m:讯息
P1, P2, …, Pn:为任意的一组公钥
1.计算加密金钥k = Hash(m)
2.选择随机数v
3.为所有的公钥选择随机数(x1, x2, …, xn)(不包含自己xs),接着计算
yi = gi( xi)。( gi = xi^{Pi} mod Ni )
*也就是上述的随机数yi,使用公钥来产生
4.藉由Ck,v(y1, y2, …, yn)来求得自己的ys
5.接着利用自己的私钥算出xs,xs = gs^{-1}(ys)
6.最终,输出环签名σ = (x1, x2, …, xs, …, xn, v)
验证
1.计算yi = gi(xi), i = 1, 2, …, n
2.计算加密金钥k = Hash(m)
3.验证Ck,v(y1,y2,…,yn) ?= v
因为v跟ys是相关的,而只有拥有私钥的人才能从ys算出xs,因此其他人无法假造签名。而环签名有个特性,就是少了某一项,可以用其他项来算出少的那一项。因为签名被混合过了,所以矿工无法直接验证交易是否花过了,要怎么确保双花的问题?就要借助到金钥映像(key image)的帮助,实际怎么运作,后面的隐地址一起介绍。
Ring ConfidenTIal TransacTIons(环保密交易)
在RingCT(环保密交易)出现之前,因为环签名的限制,混合环签名的金额必须一样,所以交易金额都必须被拆成固定面额,例如要交易12.5 XMR,就需要拆成10, 2 , 0.5三种面额,虽然发送方的资讯有环签名做保护,但是交易的金额就暴露给所有人了。
环保密交易出现后(新版的环签名”A MulTI-layered Linkable Spontaneous Anonymous Group signature”所支援),金额将会被遮罩住,因此不必拆成已知面额,进而可以达到隐匿的作用。
Stealth Address(隐地址)
记得上面提到,每个人有两把key(view key跟spend key)。假设Alice要转钱给Bob,首先,Alice要利用Bob的public view key跟public spend key组成一次性的公钥,计算如下
P = H(rA)G + B
r: Alice选的随机数
A:Bob‘s public view key
B:Bob’s public spend key
G:椭圆曲线中的基准点
H:hash function
然后计算R = rG。接着把交易送到P所产生的位址,并将R值放入交易的内容。所以整个网路都会知道P跟R。
因为r 是随机数,每次产生出的一次性公钥P都会是不同的,而由公钥P产生出门罗的地址就叫做隐地址(stealth address)。Alice把交易送到隐匿地址后,Bob要怎么知道这笔交易呢?
Bob有view key跟spend key对应的私钥(a, b),Bob计算
P′ = H(aR) + B
因为aR = arG = rA,所以可得P‘ = H(aR) + B = H(rA) + B = P
所以若P’==P就代表这笔交易是给自己的,而这个计算需要a : private view key,所以也就只有Bob可以计算得出来。Bob找到交易后可以算出对应的私钥x = H(aR) + b,就可以动用这笔交易了!而这种方式,对于收款人来说是麻烦的,因为要随时扫描链上的交易,才知道有没有自己的。(有一种方式,是把自己的view key给第三方,由第三方帮你扫描,不过你的资产就会曝光,但是依然只有自己能动用)
回到双花的问题上,上面有提到金钥映像,先来看金钥映像的算法
I = xH(P)
基本上是由一次性的公钥P跟私钥x 组成,每一笔交易P只会对应到一把私钥x,所以对于每笔交易P其金钥映像I都是固定的,因此矿工只需要去验证I 是否有重复,就可以验证是否双花。
门罗的最新协议Bulletproof,是一种range proof,主要用于环保密交易(RingCT),藉由Bulletproof可以大大减少了验证资料的大小,让交易资料变小,而手续费得以减少,有机会再来深入探讨Bulletproof。
扩展性(scalability)是门罗的一个大问题,主要是保密交易使用的rang proof的资料量庞大,使得交易的资料量很大,约是比特币的10倍(使用bulletproof后),每次交易也都会有新的金钥映像提供查询,所有历史交易的纪录都需要保留,无法像比特币有些技巧可以省略某些交易。这或许对门罗币是个挑战,但是另一派的说法,门罗币的交易量不是重点,而是他提供的隐私性。