ライトニングネットワークとHTLC
久しぶりの投稿となりますが、今回はライトニングネットワークのコア技術であるHTLCを使っての送金について書きたいと思います。HTLCとはHashed Time Lock Contractの略でハッシュ値やタイムロックを使って送金を一時的にロックし、2者間(や3者間)での送金をトラストレスに行うためのスクリプトになります。
アリスとボブ間の送金
全体のフローは以下の図のようになります。
送金をするには予めチャネルというマルチシグを使ったトランザクション(これをFunding Txと言う)を作ってブロックチェーンへ書き込む必要があります(上記図の(1)にあたる)。このトランザクションのアウトプット構成は以下のようになっています。
2 <A’s pubkey> <B’s pubkey> 2 OP_CHECKMULTISIG
チャネルの作成が完了したら、アリスはボブへ送金ができるようになります。以降の送金は、すべてCommitment Txというトランザクションを更新することで行いますが、このトランザクションはブロックチェーンへ書き込まず、お互いのノードに保管します。このトランザクションのインプットはFunding Txになっており、アウトプットにはアリスのためのto_local、ボブのためのto_remote、ボブのためのOffered HTLC、アリスのためのReceived HTLCの4種類があります。
アリスがボブへ送金をする場合、このCommitment TxにHTLCスクリプトをアウトプットへ追加することで送金を行います。
では実際にアリスがボブへ1coinを送金する場合を考えてみます。この時、HTLCを使って送金するのですが、送金には2段階に分けて行います。事前にボブはアリスに対してインボイスという送金のための情報(送金金額やボブのノード情報、プリイメジ*1のハッシュ)を渡します(上記図の(2)にあたる)。
*1 プリイメジ(Preimage)とはHTLCからコインを取り出すために必要でシークレットなどと呼ばれたりします。そのプリイメジをハッシュした情報をアリスへ渡します。
HTLCの追加(update_add_htlc)
アリスはボブに対してHTLCの追加を要求します(上記図の(3)にあたる)。この時に、送金金額やプリイメジのハッシュ値、オニオンルーティングパケット*2を一緒に送信します。そして、Commitment TxのアウトプットにOffered HTLCと送金金額1 coinを追加したトランザクションを作り署名をしボブへ送信します。この時のCommitment Txの構成は以下のようになります。
受信したデータが有効かボブはチェックし、問題がなければボブはCommitment TxのアウトプットにReceived HTLCと送金金額1 coinを追加したトランザクションを作り書名をしアリスへ送信します(4)。この時のCommitment Txの構成は以下のようになります。
*2 オニオンルーティングパケットとは、第三者を中継して送金するための情報で、今回は説明を割愛します。
HTLCの反映(update_fulfill_htlc)
HTLCの追加が完了したら、今度はHTLCの反映をします。反映とは、HTLCの削除及びその金額の反映です。まず、ボブはアリスへプリイメジを送信します。また、ボブはアリスへOffered HTLCを削除し、アリスの金額を-1へボブの金額を+1へ更新したCommitment Txを作成、署名し送信します(上記図の(4)にあたる)。これと同様に、アリスはRecieved HTLCを削除し、アリスの金額を-1へボブの金額を+1へ更新したCommitment Txを作成、署名し送信します。
この反映が完了すると、アリスとボブがそれぞれ持っている最新のCommitment Txのアウトプットはto_localとto_remoteの2つのみとなります。この時のCommitment Txの構成は以下のようになります。
以上が、HTLCを使った送金手順についてです。ライトニングネットワークはこのHTLCを活用することで、送金をしているようにみせて、実際はCommitment Txのアリスとボブのアウトプットの金額をトラストレスに更新しているのです。