Develop with pleasure!

福岡でCloudとかBlockchainとか。

BlockchainとSidechain間のtwo way pegについて

BlockchainとSidechain間の連携というと、CounterpartyのようにBlockchain上のBitcoinを誰も入手不可能なアドレスに送るProof of Burnにより消失させ、サイドチェーン側に持ってくる one way pegであれば現状のBitcoinのBlockchainでも実現可能。ただこの方法ではSidechainに移った後、もとのBitcoinのBlockchainに戻ってくることはできない一方向の連携になる。
一方 、SidechainからBitcoinのBlockchainに資産を戻すことを可能にするのが two way peg。two way pegの場合、Bitcoin側の実装に変更を加えないと実現できないのでは?と思ってたけど、Liquidではtwo way pegを実現しているようだったので、どのように実現してるのか気になって調べてみた。ベースになってるのはBlockstreamの↓のホワイトペーパー。

https://blockstream.com/sidechains.pdf

ホワイトペーパーに記載されているtwo way pegの方法は↓2種類。

Symmetric two-way peg

SPV pegを使ったアプローチで、親チェーンのコインをSidechainに転送するため、親チェーンのコインを親チェーン上の特殊なOutputに送り、それをアンロックできるのはSidechain上のSPV証明のみ。
2つのチェーンを同期させるには、以下の2つの待機期間を定義する必要がある。

  1. confirmation period
    confirmation periodはコインがSidechainへ転送されるまでの間、親チェーン上でコインをロックしておく必要がある時間。このconfirmation periodを設定するのは、対象となるコインのUTXOのConfirminationが進む時間を確保するため。
    confirmation periodとして設定する典型的な期間は1日か2日になる。
    親チェーン上で特殊なOutputを作成したら、ユーザはconfirmation periodに設定された時間待った後、このOutputを参照するトランザクションSidechain上に作成し、親チェーン上で充分Confirmationが進んだことを証明するSPV証明を提供する。
    confirmation periodはSidechainのセキュリティパラメータで、セキュリティとチェーン間の転送時間はトレードオフになる。
  2. contest period
    Sidechain上にトランザクションが作成されると、続いてユーザはcontest periodを待つ必要がある。contest periodは転送されたコインがSidechain側で消費されてないことを確認するための時間。contest periodを設定するのは、以前にロックされたコインを転送することによる二重使用を防ぐため。contest periodとして設定する典型的な期間は1日か2日になる。
    ユーザがこれらの遅延を回避する方法としてAtomic swapsを利用するという方法もある。

親チェーンでロックされている間、コインはSidechain内では自由に転送することができる。ただ、親チェーンのコインであるというアイデンティティは保持しており、送られてきた親チェーンにしか戻すことはできない。
Sidechainから親チェーンにコインを戻したい場合は、Sidechainに転送する際に行ったことと同じことを行う。Sidechain側でSPVロックしたOutputを作成し、親チェーンに送る。親チェーンでは以前ロックした出力をSPV証明を使ってアンロックし、親チェーン上で利用可能にする。(親チェーンに戻す際もconfirmination period と contest periodの待機時間は発生する)

チェーン間の処理の流れ(ホワイトペーパーから抜粋)
f:id:techmedia-think:20151123141854p:plain

Sidechainにペグするといろんなチェーンからアセットを転送できるようになるが、各チェーンのセキュリティについては仮定できないので、アセットに互換性を持たせない方が良い。そうしないと価値の無い資産で価値の無いチェーンを作成しSidechainにペグされるとSidechain内で無価値のアセットと価値のあるアセットとの交換が発生しアセットが盗難されることも考えられる。そのためSidechain側では親チェーンが異なる場合はそれぞれ別のアセットタイプとしてアセットを扱うようにする必要がある。

要約すると、親チェーンとSidechan間で相互にSPV検証を行うようにしようという提案。親チェーンのクライアントが全Sidechainの観察を行うことは期待できないので、ユーザがコインの所有を証明するには、Sidechainのproofs of workを親チェーンにインポートする必要がある。

そして親チェーンとしてBitcoinのBlockchainを使用する場合は、このようなSPV証明を検証できるスクリプトの拡張が必要とされる。そしてその証明はBitcoinの取引に収まるくらいコンパクトにする必要がある。

Asymmetric two-way peg

基本的な仕組みはSymmetric two-way pegと変わらないけど、親チェーンからSidechainへの転送にはSPV証明を必要としない。

結論

ということで、やはり現状でBitcoinのBlockchainとSidechain間で two way pegを行うにはBitcoin側での変更が必要というので間違いなさそう。Liquidではsoft forkしてる?
SPV使ったロック処理については具体的にどうやるのかよく分かってない。

2015/11/24追記

LiquidではFederated pegという方法が取られており、これはBlockchainとSidechain間のコインの送付は、信頼できる連合の職員(functionary)によるスクリプトの評価と、職員が持つ秘密鍵とコインホルダーが持つ秘密鍵による多重署名を行うことで実現している。要はBurnするのではなくコインホルダーと第三者となる職員秘密鍵を使ってマルチシグをすることによってコインをロックする仕組みを取っており、戻りの際も同様のやりとりが行われるためSPV証明のようにsoft fork無しで実現できてると。