Lightning Network BOLTの概要について、書いていくシリーズ。
今回は、送金を転送する際のfee計算についてです。
Lightning Network BOLTには、送金を転送するという仕様があります。
だいたいの場合、Lightning Networkで送金をする際には、このような流れになります(図の数字と連番は関係ありません)。
- 送金する人(payer)が、送金先の人(payee)からinvoiceの文字列をもらう
- payerは、Lightning Networkのノードアプリにinvoiceを伝える
- payerのノードアプリが、今まで通知されたchannelの情報を使って、payeeまでのルートを作る
- payerは、ルートの最初の人に暗号化されたルート情報と送金額を通知
- 受け取った人は、暗号化されたルートから次の送金先と送金額をデコードし、それに従って通知
- 手順5を繰り返していき、payeeまでたどり着くと、payeeはinvoiceを解く鍵を送り返す
- 鍵を受け取った人はinvoiceを解いて自分への送金を受け取り、送金したルートと逆順に鍵を送っていく
中継する人は、経路を使った見返りとして、送金したfeeを受け取ることができます。
feeは、「受け取った送金額」と「次に渡す送金額」の差になります。
たとえばこの図では、中継Aさんがfeeとして10、中継Bさんが20を要求した場合、payeeへ100送りたいならば、payerは130送金します。
手数料はpayerが勝手に決めるわけではなく、各ノードがchannel情報をアナウンスするメッセージの中に入っています。
BOLTメッセージで言えば、channel_updateになります。
feeに関係するパラメータは、この2つです。
fee_base_msatは、ベースとなるfeeで、固定です(単位はmsatoshi)。
fee_proportional_millionthsは、100万satoshi=10mBTC辺りのfeeです。
なお、単に相手に送金するだけであればfeeは発生しません。
feeは、経由するチャネルごとにかかるため、経路のチャネルが増えると、feeが多くなっていきます。
しかし、feeはチャネルごとに異なるため、あまり高いfeeを設定しているとpayerがルート計算する際に除外されることでしょう。
2018年2月にTESTNETで値を見たときは、各ノードのデフォルト値はこのようになっていました。
https://github.com/nayutaco/lightning-memo/wiki/%E6%8E%A5%E7%B6%9A%E3%83%86%E3%82%B9%E3%83%88#table
TESTNETなので値が高い低いというのはあまり意味がありません(MAINNETでの値は調べていません)。
パラメータはノードアプリで設定できると思いますので、確認されると面白いでしょう。