ここからは、2ノード間での送金処理について解説していく。
送金は大きく、「送金する情報(HTLC)の追加(1~5)」と「送金を実行(6~8)」の2段階に分かれている。
- 送金先:請求書(=送金先であることを証明するIDのハッシュ値)を作成し、送金元に渡す。
- 送金元:送金先までのルートを決定する。
- 送金元:送金ルートの直近ノードに、ルート情報とHTLCを追加するメッセージを送信する。
- 中継:送金する情報を追加するメッセージを受信した場合、自分が送金元で無い場合はルート情報を読んで次のノードに転送する。
- 各ノード:HTLCを追加するメッセージが正しければ、HTLCを受け取った場合のメッセージ交換を行う。
- 送金先:HTLCメッセージの中にIDのハッシュ値があるので、それが請求書のハッシュ値と一致することを確認する。
- 送金先:自分の請求書IDを相手に返信して、送金を完了させることを宣言する。
- 各ノード:受け取った請求書IDを相手に返信していく。
(※上記の番号と図中の番号は対応していません)
HTLCはHashed TimeLock Contractsの略だが、ここでこの言葉を使う場合は、送金する情報だったり、送金を使用するためのスクリプトだったりするので、あまり用語に縛られず、そういったものを表していると考えていただきたい。
このHTLCは、相手に渡す「Offered HTLC outputs」と、相手からもらう「Received HTLC outputs」がある。
“outputs”とついているのは、これがcommitment transactionの送金先になるからである。
これまでの章では、送金を「出資額を分割した比率が変わるだけ」と説明してきたが、途中での通信切断や、相手が不正を働いたときのために、送金者から送金したい額を引き、送金額をHTLC outputとして追加する。
もし、送金の途中で問題が起きたとしても、送金額はHTLCなので、スクリプトを解くまでは特定の誰かに送金されるわけではない。
HTLCのスクリプトを解く条件は、基本的に以下のどれかになる。
- 請求書のIDを入手する
- タイムアウトする
- 相手が裏切る
正常な送金であれば、送金先が請求書のIDを持っているので、それを使ってスクリプトを解き、自分の額に組み入れる。
もし相手が不在になったりして請求書のIDがわからないままになったとしても、時間制限があるため、それを過ぎると送金元が取り戻すことができるようになる。
相手が裏切って、古い配分のcommitment transactionを使った場合は、古い鍵情報を生成するためのper_commitment_secretを持っているので、裏切った場合の特別ルールで、相手の配分を含めてすべてを総取りできる。
以降では、正常な送金について解説していく。