Bitcoin のLightning Network を使ってお買い物しました〜環境構築と支払い方法〜

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">.<a href="https://twitter.com/Blockstream?ref_src=twsrc%5Etfw">@Blockstream</a> launches store accepting <a href="https://twitter.com/hashtag/LightningNetwork?src=hash&amp;ref_src=twsrc%5Etfw">#LightningNetwork</a> payments: <a href="https://t.co/RO4Rvs8RJD">https://t.co/RO4Rvs8RJD</a>. We&#39;ve got a &quot;Don&#39;t Trust. Verify.&quot; t-shirt, a Blockstream <a href="https://twitter.com/hashtag/Satellite?src=hash&amp;ref_src=twsrc%5Etfw">#Satellite</a> sticker, and an &quot;I Got Lightning Working But All I Got Was This Sticker&quot; sticker! ⚡️ <a href="https://twitter.com/hashtag/LightningCharge?src=hash&amp;ref_src=twsrc%5Etfw">#LightningCharge</a> <a href="https://twitter.com/hashtag/Swag?src=hash&amp;ref_src=twsrc%5Etfw">#Swag</a> <a href="https://twitter.com/hashtag/Bitcoin?src=hash&amp;ref_src=twsrc%5Etfw">#Bitcoin</a> <a href="https://t.co/8WVFf0NpT7">pic.twitter.com/8WVFf0NpT7</a></p>&mdash; Blockstream (@Blockstream) <a href="https://twitter.com/Blockstream/status/953457596609921026?ref_src=twsrc%5Etfw">2018年1月17日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>



Blockstream がLightning Network（以下LN）での決済ができるECサイトを立ち上げたというこのtweetを見て居てもたってもいられなくなったので、VPSを借りてLNのノードを立てることにしました。
"Testnet is so boring" ということで、もちろんmainnnetでの送金です。



<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">Disclaimer: c-lightning is not production ready. TorGuard will cover loss of funds when sending us LN payments. Testnet is so boring.</p>&mdash; TorGuard (@TorGuard) <a href="https://twitter.com/TorGuard/status/950414221120081920?ref_src=twsrc%5Etfw">2018年1月8日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


注）LightningNetworkはテスト段階の技術であるため、mainnetでの送金は資金を失う可能性があります。少額で、かつ自己責任でお願い致します。

## 環境構築

### bitcoindのインストール
LNの実装は複数ある（LightningLabsのLNDが最もドキュメントやチュートリアルが充実している気がします）のですが、Blockstreamでの買い物ということで、Blockstreamが開発している[c-lightning](https://github.com/ElementsProject/lightning)を使うことにします。なお、c-lightningを立ち上げるにはbitcoindがインストールされている必要があります。bitcoindのインストール方法について詳しくは他の記事に譲りますが、Ubuntu/Debian系なら以下のコマンドでインストール可能です。

```
$ sudo apt install software-properties-common
$ sudo add-apt-repository ppa:bitcoin/bitcoin
$ sudo apt update && sudo apt install -y bitcoind
```

VPS環境でのインストールなのでbitcoin-qtはインストールしていませんが、デスクトップとかなら入れたほうがわかりやすいと思います。

次に、```~/.bitcoin/bitcoin.conf```を作成して、適当に設定してください（[参考](http://block-chain.jp/tech/bitcoin-conf/)）。次のコマンドでmainnetで起動します。

```
$ bitcoind -daemon
```

ここで、ポートの8332と9735版を開けておくことを忘れないようにしてください。それぞれbitcoind、lightningdが使用します。

また、bitcoindのログを見たい場合には次のようにすると良いでしょう。

```
$ tail -f ~/.bitcoin/debug.log
```

### c-lightningのインストール

githubのリポジトリからcloneしてビルドします。

```
$ sudo apt-get install -y autoconf automake build-essential git libtool libgmp-dev libsqlite3-dev python python3 net-tools
$ git clone https://github.com/ElementsProject/lightning.git
$ cd lightning
$ make
```



## lightningd を立ち上げる
lightningdは以下のコマンドでテストネット上で立ち上げることができます。

```
$ cd ~/lightning
$ lightningd/lightningd --network bitcoin --log-level debug
```

## 他のノードとつながってみる

```cli/lightning-cli connect <ID>```で他のlightningノードと接続することができます。
Blockstreamのノードとつながってみましょう。

```
$ cli/lightning-cli connect 02f6725f9c1c40333b67faea92fd211c183050f28df32cac3f9d69685fe9665432
```

## Funding Transactionを作成&ブロードキャストしてチャンネルを開通する

これで、Blockstream Storeでお買い物をする準備が整いました。さっそくFunding Transactionを作成してみます。

```
$ cli/lightning-cli fundchannel <nodeID> ammount_in_satoshis
```

このtransactionが3承認されるとLNで支払いが可能になります。チャンネルが開通したかをチェックするには、

```
$ cli/lightning-cli getinfo
```

で自分のnodeIDをコピーし、

```
$ cli/lightning-cli listchannels | grep <your_node_id>
```

で自分のノードが含まれるチャンネルが見つかれば、チャンネルが開通したことを確かめられます。
チャンネルが開けていることを確認したら、とうとうLNペイメントです！

## Instant payment

Lightning Networkでの支払いはinvoice-basedなので、[bolt11](https://github.com/lightningnetwork/lightning-rfc/blob/master/11-payment-encoding.md)で定義されたinvoiceを誰かに作ってもらう必要があります。

今回は、Blockstreamでのお買い物なのでBlockstreamが作ってくれます。invoiceを使って次のように支払いましょう。

```
$ cli/lightning-cli pay <invoice>
```

## 最後に

以上です！一瞬で送金されましたね。

c-lightningの他にもLNDなど、他にもLightning Networkノードの実装はありますので、それらもいじったり、関連のライブラリを書いたりしていきたいと思います！

不明な点や間違っているところがあればコメントや[Twitter](https://twitter.com/j0hnta0)で教えてくださると幸いです。