Litを使いLightningNetworkをテストする【仮想通貨】

#始めに
仮想通貨に関して勉強しなければならないと思うので勉強開始しています
まず目標としてはMonacoinに LightningNetworkをくっつけようと思います
仮想通貨に関してなんとなく知識がある人向けといった内容です

大雑把にLightningNetworkを説明すると
仮想通貨のチェーン上で取引を行うと

* 取引の確定が一瞬である
* 手数料がほとんどかからないので少額取引きをたくさん行える
* 仮想通貨のチェーン外（オフチェーン）なので、DBが大きくならない

などなど、各種メリットがある


#LightningNetworkライブラリ
LightningNetwork（以下LN）の実装は色々ある
有名なものに LND、Lit、Lightningd、eclair、plasma、akiko pay 等があるらしい
この中でどれが人気なのかわからないが、今回は Litでテストしてみる

Litの特徴としては　SPV(simplified payment verification)ノードという事
仮想通貨クライアントではフルノードをダウンロードする必要があるものと、不要なものとあるが
この不要なものがSPVノードである
LNにおいてSPVノードというものが何であるかは、今後調べるとして　Litの特徴である
またGo言語で書かれていて　比較的評価の高いライブラリである

#インストール
私は Windows10で WSL上のbashで作業を行いましたが、だいたいの環境で実行できると思います

##Go
Goをインストール。色んなページあるのでそれを見て下さい（投げやり
特殊な事はありません

##Lit
GitHubページはここ
https://github.com/mit-dci/lit

ソースをダウンロードし go buildしていきます
若干Readmeの記載で上手くいかなかったのでその部分を補う

ソースは go getで取ってこれる。もちろん git cloneして持ってきても良い
ソースのlitディレクトリに入り go buildを行い litをコンパイル
このlitがLNの本体になる
go build した時に、ライブラリが不足している場合は、それらを全部 go get hogehoge すればよい
次に　クライアントをビルドする。今回はコマンドラインインタフェースを使う
cmd/lit-af に入り go buildを行い　CUIをビルドする

```bash
$ go get github.com/mit-dci/lit
$ cd $GOPATH/src/github.com/mit-dci/lit
$ cd cmd/lit-af
$ go build
```

これで　litとlit-afが作成できた

#Litを起動
AliceとBobが　LightningNetworkを使ってマイクロペイメントを行います
ターミナルを4つ使用します
Aliceのlitサーバと lit-afクライアント
Bobのlitサーバと lit-afクライアント

##Aliceの起動
今回はBitcoinのtestnetを使います
Aliceはデフォルト設定で起動させます
ユーザデータは ~/.lit 以下になります

```bash
$ cd lit
$ ./lit --tn3
PassPhaseを設定＆入力
```

```bash
$ cd cmd/lit-af
$ ./lit-af
```



##Bobの起動
Bobはポート番号とユーザディレクトリを指定します
~/.lit2 に保存します

```bash
$ cd lit
$ ./lit -rpcport 9751 -dir $HOME/.lit2 --tn3
PassPhaseを設定＆入力
```

```bash
$ cd cmd/lit-af
$ ./lit-af -p 9751 --dir $HOME/.lit2
```

#lit-afの使い方
lit-afのコマンドラインが出ているが、そこで

```bash
lit-af# help
```

とすると、コマンドヘルプが出る
この中で今回使うものは

ls: 状態表示
lis: 接続を受け付ける
con:　接続する
say: ピアにメッセージを送る
sweep: トランザクションを整理（まだよくわかってない）
fund: ピアに対して LNチャンネルを作成する＆コインをLNにあずける
push: ピアに対してコインを送る(LN)
send: 他のアドレスに対してコインを送る（オンチェイン）

##状態表示
lsコマンドで状態表示される

Peers :接続しているピア一覧

Channels: 接続しているLNチャンネル
cap bal h state data pkh 等色々情報あるが、詳細はよくわからない
おそらく capがチャンネル内の合計コイン数（satoshi）、balが自分のsatoshi　

Txos:　トランザクション一覧

Listening Ports: 自分が待ち受けしているポート

Addresses: コインのアドレス。　最初のがLNでつかうSegwitアドレス。かっこ内が通常アドレス

Type: コインタイプと思われる
Sync Height:　わからない
FeeRate: 気にしない
Utxo: よくわからない。持っているコインの総計？ 通常アドレス
WitConf:　よくわからない。Segwitアドレスのコイン？
Channel: チャンネル内のコイン

##ピア接続
まずAliceがコネクションを待ち受ける

```bash:alice
lit-af# lis

entered command: lis
listening on ln1av2h4yr5hyvvumy2u5cxkk8cygxn2ya9m5ljjd@:2448
```

今回のLNアドレスは ln1av2h4yr5hyvvumy2u5cxkk8cygxn2ya9m5ljjd@:2448　である
Bobはそのアドレスに接続する

```bash:bob
lit-af# con ln1av2h4yr5hyvvumy2u5cxkk8cygxn2ya9m5ljjd@:2448

entered command: con ln1av2h4yr5hyvvumy2u5cxkk8cygxn2ya9m5ljjd@:2448
connected to peer ln1av2h4yr5hyvvumy2u5cxkk8cygxn2ya9m5ljjd@:2448
```

これで Peer1番にお互い接続された。
メッセージ送ってみよう

```bash:alice
lit-af# say 1 Hello Bob
```

Bob側に Hello Bobが表示されたとおもう（なぜか 1単語だと送れない）


#LNを開く
今のままだとコインを持っていない。LNを開くには 100万satoshi必要なので
Bitcoin faucet testnet3  等で検索し、Aliceにコインを振り込もう
振り込みアドレスは　カッコ内の方を使う。
また　使い終わったら faucetサイトにsendコマンドで戻してあげると喜ばれる

必要額を送ったら、1時間ほど待てば入っているはず（testnetはブロック生成が遅い・・）
入金終了後にAliceのアドレスから Segwitアドレスにsendし、LNで使えるようにする
Segwitアドレスは　Addressのかっこの前のアドレスである
LNのチャンネルを開くには最低 1Msatoshi必要なのでそれ以上入れる事

```bash:alice
lit-af# send  aliceのSegwitアドレス 1000000
```

これも　ブロック生成されるまで1時間ほどかかる・・


LN用のコインが手に入ったのでLNを開くことができる！
チャンネルを開くには  fundコマンドを使う
Readmeでは引数が間違えているので注意。 

```bash:alice
lit-af# fund 1 1 1000000 0

entered command: fund 1 1 1000000 0
```

これで　1000000satoshiを入れたチャンネルが出来た


#コインを送ってみる
LNで送るには　pushコマンドだ

```bash:alice
lit-af# push 1 500

entered command: push 1 500
Pushed 500 at state 0
```

このように少額の送金を無料で即座に無料で行う事ができる
1satoshiから送る事が出来るよ！