[LN#007]送金 (1)

ここからは、2ノード間での送金処理について解説していく。

送金は大きく、「送金する情報(HTLC)の追加(1~5)」と「送金を実行(6~8)」の2段階に分かれている。

  1. 送金先:請求書(=送金先であることを証明するIDのハッシュ値)を作成し、送金元に渡す。
  2. 送金元:送金先までのルートを決定する。
  3. 送金元:送金ルートの直近ノードに、ルート情報とHTLCを追加するメッセージを送信する。
  4. 中継:送金する情報を追加するメッセージを受信した場合、自分が送金元で無い場合はルート情報を読んで次のノードに転送する。
  5. 各ノード:HTLCを追加するメッセージが正しければ、HTLCを受け取った場合のメッセージ交換を行う。
  6. 送金先:HTLCメッセージの中にIDのハッシュ値があるので、それが請求書のハッシュ値と一致することを確認する。
  7. 送金先:自分の請求書IDを相手に返信して、送金を完了させることを宣言する。
  8. 各ノード:受け取った請求書IDを相手に返信していく。

(※上記の番号と図中の番号は対応していません)
image

 

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を持っているので、裏切った場合の特別ルールで、相手の配分を含めてすべてを総取りできる。

以降では、正常な送金について解説していく。