ライトニングネットワークで使われるトランザクション構成について仕様書BOLTに沿って解説します。前提知識としてビットコインのトランザクション構成とライトニングネットワークの基礎が必要です。本ブログでは、アリスがチャネル開設者、ボブを受諾者として解説します。
トランザクションの種類と関連性
ライトニングネットワークには主に3種類のトランザクションがあります。また、その内の1つであるCommitment Txから資金を移動するために、さらら2種類のトランザクションがあります。
トランザクション名 | 解説 | ||||
Funding Tx | チャネルを開設する時に作りブロードキャストするトランザクション | ||||
Commitment Tx | お互いがオフラインで資金を送金し合う時に更新していくトランザクション。どちらかが一方的にチャネルを閉鎖する時は、このトランザクションをブロードキャストする。Commitment Txのアウトプットは4種類ある。
通常のCommitment Txのアウトプットは1と2となることが殆どである。しかし、例えば送金先のボブがpreimageをアリスへ公開しない場合は、以下に示すHTLC Timeout txまたはHTLC Success txを使い3または4のアウトプットを指定先へ送金すことができる。
| ||||
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個ある。
- Commitment TxのTo_localアウトプットには144ブロックのタイムロックがかかっている。
よって、HTLCが残った状態でアリスが一方的にチャネルを閉鎖したことが分かります。もしClosing Tx(協力的チャネル閉鎖)の場合であれば、お互いへのアウトプットがP2WPKHとなります。
よって、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は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)によるライトニングネットワークのトランザクション統計結果を一部以下に紹介します。オリジナル記事はここを参照してくだっさい。
- 一方的チャネル閉鎖の割合が多い
- 大きなチャネルほど一方的チャネル閉鎖が起きている
- 一日平均、1件のペナルティー(不正行為による資金の没収)
チャネル開設の相手側が一方的にチャネルを開設する割合が多いが、一方的に閉鎖するインセンティブはなく、少し奇妙な行動である。
これは相手がオフラインになったときにCommitment Txをブロードキャストして不正に資金を横取りしようと考えるインセンティブが働くからである。
最後に
今回はライトニングネットワークで使われる主要なトランザクションとその関連性について見てきました。仕様書BOLTだけ読んでも実感がわかなかった箇所が、実際のデータを使いブレークダウンすることでより一層理解が深まったと思います。
また、トランザクション構成や特性を理解することで、ライトニングのトランザクション統計結果も違う角度で考察することができると思います。例えば、大きなチャネルほど一方的チャネル閉鎖が起きているが、実際に資金を不正入手された件数はどのぐらいあるか、HTLC Timeout TXがブロードキャストされた件数はどのぐらいあるのか(HTLC Timeout/Success Txが存在することは稀)、などが上げられます。
AMPやルーティング最適化もライトニングの普及には欠かせませんが、上記の不正行為を防ぎ、ユーザーの資金をしっかりと守ることが優先度が高いと思うので、ウォッチタワーの設計・実装が今後ますます重要になると思っています。
コメントを残す