LightningNetworkを使ってみる（c-lightning編）

# はじめに
LightningNetworkはBlockstream社のc-lightningを使用します。
そのためbitcoind 0.15 以上を使用してください。

# 流れ
- Bitcoinフルノードの立ち上げ
- LightningNewtorkの立ち上げ
- LightningNetworkの動きの流れ

# Bitcoinフルノードの立ち上げ
以下を参考に立ち上げてください。

お手軽にVPSでBitcoinフルノードを立ち上げる方法
https://qiita.com/9muta/items/d3b5cf003d18ab58d112

# LightningNewtorkの立ち上げ
以下を参考に立ち上げてください。

LNノードを立ち上げる方法
https://qiita.com/9muta/items/285431be70caf667ecd1


# LightningNetworkの動きの流れ

おおまかな取引の流れは以下になります。

1.アドレス作成 → 2.送金 → 3.チャネルを開く → 4.デポジット → 5.支払い → 6.チャネルを閉じる → 7.返金 → 8.取引完了

順に詳細を見ていきます。

### 1.アドレス作成
LNに送金時に送金するためのアドレスを作成します。
実際はLNに送金はできないのでロックしておくためのアドレスを作成します。

```
$ lightning-cli newaddr
{ "address" : "2N9QaKvP83UobTBWArtDGvTK3xPjgVBG75J" }
```

### 2.送金
ビットコインを `1.アドレス作成` で作成したアドレスに送金します。

```
$ bitcoin-cli sendtoaddress 2N9QaKvP83UobTBWArtDGvTK3xPjgVBG75J 0.5
ec729dd57a2d35fca25604bbd076ef8e8cf13a12362d1a14ffb283a962ae07cb
```

[エクスプローラ](https://test-insight.bitpay.com)で確認すると0.5BTCが指定のアドレスに送金されているのがわかります。
<img width="963" alt="スクリーンショット 2018-03-26 6.32.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/173398/bfbe6566-7aea-bea2-2d77-edbbe03189f8.png">

念のためLN側の確認すると50000000satoshi(=0.5BTC)が残高としたることがわかります。Bitcoin側で`2N9QaKvP83UobTBWArtDGvTK3xPjgVBG75J`に0.5BTCロックしつつLN側で同額のアセットを発行して処理をしています。

```
$ lightning-cli listfunds
{ "outputs" : 
	[ 
		{ "txid" : "ec729dd57a2d35fca25604bbd076ef8e8cf13a12362d1a14ffb283a962ae07cb", "output" : 1, "value" : 50000000, "status" : "confirmed" } ], "channels" : 
	[  ] }
```

### 3.チャネルを開く
接続できるノードを探してノードID、IP、ポート番号を取得します。
https://explorer.acinq.co/#/

取得した情報でチャネルを開きます。
何らかの理由で開けない場合はタイムアウトになるようです。

```
$ lightning-cli connect 027e92b4fa1988ae5b0d44b87da80ab8875312fdae6631a8896851bc41857e66aa 133.18.23.0:9735
{ "id" : "027e92b4fa1988ae5b0d44b87da80ab8875312fdae6631a8896851bc41857e66aa" }
```

### 4.デポジット 
ノードIDとデポジット額(単位はsatoshi)を指定してチャネルにデポジットします。


```
$ lightning-cli fundchannel 027e92b4fa1988ae5b0d44b87da80ab8875312fdae6631a8896851bc41857e66aa 10000000
{ "tx" : "02000000000101cb07ae62a983b2ff141a2d36123af18c8eef76d0bb0456a2fc352d7ad59d72ec010000001716001427d2500167072538f7789c43937515d8d48e8c3bffffffff0280969800000000002200206272ed5e4067c9973f2e84e11ee70b0a3771384d669ac78d116b4690dc93f8164f5962020000000016001484ae88d42fbb0034f134638e8bc34169c057e6f602483045022100faca61580ca9573b0c07a51e60b44384a96e79971cdff56c6fc6e897f7a39493022065e24e2a81412ab36693efe73aafe1b4887bd5f98f3ece667488b0d335afbb1f0121036c7ea29ecfdf82367df60fbb78c9a68cbda541dcb5afeb4d2daa22b92d13e8a000000000", "txid" : "89d292c971ca2fb2b89c57156c312a18493e46e5611ff1ff0ee350bb7518f49f", "channel_id" : "9ff41875bb50e30efff11f61e5463e49182a316c15579cb8b22fca71c992d289" }
```

ステータスが`CHANNELD_AWAITING_LOCKIN`の場合はBitcoin側のブロックに取り込まれるのを待っている状態です。

```
$ lightning-cli listpeers
{ "peers" : 
	[ 
		{ "id" : "027e92b4fa1988ae5b0d44b87da80ab8875312fdae6631a8896851bc41857e66aa", "connected" : true, "netaddr" : 
			[ "133.18.23.0:9735" ], "alias" : "TEST1.MUTAGUCHI", "color" : "008000", "channels" : 
			[ 
				{ "state" : "CHANNELD_AWAITING_LOCKIN", "owner" : "lightning_channeld", "channel_id" : "9ff41875bb50e30efff11f61e5463e49182a316c15579cb8b22fca71c992d289", "funding_txid" : "89d292c971ca2fb2b89c57156c312a18493e46e5611ff1ff0ee350bb7518f49f", "msatoshi_to_us" : 10000000000, "msatoshi_total" : 10000000000, "dust_limit_satoshis" : 546, "max_htlc_value_in_flight_msat" : 18446744073709551615, "channel_reserve_satoshis" : 0, "htlc_minimum_msat" : 0, "their_to_self_delay" : 6, "our_to_self_delay" : 6, "to_self_delay" : 6, "max_accepted_htlcs" : 483, "status" : 
					[ "CHANNELD_AWAITING_LOCKIN:Funding needs more confirmations." ] } ] } ] }
```

Bitcoin側のブロックに取り込まれるとステータスが`CHANNELD_NORMAL`になりデポジットが確定します。

```
$ lightning-cli listpeers
{ "peers" : 
	[ 
		{ "id" : "027e92b4fa1988ae5b0d44b87da80ab8875312fdae6631a8896851bc41857e66aa", "connected" : true, "netaddr" : 
			[ "[::ffff:133.18.23.0]:42824" ], "alias" : "TEST1.MUTAGUCHI", "color" : "008000", "channels" : 
			[ 
				{ "state" : "CHANNELD_NORMAL", "owner" : "lightning_channeld", "short_channel_id" : "1289178:668:0", "channel_id" : "9ff41875bb50e30efff11f61e5463e49182a316c15579cb8b22fca71c992d289", "funding_txid" : "89d292c971ca2fb2b89c57156c312a18493e46e5611ff1ff0ee350bb7518f49f", "msatoshi_to_us" : 10000000000, "msatoshi_total" : 10000000000, "dust_limit_satoshis" : 546, "max_htlc_value_in_flight_msat" : 18446744073709551615, "channel_reserve_satoshis" : 0, "htlc_minimum_msat" : 0, "their_to_self_delay" : 6, "our_to_self_delay" : 6, "to_self_delay" : 6, "max_accepted_htlcs" : 483, "status" : 
					[ "CHANNELD_NORMAL:Reconnected, and reestablished.", "CHANNELD_NORMAL:Funding transaction locked." ] } ] } ] }
```

### 5.支払い
支払いで使用するBOLT規格のペイメントコードを取得する。

StarBlocksで購入するモノをカートに入れてチェックアウトする。
https://starblocks.acinq.co/#/

ペイメントコードが表示されるのでコピーする。
支払い処理を実施。

```
$ lightning-cli pay lntb1230n1pdvp3yhpp5d9mtwhl7deg8dd295edgey3naxzc6fug3hxytdmqzh4hfg5pj09sdq0g9c8y6tvgehk7mqcqpxmv0ywcsqan676ef6xvqyhcrymfdqjf6u4qa3vn0q4tgq2q2e09sj3xzpvdzgen0th6z2ssp2llkrzh693r9c05ruzk6ju07c9jylm6qpgaxl4s
{ "id" : 3, "payment_hash" : "6976b75ffe6e5076b545a65a8c9233e9858d27888dcc45b76015eb74a28193cb", "destination" : "027e92b4fa1988ae5b0d44b87da80ab8875312fdae6631a8896851bc41857e66aa", "msatoshi" : 123000, "timestamp" : 1522582695, "created_at" : 1522582695, "status" : "complete", "payment_preimage" : "3b3ea357b77022d3b94a4a96d377ea0b3c64f4bb7ff95cd002a2c1eb5695b78a", "getroute_tries" : 1, "sendpay_tries" : 1, "route" : 
	[ 
		{ "id" : "027e92b4fa1988ae5b0d44b87da80ab8875312fdae6631a8896851bc41857e66aa", "channel" : "1289178:668:0", "msatoshi" : 123000, "delay" : 6 } ], "failures" : 
	[  ] }
```

支払い処理が実施されたか確認する。
completeとなっているので支払い処理は実施されてます。

```
$ lightning-cli listpayments
{ "payments" : 
	[ 
		{ "id" : 1, "payment_hash" : "6976b75ffe6e5076b545a65a8c9233e9858d27888dcc45b76015eb74a28193cb", "destination" : "027e92b4fa1988ae5b0d44b87da80ab8875312fdae6631a8896851bc41857e66aa", "msatoshi" : 123000, "timestamp" : 1522582695, "created_at" : 1522582695, "status" : "complete", "payment_preimage" : "3b3ea357b77022d3b94a4a96d377ea0b3c64f4bb7ff95cd002a2c1eb5695b78a" } ] }
```

### 6.チャネルを閉じる

```
$  lightning-cli close 027e92b4fa1988ae5b0d44b87da80ab8875312fdae6631a8896851bc41857e66aa
{  }
```

クローズされていることを確認する。

```
$ lightning-cli listpeers
{ "peers" : 
	[ 
		{ "id" : "027e92b4fa1988ae5b0d44b87da80ab8875312fdae6631a8896851bc41857e66aa", "connected" : false, "channels" : 
			[ 
				{ "state" : "CLOSINGD_COMPLETE", "short_channel_id" : "1289178:668:0", "channel_id" : "9ff41875bb50e30efff11f61e5463e49182a316c15579cb8b22fca71c992d289", "funding_txid" : "89d292c971ca2fb2b89c57156c312a18493e46e5611ff1ff0ee350bb7518f49f", "msatoshi_to_us" : 9999877000, "msatoshi_total" : 10000000000, "dust_limit_satoshis" : 546, "max_htlc_value_in_flight_msat" : 18446744073709551615, "channel_reserve_satoshis" : 0, "htlc_minimum_msat" : 0, "their_to_self_delay" : 6, "our_to_self_delay" : 6, "to_self_delay" : 6, "max_accepted_htlcs" : 483, "status" :  } ] }
] }
```

### 7.返金

全額`2MwXnASptwmqs9Y1b7jbkuaRM3g16S6eJ3D `に戻します。

```
$ lightning-cli withdraw 2MwXnASptwmqs9Y1b7jbkuaRM3g16S6eJ3D all
{ "tx" : "020000000001019ff41875bb50e30efff11f61e5463e49182a316c15579cb8b22fca71c992d2890100000000ffffffff01295662020000000017a9142f02045c75e651b272bf554deae513cf791a12688702483045022100b9c8e73a4769b985c171f206f5a95033960bea8b6b3ea26e96fd7cf70ad1b8d00220391bcd9c10e1d74caa9f31e8669064a5b645d5c1ddc980d685ca407d70c1adfb012102d2d9af31b985e3f6d4fd6a4d2fb50370dc003a6ba1318324fd5827b77ae3778a00000000", "txid" : "80f7d8d3f3a3784d3d6d7f3dbfdb4b7bbddccd0f65b2f18c5bba705ecf74dbfa" }
```
### 8.取引完了

完了です。