c-lightningでlightningステッカー買う

Masashi Nakane
暗号通貨 とセキュリティ
17 min readMay 28, 2018

Update:さきほど、BlockStreamストアにいって確認したら、Tシャツ等は売り切れだったので、残念だが、買うのはステッカーだけの様子。

前回の手順で、無事、bitcoindのブロックチェーンが同期されただろうか。確認方法は、復習になるが、blockchaininfochainflyerで最新のブロック番号を確認しつつ、以下のコマンドで自分のブロックチェーンのブロック高を見ればよい。

bitcoin-cli getblockchaininfo

エクスプローラーのと同じブロック高になっていれば、OK. そして、lightningdは、起動しているだろうか?

lightningd --network=bitcoin --log-level=debug

このままだと、lightningdは、Terminalを終了すると同時に終了してしまう。引き続き走り続けるようにしたいので、一旦終了しよう。終了する方法は TerminalをアクティブにしてCtrl-c だ。そして、もう一度起動する。が、すこしコマンドを変え以下のようにデーモンとして実行する。これで、Terminalを閉じてもlightningdは、走っている状態となる。

lightningd --network=bitcoin --daemon

起動したら、lightningdの状態を確認する。Bitcoindとうまく接続してるか、見えているか同期されたlightningdのブロック高を確認しよう。

lightning-cli getinfo

これで、MainetにつながったBitcoindとlightningdが、フルノードとして、無事動き始めた。(上記では、実行のタイミングが、ちがうので、ブロック高にずれがある。)

さあ、ここからが、本番だ。Payment チャネルを開き、BlockStream storeから買い物をする。慎重にいこう。こまかく手順を書く。

以降は、自分のBitcoinウオレットに10ドル分(ステッカー2ドル×2 +ステッカーの送料3ドル+ マイニングフィー 50セント×4)のBitcoinを用意してから始めよう。(くどいようだが、以降は自己責任で、よろしく。あとマイニングフィーは、非常にすくない50セントで攻めてみるので、1回目のコンファメーションまでに、多分、数時間かかることを想定している。)

手順は、こうだ。

  1. Payment チャネルのためにロックするBitcoinのFund用のBitcoinアドレスをlightnin-cliで作成
  2. 自分のBitcoinウオレットから上記lightningのFund用アドレスへ通常の方法で、Bitcoinを送金
  3. 他のLightningノードに接続し、Paymentチャネルを開きFundingトランザクションを作成
  4. BlockStream Storeで、買いたいステッカーをカートにいれ、決済画面で決済BOLT11アドレスをコピーし、lightning-cliでBOLT11アドレスに対し支払を行う
  5. あまりのBitcoinがあれば、自分のウオレットのアドレスへ引き出し、Paymentチャネルを閉じる(Confirmationトランザクションを作成)

さあ、10ドル分のBitcoinをうしなっても、かまわない覚悟はできたかな。できたら、先にすすもう。

1. Lightning Funding用のBitcoinアドレス作成

コマンドラインから、lightning-cliで以下のコマンドを実行しlightning Funding用アドレスを作成する。これはただのBitcoinアドレス(P2SH,publickey to script hashと言われるタイプのアドレス)だ。lightningdが秘密鍵を把握しているので、lightningdは、Paymentチャネル用のトランザクションを相手のLightingノードと協力して作成することができる。

lightning-cli newaddr

Paymentチャネル用のBitcoin Mainnetトランザクションには、2つあり、チャネル開始時と、終了時のものだ。相手側のLightingノードと、マルチシグとタイムロックの入ったBitcoinトランザクションを作成することで、お互いに騙せない状態にするためのものだ。詳細は別の記事で書くが、ここでは、接続する2つのノードが協働で、お金をだしあって、2人が同意しないと、資金がうごかせない、チートできないため(Trustless)のトランザクションだとおもってほしい。Fundingトランザクションと呼ばれる。その後は、お互いの残高がゼロ以下ならないなら、いくらでも、資金の移動が可能になり、Bitcoin上のトランザクションは不要だ(=オフライントランザクション)。そして、最後、マルチシグにロックされた資金を引き上げたいとき、Paymentチャネルを閉じるためのトランザクションを協働で作成する。お互いの最終の残高になるようなトランザクションを、作成し、マルチシグのアドレスから、それぞれのノードのFundingアドレスにお金がもどり終わりになる。(lightningのWhite Paperでは、10ページ目の上の絵)これは、Commitmentトランザクションと呼ばれる。

2.ウオレットからlightningのFund用アドレスへ送金

筆者のウオレットは、Android用のGreen Addressウオレットアプリだ。コマンドラインで作成したlightning Fundアドレスを、自分あてにfacebook messangerで送り、スマホ上で、Green Adressウオレットへコピペして10ドル分のBitcoinをFundingアドレスへ送金する。

50セントを手数料にしたいが、GreenAddressでの手数料の入力は、 satoshi/kByteなので、単位の変換が必要となった。ウオレットに、よっては、high/mid/low priorityなどの選択肢しかないかもしない、その場合は、多分50セントより多分、高くなるが、Lowを選べばよい。)

筆者の場合の計算方法は、こうだ。普通の1 input +2 outputのトランザクションは、サイズは、150~200byteである。いまの時点で, 0.5 USD = 0.063 millii-BTC だ。結果、指定したいレートは、31500 (satoshi/kByte)となる。手書きの計算だが、以下に付ける。

丁度の30,000 satoshi/kbyteにして、トランザクションを入力し、

Bitcoin Mainnetにブロードキャストした。計算も、あっていたようだ。約50銭との手数料になった。

そして、手数料が低いので、最初のコンファメーションは、20分くらいまった。(アメリカ太平洋時間 PDTで 6:33AMに送信し、20分後、すなわち、2つ目のブロックでコンファームされた。)興味があれば、トランザクションをこちらのブロックチェーンエクスプローラーで見てくれ。

次に、lignting-cliでfunding用アドレスの残高を確認する。

lightning-cli listfunds

無事に1.2mBTC=0.0012BTC= $9.5届いたのが確認できた。

3.他のLightningノードに、接続し、Paymentチャネルを開く

lightning networkは、Bitcoin networkと同様に、他のノードにつながないことには、なにもできない、今回の場合、Blockstreamのストアに、つながっているノードに接続しないといけない。もちろん、自分のノードとBlockstreamノードの間には、いくつノードが間にはいってもかまわない。

では、どうやって、ノードをさがせばいいか。このサイトに行ってみよう。

世界中の危険しらず(Reckless)なBitcoinerが、lightningノードやlightningウオレットをセットアップし、BitcoinをFundしPaymentチャネルを、開いているのが見える。いまの時点でノード数は、見える限りで、2000を超えている。それぞれの線がPaymentチャネルを表し、6000を超えている。

例えば、たくさんのチャネルをもつ”lightning.scot”に接続してみよう。

上記のサイトで、”lightning.scot”で検索し、画面左下に出てくるURIをコピーしよう。そして、以下のコマンド実行して、接続する。(以下は、一行のコマンド。アットマークは、スペースに置き換える。)

lightning-cli connect   02a456b816697c6b8407ee2176475d74b790a96143bc30e896e8bf7a8852a8b637 206.189.124.227 9735

この時点では、”gossiping”という接続状態であり、まだ、Paymentチャネルは、実質開いていない。両者の間で、お金を出し合い、マルチシグとタイムロックをかけたトランザクションを作成したということが、Paymentチャネルが開いたということになる。(なので、一時的にネットワーク的な接続がきれていたとしても、Paymentチャネルは、開いているといえる。)

いまの接続状態はこのコマンドで確認できる。

lightning-cli listpeers

Paymentチャネルを開くコマンドは、次になる。

lightning-cli fundchannel <node_id> <amount_in_satoshis>

が、その前に、手数料の設定をしよう。安くいく作戦なので。

bitcoin-cli settxfee 0.00023

これは、手数料を0.00023BTC/kbyte (=0.23mBTC/kbyte)すなわちfundingアドレスに送った時のレートより少しすくなめだ。マルチシグのトランザクションは、300kbyteほどになるので、レートをすこし低めに設定し、丁度50セントになるように、してみる。50セントは、書いている時点で約、7000 satoshiになる。そのfee分を引いた金額をfundする。

120125 - 7000 =  113125

ではこの金額でPaymentチャネルオープン!。

lightning-cli fundchannel 02a456b816697c6b8407ee2176475d74b790a96143bc30e896e8bf7a8852a8b637 113125

無事、Payment Channelが開いたようだ。listpeersコマンドで、状態を確認しよう。”CHANNELD_AWAITING_LOCKIN”という状態になっている。(手数料を考慮にいれないと、資金不足”Not afford”エラーが発生する。)

どういういみか,c-lightning のREADMEをみてみよう。

Fundingトランザクションのコンファメーション待ちという状態のようだ。では、エクスプローラーで、トランザクションを確認してみる。

しかし、どこでミスったのか、手数料が狙った50セント(7000satoshi)でなく。822satoshi=5セントになってしまった。しかしながら、安い手数料にかかわらず、トランザクションを作成/ブロードキャストして、1つ目のブロックで処理してもらえた。ラッキーなのか、そもそも手数料は安くていいのかは不明だが。(Fundingトランザクションのマイニングフィーの計算方法については、まだ不明、後日また研究し報告することにする。)

このFundingトランザクションは、ReadMeにあるように、ある程度のコンファメーションを経ないと使えないようになっている。

コンファメーション1つ目で、チャネルが利用可能に。3コンファメーションで、状態が “CHANNELD NORMAL”に、6コンファメーションで、publicプロパティがtrueとなり、他のノードからも見えるようになる。

4. BlockStream Storeで、ステッカーを買う

さて、ここが一番楽しいところだ。lightningで買い物をしよう。なにはともあれ、https://store.blockstream.com/shop/ へいってみよう。

筆者は、”Don’t Trust.Verify” “Lightning Sticker”を買ってみる。それぞれ、$1.99 と送料が世界一律の$3.00の合計$6.98 =(今の瞬間のレートで、0.959mBTC)。

住所を英語で入力し。Proceedボタンをおしてみよう。

BOLT11のコードがでてくるので、コピ-する。payコマンドの後ろにペースとし、支払を行う。

pay コマンドは、こうだ。(1行のコマンド)

lightning-cli pay lnbc960958750p1pdscxqlpp5t2kwmke0c2hvjp29lw84csgeeyg57mwscp228lgcf92r7hh9y90qdy5gfkx7cmtwd68yetpd5s9xar0wfjn5gpk9cunsgz42dzzqen0wgsygmmwya6zq4rjw4ehgt3q2ejhy6tx0yhzqtfq2d6xjcmtv4ezq7pqxysxzmnyypxxjemgw3hxjmn8ypfhg6trddjhygrcyqcscqpg2jdwvtqeyqn5263r7m420flfu8fym8efxc9tx9nyjysu5ty74gvhxf3grv2ancc4ec2pgs4jan7tkamp8ew53vz5tu7gjnxcgt0ne2gqg52pxu

数秒後、BlockStream Storeの画面が、変わり、注文完了のページになれば、完了したことになる。メールも届いているとおもう。

メールがきていれば、もう、あとは、ステッカーが届くのを待つだけとなる。

5.チャネルを閉じ資金を回収する。

さて、買い物が終わったので、チャネルを閉じてみよう。実際には、毎回買い物をするたびに、チャネルを閉じるというのでは、2つのコンファーメーションの待ち時間や、手数料がかかるので、Lightningをつかうメリットはない。ある程度の金額を入れておいて、少額の買い物をするプリペイドカードみたいにつかってもいいし、どこかのFunding追加サービスからFundの追加をして、開いたチャネルは、しばらく(1年とか?)置いておくのがユースケースだろう。

まずは、残高をみてみよう。spendableは、15660 satoshiだ。これを、Paymentチャネルを閉じることで、すなわち、Commitmentトランザクションを作ることで、引き出したい。

Paymentチャネルを閉じるコマンドは、closeコマンドで、引数には、相手のノードのidをセットする。

lightning-cli close 02a456b816697c6b8407ee2176475d74b790a96143bc30e896e8bf7a8852a8b637

listpeersしてみると、Paymentチャネルを閉じるトランザクションを協働で作成し、今ファーメーション待ちの状態だ。

出力されたトランザクションIDを使って、Commitment トランザクションをエクスプローラーで見てみよう。

Commitmentトランジションが、無事協働で作成され、コンファメーションも、されたようだ。listfundsコマンドで、いまのfundingアドレスの残高をみてみよう。余りが、もどってきた。

詳細は、こうなる。96332 satoshiは、ブロックストリームへいくもの(96095satoshi)と、lightning networkのノードへのlightning手数料(237satoshi)の合計となる。手数料1451satoshiは、チャネル上でReserveされていた1132satoshiと、あまりの額から318satoshi引かれたものの合計だ。すなわち もどってくるのは、spendable 15660satoshi-318satoshi=15342satoshiになる。

では、最後にロックしたFund全部、引き上げる。そのために、自分の普段使いのウオレットのアドレスを用意しよう。withdraw コマンドは、引数に、あて先のBitcoinアドレスと金額もしくは”all”で、全額引き出せる。

lightning-cli withdraw 3Bi6YJW3WWNtjz2ifY2xSJeg81442rF4DF all

listfundsすると、なにもFundingアドレスには残っていない。そして、あまった、Bitcoinは、無事、ウオレットにもどってきたとおもう。

トータルすると、9.5USD分のBitcoinを送金するところから、始まり、2枚のステッカーと送料で、7ドルほど使い、1ドル45セント分のBitcoinが戻ってきた。

おめでとう!これで、一連の流れはおわりだ。是非、たのしみに、ステッカーがくるのをまってほしい。そして、スマホの裏や、ラップトップの表面にはって、自己満足に浸ろう!興味があれば、自分のBitcoinの数字の動きも追ってみよう。

--

--