Schnorr署名のDLCへの適用

DLCのOracle

DLCのOracleは、他のスマートコントラクトと比較して、プライバシーへの配慮に特徴を持っている。
下記はMIT DCIが出した論文からの引用である。

Discreet Log Contractsは、スケーラビリティとプライバシーの問題に対処し、外部データを提供するオラクルへの信頼を最小限に抑えるシステムを提案している。またこのコントラクトは外部のオブザーバーがトランザクションログからコントラクトの存在を検出できないように設計されている。

通常の2 of 3マルチシグと違い、contractの存在がOracleに当たる人から秘匿化され、ブロックチェーンに登録されるデータにもその形跡は残らない。

DLC(discreet log contract)では、Schnorr署名を応用することによって、上記を実現して(しようとして)いる。

なぜ普通の電子署名ではなくて、Schnorr署名なのか。
オフチェーンとして構成されているのだから、外部からこのcontractを秘匿化できるのはわかるが、いかにしてOracleに対してcontract内容を秘匿化しているのか。

よくわからなったので、まとめてみた。DLCの特徴を理解するのに重要なトピックだけど、知らないといけないことが多くて大変だ。

電子署名

電子署名とはなんだろうか。「署名」とつくからには本人であることや責任を明らかにするために(書類・書簡などに)自分が氏名を記すことだが、電子上ではこれが難しい。コピーペーストができるからだ。
電子上でこれを実現するためには、別の方法で証明を実施する必要がある。

暗号化

そのためのアプローチは、署名文章の暗号化である。
もっとも簡単なのは、二人で、暗号を解くための秘密鍵を事前に共有しておくことだ。そうすれば、「この秘密を知っているということは、あなた」と言うことができる。

だが、コンピュータ上で初めて出会う二人が、事前に共有化された秘密を編み出すことは非常に難しい。これを実現する非常に巧妙なアルゴリズムが公開鍵暗号方式である。

一方向性関数を利用する。 これは、簡単に計算できるが逆関数の計算は非常に困難である関数を指す。

例えば、xのy乗=z mod pのとき (x,y,p)からzを求めるのは容易だが、(x,z,p)からyを求めるのは困難である。

絵の具の比喩がわかりやすい。混ぜて色を作るのは簡単だが、出来上がっている調合色からもとの色を算定するのは極めて難しい。

この性質を使って、二者間で、二者間で、秘密の数を公開することなく、鍵を共有することができる。

Bitcoinにおける電子署名

ビットコインにおいては、楕円曲線暗号を使用する。これは、RSA暗号に比較し、処理速度が早いことが理由である。 これが採用できる重要な理由は、一方向性関数であることだ。

その性質に違いはない。公開鍵で暗号化したメッセージは、それに対応した秘密鍵でしか複合できない。
逆に、秘密鍵で暗号化したメッセージは、それに対応した公開鍵でしか復元できない。この方式をECDSA署名と呼ぶ。

この場合、公開鍵は受け取りに、秘密鍵はbitcoinのトランザクション生成への署名に利用される。

異なるのは、下記の仕組みだ。

  1. 秘密鍵は、ランダムに生成される
  2. 公開鍵は、秘密鍵から、楕円曲線アルゴリズムによって生成される。
  3. さらに、この公開鍵から不可逆ハッシュ関数を用いて、bitcoinアドレスが生成される。

Schnorr署名

Schnorr署名は、Bitcoinで使われるECDSA署名と同様に、電子署名の方式の一つである。

ここでは、直感的記載に留めるが、これを理解することにより、DLCではなぜSchnorr署名が使われるのか、どのように応用しているのか、を理解することができる。基本的には、この資料を参考にしている。

まず、式を示す。

y,eは計算すべき電子署名データ、mは署名対象のメッセージ、gは任意の整数、Pは公開鍵、H(x;y) は一方向性関数(hash)の計算を示す。

変数 e が式の両辺に現れており、関数に対する入力が出力にも依存するような「自己言及型」の式となっている。hash計算の出力結果と入力を一致させることはほぼ不可能である。

ところが、秘密鍵sを知っていると、公開鍵Pは秘密鍵s * Gと表すことが可能になり、その値を計算することが不可能ではなくなる。

このような変形が成り立つと、y と e の値の配分のみを変えることで e の値を自由に調整し、値を探すことができる。このような処理を、トラップドア(trapdoor; 落とし戸)関数と言う。

つまり、この方程式を解くことができる、= 秘密鍵を知っていて式を変形できている = 署名者、ということになるわけだ。

楕円曲線暗号の組み合わせ

Bitcoinの公開鍵の生成プロセスにおいてもそうだが、楕円曲線暗号を利用してSchnorr署名を書き換えている。DLCにおいても、これを使っている。楕円曲線暗号を使った場合、計算アルゴリズムは複雑になるが、より短い(サイズの小さい)公開鍵や電子署名で十分になり、ディスク容量や通信量を削減でき、セキュリティ強度も上がる。

では、楕円曲線暗号とはなんなのか。
よく利用されるRSAが巨大な数の素因数分解の困難さを原理としたものであるのに対して、楕円曲線暗号は、楕円曲線上の離散対数問題の困難さを原理とする。

暗号の交換方法自体は、ほとんど変わらない。計算内容が変わるだけだ。 整数の掛け算をつかったオリジナルのSchnorr署名では、

楕円曲線においては、

となる。

Fixed-R Schnorr signature

DLCでは、通常のSchnorr署名ではなく、Schnorr署名を別の考え方で使っている。実証されていない応用であり、問題がある可能性もある。(ぜひ暗号技術に詳しい人は検証してほしい)

作成者のTadgeは、このSchnorr署名をFixed-R Schnorr signatureと呼んでいる。 ここで呼ぶRとは、楕円曲線のベースポイントGに乱数rを掛け合わせたものをさす。 これを公開することにより、Oracleの確認なく、Oracleが値を公表した段階で二者間で署名を実施することが可能になる。秘密鍵sを知らなくても、Rがあれば公開鍵(s*G)を算出可能なためだ。

sG = R - h(m,R)A

ただし、Rを公開しているため、この乱数rは、都度新しく払い出す必要がある。詳しい計算式は省略するが、二回の署名から、秘密鍵を算出可能となってしまうためだ。これは、プレイステーション3の秘密鍵がハッキングされた際に利用された手法でもある。

まとめると、外部にdiscreetされるに留まらず、この特殊な署名方式によって、Oracleに対しても、contractの存在を秘匿化したまま契約を執行することができる。 Schnorr署名の公開情報が増えているため、これに伴うセキュリティの脆弱性はまだ検証レベルであると言える。