Develop with pleasure!

福岡でCloudとかBlockchainとか。

担保付き債務を表現するHashed Time-Locked Collateral Contract(HTLCC)を定義したBIP-197

トラストレスかつ仲介機能(中抜き)を排除した方法で超過担保付き商品を作成するためにAtomic Swapを利用したAtomic Loansを提案するペーパー↓

https://arxiv.org/pdf/1901.05117.pdf

ブローカー抜きに借り手と貸し手の間でローン契約を結ぶ際に、担保を設定した債務契約を結ぶにあたって、

  • 正常に返済されれば担保は解消され
  • デフォルト or 返済されない場合に
    • 両者が合意して担保を入札にかけて精算する。
    • 両者が合意しない場合は、担保の一定割合を差し押さえ精算する。

といったコントラクトを、HTLCを拡張したHashed Time-Locked Collateral Contract(HTLCC)で実現しようというBIP提案。担保をBitcoinブロックチェーン上でBTCとして2つのHTLCCスクリプトにロックし、他のブロックチェーン上でローン資金を発行する。

https://github.com/bitcoin/bips/blob/master/bip-0197.mediawiki

以下BIPの内容↓

概要

Hashed Time-Locked Collateral Contract(HTLCC)は2つのスクリプトで構成される。このスクリプトは指定された参加者(借り手)が、ローンの元本が別のブロックチェーン上の通貨建てである債務契約に担保として、指定された期間、資金をBitcoinブロックチェーンにロックすることを許可する。ローン元本が発行されたブロックチェーンを元本ブロックチェーンと呼ぶ。

スクリプトの目的は、2人の参加者(借り手と貸し手)の間で債務契約を作成できるようにすることで、担保はP2SHにロックされ、借り手が元本ブロックチェーン上で元金を返済し債務契約の利息を支払った後でのみ使用可能になる。借り手が返済をしない場合、借り手または貸し手は担保の精算を選択することができ、これにはローン通貨と担保のAtomic Swapが含まれる。両者のうち、どちらか一方が精算を選択しない場合、両者は資金が最初にP2SHにロックされた際に決定された担保の一定割合を受け取る権利がある。

これらの資金は2つのスクリプトにロックされる。Refundable CollateralスクリプトとSeizable Collateralスクリプトだ。これらのスクリプトに送られた資金は、返済が失敗し参加者が精算を選択しない場合の各参加者が権利を有する担保の割合を表す。

Refundable Collateralスクリプトは以下のような形式になる:

OP_IF
  OP_SIZE <シークレットB2の長さ> OP_EQUALVERIFY [HASHOP] <シークレットB2のハッシュ> OP_EQUALVERIFY OP_DUP OP_HASH160 <借り手の公開鍵ハッシュ> OP_EQUALVERIFY OP_CHECKSIG
OP_ELSE
  OP_IF
    <ローンの有効期間> [TIMEOUTOP] OP_DROP OP_SIZE OP_PUSHDATA(1) <シークレットA2の長さ> OP_EQUALVERIFY [HASHOP] <シークレットA2のハッシュ> OP_EQUALVERIFY OP_SIZE <シークレットB3の長さ> OP_EQUALVERIFY [HASHOP] <シークレットB3のハッシュ> OP_EQUALVERIFY OP_2 <借り手の公開鍵> <貸し手の公開鍵> OP_2 OP_CHECKMULTISIG
  OP_ELSE
    <精算の有効期間> [TIMEOUTOP] OP_DROP OP_DUP OP_HASH160 <借り手の公開鍵ハッシュ> OP_EQUALVERIFY OP_CHECKSIG
  OP_ENDIF
OP_ENDIF

Seizable Collateralスクリプトは以下のような形式になる:

OP_IF
  OP_SIZE <シークレットB2の長さ> OP_EQUALVERIFY [HASHOP] <シークレットB2のハッシュ> OP_EQUALVERIFY OP_DUP OP_HASH160 <借り手の公開鍵ハッシュ> OP_EQUALVERIFY OP_CHECKSIG
OP_ELSE
  OP_IF
    <ローンの有効期間> [TIMEOUTOP] OP_DROP OP_SIZE <シークレットA2の長さ> OP_EQUALVERIFY [HASHOP] <シークレットA2のハッシュ> OP_EQUALVERIFY OP_SIZE <シークレットB3の長さ> OP_EQUALVERIFY [HASHOP] <シークレットB3のハッシュ> OP_EQUALVERIFY OP_2 <借り手の公開鍵> <貸し手の公開鍵> OP_2 OP_CHECKMULTISIG
  OP_ELSE
    OP_IF
      <入札の有効期間> [TIMEOUTOP] OP_DROP OP_SIZE <シークレットA1の長さ> OP_EQUALVERIFY [HASHOP] <シークレットA1のハッシュ> OP_EQUALVERIFY OP_DUP OP_HASH160 <貸し手の公開鍵ハッシュ> OP_EQUALVERIFY OP_CHECKSIG
    OP_ELSE
      <差し押さえ有効期間> [TIMEOUTOP] OP_DROP OP_DUP OP_HASH160 <借り手の公開鍵ハッシュ> OP_EQUALVERIFY OP_CHECKSIG
    OP_ENDIF
  OP_ENDIF
OP_ENDIF

[HASHOP]、OP_SHA256OP_HASH160のいずれか。

[TIMEOUTOP]は、OP_CHECKSEQUENCEVERIFYOP_CHECKLOCKTIMEVERIFYのいずれか。

対話

  • アリス(借り手)とボブ(貸し手)は、アリスが作成した2つのシークレットのハッシA1, A2、ボブが作成した3つのシークレットのハッシュB1, B2, B3を交換する。両者はその後、ローンの期間(Loan Period)、精算期間(Liquidation Period)、差し押さえ期間(Seizure Period)のタイムアウト閾値について合意する。アリスはRefundable Collateral Contract と Seizable Collateral ContractのスクリプトおよびそのP2SHアドレスを作成する。ボブはローンの元金が発行されるブロックチェーン、元本ブロックチェーンスクリプトを構成する。
  • ボブは元本ブロックチェーンのローンスクリプトに元本の資金を送金する。
  • アリスはRefundable Collateral P2SHアドレスとSeizable Collateral P2SHアドレスに資金を送る。アリスが2つのアドレスに送金する金額は事前にアリスとボブの間で決定される。
  • その後は以下のいずれかのパターンになる:
    • ボブがアリスによる担保のロックを受け入れると、ボブはB1を明らかにし、アリスが元本ブロックチェーン上のローンの元金を引き出すのを可能にする。
    • ボブがアリスによる担保のロックを受け入れない場合、承認期間後にB2を明らかにして資金を回収する。これによりアリスにRefundableとSeizableの担保を返金できる。
    • ボブがアリスによる担保のロックを受け入れたその後は、以下のいずれかのパターンになる。
      • アリスはローン期間の終わりまでにローンを返済し、ボブはローン返済受け入れトランザクションでアリスにシークレットを明らかにする。
      • アリスがローンをデフォルト(債務不履行)し、アリスとボブ両者が担保精算を選択する場合、第三者が担保に入札することができる。入札で勝利したチャーリーは、担保資金(Refundable CollateralのP2SHとSeizable CollateralのP2SHの両方にロックされたBTC)と入札資金(チャーリーが入札に拠出したローン通貨建ての資金)をAtomic Swapし、精算担保を受け取る。これはアリスとボブがマルチシグに署名し、A2とB2を公開することで行われる。
      • アリスがローンをデフォルト(債務不履行)し、アリスとボブのどちらかが担保精算に同意しない場合、アリスはRefundable Collateralの資金を回収し、ボブはSeizable Collateralの資金を使用する。
      • アリスがローンをデフォルト(債務不履行)し、アリスとボブのどちらかが担保精算に同意せず、かつボブがSeizable Collateralの資金を使用していない場合、アリスはRefundable Collateralの資金とSeizable Collateralの資金両方を回収する。

互換性

BIP 197はEthereumのERC および Atomic Loans と互換性がある。将来的には他のHTLCおよびスマートコントラクト互換チェーンと互換性を持つよう拡張することができる。

動機

多くの異なるプロトコルでは、シークレットを明らかにすることがセトルメントの仕組みとして利用されている。HTLCCトランザクションは非協力的な相手から一定の割合の担保資金を回収し、元本 + 金利 + 精算手数料を当事者と協力して支払わせるため、債務契約の状態を進めるためにシークレットを交換する安全な方法である。

定義

借り手:借り手の借入承認後に、Bitcoinチェーンに担保をロックし、貸し手から元本ブロックチェーンの貸付金額を受け取るエンティティ

貸し手:Bitcoinチェーンに担保をロックし貸し手の承認後に、借り手が借りる元本ブロックチェーン上のHashed Time-Locked Principal Contract (HTLPC)に資金を提供するエンティティ。

返済:借り手がローンの期間の前に元本+利息を返済する場合

デフォルト:借り手がローンの期間の前に元本+利息の返済に失敗した場合

シークレット:債務契約の状態を変更できるように明らかにされる、借り手もしくは貸し手によって選択された乱数

シークレットのハッシュ:HTLCCの構築に使われるシークレットのハッシュ

シークレットA1:借り手によって生成されるシークレットで、借り手がローンを引き出したことの証明に使われる

シークレットA2:借り手によって生成されるシークレットで、入札者が精算した担保資金を引き出すのに使われる

シークレットB1:貸し手によって生成されるシークレットで、借り手による担保のロックを受け入れ、借り手がローン資金を引き出すのを可能にするのに使われる

シークレットB2:貸し手によって生成されるシークレットで、借り手に寄る担保のロックに不満がある場合に、ローン資金を返金するのに使われる。借り手による元本+利息の返済を受け入れる際にも使われる。

シークレットB3:貸し手によって生成されるシークレットで、入札者が精算される担保資金を引き出すのに使われる。

シークレットC:入札者によって生成されるシークレットで、担保の精算の承認のために借り手と貸し手の署名を受け入れるのに使われる。

ローンの有効期間:借り手がローンを返済しなければならなくなるまでのタイムスタンプ、もしくは、担保の精算、差し押さえのリスク。

入札の有効期間:差し押さえ有効期間が始まる前の、入札に割り当てられる時間を決定するタイムスタンプ

差し押さえ有効期間:貸し手がSeizable Collateral P2SH内の資金を差し押さえることができる期間を決めるタイムスタンプで、この有効期間後、借り手は借り手が権利を有する対応する額の担保(Refundable Collateral P2SH内の資金、もしくは貸し手が差し押さえに失敗した場合はRefundable CollateralとSeizable Collateralの両方)を払い戻しできる。

承認期間

この間、貸し手はHTLPCを元本ブロックチェーン上にデプロイする。続いて、Bitcoinブロックチェーン上のHTLCCに担保をロックする。貸し手は担保の内容に問題がなければシークレットB1を明らかにし、借りてはシークレットA1を明らかにすることでローンを引き出すことができる。貸し手が担保の内容に不満がある場合は、シークレットB2を明らかにすることでローン資金の払い戻しを受ける。また借り手はシークレットB2が明らかになることで、デポジットした担保資金の払い戻しを受けられる。

ローンの有効期間

一旦、借り手がローン資金を引き出すと、ローン期間が始まる。ローン期間が終了すると借り手によるローンの返済が期待される。借り手からの返済があった場合、貸し手はシークレットB2を明らかにすることで返済を受け入れることができ、借り手は担保資金の払い戻しを受けられる。借り手がデフォルトしたか、元本+利息を返済しない場合、貸し手はローンの返済を受け入れないことを選択でき、両者は入札期間中に担保の精算を選択することができる。

入札の有効期間

デフォルト、もしくは貸し手が借り手の返済を受け入れない場合、両者は第三者の入札者による担保への入札プロセス通して、担保の精算を選択することができる。入札の期間は貸し手、借り手のどちらからでも開始できる。入札期間が過ぎると、借り手と貸し手はそれぞれ署名を提供しなければならず、署名が適切あることを確認したら入札の落札者によってシークレットCが明らかにされる。最後に貸し手と借り手は落札者が担保を引き出せるようにシークレットA2とシークレットB3をそれぞれ明らかにしなければならない。

差し押さえ期間

借り手もしくは貸し手のどちらかが入札に応じない場合は、貸し手は担保の一定割合を差し押さえることができる。その金額はこのBIPで説明されているように、Seizable CollateralスクリプトとRefundable Collateralスクリプトにロックされている担保の金額によって異なる。この期間中、借り手はRefundable Collateralスクリプトにロックされている資金の払い戻しを受けることもできる。

払い戻し期間

貸し手がSeizable Collateralスクリプトにロックされた担保を差し押さえない場合、借り手はRefundable Collateralスクリプトにロックされた資金の払い戻しを受けられる(Seizable Collateralスクリプトの間違いような気が)。

論拠

以下のスクリプトOP_SHA256に使われるスタックにプッシュされたシークレットの長さをチェックするのは、

OP_SIZE <secret b2 length> OP_EQUALVERIFY

シークレットのサイズが特定のバイト長であるであることを保証するためである。

sha256 opcodeが32バイトしかしめず、残りを無視するEthereumのような他のチェーンで、このスクリプトがHTLPCと一緒に使われる場合、これは特に重要になる。Bitcoin側のサイズが32バイトであることを確実にする必要がある。

後方互換

これは担保付き債務の新しい標準であるため、後方互換性は必要ない。これが標準と認められると、同じ最大ブロックサイズを持つ2つのブロックチェーンで使われている場合はハッシュのサイズを検証する必要がなくなるなど、後方互換を保ちながら変更可能なコントラクトの特定の側面がある。

実装

https://github.com/AtomicLoans/chainabstractionlayer/blob/bitcoin-collateral-provider/src/providers/bitcoin/BitcoinCollateralProvider.js