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をビルドする

$ 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 以下になります

$ cd lit
$ ./lit --tn3
PassPhaseを設定&入力
$ cd cmd/lit-af
$ ./lit-af

Bobの起動

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

$ cd lit
$ ./lit -rpcport 9751 -dir $HOME/.lit2 --tn3
PassPhaseを設定&入力
$ cd cmd/lit-af
$ ./lit-af -p 9751 --dir $HOME/.lit2

lit-afの使い方

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

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がコネクションを待ち受ける

alice
lit-af# lis

entered command: lis
listening on ln1av2h4yr5hyvvumy2u5cxkk8cygxn2ya9m5ljjd@:2448

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

bob
lit-af# con ln1av2h4yr5hyvvumy2u5cxkk8cygxn2ya9m5ljjd@:2448

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

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

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必要なのでそれ以上入れる事

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

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

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

alice
lit-af# fund 1 1 1000000 0

entered command: fund 1 1 1000000 0

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

コインを送ってみる

LNで送るには pushコマンドだ

alice
lit-af# push 1 500

entered command: push 1 500
Pushed 500 at state 0

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