LightningNetworkを使ってみる(lnd編)


はじめに

LightningNetworkはlnd社のlndを使用します。
lndは2018年07月15日時点で最新のv0.4.2-betaを使用してます。

流れ

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

Bitcoinフルノードの立ち上げ

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

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

lndの立ち上げ

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

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

lndの動きの流れ

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

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

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

1.アドレス作成

LNに送金時に送金するためのアドレスを作成します。

$ lncli newaddress np2wkh
{
    "address": "2NB5YBxYTBsTTkuBscf6ymsn7u8K7VKnWdW"
}

2.送金

作成したアドレスに0.5BTCを送金する。

$ bitcoin-cli sendtoaddress 2NB5YBxYTBsTTkuBscf6ymsn7u8K7VKnWdW 0.5
0a4fe2544ea1346d1242edd210ac25cc0720f44e21e4a5c847fe12ecbd4f0521

トランザクションが未承認のときはunconfirmed_balanceに送金額が表示される。

 lncli walletbalance
{
    "total_balance": "50000000",
    "confirmed_balance": "0",
    "unconfirmed_balance": "50000000"
}

エクスプローラで送金が確認できたらウォレットで残高を確認する。
50000000satoshi(0.5BTC)が確認できます。

$ lncli walletbalance
{
    "total_balance": "50000000",
    "confirmed_balance": "50000000",
    "unconfirmed_balance": "0"
}

3.チャネルをはる

どことチャネルを開くかわからない場合は以下より探してみます。
https://1ml.com/testnet/node?order=capacity

赤枠の部分をコピーして貼り付けます。

チャネルをはる。

$ lncli connect 038863cf8ab91046230f561cd5b386cbff8309fa02e3f0c3ed161a3aeb64a643b9@180.181.208.42:9735
{

}

4.デポジットする

開いたチャネルにデポジットします。

$ lncli openchannel 038863cf8ab91046230f561cd5b386cbff8309fa02e3f0c3ed161a3aeb64a643b9 10000000
{
    "funding_txid": "ad601b1b66292bf2fb7c191db5dc80520fa517962e8a9bd074c25473f486bd4f"
}

pending_open_channelsに上のデポジットがあります。

$ lncli pendingchannels
{
    "total_limbo_balance": "0",
    "pending_open_channels": [
        {
            "channel": {
                "remote_node_pub": "038863cf8ab91046230f561cd5b386cbff8309fa02e3f0c3ed161a3aeb64a643b9",
                "channel_point": "ad601b1b66292bf2fb7c191db5dc80520fa517962e8a9bd074c25473f486bd4f:0",
                "capacity": "10000000",
                "local_balance": "9999819",
                "remote_balance": "0"
            },
            "confirmation_height": 0,
            "commit_fee": "181",
            "commit_weight": "600",
            "fee_per_kw": "250"
        }
    ],
    "pending_closing_channels": [
    ],
    "pending_force_closing_channels": [
    ],
    "waiting_close_channels": [
    ]
}

デポジットされてないのでチャネルはまだ開かれてません。

$ lncli listchannels
{
    "channels": [
    ]
}

funding_txidad601b1b66292bf2fb7c191db5dc80520fa517962e8a9bd074c25473f486bd4fをエクスプローラで調べて送金が終わったらpending_open_channelsから消えて以下のようになります。

$ lncli pendingchannels
{
    "total_limbo_balance": "0",
    "pending_open_channels": [
    ],
    "pending_closing_channels": [
    ],
    "pending_force_closing_channels": [
    ],
    "waiting_close_channels": [
    ]
}

そしてチャネルが開きました。

$ lncli listchannels
{
    "channels": [
        {
            "active": true,
            "remote_pubkey": "038863cf8ab91046230f561cd5b386cbff8309fa02e3f0c3ed161a3aeb64a643b9",
            "channel_point": "ad601b1b66292bf2fb7c191db5dc80520fa517962e8a9bd074c25473f486bd4f:0",
            "chan_id": "1489706314323263488",
            "capacity": "10000000",
            "local_balance": "9999819",
            "remote_balance": "0",
            "commit_fee": "181",
            "commit_weight": "600",
            "fee_per_kw": "250",
            "unsettled_balance": "0",
            "total_satoshis_sent": "0",
            "total_satoshis_received": "0",
            "num_updates": "0",
            "pending_htlcs": [
            ],
            "csv_delay": 1201,
            "private": false
        }
    ]
}

手数料を引いた分がチャネルにデポジットされています。

$ lncli channelbalance
{
    "balance": "0",
    "pending_open_balance": "9999819"
}

そしてウォレットはXXXXXX

$ lncli walletbalance
{
    "total_balance": "40000000",
    "confirmed_balance": "1858",
    "unconfirmed_balance": "0"
}

5.支払い

Starblocksで支払いをしてみます。
以下よりペイメントコードを取得して支払い処理をします。
https://starblocks.acinq.co

$ lncli payinvoice lntb19u1pd48n9npp5e3w9l6fv3xrgks90mgh7lc5xzj0udfxvhlepwf8kje3vd27spxdqdp8xys9xcmpd3sjqsmgd9czq3njv9c8qatrvd5kumccqp2yzp6lpkz8j3xhxanarllspd2r6spq2y4f6dy5svvvcsnlwz5alkpp2esu8r67m6awx0urzmeffjxxcyt9rrrvug77zsv2tfuuq533jgqzcv3vh
{
    "payment_error": "",
    "payment_preimage": "dab7ff92e6ac03143e645f4f36a1358292c049aa5ee81fe14610113f6b1a92fa",
    "payment_route": {
        "total_time_lock": 1355186,
        "total_fees": 1,
        "total_amt": 1901,
        "hops": [
            {
                "chan_id": 1489706314323263488,
                "chan_capacity": 9899819,
                "amt_to_forward": 1900,
                "fee": 1,
                "expiry": 1355042,
                "amt_to_forward_msat": 1900168,
                "fee_msat": 1001
            },
            {
                "chan_id": 1484456146219892736,
                "chan_capacity": 15900000,
                "amt_to_forward": 1900,
                "expiry": 1354898,
                "amt_to_forward_msat": 1900000,
                "fee_msat": 168
            },
            {
                "chan_id": 1488731047529938945,
                "chan_capacity": 10490000,
                "amt_to_forward": 1900,
                "expiry": 1354898,
                "amt_to_forward_msat": 1900000
            }
        ],
        "total_fees_msat": 1169,
        "total_amt_msat": 1901169
    }
}

ペイメントコードをデコードすると詳細が確認できます。

$ lncli decodepayreq lntb19u1pd48n9npp5e3w9l6fv3xrgks90mgh7lc5xzj0udfxvhlepwf8kje3vd27spxdqdp8xys9xcmpd3sjqsmgd9czq3njv9c8qatrvd5kumccqp2yzp6lpkz8j3xhxanarllspd2r6spq2y4f6dy5svvvcsnlwz5alkpp2esu8r67m6awx0urzmeffjxxcyt9rrrvug77zsv2tfuuq533jgqzcv3vh
{
    "destination": "03933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134",
    "payment_hash": "cc5c5fe92c89868b40afda2fefe286149fc6a4ccbff21724f69662c6abd0099a",
    "num_satoshis": "1900",
    "timestamp": "1532218547",
    "expiry": "3600",
    "description": "1 Scala Chip Frappuccino",
    "description_hash": "",
    "fallback_addr": "",
    "cltv_expiry": "10",
    "route_hints": [
    ]
}

6.チャネルを閉じる

channel_pointを指定して開いていたチャネルを閉じます。

$ lncli closechannel ad601b1b66292bf2fb7c191db5dc80520fa517962e8a9bd074c25473f486bd4f
{
    "closing_txid": "1d4d945c66ebd242565fcacc423432d3788a7a8d3af5d38598f9e708d1036ff2"
}

全てのチャネルをまとめて閉じる場合はこちら。

lncli closeallchannels
{
    "remote_pub_key": "03a9565d005199f7e3e1eac381804bb5b9b8333ea5b0f15305a4903c2cb6e45fe2",
    "channel_point": "39dc04c7eb5cf2c3e7d1c6721d81a0df49f606d907cf6c8753c76879d3d987bf:1",
    "closing_txid": "4f6a3fd16b081ffd6f21d718ad6858aff68cb0f481ca33cf94a9fbb5edc2256b",
    "error": ""
}

7.返金

オンチェーンへ送金します。
全額返金といった指定が見当たらないので手数料を考慮して金額を指定します。

$ lncli sendcoins 2MsNwbrBzY8gykHt8SLqce9mibuUCGx2LnP 44095569
{
    "txid": "256cb8b023acb31d669cbfd57b81d7fd6b7b7b72d4b57d5b9ade2b0fce37ef76"
}

8.取引完了

オンチェーン側で着金していることを確認します。

$ bitcoin-cli getwalletinfo
{
  "walletname": "wallet.dat",
  "walletversion": 159900,
  "balance": 1.29094877,
  "unconfirmed_balance": 0.00000000,
  "immature_balance": 0.00000000,
  "txcount": 4,
  "keypoololdest": 1532098568,
  "keypoolsize": 1000,
  "keypoolsize_hd_internal": 999,
  "paytxfee": 0.00000000,
  "hdmasterkeyid": "e5a8a941f936f83b2db68c038ecd51dedef6319c"
}