整理《RING CONFIDENTIAL TRANSACTIONS》by Shen Noether- Monero Research Labs
https://ledger.pitt.edu/ojs/ledger/article/view/34
Ring CT 2016
- Introduction
- Multilayered Linkable Spontaneous Anonymous Group signatures (MLSAG)
- Confidential Transactions
- Monero Ring CT协议的正式定义
- range proof
Introduction
加密货币中的环签名
CryptoNote:Traceable ring signature-防止双花费
Ring coin :Linkable ring signature
优点:
- 与CoinJoin 或使用混币服务相比,环签名提供了不需要中心管理器的“自组织”(Spontaneous)混合。
- Dashcoin使用更大数量的可信混频器,但中心节点的个数仍然远小于用户数。
问题:
- 通过区块链分析具有特殊金额的交易,可以缩小范围。使用一次性密钥可以解决。但会产生大量灰尘交易,对于金额较小的交易消耗空间巨大。
- 接收方想要花费收到的硬币时可能被敌手跟踪相关的交易公钥。
- 原始CryptoNote 需要给出 ( p u b k e y P , a m o u n t A ) (pubkey P, amount A ) (pubkeyP,amountA), 如果 A A A比较特殊,则可能缩小实际的匿名集([AMT15].)
Monero中的Ring CT
扩展了CryptoNote协议,隐藏:金额、来源、目的地(与Zerocash的区别,Ring CT使用PoW生成硬币,而Zerocash必须有可信组生成)
多层可链接自发匿名群签名(MLSAG):机密交易+环签名
→
\rightarrow
→匿名+防止双花
Multilayered Linkable Spontaneous Anonymous Group signatures (MLSAG)
Ring coin(2015)的环签名
- K e y G e n : ( x , P j = x G ) , I = x H p ( P j ) {\rm KeyGen}: (x,P_j=xG),I=xH_p(P_j) KeyGen:(x,Pj=xG),I=xHp(Pj);
-
S
i
g
n
(
α
,
s
i
)
{\rm Sign}(\alpha,s_i)
Sign(α,si),其中
s
i
s_i
si是一组随机数
(
i
≠
j
,
i
∈
{
1
,
.
.
.
,
n
}
)
(i\neq j,i\in\{1,...,n\})
(i=j,i∈{1,...,n})
计算 L , R L,R L,R,从 j + 1 → n , 1 → j − 1 j+1\rightarrow n,1\rightarrow j-1 j+1→n,1→j−1; c c c从 j + 2 → n , 1 → j j+2\rightarrow n,1\rightarrow j j+2→n,1→j
环的接口:
输出签名: σ = ( I , c 1 , s 1 , . . . , s n ) \sigma = (I, c_1, s_1,...,s_n) σ=(I,c1,s1,...,sn) - V e r i f y {\rm Verify} Verify:计算所有的 L , R , c L,R,c L,R,c,并检查所有的 c c c, c n + 1 = c 1 c_{n+1}=c_1 cn+1=c1
- L i n k {\rm Link} Link:不出现重复的 I I I.
MLSAG
key-vector: y ˉ = ( y 1 , . . . , y r ) , x ˉ = ( x 1 , . . . , x r ) \bar{y}= (y_1,...,y_r),\bar{x}=(x_1,...,x_r) yˉ=(y1,...,yr),xˉ=(x1,...,xr)
设环中的n个成员每个都有m个公钥,MLSAG 环签名的目标:
- 为了证明n个签名者中的一个知道他们整个key向量的密钥
- 如果签名者在另一个MLSAG签名中使用他们的m签名密钥中的任何一个,那么这两个环被链接,第二个这样的签名(由Monero区块链排序)被丢弃。
- K e y G e n : ( x , P j = x G ) {\rm KeyGen}: (x,P_j=xG) KeyGen:(x,Pj=xG), π \pi π是签名者的秘密index;对于 j = 1 , . . . , m , I j = x H p ( P π j ) j={1,...,m},I_j=xH_p(P_\pi^j) j=1,...,m,Ij=xHp(Pπj)
-
S
i
g
n
(
α
,
s
i
)
{\rm Sign}(\alpha,s_i)
Sign(α,si),对于
j
=
1
,
.
.
.
,
m
,
i
=
1
,
.
.
.
,
n
(
i
≠
π
)
j={1,...,m},i=1,...,n(i\neq\pi)
j=1,...,m,i=1,...,n(i=π),其中
s
i
j
s_i^j
sij是一组随机标量
对于随机标量 α j , j = 1 , . . . , m \alpha_j,j={1,...,m} αj,j=1,...,m:
类似地,依次计算 π + 2 , . . . . , π − 1 \pi+2,....,\pi-1 π+2,....,π−1的 L , R , c L,R,c L,R,c直到 c π c_\pi cπ:
最后计算每个 s π j s_\pi^j sπj:
输出签名: O ( m ( n + 1 ) ) O(m(n+1)) O(m(n+1))
- V e r i f y {\rm Verify} Verify: 重构所有 L i j , R i j L_i^j,R_i^j Lij,Rij,查验 c n + 1 = c 1 c_{n+1}=c_1 cn+1=c1.
- L i n k {\rm Link} Link: I j I_j Ij
Confidential Transactions
Greg Maxwell提出的Confidential Transactions
https://elementsproject.org/features/confidential-transactions/investigation
原理:使用加性同态承诺(Pedersen commitment),承诺的内容包含两部分:盲因子+明文值。通过谨慎选择盲因子,可验证交易的承诺之合为0。
问题:如果输入不在范围内(比如负数),也可能通过验证
解决:证明一个已提交的数量在范围内,但不透露它的其他信息。
- 签名+Pedersen:从一个基本的EC签名开始。如果构造一个签名,使“消息”是pubkey的hash,则签名证明签名者知道私钥,对于一个
P
=
x
G
+
a
H
P=xG+aH
P=xG+aH这样的"pubkey"(x是盲因子,a是被承诺明文)
- 一个pedersen承诺可以被证明是一个零承诺,对承诺的hash值签名(即将承诺视为pubkey);在签名中使用公钥是为了防止将签名设为任意值并求解承诺,用于签名的私钥只是盲因子。
- 举个栗子,想要证明 C C C是1的承诺,但不能泄露盲因子,则计算: C ′ = C − 1 H C'=C-1H C′=C−1H,并要求证明者提供用 C ′ C' C′作为公钥的签名。如果能够提供有效签名,则说明 C C C一定是1的承诺(否则攻破ECDLP)
- 环签名+Pedersen: OR proof:
C
C
C是0或1的承诺。
再举个栗子,计算 C ′ = C − 1 H C'=C-1H C′=C−1H,然后提供 对 { C , C ′ } \{C,C'\} {C,C′}的环签名(签名者要知道私钥才能签名,回忆一下pedersen承诺 P = x G + a H P=xG+aH P=xG+aH,签名者要知道 x + a ⋅ ? x+a\cdot? x+a⋅?才行)- 如果 C C C是1的承诺,签名者不知道它的离散对数;则 C ′ C' C′等于0的承诺,签名者知道它的离散对数(即盲因子)作为私钥。
- 如果 C C C是0的承诺,则已知它的离散对数(还是盲因子),但不知道 C ′ C' C′的离散对数。
- 如果是其他任何数的承诺,则没有结果会是0,签名者无法给出有效签名。
- 环签名+Pedersen:范围证明
C
∈
[
0
,
32
)
C\in[0,32)
C∈[0,32)
- 签名方发送了一组承诺对应的OR proofs:
C1 is 0 or 1 C2 is 0 or 2 C3 is 0 or 4 C4 is 0 or 8 C5 is 0 or 16. - 如果正确选择了 C 1 , . . . , C 5 C1,...,C5 C1,...,C5的盲因子,则有 C 1 + C 2 + C 3 + C 4 + C 5 = = C C1+C2+C3+C4+C5==C C1+C2+C3+C4+C5==C,证明 C ∈ [ 0 , 32 ) C\in[0,32) C∈[0,32)
- 签名方发送了一组承诺对应的OR proofs:
改进
Max15的方案验证交易的原理是:
Monero中,发送方被环签名混淆到一组可能的地址
P
i
,
i
=
1
,
.
.
.
,
n
P_i,i=1,...,n
Pi,i=1,...,n,其中只有一个是真正的交易输入,如果这个等式能被验证,则一定会知道哪个
P
i
P_i
Pi,破坏环签名的匿名性。
解决:
- 创建输入输出的承诺:
其中 y i y_i yi是掩码, z > 0 , a = b 1 + b 2 z>0, a=b_1+b_2 z>0,a=b1+b2
这里的 x c x_c xc是一个特殊的私钥“amount key”,它只对发送者和发给他们的货币的人已知,并且必须与他们通常的私钥不同 - 变成了对总和为0的承诺,私钥
z
z
z,公钥
z
G
zG
zG,而不是实际和为0.
除非知道 y 1 , y 2 y_1,y_2 y1,y2,否则 z z z是不可计算的 - 为了混淆发送方的输入,环签名包括所有的输入承诺
C
i
,
i
=
1
,
.
.
.
,
s
,
.
.
.
,
n
C_i,i=1,...,s,...,n
Ci,i=1,...,s,...,n的,加相应的公钥
P
i
,
i
=
1
,
.
.
.
,
s
,
.
.
.
,
n
P_i,i=1,...,s,...,n
Pi,i=1,...,s,...,n,并减去
∑
C
o
u
t
\sum C_{out}
∑Cout:
如果知道其中一个私钥( z + x ′ , x ′ G = P s z+x',x'G=P_s z+x′,x′G=Ps),就可以签名.
(对于输出的范围证明和可链接性,参考Max15和MLSAG)
Monero Ring CT协议的正式定义
Tag-Linkable Ring-CT with Multiple Inputs and Onetime Keys
- { ( P π 1 , C π 1 ) , . . . , ( P π m , C π m ) } \{(P_\pi^1,C_\pi^1),...,(P_\pi^m,C_\pi^m)\} {(Pπ1,Cπ1),...,(Pπm,Cπm)}是对应密钥 x j , j = 1 , . . . , m x_j,j=1,...,m xj,j=1,...,m的地址/承诺的集合
- 寻找 q + 1 q+1 q+1个集合 { ( P i 1 , C i 1 ) , . . . , ( P i m , C i m ) } , i = 1 , . . . , q + 1 \{(P_i^1,C_i^1),...,(P_i^m,C_i^m)\},i=1,...,q+1 {(Pi1,Ci1),...,(Pim,Cim)},i=1,...,q+1
- 确定一组输出地址 ( Q i , C i , o u t ) (Q_i,C_{i,out}) (Qi,Ci,out),其中 ∑ j = 1 m C π j − ∑ i C i , o u t \sum_{j=1}^{m}C_\pi^j-\sum_iC_{i,out} ∑j=1mCπj−∑iCi,out是0的承诺
- 定义:
是我们要签署的广义环,注意最后一列是上面提到的Ring-CT环 - 在R环上计算MLSAG签名。
交易费
门罗交易费必须是无掩码的即: b H bH bH而不是 x G + b H xG+bH xG+bH,所以矿工可以用标准量 b b b验证 b ⋅ H = b H b\cdot H=bH b⋅H=bH
range proof
假设给定交易的输入、输出承诺:
需要证明输出的范围在
[
0
,
2
n
]
[0,2^n]
[0,2n],解构二进制:
设
C
o
u
t
,
i
j
C_{out,i}^j
Cout,ij是
b
j
⋅
2
j
b_j\cdot 2^j
bj⋅2j的承诺:
使用密钥
b
j
b_j
bj可计算
(
C
o
u
t
,
i
j
,
C
o
u
t
,
i
j
−
2
j
H
)
(C_{out,i}^j,C_{out,i}^j-2^jH)
(Cout,ij,Cout,ij−2jH)(对所有的
j
j
j)的环签名,并将
C
o
u
t
,
i
j
C_{out,i}^j
Cout,ij提供给验证方(矿工)。
为了节省空间,可以用Borromean ring signature来组合这些简单环签名,也可以定义一种聚合环签名ASNL
聚合Schnorr非链接环签名-ASNL
Sign
设
(
x
i
j
,
P
1
j
,
P
2
j
)
(x_i^j,P_1^j,P_2^j)
(xij,P1j,P2j)是一组keys,
j
=
1
,
.
.
.
,
k
j=1,...,k
j=1,...,k,其中
x
i
j
x_i^j
xij是其中一个
P
i
j
P_i^j
Pij的secret key
对每个
j
j
j,令
i
′
:
=
i
+
1
m
o
d
2
i':=i+1~mod ~2
i′:=i+1 mod 2,设一个随机标量
α
j
\alpha_j
αj,计算:
- L i j = α j G L_i^j=\alpha_jG Lij=αjG
- c i ′ j = H s ( L i j ) , L i ′ j = s i ′ j G + c i ′ j P i ′ j c_{i'}^j=H_s(L_i^j), L_{i'}^j=s_{i'}^jG+c_{i'}^jP_{i'}^j ci′j=Hs(Lij),Li′j=si′jG+ci′jPi′j(random s i ′ j s_{i'}^j si′j)
- c i = H s ( L i ′ j ) , s i j = α j − c i j x i j m o d l c_i=H_s(L_{i'}^j),s_i^j=\alpha_j-c_i^jx_i^j~mod~l ci=Hs(Li′j),sij=αj−cijxij mod l
- return ( L 1 j , s 2 j ) (L_1^j,s_2^j) (L1j,s2j) for all j j j, s = ∑ j s 1 j s=\sum_j s_1^j s=∑js1j
V
e
r
i
f
y
(
P
1
j
,
P
2
j
,
L
1
j
,
s
2
j
,
s
)
Verify(P_1^j,P_2^j,L_1^j,s_2^j,s)
Verify(P1j,P2j,L1j,s2j,s)
for all
j
j
j,计算:
- c 2 j = H s ( L 1 j ) , L 2 j = s 2 j + c 2 j P 2 j , c 1 j = H s ( L 2 j ) c_2^j=H_s(L_1^j),L_2^j=s_2^j+c_2^jP_2^j,c_1^j=H_s(L_2^j) c2j=Hs(L1j),L2j=s2j+c2jP2j,c1j=Hs(L2j)
- 如果 ∑ j = 1 k L 1 j = s G + ∑ j ( c 1 j P 1 j ) \sum_{j=1}^kL_1^j=sG+\sum_j(c_1^j P_1^j) ∑j=1kL1j=sG+∑j(c1jP1j),验证通过。
Correctness
- i = 1 , i ′ = 2 \bm{i=1,i'=2} i=1,i′=2
- L 1 j = α j G L_1^j=\alpha_jG L1j=αjG
- c 2 j = H s ( L 1 j ) , L 2 j = s 2 j G + c 2 j P 2 j c_{2}^j=H_s(L_1^j), L_{2}^j=s_{2}^jG+c_{2}^jP_{2}^j c2j=Hs(L1j),L2j=s2jG+c2jP2j(random s 2 j s_{2}^j s2j)
- c 1 = H s ( L 2 j ) , s 1 j = α j − c 1 j x 1 j m o d l c_1=H_s(L_{2}^j),s_1^j=\alpha_j-c_1^jx_1^j~mod~l c1=Hs(L2j),s1j=αj−c1jx1j mod l
- return
(
L
1
j
,
s
2
j
)
(L_1^j,s_2^j)
(L1j,s2j) for all
j
j
j,
s
=
∑
j
s
1
j
s=\sum_j s_1^j
s=∑js1j
Verify: - c 2 j = H s ( L 1 j ) , L 2 j = s 2 j + c 2 j P 2 j , c 1 j = H s ( L 2 j ) c_2^j=H_s(L_1^j),L_2^j=s_2^j+c_2^jP_2^j,c_1^j=H_s(L_2^j) c2j=Hs(L1j),L2j=s2j+c2jP2j,c1j=Hs(L2j)
- L H S = ∑ j = 1 k L 1 j = ( ∑ j α j ) G = ∑ j ( s 1 j + c 1 j x 1 j ) G = s G + ∑ j c 1 j P 1 j = R H S LHS=\sum_{j=1}^kL_1^j=(\sum_j\alpha_j)G=\sum_j (s_1^j+c_1^jx_1^j)G=sG+\sum_j c_1^jP_1^j=RHS LHS=∑j=1kL1j=(∑jαj)G=∑j(s1j+c1jx1j)G=sG+∑jc1jP1j=RHS
- i = 2 , i ′ = 1 \bm{i=2,i'=1} i=2,i′=1
- L 2 j = α j G L_2^j=\alpha_jG L2j=αjG
- c 1 j = H s ( L 2 j ) , L 1 j = s 1 j G + c 1 j P 1 j c_{1}^j=H_s(L_2^j), L_{1}^j=s_{1}^jG+c_{1}^jP_{1}^j c1j=Hs(L2j),L1j=s1jG+c1jP1j(random s 1 j s_{1}^j s1j)
- c 2 = H s ( L 1 j ) , s 2 j = α j − c 2 j x 2 j m o d l c_2=H_s(L_{1}^j),s_2^j=\alpha_j-c_2^jx_2^j~mod~l c2=Hs(L1j),s2j=αj−c2jx2j mod l
- return
(
L
1
j
,
s
2
j
)
(L_1^j,s_2^j)
(L1j,s2j) for all
j
j
j,
s
=
∑
j
s
1
j
s=\sum_j s_1^j
s=∑js1j
Verify: - c 2 j = H s ( L 1 j ) , L 2 j = s 2 j + c 2 j P 2 j , c 1 j = H s ( L 2 j ) c_2^j=H_s(L_1^j),L_2^j=s_2^j+c_2^jP_2^j,c_1^j=H_s(L_2^j) c2j=Hs(L1j),L2j=s2j+c2jP2j,c1j=Hs(L2j)
-
L
H
S
=
∑
j
=
1
k
L
1
j
=
∑
j
(
s
1
j
G
+
c
1
j
P
1
j
)
=
s
G
+
∑
j
c
1
j
P
1
j
=
R
H
S
LHS=\sum_{j=1}^kL_1^j=\sum_j(s_{1}^jG+c_{1}^jP_{1}^j)=sG+\sum_j c_1^jP_1^j=RHS
LHS=∑j=1kL1j=∑j(s1jG+c1jP1j)=sG+∑jc1jP1j=RHS
①使用的是加密hash函数
②可证明签名方已知的私钥是对应于( x i j x_i^j xij) P 1 j , P 2 j P_1^j,P_2^j P1j,P2j二者之一的。用二进制把金额分成k个数,则对应k个环签名。
③用ASNL可将k个环签名聚合为k组 ( L 1 j , s 2 j ) (L_1^j,s_2^j) (L1j,s2j)和一个 s s s,规模( 2 k + 1 2k+1 2k+1)