Pedersen 承诺

初始化:椭圆曲线生成元为 $G,H, \space H=\alpha \cdot G$,其中 $\alpha$ 保密

承诺:Token 数量为 $m$ 和随机数 $r$,计算 $P=m\cdot G + r \cdot H$,发送 $P$

响应:保密发送 $m, r$

验证:$P==m\cdot G + r\cdot H$

门罗币环签名

初始化:椭圆曲线群为 G,生成元为 $G$,阶为 $n$。椭圆曲线点的横坐标和纵坐标的取值空间为 $F_q$,即基域为 $F_q$。哈希函数 $H_s: \left\{0,1\right\}^* \rightarrow F_q$,$H_p:$ G $\rightarrow$ G

密钥生成:私钥 $x \in [1,n-1]$,计算公钥 $P=x \cdot g$。为了避免别人伪造签名以实现双花,计算唯一标识 $I=x \cdot H_p(P)$

签名:使用 n 个 UTXO,假如 n = 3。其中第 1、3 个 UTXO 是其它用户的,用户可花费的 UTXO 是第 2 个。每个 UTXO 对应的分别公钥为 $P_1, P_2, P_3$

这 3 个 UTXO 记为消息 $m$

计算承诺

  1. 选择随机数 $q_1, w_1$,计算 2 个 Pedersen 承诺 $L_1=q_1G+w_1P_1, \space R_1=q_1H_P(P_1)+w_1I$
  2. 选择随机数 $q_2$,计算 2 个 Sigma 承诺 $L_2=q_2G, \space R_2=q_2H_P(P_2)$
  3. 选择随机数 $q_3, w_3$,计算 2 个 Pedersen 承诺 $L_3=q_3G+w_3P_3, \space R_3=q_3H_P(P_3)+w_3I$

计算挑战 $c = H_s(m, L_1,L_2,L_3,R_1,R_2,R_3)$

计算响应

  1. 第 3 步的 Pedersen 打开承诺 $q_3, w_3$
  2. 第 1 步的 Pedersen 打开承诺 $q_1, w_1$
  3. 第 2 步的 Sigma 响应 $\hat{w_2}=c-(w_1+w_3), \space \hat{q_2}=q_2-\hat{w_2}x$

环签名为 $\sigma=\left\{I,w_1,w_2,\hat{w_2},q_1,\hat{q_2},q_3\right\}$,n 越大,签名越长

验证:验证方基于环签名 $\sigma$

  1. 重新计算 Pedersen 承诺 $L_1=q_1G+w_1P_1, \space R_1=q_1H_P(P_1)+w_1I$
  2. 重新计算 Pedersen 承诺 $\hat{L_2}=\hat{q_2}G+\hat{w_2}P_2, \space \hat{R_2}=\hat{q_2}H_P(P_2)+\hat{w_2}I$
  3. 重新计算 Pedersen 承诺 $L_3=q_3G+w_3P_3, \space R_3=q_3H_P(P_3)+w_3I$

计算承诺的形式一样,没有泄露用户信息。

推导:

$$ \begin{align} &\hat{L_2}=\hat{q_2}G+\hat{w_2}P_2=(q_2-\hat{w_2}x)G+\hat{w_2}P_2=q_2G=L_2 \\ &\hat{R_2}=\hat{q_2}H_P(P_2)+\hat{w_2}I=(q_2-\hat{w_2}x)H_P(P_2)+\hat{w_2}I=q_2H_P(P_2)=R_2 \end{align} $$

链接:如果私钥 $x$ 使用 2 次,则唯一标识 $I=xH_P(P_2)$ 出现 2 次,则双重花费

每次支付仅使用一个 UTXO,如果想批量使用 UTXO,应使用门限环签名。

参考

密码学基础系列3(上):RSA非对称密码与环签名