作り方
位数が素数 $p$ の有限巡回群上に、ジェネレーター $G$ と $H$ を準備する。
位数が素数なので、群論のラグランジュの定理から $G$ と $H$ の位数は $p$ になり、$G$ 上の元は必ず $H$ 上にも存在して、$G^x=H$ や $H^y=G$ となる $x,y$ が存在するが、これがわからない形で、$G$ と $H$ を準備する。
その上で、Pedersen Commitment $C$ は、
$$C(a, b) = G^a \cdot H^b$$
使い方
ジェネレーター $G$ 上の $\cdot$ の演算は、準同型性があって、$G^x + G^y = G^{x+y}$ が成り立つので、
コミットメント同士を足した結果と、コミットメントへの入力を足してものの、コミットメントをを作った結果が一致する。
この性質を利用して、何かをする。
$$C(a,b) + C(c,d) = G^a \cdot H^b \cdot G^c \cdot H^d = G^a \cdot G^c \cdot H^b \cdot H^d = G^{a+c} \cdot H^{b+d} = C(a+c, b+d)$$
Liquid の Confidential Transaction での使用例
Perdersen Commitment を利用して、トランザクションの具体的な数量を明かさずに、tx-in の合計と、tx-out の合計が一致していることを示す。
例えば、こんなトランザクションがあったとする。
tx-in | tx-out |
---|---|
5 | 10 |
10 | 32 |
17 |
この tx-in/out それぞれについて、blinding factor を割り当てる。その際に、blinding factor の tx-in 側の合計と、tx-out 側の合計が同じになるようにする。例えば、
tx-in | tx-in-blinding-factor | tx-out | tx-out-blinding-factor |
---|---|---|---|
5 | 100 | 10 | 500 |
10 | 250 | 32 | 30 |
17 | 180 |
tx-in/out = a, blind factor = b を、$C(a,b)$ で置き換えて、トランザクションを公開する。
tx-in | tx-out |
---|---|
C(5, 100) | C(10, 500) |
C(10, 250) | C(32, 30) |
C(17, 180) |
こうすると、
$$
C(5, 100) + C(10, 250) + C(17, 180) - C(10, 500) - C(32, 30)
= G^{5+10+17-10-32} \cdot H^{100+250+180-500-30}
= G^0 \cdot H^0
= e \cdot e
= e
$$
となるので、具体的な数量を明かしていなくても、tx-in の合計と、tx-out の合計が一致していることがわかる。
参考サイト
https://link.springer.com/content/pdf/10.1007%2F3-540-46766-1_9.pdf
http://hooktail.sub.jp/algebra/LagrangeanTheorem/
https://techmedia-think.hatenablog.com/entry/2015/12/31/002253
https://www.blockchainengineer.tokyo/entry/confidential-transactions
https://elementsproject.org/features/confidential-transactions/investigation