ビットコインで不正な取引が行われないようにするためにデジタル署名は必須の技術です。このデジタル署名にはさまざまな方式がありますが、現在ビットコインではECDSAという署名方式が使われています。
しかし、現在このECDSAに代えてシュノア署名(Schnorr Signature)という署名方式に変更しようと開発が進められています。
そこで当記事ではシュノア署名の概要や得られるメリットについて解説していきます。
ビットコインにおける署名の必要性
ビットコインなどの仮想通貨ではデジタル署名がとても重要な働きをしています。「署名」とは、ある行為をする際に自分自身が実際に行なった行為であると証明するものです。つまり、署名された行為はその署名者がその行為を行っていると証明することができます。
ビットコインにおいては、トランザクションへの署名が行われます。トランザクションとは、あるユーザーからあるユーザーへビットコインが送金されたことを表す取引データです。このトランザクションに署名がされることで、その取引という行為はその署名者自身によって行われたと第三者に証明することができるのです。
例えば、アリスがボブに1BTCを送るトランザクションについて考えてみましょう。アリスはこのトランザクションにアリス自身の署名をすることで、アリス→ボブ:1BTCというトランザクションが正当なものであると証明することができます。
つまり、アリスの意思でボブに1BTCが送金されたことを表すことができ、正当なトランザクションとして扱われます。そして、このトランザクションはmemプールに送られ、ブロックに追加され、承認されるというプロセスを経て改ざんされることのないブロックチェーンに追加されるのです。
ただし、ここで注意しなければならないことがあります。アリスによって署名されたトランザクションはどうやって本当にアリスが署名したと証明できるのでしょうか。
例えば、アリスがトランザクションに署名してトランザクションが「Alice ga Shomei」という文字列になったとします。この「Alice ga Shomei」文字列をアリスが作ったということをどうすれば他の人に証明することが可能でしょうか。攻撃者のイブがアリスになりすまして、トランザクションに対して署名し「Alice ga Shomei」にすることもできてしまいます。
ビットコインではこのような署名者自身を証明するために以下のようなプロセスを行なっています。
アリスは自分だけが知っている秘密鍵を使ってトランザクションに署名をすることができます。しかし、このままビットコインネットワークに伝えたとしても、アリスが秘密鍵自体をネットワークにブロードキャストしない限り、その署名がアリスのものであると証明することはできません。(秘密鍵をブロードキャストしたらそのアドレスに紐付けられているビットコインが盗まれてしまいます)
なので、アリスは秘密鍵をブロードキャストするのではなく、公開鍵という「ブロードキャスト専用の鍵」をネットワークに伝えます。『秘密鍵から公開鍵そしてアドレスが生成されるまでの流れ【仮想通貨】』で書いているように、秘密鍵から公開鍵は簡単に作ることができます。しかし、逆に公開鍵から秘密鍵を作ることはできません。
なので、アリスは公開鍵をブロードキャストしても秘密鍵が他人に知られることはありません。
そして、アリスは秘密鍵によって署名したトランザクションとともに、その秘密鍵から作られた公開鍵もネットワークにブロードキャストします。そして、ネットワークの参加者は、この公開鍵を使って署名したトランザクションを署名前のトランザクションとして見ることが可能です。
この署名前のトランザクションがアリスのトランザクションと一致するということは、アリスだけが持っているはずの秘密鍵によって署名されたことの証明になります。このようなプロセスによって、トランザクションの署名が確実に行為者アリスによるものだと断定することができるのです。
以上のようにビットコインでは不正な取引が行われないようにデジタル署名という技術を使っているのです。
また、このデジタル署名にもさまざまな種類がありビットコインでは、ECDSA(楕円曲線DSA)という安全かつデータサイズの小さい署名方式が使用されています。このECDSAに代わってビットコインで使われようとしているのがシュノア署名という署名方式です。
参考:ECDSAによる署名生成と検証の仕組みを分かりやすく解説
シュノア署名とは
デジタル署名にはRSAやDSAなどさまざまな方法がありますが、ECDSAはビットコインによく適しています。なぜなら、RSAなどと比べて署名のデータサイズを小さくできるからです。ビットコインはスケーラビリティ問題に悩まされれているように、ブロックチェーンに記録されるデータはできるだけ小さくしておくことが望ましいです。なので、署名データのサイズを小さくできるECDSAがビットコインでは使われています。
しかし、ビットコインではECDSAに代わって新しいシュノア署名という方式に変更しようとしているのです。シュノア署名の優れている点は、複数人の署名を必要とするマルチシグによる送金のデータサイズを大幅に削減できることがあげられます。(詳しいシュノア署名のメリットについては後述します)
特に、ビットコインではトランザクション量が急激に増えて、送金時間が遅くなったり、送金手数料が増えてしまったりするスケーラビリティ問題に深刻化しているので、シュノア署名により署名のデータサイズを減らせることはとても大きなメリットになります。
しかし、なぜ今になってECDSAからシュノア署名に変更しようとしているのでしょうか。シュノア署名自体はC.P.Schnorr 氏によって1989年頃に発明されています。2008年まで特許で保護されていたとしても、今よりもっと前に実装するタイミングはあったはずです。
シュノア署名が長らくビットコインに使われなかった理由は、ビットコインのブロックチェーンで署名データが保存される仕様が原因です。ビットコインにおいて署名データは、それぞれのトランザクションのインプットにあるscriptSigに保存されていました。
このようにそれぞれのトランザクションごとに署名データが分かれて保存されてる状態だと署名方式を変更するにはハードフォークが必要になります。ハードフォークはコミュニティ分裂などのリスクが高くできるだけ避けなければならないのです。
しかし、2017年8月にビットコインに新たなプロトコルが実装されました。それがSegwitです。Segwitはトランザクション展性問題とスケーラビリティ問題を解決するためにソフトフォークによってアクティベートされました。このSegwitは、トランザクション内で大きなデータ量を占めている署名データを、witnessと呼ばれる他の領域に移動させて保存するという仕組みです。
(Segwitの詳しい解説についてはこちらで書いています。ビットコインにおけるSegwitとは結局何なのか。メリットとデメリットを解説)
そして、witnessにおけるルール変更はソフトフォークで行うことができます。ソフトフォークはハードフォークよりもリスクが低いのでマイナーの十分な同意があれば実施することが可能です。
このようにSegwitにより、witnessに移された署名データをソフトフォークでシュノア署名に変更することができるのでSegwitがアクティベートされた現在シュノア署名の実装が進められているのです。
ただし、Segwitはにソフトフォークで行われ、かつその実装が複雑なので対応しているウォレットや取引所が少ないことが現状です。(ソフトフォークではブロック生成以外、旧ルールを引き続き使うことができます)つまり、Segwitが普及をしないとシュノア署名も使うことができないのです。
シュノア署名のメリット
複数の署名データをひとつの署名データにまとめることができるのがシュノア署名です。なので、複数の送金者がいる場合はシュノア署名を使うこと署名データのサイズを減らすことができ、取引手数料を低くすることが可能です。
また、シュノア署名を使うことでブロックチェーンのスケーラビリティ問題の解決に大きく貢献することになります。このようなシュノア署名を実装することで得られるメリットについて見ていきましょう。
署名データのサイズ削減
従来のECDSAでは、1人の送り手と1人の受け手がいるトランザクションごとに署名が必要でした。しかし、シュノア署名では、複数人の送り手から1人の受け手に送金されるような場合、複数のトランザクションがあったとしても1つの署名で済ますことができるのです。要するに、複数のトランザクションインプットはまとめられた1つのシュノア署名データを含めるだけでいいのです。
送り手A、B、C、Dが受け手Eに送金するような状況を考えましょう。ECDSAによる署名方式の場合は、4つの署名データが必要でした。一方、シュノア署名による署名方式であれば1つの署名データにまとめることができます。
ビットコインコアの開発者であるEric Lombrozo氏はシュノア署名により40%以上のブロックデータを削減できると考えています。
マルチシグ
シュノア署名はマルチシグネチャを使った送金において最も大きな恩恵を得ることができます。マルチシグでは、P2WPKH(P2SH)というトランザクションスクリプトを使うことで、複数の送り手が送金する取引を1つのトランザクションとして扱うことができます。
例えば、2-of-3マルチシグの場合はブロードキャストされている3つの公開鍵に対して2つ以上の署名で実行することができます。この場合、2つの署名データを含めることになるのでその分マルチシグのトランザクションはデータサイズが大きくなり、取引手数料も高くなってしまいます。
このようなマルチシグによる送金に対しても、シュノア署名で署名データを1つにまとめることができるのです。
例えば、将来複雑なスマートコントラクトにより100人の署名データが必要になる100-0f-100マルチシグに対してもシュノア署名であれば1つの署名データにまとめることが可能になるのです。シュノア署名がもたらす最も大きなインパクトはこの点になります。
CoinJoinによるプライバシー強化
CoinJoinとは取引において送り手と受け手のアドレスを第三者に見られないようにする技術です。同時期に作られた複数のトランザクションをランダムにまとめた後に、個々の受け手に対して送金されるので、誰が誰に対してお金を送ったのか分からなくなるのです。
このCoinJoin自体は新しい技術ではないですが、同時期のトランザクションをまとめる必要があるため利用者が少ないと、匿名化をすることができないことからあまり一般的には使われていません。
しかし、このトランザクションの匿名性を高めるCoinJoinとシュノア署名を組み合わせて使うと、複数のトランザクションをまとめるだけでなく、それらの署名データもまとめてひとつにすることができるのです。すると、署名データのサイズが実質的に小さくなることになり取引手数料が小さくなることになります。
つまり、プライバシーの強化だけでなくトランザクションデータサイズも減らすことが可能になりCoinJoinを使うことの大きなインセンティブになるのです。CoinJoinの利用者が増えれば匿名性も増すので好循環になります。