ライトニングネットワークのトランザクション構成と統計結果

posted in: Jack Wills | 0 |
Reading Time: 7 minutes

ライトニングネットワークで使われるトランザクション構成について仕様書BOLTに沿って解説します。前提知識としてビットコインのトランザクション構成とライトニングネットワークの基礎が必要です。本ブログでは、アリスがチャネル開設者、ボブを受諾者として解説します。


トランザクションの種類と関連性

ライトニングネットワークには主に3種類のトランザクションがあります。また、その内の1つであるCommitment Txから資金を移動するために、さらら2種類のトランザクションがあります。

トランザクション名 解説
Funding Tx チャネルを開設する時に作りブロードキャストするトランザクション
Commitment Tx お互いがオフラインで資金を送金し合う時に更新していくトランザクション。どちらかが一方的にチャネルを閉鎖する時は、このトランザクションをブロードキャストする。Commitment Txのアウトプットは4種類ある。

  1. To_local
  2. To_remote
  3. Offered HTLC
  4. Received HTLC

通常のCommitment Txのアウトプットは1と2となることが殆どである。しかし、例えば送金先のボブがpreimageをアリスへ公開しない場合は、以下に示すHTLC Timeout txまたはHTLC Success txを使い3または4のアウトプットを指定先へ送金すことができる。

HTLC Timeout tx アリスが一方的にチャネルを閉鎖後、ボブがpreimageを公開せず、一定期間経過後、アリスが3.Offered HTLCを取り戻すためのトランザクション
HTLC Success tx ボブが一方的にチャネルを閉鎖後、ボブがpreimageを使い4.Received HTLCの資金を得るためのトランザクション
Closing Tx お互いが合意してチャネルを閉鎖する時に作りブロードキャストするトランザクション


上記のトランザクションの関連性を表したのが以下の図です。


実際のデータ(Testnet)を見てみましょう。以下の表の3つのトランザクションは上記図のFunding Tx、Commitment Tx、HTLC Timeout Txを投影しています。

Funding Tx 備考 Commitment Tx 備考 HTLC Timeout Tx 備考
Txid 344b9… 963df… Not yet
block_height 1356179 1356183 Not yet
out[0] script 002095ac… A & B’s MultSig 00208cda… Offerd HTLC 0020d693…
out[1] script a9146c96… 001433cd… To_remote
out[2] script 0020d693… To_local
Lock Time 543677021 1356614


上記のトランザクションのポイント

アリスがチャネル開設し、ボブと送受金をしHTLCが残ったまま、アリスが一方的(非協力的)にチャネルを閉鎖した。

  • Commitment TxのアウトプットはP2WSHが2個(Offered HTLCとTo_local)とP2WPKH(To_remote)が1個ある。
  • よって、HTLCが残った状態でアリスが一方的にチャネルを閉鎖したことが分かります。もしClosing Tx(協力的チャネル閉鎖)の場合であれば、お互いへのアウトプットがP2WPKHとなります。

  • Commitment TxのTo_localアウトプットには144ブロックのタイムロックがかかっている。
  • よって、To_localアウトプットが使用可能になるのは約24時間後となります。To_localを使ったトランザクションのWitnessデータを

    6321026644cb387614f66421d14da3596c21cffa239011416c9adf3f351ee8551a9fc767029000b27521029654f80732769d7c435a184a3559f12178315526c53bbf003349390811c7590a68ac

    ここでデコードすると、以下のようなスクリプトになっており、144ブロックであるかをOP_CHECKSEQUENCEVERIFYでチェックしていることが分かります。

    OP_IF 026644cb387614f66421d14da3596c21cffa239011416c9adf3f351ee8551a9fc7 OP_ELSE 144 OP_CHECKSEQUENCEVERIFY OP_DROP 029654f80732769d7c435a184a3559f12178315526c53bbf003349390811c7590a OP_ENDIF OP_CHECKSIG
  • HTLC Timeout Txはサイン済みだが、1356614ブロックまでタイムロックがかかっている。
  • よってHTLC Timeout txは8/1正午時点ではまだブロードキャストできず、Commitment Txが含まれた1356183ブロックから数えて431ブロック(約3日間)目の1356614ブロック以降にブロードキャスト可能になります。431ブロックという数字はcltv_expiryという変数から計算されている。この辺は今後のルーティングの解説ブログで紹介したいと思います。実際のデータは以下となり、既にサイン済みです。

    02000000000101a6aff0c6b6f029adcd2b71d1c5d401bd00d66ea2af574e828c3248716ef13d9600000000000000000001be71000000000000220020d693f9aa5645d6c0935a053c458b5f792fc8bccc823f1c1223ddc06b4bce192205004830450221008b1bca92ba916a1c72ee86a560a5c6aa860533ff41217525da7d5a4b68d33b440220282c68c467f9c564767458c37004e8e23607f1fb5553ff1676cfe8099196bf6601483045022100832e9aae61a5130c6fe58060c8433d3abe404953a587a33d5932aba9b55bbb370220291f1be809f92f0829249e29677d975c66f616a9b6525ec40bca7814680dc4e601008576a91408ae0c6a9fb4b3acda162029f289ecf6ff64ebca8763ac6721023ecc0db3d1b693fca1549ef0d46ca464a28d8e73476abb5e96c826234b17752f7c820120876475527c210390719fd57dd70d3edd9a7aa6bbdf6310bf81989c777da8813637c4d9f8b68bdd52ae67a9142a27e0539cefff67396a56c519a8eb90d9427f6d88ac686846b31400

    上記の生データをデコードすると、以下のようなトランザクションとなり、Lock timeが1356614であることが分かります。

    { "result": { "txid": "6d58368666741e19ef7c711f43a7eb2d81fb82b7c6850f12fd11bc0bd5ed642c", "hash": "eeae4fad5b45d6a575ecb1073e1cb09d782a61a50ed5993357b658904d2aed93", "version": 2, "size": 379, "vsize": 166, "locktime": 1356614, "vin": [ { "txid": "963df16e7148328c824e57afa26ed600bd01d4c5d1712bcdad29f0b6c6f0afa6", "vout": 0, "scriptSig": { "asm": "", "hex": "" }, "txinwitness": [ "", "30450221008b1bca92ba916a1c72ee86a560a5c6aa860533ff41217525da7d5a4b68d33b440220282c68c467f9c564767458c37004e8e23607f1fb5553ff1676cfe8099196bf6601", "3045022100832e9aae61a5130c6fe58060c8433d3abe404953a587a33d5932aba9b55bbb370220291f1be809f92f0829249e29677d975c66f616a9b6525ec40bca7814680dc4e601", "", "76a91408ae0c6a9fb4b3acda162029f289ecf6ff64ebca8763ac6721023ecc0db3d1b693fca1549ef0d46ca464a28d8e73476abb5e96c826234b17752f7c820120876475527c210390719fd57dd70d3edd9a7aa6bbdf6310bf81989c777da8813637c4d9f8b68bdd52ae67a9142a27e0539cefff67396a56c519a8eb90d9427f6d88ac6868" ], "sequence": 0 } ], "vout": [ { "value": 0.00029118, "n": 0, "scriptPubKey": { "asm": "0 d693f9aa5645d6c0935a053c458b5f792fc8bccc823f1c1223ddc06b4bce1922", "hex": "0020d693f9aa5645d6c0935a053c458b5f792fc8bccc823f1c1223ddc06b4bce1922", "reqSigs": 1, "type": "witness_v0_scripthash", "addresses": [ "bc1q66fln2jkghtvpy66q57ytz6l0yhu30xvsgl3cy3rmhqxkj7wry3qdtn2kg" ] } } ] }, "error": null, "id": null }


トランザクション構成

では各トランザクションの生データを分解して重要なポイントを確認して行きましょう。

#1 Funding Tx

output[0]が資金をロックするためのスクリプト

2 <pubkey1> <pubkey2> 2 OP_CHECKMULTISIG

のP2WSHです。

Funding Txのoutput[0]を使ったCommitment Txのインプット(Witnessデータ)

522102f8d3a287882446f9570f5e0e29638d46b4bf519f5628c35b30b6901311dac60821033f7837aed227d5e26c8d55672ca6cb33c4cc8aebef8fd06e6ade5c6580c153b552ae

をデコードすると、以下のようなスクリプトになっており、2-2マルチシグのチェックをしていることが分かります。

2 02f8d3a287882446f9570f5e0e29638d46b4bf519f5628c35b30b6901311dac608 033f7837aed227d5e26c8d55672ca6cb33c4cc8aebef8fd06e6ade5c6580c153b5 2 OP_CHECKMULTISIG",
version 02 00 00 00
maker 00
flag 01
input count 01
input previous output hash
(reversed)
eb4fe1372be9c2e0e6ffc423f0bde4bcfda69f185c5c1a8949ea8c6e5e4f104d
previous output index 01 00 00 00
script length 17
scriptSig 16001484b12b3faf41f4a4eabdce17338ca5ec49413140
sequence ff ff ff ff
output count 02
output[0] value 40420f0000000000
script length 22
script 002095ac86776a9be2676333e1974c23409524732db6cb13574845c217d54e256404
output[1] value 942c590000000000
script length 17
script a9146c96a72d0943be0212793177251f7feb6ec739bc87
witness 02
483045022100c9a818188c3a6ac8d3769094d042cba999442fdcb08488f99304f5a9ede8eef502200e944849599a94baf8950aca74120db9ce8f7ec2dbaa63262ca2fb32a7134dde01
2103ff8c135286952caa12bf4e4a307b8d94a8cd3dc701b42cf217ee9efc9b04a200
block lock time 00 00 00 00

#2 Commitment Tx

output[0]がOffered HTLCです。スクリプト自体はハッシュ化されていますが、HTLC Timeout TxのWitnessデータ

8576a91408ae0c6a9fb4b3acda162029f289ecf6ff64ebca8763ac6721023ecc0db3d1b693fca1549ef0d46ca464a28d8e73476abb5e96c826234b17752f7c820120876475527c210390719fd57dd70d3edd9a7aa6bbdf6310bf81989c777da8813637c4d9f8b68bdd52ae67a9142a27e0539cefff67396a56c519a8eb90d9427f6d88ac6868

をデコードすると、以下のとおり、BOLT仕様書どおりのスクリプトになっています。

OP_OR OP_DUP OP_HASH160 08ae0c6a9fb4b3acda162029f289ecf6ff64ebca OP_EQUAL OP_IF OP_CHECKSIG OP_ELSE 023ecc0db3d1b693fca1549ef0d46ca464a28d8e73476abb5e96c826234b17752f OP_SWAP OP_SIZE 32 OP_EQUAL OP_NOTIF OP_DROP 2 OP_SWAP 0390719fd57dd70d3edd9a7aa6bbdf6310bf81989c777da8813637c4d9f8b68bdd 2 OP_CHECKMULTISIG OP_ELSE OP_HASH160 2a27e0539cefff67396a56c519a8eb90d9427f6d OP_EQUALVERIFY OP_CHECKSIG OP_ENDIF OP_ENDIF

version 02 00 00 00
maker 00
flag 01
input count 01
input previous output hash
(reversed)
6e095eada577d15b30c05a77399cdc5039697072a797e6a23e13b5d9d79c4b34
previous output index 00 00 00 00
script length 00
scriptSig
sequence 6d2e0880
output count 03
output[0] value 57c3000000000000
script length 22
script 00208cda218e1ba82f99abd5e865ba2c19cd4b0306aaecf27fba77428f4abadb77f9
output[1] value 6aea000000000000
script length 16
script 001433cdbb0c88c99d11fd1b8d23b2ed0b36ff426b13
output[2] value 38260d0000000000
script length 22
script 0020d693f9aa5645d6c0935a053c458b5f792fc8bccc823f1c1223ddc06b4bce1922
witness 04
00
483045022100ecefc2b781e55ba75c566bbe8a2c7c6b41a52ead675af9207a09ce934e4eaf5b022031686c216aad75fe53a2539c2af1a30ef01a492074d6b311c9b026a74519c5eb01
473044022078400de1c4d328a9f38c7e8db484c7a3e174f65efc813216d52f6867735cc31002202c9a68784efcf75d25c2988f3a0af0ff7aa585c8bb6c9e387c0db79481d027f501
47522102f8d3a287882446f9570f5e0e29638d46b4bf519f5628c35b30b6901311dac60821033f7837aed227d5e26c8d55672ca6cb33c4cc8aebef8fd06e6ade5c6580c153b552ae
block lock time 5dda6720

#3 HTLC Timeout Tx

上記のポイントでも言及しましたが、このトランザクションで注目すべきはlock timeです。その値は46b31400で、1356614ブロック目を表しています。Commitment Txがブロックに取り込まれた1356183ブロックから約3日間経過後の1356614ブロック以降にこのHTLC Timeout Txをブロードキャストすることができます。

version 02 00 00 00
maker 00
flag 01
input count 01
input previous output hash
(reversed)
a6aff0c6b6f029adcd2b71d1c5d401bd00d66ea2af574e828c3248716ef13d96
previous output index 00 00 00 00
script length 00
scriptSig
sequence 00 00 00 00
output count 01
output[0] value be71000000000000
script length 22
script 0020d693f9aa5645d6c0935a053c458b5f792fc8bccc823f1c1223ddc06b4bce1922
witness 05
00
4830450221008b1bca92ba916a1c72ee86a560a5c6aa860533ff41217525da7d5a4b68d33b440220282c68c467f9c564767458c37004e8e23607f1fb5553ff1676cfe8099196bf6601
483045022100832e9aae61a5130c6fe58060c8433d3abe404953a587a33d5932aba9b55bbb370220291f1be809f92f0829249e29677d975c66f616a9b6525ec40bca7814680dc4e601
00
8576a91408ae0c6a9fb4b3acda162029f289ecf6ff64ebca8763ac6721023ecc0db3d1b693fca1549ef0d46ca464a28d8e73476abb5e96c826234b17752f7c820120876475527c210390719fd57dd70d3edd9a7aa6bbdf6310bf81989c777da8813637c4d9f8b68bdd52ae67a9142a27e0539cefff67396a56c519a8eb90d9427f6d88ac6868
block lock time 46b31400


LNのトランザクション統計結果(一部抜粋)

ライトニングの主なトランザクションと各特性を理解したうえで、最後にLightningPeach(Bitfury)によるライトニングネットワークのトランザクション統計結果を一部以下に紹介します。オリジナル記事はここを参照してくだっさい。

  • 一方的チャネル閉鎖の割合が多い
  • チャネル開設の相手側が一方的にチャネルを開設する割合が多いが、一方的に閉鎖するインセンティブはなく、少し奇妙な行動である。

  • 大きなチャネルほど一方的チャネル閉鎖が起きている
  • これは相手がオフラインになったときにCommitment Txをブロードキャストして不正に資金を横取りしようと考えるインセンティブが働くからである。

  • 一日平均、1件のペナルティー(不正行為による資金の没収)


最後に

今回はライトニングネットワークで使われる主要なトランザクションとその関連性について見てきました。仕様書BOLTだけ読んでも実感がわかなかった箇所が、実際のデータを使いブレークダウンすることでより一層理解が深まったと思います。
また、トランザクション構成や特性を理解することで、ライトニングのトランザクション統計結果も違う角度で考察することができると思います。例えば、大きなチャネルほど一方的チャネル閉鎖が起きているが、実際に資金を不正入手された件数はどのぐらいあるか、HTLC Timeout TXがブロードキャストされた件数はどのぐらいあるのか(HTLC Timeout/Success Txが存在することは稀)、などが上げられます。
AMPやルーティング最適化もライトニングの普及には欠かせませんが、上記の不正行為を防ぎ、ユーザーの資金をしっかりと守ることが優先度が高いと思うので、ウォッチタワーの設計・実装が今後ますます重要になると思っています。


参考

[1] Understanding the Lightning Network, Part 2: Creating the Network

[2] Understanding the Lightning Network, Part 3: Completing the Puzzle and Closing the Channel

[3] LightningPeachによる統計報告1

[4]Offered/Received HTLCの解説 by Nayuta

[5] NayutaによるHTLCの送金の解説 by Nayuta

[6] Lightning Networkが動作する仕組み by Nayuta

コメントを残す