Upgrade to Pro — share decks privately, control downloads, hide ads and more …

新しいオフチェーンコントラクトeltooとSIGHASH_NOINPUT

 新しいオフチェーンコントラクトeltooとSIGHASH_NOINPUT

GBEC動画解説コンテンツのスライドです。
https://goblockchain.network/2018/11/eltoo_and_sighash_noinput/

shigeyuki azuchi

December 04, 2018
Tweet

More Decks by shigeyuki azuchi

Other Decks in Technology

Transcript

  1. 1 Off-chain Scaling Payment Channel 資金をブロックチェーン上に固定し、固定した金額を上限として、トラストレスに オフチェーンで決済を繰り返すためのプロトコル。 Block Block Block

    Block Block Block Funding Tx(on-chain) Inputs アリスの1BTC ボブの1BTC Outputs アリスとボブのマルチシグに 2 BTC Commitment Tx(off-chain) Outputs アリスに1.1BTC ボブに0.9 BTC Inputs アリスとボブのマルチシグ 2 BTC オンチェーン上にマルチシグで ロックされたコインをインプットにし、 アウトプットには決済時のそれぞれの 残高を反映したトランザクションを作っ て決済する。 新しい決済をする場合はアウトプット の残高を更新した同様のトランザク ションを作る。
  2. 2 Payment Channelのセットアップ ① アリスとボブはPayment Channelをセットアップするため チャネル決済に使用するコインをブロックチェーン上に ロックするFunding Txを作成する。 Funding

    Tx Inputs アリスの1BTC ボブの1BTC Outputs アリスとボブのマルチシグに 2 BTC この時点で、Funding Txは未署名で 当然ブロードキャストはできない。
  3. 3 Payment Channelのセットアップ ② アリスとボブはそれぞれ秘密の値(Secret)とその値のハッシュを生成する。  このうちハッシュだけ相手に伝える。 Secret A1 H(A1) Secret

    B1 H(B1) 交換 アリスが作るCommitment Tx1 Outputs アリスの鍵で入手可能な 1BTC 残り1 BTCは以下のいずれかで入手可能 •このTxがブロックに入って 1,000ブロック経過した らボブの鍵で入手可能。 •Secret B1が分かればアリスの鍵で入手可能。 ③ アリスとボブは相手から受け取ったハッシュを使ってFunding Txの アウトプットをインプットにしたCommitment Txをそれぞれ作り、自分の署名を 付与して相手に送る。 ボブが作るCommitment Tx1 Outputs ボブの鍵で入手可能な 1BTC 残り1 BTCは以下のいずれかで入手可能 •このTxがブロックに入って 1,000ブロック経過し たらアリスの鍵で入手可能。 •Secret A1が分かればボブの鍵で入手可能。 交換
  4. 4 Payment Channelのセットアップ アリスが作ったCommitment Tx1 Outputs アリスの鍵で入手可能な 1BTC 残り1 BTCは以下のいずれかで入手可能

    •このTxがブロックに入って 1,000ブロック経過した らボブの鍵で入手可能。 •Secret B1が分かればアリスの鍵で入手可能。 ボブが作ったCommitment Tx1 Outputs ボブの鍵で入手可能な 1BTC 残り1 BTCは以下のいずれかで入手可能 •このTxがブロックに入って 1,000ブロック経過し たらアリスの鍵で入手可能。 •Secret A1が分かればボブの鍵で入手可能。 この時点でお互いに相手が作成し相手の署名が付与されたCommitment Txを持って いる状態になる。このTxに自分の署名を加えればTxは完成する。 このTxがブロードキャストされると、ブロードキャストしたユーザーは1,000ブロック待てば コインを入手でき、相手はすぐにコインを入手できる。 ④ 最初のCommitment Txの交換が終わったら①で作成したFunding Txに署名して ネットワークにブロードキャストしてチャネルをオープンする。 相手の署名済みのTxを両者 持つので、これでFunding Txを ブロードキャストした後に、 相手がいなくなってマルチシグに ロックした資金が取り戻せないと いった事態はなくなる。
  5. 5 オフチェーン決済 オフチェーン決済は新しいシークレットの作成・交換し、決済の結果で残高を 更新したCommitment Txを作り自分の署名を加え相手に送る。 アリスが作るCommitment Tx2 Outputs アリスの鍵で入手可能な 1.1BTC

    残り0.9BTCは以下のいずれかで入手可能 •このTxがブロックに入って 1,000ブロック経過した らボブの鍵で入手可能。 •Secret B2が分かればアリスの鍵で入手可能。 Secret A2 H(A2) Secret B2 H(B2) 交換 ボブが作るCommitment Tx2 Outputs ボブの鍵で入手可能な 0.9BTC 残り1.1 BTCは以下のいずれかで入手可能 •このTxがブロックに入って 1,000ブロック経過し たらアリスの鍵で入手可能。 •Secret A2が分かればボブの鍵で入手可能。 交換 Secret A1 Secret B1 交換 セットアップ時と違うのは前のCommitment Txを作る際に 生成した秘密の値を相手に明らかにする点
  6. 6 不正を働いた場合のペナルティ アリスが作ったCommitment Tx1 Outputs アリスの鍵で入手可能な 1BTC 残り1 BTCは以下のいずれかで入手可能 •このTxがブロックに入って

    1,000ブロック経過した らボブの鍵で入手可能。 •Secret B1が分かればアリスの鍵で入手可能。 ボブが自分に有利な古いCommitment Tx1をブロードキャストするとどうなるか? ボブは、Commitment Tx1がブロックに格納されて1,000ブロック経過するまで1BTCは入 手できない。ボブが1000ブロック待っている間にアリスは、もともとアリス宛の1BTCは普通 に入手でき、さらにSecret B2をこの段階では知っているので残りの1BTCも入手することが できる。つまり裏切って古いTxをブロードキャストすると相手に全資金が渡る。 ※ 但し、古いCommitment Txがブロードキャストされていないかチェーンの監視が必要。 アリスが作ったCommitment Tx2 Outputs アリスの鍵で入手可能な 1.1BTC 残り0.9 BTCは以下のいずれかで入手可能 •このTxがブロックに入って 1,000ブロック経過した らボブの鍵で入手可能。 •Secret B2が分かればアリスの鍵で入手可能。 Commitment Tx2のオフチェーン決 済が終わったとして、この段階でボ ブはCommitment Tx1をブロード キャストした方が自分の残高が多く 特をする。
  7. 7 eltoo: A Simple Layer2 Protocol for Bitcoin 2018年4月にChristian Decker、Rusty

    Russell、Olaoluwa Osuntokunらによって 発表された新しいオフチェーンプロトコル。 https://blockstream.com/eltoo.pdf 古い状態をブロードキャストした際の 振る舞いが変わる • 不正を働いたユーザーの資金の没収 • 最新の残高の反映
  8. 8 eltoo: Payment Channelのセットアップ セトルメント用公開鍵As アップデート用公開鍵Au セトルメント用公開鍵Bs アップデート用公開鍵Bu ① チャネルを開く前に各参加者はアップデート用とセトルメント用の

     2つの鍵ペアを生成し、各公開鍵を相手と交換する。 • アップデート鍵ペア(Au, Bu) チャネルの状態を更新する(新しい支払いをする)際に使用する鍵 • セトルメント鍵ペア(As, Bs) チャネルを最終残高で閉じる際に使用する鍵 ※ eltooでは、チャネルの最新状態を表したTxさえ保持しておけば、古い状態 がブロードキャストされても、そのトランザクションを最新状態を表すTxに置換す ることができる。
  9. 9 eltoo: Payment Channelのセットアップ ② アリスの資金を2-of-2のマルチシグにロックする Funding Txを作成。 Funding Tx

    Inputs アリスの5 BTC Outputs アリスとボブのマルチシグに 5 BTC Trigger Tx Inputs Funding TxのUTXO Outputs 5 BTCは以下のいずれかで入手可能 • このTxがブロックに入って 1,000ブロック経過したら  As1とBs1のマルチシグで入手可能 • AuとBuのマルチシグで入手可能 Settlement Tx1 Inputs Trigger TxのUTXO Outputs アリスのアドレスに 5 BTC ③ Funding TxのUTXOをインプットに  したTrigger Txを作成。 ④ Trigger TxのUTXOをインプットとしたSettlement Tx1を作成。 セットアップフェーズでは払い戻し用として機能し、アウトプットは 5 BTCがそのままアリスのアドレスへ。 ※Settlement Tx1はTrigger Txがブロックに格納されてから 1000ブロック後にブロードキャスト可能。 sig Bu sig Bs1 LNのコントラクトはCommitment Tx 1つでお互いの残高を管理していたが、 eltooではTrigger Tx(Update Tx)と Settlement Txの2つでチャネルの 残高を管理する sig Au ⑤ アリスはFunding Txに  署名しブロードキャストする。 sig Alice sig As1
  10. 10 eltoo: オフチェーン決済 1回目 ① アリス→ボブに1 BTC支払うため、Trigger Txをインプットとして新しい Update Tx2を作成。 Update

    Tx2 Inputs Trigger TxのUTXO Outputs 5 BTCは以下のいずれかで入手可能 • このTxがブロックに入って 1,000ブロック経過したら  As2とBs2のマルチシグで入手可能 • このTxを使用すTxのnLocktimeが3以上で、  AuとBuのマルチシグで入手可能 Settlement Tx2 Inputs Update Tx2のUTXO Outputs アリスのアドレスに 4 BTC ボブのアドレスに 1 BTC ※ Update TxのnLocktimeには状態を表すState Numberをセットする。 アウトプットの条件の1つには、その <State Number + 1> がOP_CLTVの引数としてセットされる= このUTXOを使用するTxのnLocktimeは3以上であることが条件。 sig Bs2 Trigger Tx Inputs Funding TxのUTXO Outputs 5 BTCは以下のいずれかで入手可能 • このTxがブロックに入って 1,000ブロック経過したら  As1とBs1のマルチシグで入手可能 • AuとBuのマルチシグで入手可能 sig Bu nLocktime State Number: 2 sig Au sig Bu ② Update Tx2のUTXOを インプットとして、アウトプットに 残高を反映したSettlement Tx を作成する。 sig Au sig As2 ※ eltooではお互いに同じTx (Update TxとSettlement Tx)を管理する
  11. 11 eltoo: オフチェーン決済 2回目 ① ボブ→アリスに0.5 BTC支払うため、Trigger Txをインプットとして新しい Update Tx3を作成。 Update

    Tx3 Inputs Trigger TxのUTXO Outputs 5 BTCは以下のいずれかで入手可能 • このTxがブロックに入って 1,000ブロック経過したら  As3とBs3のマルチシグで入手可能 • このTxを使用すTxのnLocktimeが4以上で、  AuとBuのマルチシグで入手可能 Settlement Tx3 Inputs Update Tx3のUTXO Outputs アリスのアドレスに 4.5 BTC ボブのアドレスに 0.5 BTC sig Bs3 Trigger Tx Inputs Funding TxのUTXO Outputs 5 BTCは以下のいずれかで入手可能 • このTxがブロックに入って 1,000ブロック経過したら  As1とBs1のマルチシグで入手可能 • AuとBuのマルチシグで入手可能 sig Bu nLocktime State Number: 3 sig Au sig Bu ② Update Tx3のUTXOを インプットとして、アウトプットに 残高を反映したSettlement Tx を作成する。 sig Au sig As3
  12. 12 eltoo: 古い状態のブロードキャスト ボブの裏切り Update Tx3 Inputs Trigger TxのUTXO Outputs 5

    BTCは以下のいずれかで入手可能 • このTxがブロックに入って 1,000ブロック経過したら  As3とBs3のマルチシグで入手可能 • このTxを使用すTxのnLocktimeが4以上で、  AuとBuのマルチシグで入手可能 Settlement Tx3 Outputs アリスのアドレスに 4.5 BTC ボブのアドレスに 0.5 BTC nLocktime State Number: 3 sig Bu sig Au Update Tx2 Inputs Trigger TxのUTXO Outputs 5 BTCは以下のいずれかで入手可能 • このTxがブロックに入って 1,000ブロック経過したら  As2とBs2のマルチシグで入手可能 • このTxを使用すTxのnLocktimeが3以上で、  AuとBuのマルチシグで入手可能 nLocktime State Number: 2 sig Bu sig Au Settlement Tx2 Outputs アリスのアドレスに 4 BTC ボブのアドレスに 1 BTC ボブにとってはSettlement Tx2の 方が取り分が多いので、Update Tx2をブロードキャストする その後Settlement Tx2をブロード キャストする必要があるが、これに は Update Tx2がブロックに入ってか ら1,000ブロック待つ必要がある。 sig Bs2 sig As2 sig Bs3 sig As3
  13. 13 eltoo: 古い状態のブロードキャスト アリスの対応 Update Tx3 Inputs Trigger TxのUTXO Outputs

    5 BTCは以下のいずれかで入手可能 • このTxがブロックに入って 1,000ブロック経過したら  As3とBs3のマルチシグで入手可能 • このTxを使用すTxのnLocktimeが4以上で、  AuとBuのマルチシグで入手可能 nLocktime State Number: 3 sig Bu sig Au Update Tx2 Inputs Trigger TxのUTXO Outputs 5 BTCは以下のいずれかで入手可能 • このTxがブロックに入って 1,000ブロック経過したら  As2とBs2のマルチシグで入手可能 • このTxを使用すTxのnLocktimeが3以上で、  AuとBuのマルチシグで入手可能 nLocktime State Number: 2 sig Bu sig Au ボブが1000ブロック待っている間に、 もう1つの条件を使ってコインを取り戻 す Update Tx3のインプットの参照先を Trigger TxのUTXOからUpdate Tx2の UTXOに書き換え、ブロードキャストす る。 Update Tx3がブロックに格納されるとアリスはその後、 Settlement Tx3を ブロードキャストすることで、最新状態でチャネルをクローズできる。
  14. 14 eltooを可能にするSIGHASH_NOINPUT 通常、Txの署名はトランザクションデータが署名対象のメッセージダイジェストとなるため、トランザクションデータ が一部でも変更されるとその署名は無効になる。そのため現時点での Bitcoinの仕様では実現不可能。 Txの署名対象データ【 BIP-143】 nVersion hashPrevouts(全入力のOutpointから生成したハッシュ) hashSequence(全入力のsequenceから生成したハッシュ)

    outpoint(署名対象の入力の Outpoint) scriptCode value(署名対象の入力が持つコインの量) nSequence(署名対象の入力の sequence) hashOutputs(全出力から生成したハッシュ) nLocktime sighash type インプットが参照する前のトランザクションのアウトプットの 情報が全て空になる。 署名はトランザクションの OutPointにコミットしなくなり、 署名後にインプットが参照する OutPointの変更が可能にな る。 空(0x00) 署名済みTx Input Output TxA Input Output TxB Input Output 変更可 ※ リバインド可能なのは同じ witness   要素でアンロック可能な UTXOのみ SIGHASH_NOINPUT
  15. 15 eltooのポイント: State Numberの導入 Update Tx3 Inputs Trigger TxのUTXO Outputs

    5 BTCは以下のいずれかで入手可能 • このTxがブロックに入って 1,000ブロック経過したら  As3とBs3のマルチシグで入手可能 • このTxを使用すTxのnLocktimeが4以上で、  AuとBuのマルチシグで入手可能 nLocktime State Number: 3 sig Bu sig Au Update Tx2 Inputs Trigger TxのUTXO Outputs 5 BTCは以下のいずれかで入手可能 • このTxがブロックに入って 1,000ブロック経過したら  As2とBs2のマルチシグで入手可能 • このTxを使用すTxのnLocktimeが3以上で、  AuとBuのマルチシグで入手可能 nLocktime State Number: 2 sig Bu sig Au Update Tx3がブロードキャストされた後に、 Update Tx2のインプットの参照先を Update Tx3に書き換えられるてブロードキャストされてしまう問題 Update Tx3のUTXOを使用する場合、そのTxのnLocktimeは4以上で なければならず、Update Tx2のnLocktimeは2なのでリジェクトされる。 ※ nLocktimeは本来指定時間までTxをロックする仕組みだが、それを  チャネル状態のバージョンとして利用。
  16. 16 eltooのポイント: セトルメント鍵のローテーション Settlement Tx1 Inputs Trigger TxのUTXO Outputs アリスのアドレスに

    5 BTC sig Bs1 sig As1 Settlement Tx3 Inputs Update Tx3のUTXO Outputs アリスのアドレスに 4.5 BTC ボブのアドレスに 0.5 BTC sig Bs3 sig As3 Settlement Tx2 Inputs Update Tx2のUTXO Outputs アリスのアドレスに 4 BTC ボブのアドレスに 1 BTC sig Bs2 sig As2 Settlement Txに署名する際もSIGHASH_NOINPUTが使用される。 不正があった場合に、対応する Update Txのインプットの参照先が変わると Update TxのTXIDも変わり、Settlement Txのインプットの参照先も変更する必要がある。 ※異なるUpdate Tx(Settlemnt Tx2の参照先をUpdate Tx3)を参照されるとまずい Outputs 5 BTCは以下のいずれかで入手可能 • このTxがブロックに入って 1,000ブロック経過したら  As3とBs3のマルチシグで入手可能 • このTxを使用すTxのnLocktimeが4以上で、  AuとBuのマルチシグで入手可能 Update Txの条件で、セトルメント鍵でアンロックする場合、 その鍵は各状態毎に異なる鍵が使われる。 鍵ペアの導出自体は HDウォレット等と同様に決定論的に導出される。 これによりSettlement Txは対応するUpdate Txのみにバインドされ る。
  17. 17 eltooのポイント: チャネルの協調クローズ Funding Tx Inputs アリスの5 BTC Outputs アリスとボブのマルチシグに

    5 BTC Trigger Tx Inputs Funding TxのUTXO Outputs 5 BTCは以下のいずれかで入手可能 • このTxがブロックに入って 1,000ブロック経過したら  As1とBs1のマルチシグで入手可能 • AuとBuのマルチシグで入手可能 sig Bu sig Au sig Alice Settlement Tx2 Inputs Update Tx2のUTXO Outputs アリスのアドレスに 4 BTC ボブのアドレスに 1 BTC sig Bs2 sig As2 Update Tx2 Inputs Trigger TxのUTXO Outputs 5 BTCは以下のいずれかで入手可能 • このTxがブロックに入って 1,000ブロック経過したら  As2とBs2のマルチシグで入手可能 • このTxを使用すTxのnLocktimeが3以上で、  AuとBuのマルチシグで入手可能 nLocktime State Number: 2 sig Bu sig Au Closing Tx Inputs Funding TxのUTXO Outputs アリスのアドレスに 4 BTC ボブのアドレスに 1 BTC sig Bs2 sig As2 on-chain on-chain 協調クローズの場合はClosing Txを 協力して作成してブロードキャスト 協調クローズでない場合、 Trigger Tx、Update Tx、Settlement Txが ブロードキャストされる。 無期限のチャネルにするため、Trigger Txが必要
  18. 18 まとめ eltooはPayment Channelで旧状態がブロードキャストされた際に、 ペナルティではなく、最新の状態を後から差し替え可能にするコントラクトを ベースにした新しいPayment Channelの提案。 • メリット ◦

    チャネルのバックアップが正常にできてなくて、意図的で無いにしろ 古い状態をブロードキャストしてしまった際のリカバリになる。 ◦ 古い状態をブロードキャストさせようとする攻撃ベクトルを回避す る。 ◦ 保存するのが最新のUpdate Tx / Settlement Txのみで済む。 ◦ 参加者が増えた場合の対応が簡単 ▪ Update Txの各条件が参加者分のマルチシグに ▪ Settlement Txのアウトプットが参加者分増える • デメリット ◦ SIGHASH_NOINPUTがBitcoinに導入されるまで導入できない。