Communicating with Lightning Network Daemon using gRPC

Shunta Shirai
Jun 23 · 12 min read

Lnd(Lightning Network Daemon)を操作するインターフェースについて

Lightning Networkを組み込んだApplicationであるLappsでは、通常のアプリケーション構成(左側)と比較して以下のような構成(右側)となります。

https://medium.com/lightwork/lightning-network-development-for-modern-applications-e4dd012dac82

gRPCを使ってlndを操作してみる

gRPCとは

既に様々なサービスで利用されているgRPCですが、RESTと比較すると、まだしっかりと触ったことがない人もいるのではないでしょうか。

https://www.grpc.io/docs/guides/
  • 双方向ストリーミングなどのHTTP/2を用いた効率的なネットワークリソースの活用が可能
  • protoファイルを定義するだけでクライアント・サーバーの実装を様々な言語で自動生成出来る
  • バイナリ形式のシリアライズフォーマットであるprotocol buffersで通信を行うためJSONやXMLと比較して通信速度が早い

gRPCクライアントを作成する

ここからは実際にgRPCをインストールして、lndを操作してみます。

# ディレクトリの作成を行い作業ディレクトリに移動する
$ mkdir ln-grpc
$ cd ln-grpc
# Gemfileの雛形を作成
$ bundle initg
----Gemfile----# frozen_string_literal: true
source "https://rubygems.org"
git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
gem 'grpc'
gem 'grpc-tools'
---------------
$ bundle install --path vendor/bundleFetching gem metadata from https://rubygems.org/.........
Resolving dependencies...
Using bundler 1.17.2
Fetching google-protobuf 3.8.0 (universal-darwin)
Installing google-protobuf 3.8.0 (universal-darwin)
Fetching googleapis-common-protos-types 1.0.4
Installing googleapis-common-protos-types 1.0.4
Fetching grpc 1.21.0 (universal-darwin)
Installing grpc 1.21.0 (universal-darwin)
Fetching grpc-tools 1.21.0
Installing grpc-tools 1.21.0
Bundle complete! 2 Gemfile dependencies, 5 gems now installed.
Bundled gems are installed into `./vendor/bundle`
$ git clone https://github.com/googleapis/googleapis.gitCloning into 'googleapis'...
remote: Enumerating objects: 116, done.
remote: Counting objects: 100% (116/116), done.
remote: Compressing objects: 100% (82/82), done.
remote: Total 123042 (delta 53), reused 90 (delta 31), pack-reused 122926
Receiving objects: 100% (123042/123042), 134.65 MiB | 14.57 MiB/s, done.
Resolving deltas: 100% (111143/111143), done.
$ curl -o rpc.proto -s https://raw.githubusercontent.com/lightningnetwork/lnd/master/lnrpc/rpc.proto$ bundle exec grpc_tools_ruby_protoc --proto_path googleapis:. --ruby_out=. --grpc_out=. rpc.proto
  • rpc_services_pb.rb

gRPCクライアントを使ってlndを操作してみる

--no-macaroonsオプションを設定しlocalhost:10009でlndを起動しておく

# ファイルを作成し、以下のコードを記述する---- get_wallet_balance.rb ----#!/usr/bin/env ruby$:.unshift(File.dirname(__FILE__))
require "bundler/setup"
require 'grpc'
require 'rpc_services_pb'
# Due to updated ECDSA generated tls.cert we need to let gprc know that
# we need to use that cipher suite otherwise there will be a handhsake
# error when we communicate with the lnd rpc server.
ENV['GRPC_SSL_CIPHER_SUITES'] = "HIGH+ECDSA"
certificate = File.read(File.expand_path("~/Library/Application Support/Lnd/tls.cert"))
credentials = GRPC::Core::ChannelCredentials.new(certificate)
stub = Lnrpc::Lightning::Stub.new('127.0.0.1:10009', credentials)
response = stub.wallet_balance(Lnrpc::WalletBalanceRequest.new())
puts "Total balance: #{response.total_balance}"
-------------------------------
$ ruby get_wallet_balance.rbTotal balance: 2952553
# ファイルを作成し、以下のコードを記述する---- subscribe_invoice.rb ----#!/usr/bin/env ruby$:.unshift(File.dirname(__FILE__))require "bundler/setup"
require 'grpc'
require 'rpc_services_pb'
ENV['GRPC_SSL_CIPHER_SUITES'] = "HIGH+ECDSA"certificate = File.read(File.expand_path("~/Library/Application Support/Lnd/tls.cert"))
credentials = GRPC::Core::ChannelCredentials.new(certificate)
stub = Lnrpc::Lightning::Stub.new('127.0.0.1:10009', credentials)
stub.subscribe_invoices(Lnrpc::InvoiceSubscription.new) do |invoice|
puts invoice.inspect
end
------------------------------
$ ruby subscribe_invoice.rb# invoiceを発行したり支払いが行われると結果をストリーミング通信で受け取ることが出来る
$ lncli addinvoice --amt=590
{
"r_hash": <R_HASH>,
"pay_req": <PAY_REQ>
}
$ lncli sendpayment --pay_req=<PAY_REQ># subscribe_invoice.rbを実行しているコンソールで支払いを確認できる

まとめ

lndのリポジトリにある以下のドキュメントには、各言語でのgRPCの使用方法や応用が記載されています。https://github.com/lightningnetwork/lnd/tree/master/docs/grpc

お知らせ

■HashHubでは入居者募集中です!
HashHubは、ブロックチェーン業界で働いている人のためのコワーキングスペースを運営しています。ご利用をご検討の方は、下記のWEBサイトからお問い合わせください。また、最新情報はTwitterで発信中です。

Blockchain Engineer Blog

This Blog is for all Blockchain Engineer

    Shunta Shirai

    Written by

    Blockchain Engineer Blog

    This Blog is for all Blockchain Engineer