Develop with pleasure!

福岡でCloudとかBlockchainとか。

Scriptless Scriptで実現するAtomic Swap

Atomic Swapといえば同じハッシュ関数とタイムロックの仕組みを持つブロックチェーンであれば、それぞれのチェーンの通貨をトラストレスに交換することができるプロトコルで、最近だとBitcoinやLitecoin、BitcoinとEthereumでAtomic Swapの事例が出てきている。

ハッシュのプリイメージとタイムロックの仕組みを使ったこのプロトコルの詳細は↓

techmedia-think.hatenablog.com

このプロトコルでは、各チェーンで以下のようなスクリプトにコインをロックしている。

IF
  2 <アリスの公開鍵> <ボブの公開鍵> 2 CHECKMULTISIGVERIFY
ELSE
  HASH160 <H(x)> EQUAL <ボブの公開鍵> CHECKSIGVERIFY
ENDIF

↑はBitconのスクリプト言語だが、Ethereumでは同様の機能を持つContractを実装することになる。

ハッシュのプリイメージとタイムロックを使うこのプロトコルには、2つのチェーンにおいて同じプリイメージ及びそのハッシュを使用しているのでチェーン間のトランザクションがリンクできるというプライバシーの課題がある。MASTが利用可能になれば取引の当事者が協調することでこの課題を解消する方法もあるが、こういったハッシュのプリイメージを使用するスクリプトを使わずに暗号技術を使ってAtomic Swapを実現するScriptless Scriptというアプローチがある。

スクリプト無しでどうやってAtomic Swapを行うかは、Scaling Bitcoin 2017でもScriptless Scriptsについて話をしたBlockstreamのAndrew Poelstraが、以下のドキュメントに書いている。

github.com

内容についてざっと見てみる。

Schnorr署名とAdaptor Signature

楕円曲線のジェネレータをGとし、Hをビット文字列の空間から(Gの位数を法とする整数である)スカラーグループにマッピングするハッシュ関数としたとき、公開鍵Pを有するメッセージmのSchnorr署名は以下の式を満たす(s, R)のペアになる。

sG = R + H(P || R || m)P

これに関連するAdaptor Signatureは以下の式を満たす(s', R, T)として定義される。

s'G = T + R + H(P || R || m)P

Schnorr署名(s, R)とAdaptor Signature(s', R, T)から(それぞれRが同じであることに注意)、Tの離散対数をs' - sで計算することができる。上記の式を減算すると(s' - s)G = Tになるため。

同様に、Adaptor Signature(s', R, T)T = tGとなるtが与えられると、s = s' - tでSchnorr署名(s, R)を計算することができる。

公開鍵Pを有するAdaptor Signature(s', R, T)が与えられると、同じP及びRを有するSchnorr署名の知識はTの離散対数の知識と等しいと結論付けることができる。

このAdaptor SignatureがAtomic Swapのハッシュのプリイメージの代わりに使われる。

Schnorr署名のマルチシグ

Schnorr署名には複数の署名を集約することができる特性がある。公開鍵PQを持つ2人の当事者が対話的にPQのマルチシグを作成することが可能だ。署名のコンポーネント(s, R)は、両当事者の提出した署名鍵の合計になる。まず最初に両当事者は署名で使用するRの値について同意し、続くステップで各当事者がそれぞれの署名鍵を提供しsを作る。

スクリプトレスなAtomic Swapのプロトコル

スクリプトレスなAtomic Swapは↑のSchnorr署名のマルチシグとAdopter Signatureを組み合わせたプロトコルになる。

アリスはAチェーンに、ボブはBチェーンにコインをそれぞれ持っており、それぞれのチェーンのコインをアトミックに交換したい場合、以下の手順でAtomic Swapを行う。

f:id:techmedia-think:20171111133601p:plain

  1. まずアリスとボブはそれぞれコインを持っているチェーンで、使用するには両者の署名が必要なマルチシグのアウトプットにコインを入れる。またこの時、最終的にコインを償還する際の署名に使用するRの値についてお互いに合意する。
  2. 続いてアリスはランダムな値tを生成し、T = tGを算出する。続いてマルチシグの署名値のsを作成するためのアリスの署名鍵を渡す代わりにAdaptor Signature(s', R, T)を生成して、ボブに送る。(T + R + H(P || R || m)PPの部分はマルチシグなので、おそらくアリスの公開鍵とボブの公開鍵を結合したものになる)
  3. ボブは受け取ったAdaptor Signatureを検証し問題なければ(各チェーンのAdaptor Signatureで同じTが使われている=離散対数が同じことをを確認する)、マルチシグの署名データsに必要な自分の署名鍵を明らかにする。
  4. アリスはボブから受け取った署名鍵と自分の署名鍵を組み合わせてsを導出し、マルチシグの署名(s, R)を完成させる。それをパブリッシュしてコインを入手する。
  5. ボブは手順2でアリスから受け取ったAdaptor Signatureと手順4でアリスが公開した署名からシークレットtを計算する(Schnorr署名とAdaptor SignatureからTの離散対数tを計算できる)。算出したtを使ってアリスの署名鍵を計算する。
  6. ボブは計算したアリスの署名鍵に自分の署名鍵を加えて署名を完成させ、その署名でコインを入手する。

※ 手順2でアリスからAdaptor Signatureが送られてこなかったり、2つのAdaptor SignatureのTが違っていたり、手順4でアリスがトランザクションをブロードキャストしない場合、予めlocktimeを設けていた払い戻し用のトランザクションをブロードキャストして自分のコインを取り戻す。

という手順でSchnorr署名のマルチシグとAdaptor Signatureを利用することで、スクリプトを書くことなくクロスチェーンのAtomic Swapを行うことができる。

この時ブロックチェーンに記載されるのはSchnorr署名のデータのみであるため、アリスとボブの間でAtomic Swapが行われたことを他のユーザーが検知することはできず、プライバシーに優れている。

↑のプロトコルはAtomic Swapを行う各チェーンで同じ楕円曲線を使用する前提になっているが、Scaling Bitcoin 2017でのAndrew Poelstraのセッションでは今後異なる楕円曲線間(Bitcoinのsecp256k1とMoneroのed25519など)のスワップのサポートを追加していくとのこと。

Andrew Poelstraの記事を読むことで、Scriptless Scriptの仕組みがふんわりと分かった気がする。Schnorr署名は単純に署名を集約してサイズ削減するだけでなく、こういった暗号学的なトリックに使うことができるのは面白い。バックボーンの原理についてはよく分かってないので勉強しないとなー。