ブロックチェーン企業で働くエンジニアのブログ

ブロックチェーン領域のエンジニアとして働いています

MoneroのRingCTにおける金額の秘匿方法

MoneroのRingCTにおけるMLSAG,その元になったLWWのLSAGについて前回、前々回で解説してきました。

www.blockchainengineer.tokyo

www.blockchainengineer.tokyo

今回は、RingCTにおける金額の秘匿方法について記載します。

Ring Confidential Transactions の「3. Background on Confidential Transactions」,「4. Ring CT For Monero Protocol」が今回の書く範囲になります。

Confidential Transaction

Confidential Transactionsについては、過去に解説しました。BlockstreamのCTOであるGregory Maxwellによって生み出された、Pedersen Commitmentを用いた金額の秘匿方法です。

www.blockchainengineer.tokyo

Commitment cは以下のように定義されます。xは秘匿のためのマスク値、aは金額、Gはベースポイント、HはGを元にした数値です。

 c(a,x) = xG + aH

( HからGを計算できる確率は無視できるものとします)

\displaystyle{ \sum _ {i} C _ {in}  - \sum _ j C _ {out}  = 0 }

ネットワークではこの式が成立することを確認します。

Confidential Transactionの導入に当たっての障害

CryptoNoteのワンタイムリング署名に、Confidential Transactionをそのまま導入するためには障害があります。

\displaystyle{ \sum _ {i} C _ {in}  - \sum _ j C _ {out}  = 0 }

この式の成立を確認するということは、アウトプットと同一のcommitmentを持つ送信者を確認できるということで、CryptoNoteのワンタイムリング署名で保護される送信者の匿名性を除去してしまい、Moneroにとっては望ましくありません。

従って、

\displaystyle{ \sum _ {i} C _ {in}  - \sum _ j C _ {out}  = zG }

を成立するように変更します。ここで、zは z > 0 を満たすマスク値です。

このようなx,aを考える時、 例えばインプットが1,アウトプットが2個の以下のようなパターンを考えると、


\begin{aligned}
C _ {in} = x _ {c} G + aH \\
C _ {out1} = y _ {1} G + b _ 1H \\
C _ {out2} = y _ {2} G + b _ 2H \\
\end{aligned}

 x _ c , aは以下のようになります。


\begin{aligned}
x _ c - y _ 1 + y _ 2 =  z
a = b _ 1 + b _ 2
\end{aligned}

よって、input - output は

 C _ {in} - C _ {out1} - C _ {out2} = x _ {c} G + aH  - (y _ {1} G + b _ 1H) - (y _ {2} G + b _ 2H) = zG

となります。これによって、アウトプットのcommitmentから入力値を探すことはできなくなります。

ここで、zGは公開鍵、zは署名鍵の意味合いになることに注意してください。zで署名できるのは送信者のみです。送信者は分からないようにしたいため、リング署名にします。

デコイを含む公開鍵とそれぞれのcommitmentについて、commitmentの差分を合わせてMLSAG署名を作ります。

LWWのLSAGが、各メンバーが1個の鍵だったものの、MLSAGで見ていた内容は、各メンバーがm個の鍵を用いてリング署名をする形でした。

f:id:naomasabit:20210101184223p:plain

ここで、各メンバーiのコミットメントについて、インプットとアウトプットの差分であるz_iGを用いる場合、以下のようになります。

f:id:naomasabit:20210104191720p:plain

この図を見てもらうとわかる通り、公開鍵に加えて、コミットメントの分だけ、署名のベクトルが増えることになります。そのため、LWWのLSAGよりも、複数の鍵でのリング署名を作れる処理できるMLSAGの方が適した署名方式になります。

MLSAGとConfidential Transactionを組み合わせたRingCTの定義

さて、実際のRingCTトランザクションの定義を見ていきます。

  •  \{( P _ π ^ 1, C _ π ^ 1), ... , ( P _ π ^ m, C _ π ^ m)\} を、アドレス・コミットメントの組とします。 P _ i , C _ i は離散対数仮定を満たすものとします。
  • 送信先のアドレスとコミットメントの組を (Q _ i, C _ i,out)とします。
  •  R = \{\{( P _ π ^ 1, C _ π ^ 1), ... , ( P _ π ^ m, C _ π ^ m), (\displaystyle{ \sum _ {j=1} C _ 1 ^ j  - \sum _ i C _ i})\}, ... ,\{( P _ {π-1} ^ m, C _ {π-1} ^ m), (\displaystyle{ \sum _ {j=1} C _ 1 ^ j  - \sum _ i C _ i})\}\}  とリングをおきます。\displaystyle{ \sum _ {j=1} C _ {π-1} ^ j  - \sum _ i C _ i}zGであるため、性質としては公開鍵と同等です。
  •  (Q _ i, C _ i,out)ハッシュ値mに対して、MLSAG署名を作成します。
  • それぞれの C _ i,outに対して、Range Proofで検証し、数値がオーバーフローを起こさないことを確認します。

これで、MoneroにConfidential Transactionを導入することができました。送金者、着金者に加えて、金額も秘匿されることになります。

参考

こちらの記事も大変参考にさせていただきました。

techmedia-think.hatenablog.com

関連記事

www.blockchainengineer.tokyo

www.blockchainengineer.tokyo

www.blockchainengineer.tokyo

www.blockchainengineer.tokyo

www.blockchainengineer.tokyo