リップル社が提唱したILP(インターレジャープロトコル)は、異なる台帳(レジャー)間でもスムーズに送金が行えることを可能にします。例えば、ブロックチェーン上に記録されているビットコインを銀行口座システム上に記録されている日本円として送金することができるのです。
つまり、ILPはブロックチェーンを使った仮想通貨に限らず、法定通貨、クレジットカードネットワーク、web決済システムなどさまざまな価値ネットワークへ適用されることを目指しています。
なので、ILPはさまざまな規格の異なる台帳へ接続し、かつ安全な送金が行えるようにしなければなりません。安全な送金を行うひとつの方法としてHTLCという方法があげられます。これは暗号学的なトリックを使うことで、信頼できない相手とでも安全に送金を行うことが可能です。
しかし、全ての台帳がこのHTLCの規格に対応しているわけではないのでHTLCをそのままILPに適用することができません。HTLCを使えないレジャーはILPを使えないということは避けなければならないですし、ILPではHTLCを使えないということも安全面を考慮するとILPのデメリットになってしまいます。
そこで、リップル社が提唱しているHTLAという概念をILPで使うことで、HTLCを使えるレジャーも使えないレジャーも自由にILPに参加できるようにしています。
当記事では、HTLAの仕組みとその種類、そしてHTLAはを使った具体的な送金の流れについて解説していきます。また、以下ではILPの知識を前提にしていきますのでこちらの記事もあわせてご覧ください。
参考:【図解】リップルが提唱したインターレジャープロトコル(ILP)の仕組み
HTLAとは
HTLA(Hashed-Timelock Agreement)とはHTLC(Hashed-Timelock Contract)を一般化した概念です。HTLCは名前の通り、ハッシュロックとタイムロックを使ってユーザー間で安全な送金を行う仕組みのことです。(HTLCの具体的な仕組みについては後述します)
ただし、HTLCは互いの台帳(レジャー)がHTLCの規格に対応していないと使うことができません。例えば、ビットコインのブロックチェーンはHTLCに対応していますが、日本円がある通常の銀行口座はHTLCに対応していません。
ILPでは、さまざまな台帳をつなぎ合わせることを目指しているので、「HTLCの規格に満たしているレジャーでなければILPを使うことはできない」ということは避けなければならないのです。
そこで、HTLCを使えないレジャーでもILPを使えるようにHTLAという概念が登場します。HTLAではレジャー間での合意によりどのような方法で送金を実行するか、ということを決めることができます。つまり、取引参加者のレジャーがHTLCに対応しているのか、していないのかによって送金方法を変えることが可能なのです。
例えば、互いに信用していないけれど両者のレジャーがHTLCの規格に準拠しているのであれば、HTLCを使って安全に取引することが好まれるはずです。一方、互いにある程度信頼しているが、どちらか一方のレジャーがHTLCを使えない場合は、HTLCを使わない送金方法が適しているはずです。
このようにHTLAでは両者の信頼関係に基づくリスク許容度とHTLCの使用有無によって柔軟に送金方法を変えることができるのです。
また、ILPにおいて個々のローカル送金ごとにHTLAは適用されます。例えば、ILPでアリスが送り手、ボブが受け手、キャロルがコネクターという状況を考えます。つまり、アリス→キャロル→ボブの流れで送金が行われます。
このときアリスとキャロルのレジャーはHTLCを使えるけれど、ボブのレジャーはHTLCを使えない場合、アリス→キャロル間ではHTLCを使った送金を行い、キャロル→ボブ間ではHTLCを使わない送金を行う、ということがHTLAでは可能になるのです。このように、それぞれの両者間の合意によって送金方法を変えることができるのがHTLAの特徴になります。
HLTCの仕組み
HTLCは暗号学的に安全な仕組みとお伝えしましたが、簡単にどのような仕組みでこれが行われるのか見ていきましょう。
HTLCを理解するためには、ハッシュロックとタイムロックを理解する必要があります。これらの言葉はともに「ロック」というワードが含めらています。何をロックするのかというと、送金時の送り手がデポジットした資金をロックします。
つまり、送金の準備段階で送り手は資金を自分で取り出せないようにロックするのです。このようにロックを行うことで、送金相手にそのことが伝わり実際の送金が行われます。このロックを解除する条件に合わせてハッシュロックとタイムロックが存在するのです。
ハッシュロックとは、あるハッシュ値Hの元となっている値Rを鍵として扱うロックのことを言います。例えば、値RをSHA-256などのハッシュ関数に通してハッシュ値Hが得られるとします。(参考:ブロックチェーンの技術「一方向性ハッシュ関数」を理解しよう)
送金の受け手がこの値Rとハッシュ値Hを作ったとします。受け手はハッシュ値Hをあらかじめ送り手に渡しておきます。(ハッシュ関数は逆算不可能なのでハッシュ値Hから値Rを逆算することはできません)
そして、送金時に受け手だけが持っている値Rが鍵となるようなハッシュロックをデポジットした資金にかけておくことで、受け手は値Rをを送り手に渡し、そのハッシュロックを解除することでデポジットした資金が受け手に送られるという取引が可能になります。
また、タイムロックは単純にある一定の時間が経過したらロックを解除することです。例えば5分後に解除するようなタイムロックを設定した場合、デポジットした資金は自分に返金されます。(場合によっては相手に送られる条件付けも可能です)
HTLCはこのようなハッシュロックとタイムロックを組み合わせて条件付けすることで、暗号学的に安全な取引を行うことができるのです。つまり、信頼していない相手とでもHTLCを使えば不正が起こることなく取引することができます。
また、HTLCはビットコインのライトニングネットワークやアトミックスワップで用いられている技術になります。より詳しいHTLCの仕組みについては以下のライトニングネットワークの記事で解説しています。
参考:ビットコインにおけるライトニングネットワークの仕組みを分かりやすく解説
HTLAの種類
HTLAは、HTLCの規格に対応していないレジャーが参加していてもILPでの送金が行える方法です。
つまり、HTLAでは以下の状況に応じて、送金方法を決めて2者間で合意を得ることが可能になります。
- 相手をどのくらい信用しているか
- HTLCに対応しているレジャーを持っているか
信頼している相手との取引であれば、シンプルな実装で送金を行うことができます。しかし、信頼していない相手との取引であれば、複雑な実装をして安全な条件下で取引を行う必要があるでしょう。
また、互いのレジャーがHTLCに対応しているのであればHTLCを使った安全な送金が行えます。しかし、どちらか一方のレジャーがHTLCに対応していないのであれば他の方法を採用する必要があるでしょう。
ここでは以下の4つのHTLAタイプについて解説していきます。(日本語名称は分かりやすいように僕が勝手に名付けたものです)
- HTLCを使った送金:On-Ledger Holds/Escrow(using HTLCs)
- ペイメントチャネル(HTLCあり):Conditional Payment Channels(with HTLCs)
- ペイメントチャネル(HTLCなし):Simple Payment Channels
- トラストライン:Trustlines
HTLCを使った送金
送金取引における両者のレジャーがHTLCに対応しているのであれば、HTLCを使って安全に送金することができます。上述したようにHTLCを使えば信頼していない相手との取引も安全に行うことができるのです。
この方法では送り手は資金をレジャーにHTLCでロックし、そのHTLCでロックした資金を相手に送ることで送金が実行されます。この場合、HTLCでのタイムアウト(時間制限)はレジャーの処理速度がボトルネックとなるため、処理速度の速いレジャーの方が好まれるのです。
なので、レジャーの処理速度が速く、少ない手数料で送金を行えるレジャーがこの方法に適していると言えます。
ペイメントチャネル(HTLCあり)
送金取引を行う両者の間で、ペイメントチャネルを開く方法です。ペイメントチャネルの場合は、レジャーに資金をロックするのではなく、両者で共有しているペイメントチャネルに資金をロック(デポジット)します。
そしてこのペイメントチャネル内で送金を実行するのです。なので、直接レジャーを使って送金をするよりも処理量の多い取引がスムーズに行えます。
また、HTLCを使ったペイメントチャネルは処理速度の速いレジャーでは最適の方法になります。なぜなら、仕組み的にペイメントチャネルを開いている時間が取引時間のボトルネックになるからです。ペイメントチャネルを閉じるときに互いのレジャーにデータとして書き込まれるので、処理速度が早ければペイメントチャネルが開いている時間を短くすることができ、結果的に取引を高速に行うことができるのです。
ただし、HTLCを使ったペイメントチャネルのデメリットとしては、実装が最も複雑ということがあげられます。
このようなペイメントチャネルは、ビットコインのライトニングネットワークやイーサリアムのライデンネットワークで使われています。HTLCを使ったペイメントチャネルの詳しい仕組みについては以下のライデンネットワークの記事でも書いています。
参考:イーサリアムにおけるライデンネットワークの仕組みと問題点
ペイメントチャネル(HTLCなし)
取引参加者のどちらかのレジャーがHTLCに対応していない場合は、HTLCを使わないペイメントチャネルで取引を行うことも可能です。直接レジャー間で処理するよりもペイメントチャネルを開いて処理した方がより大きなボリュームの支払いを実行することができます。
送り手は資金をペイメントチャネルにデポジットし、ハッシュロックを解除することで実際の送金が行われます。ただし、ペイメントチャネルを開くことに対応していないレジャーはこの方法を採用することはできません。
トラストライン
トラストラインはHTLCやペイメントチャネルに対応していない場合でも送金を行うことができます。
送り手はハッシュロックとタイムアウトの情報を含めたメッセージを受け手に送ります。受け手はこのハッシュロックの元になっている値を使うことで、送り手がデポジットした資金を受け取ることができるのです。
ただし、取引の参加者同士は信頼している必要があります。なので、トラストラインを使った取引はビジネス的に信頼できるパートナーと使うときに適しているでしょう。
他にも、ペイメントチャネルのタイムアウトを第三者が管理する「Notarized Payment Channels」やペイメントチャネル自体を第三者が管理する「Third Party Payment Channels」などが提案されていますが、現時点ではILPに実装されていません。
HTLAを使った送金の流れ
ここでは公式ドキュメントにしたがって、HTLAを使った具体的な送金の流れを見ていきます。
①アリスとボブはハッシュロックHを使うことに同意をする。このハッシュロックHの元になる値Pはボブのみが知っている
②アリスはハッシュロックHを使ったHTLCでブロックチェーンAに資金をロックする(コネクター1への送金準備)
③コネクター1はハッシュロックHを使ってペイメントチャネルに資金をデポジットする(コネクター2への送金準備)
④コネクター2はハッシュロックHを使ってトラストラインのために資金をデポジットする(ボブへの送金準備)
⑤タイムアウトの前にボブはコネクター2に値Pを送ることで、トラストラインによってボブへの送金が行われる
⑥コネクター2はコネクター1に値Pを送ることで、ペイメントチャネルにデポジットされた資金がコネクター2へ送られる
⑦コネクター1はブロックチェーンAに値Pを送ることで、アリスがブロックチェーンAにロックした資金はコネクター1へ送られる。このときアリスは値Pを受け取ることで、無事ボブへの送金が完了したことが確認できる。(アリスはハッシュロックHのハッシュ値を知っているので)
以上がアリスからボブへさまざまな種類のHTLAを使ったILPで送金される具体例です。ここでのポイントは2つあります。
1つ目は、どのHTLAはでも同じハッシュロックHを使っている点です。HTLAの種類が異なっていても同じハッシュロックHを使うことでアリスは無事にボブに対して送金ができたことが分かるのです。
HTLAによるILPの取引を行う前にボブはアリスにHTTPSなどの安全な通信でハッシュロックに使うハッシュ値を送信します。そして、送金が完了したときにアリスは値Pを受け取り、ボブからあらかじめ受け取っていたハッシュ値と照合することで確実にボブにお金が渡ったことが分かるのです。
2つ目のポイントは、手順⑤⑥⑦のHTLAによる送金の実行は独立しているということです。つまり、⑤が実行されたのに⑥が実行されないというリスクはコネクター2のみが受けます。(もちろんコネクターのリスクは最小限になるように配慮されています)
要するに、ILPにおいてどこかの取引が上手く行かなくてもリスクを受けるのはコネクター1人のみなのです。不正が起きたらその取引に参加する全てのユーザーが被害を受けることはないということです。