Core LightningのAPIを呼んでみよう
Core Lightning の API をgolang で呼び出してみよう。
一昔前までは c-lightning という名称でしたが、今では Core Lightning となっています。略称は CLN なので、以下 CLN と記載します。
ちなみにLNDで getinfo した例の記事・コードもあります。
- LND — kotlinでgetinfo
- LND — golangでgetinfo(gist)
- LND — JavaScriptでgetinfo(gist)
CLN は基本的にJSON-RPC2.0 APIでアクセスするようにできています。gRPC と REST も標準で付いていますがデフォルトではオフになっていました。
Bitcoin Core も JSON-RPC だったので同じ要領でまずは curl
を使ってアクセスしようとしたのですが、ネットワークではなくUNIX socket になっているためかうまくいきませんでした。適当にプログラムを書くと動いたので curl
の使い方がうまくなかっただけかもしれません。
CLN の JSON-RPC 用ライブラリは標準で Python用と Rust用があるのですが、私はどちらにも慣れていないので同じリポジトリにあった glightning
という golang用のライブラリを使いました。
CLN ではプラグインとクライアントアプリが似たような感じで作ることができるようになっていて、クライアントアプリにいくつかメソッドを追加するだけでプラグインとして使えるようでした。
CLN を動かさないと API が呼び出せないので、今回は Polar を使って regtest の環境を作りました。
bob と dave が CLN です。今回は bob の getinfo
を呼び出してみましょう。
bob ノードと JSON-RPC をするための RPCファイルのパスが分からないといけないのですが、Polar のプロパティ画面から取得できます。
下の方に「TLS Cert」などのファイルがありますが、同じディレクトリの中に lightning-rpc
というファイルがあり、それが RPCファイルになります(設定ファイル config
の rpc-file
がそのファイル名なので RPCファイルと呼びました)。
呼び出すコードは難しいものではないです。今回サンプルを作っています。
getinfo.go
の dirRPC
にディレクトリ名を書いてください。文字列は .../lightningd/regtest
のようになるでしょう。go run .
で実行できます。
$ go run .
{"id":"0248b4faf96048926000d8622ea4ae0af863ca752fcd1d5a392bcd32529e0303e6","alias":"bob","color":"0248b4","num_peers":3,"num_pending_channels":0,"num_active_channels":2,"num_inactive_channels":0,"address":[],"binding":[{"type":"ipv4","address":"172.19.0.4","port":19846,"socket":"","service":{"type":"","address":"","port":0},"name":""},{"type":"ipv4","address":"0.0.0.0","port":9735,"socket":"","service":{"type":"","address":"","port":0},"name":""}],"version":"v23.05.2","blockheight":177,"network":"regtest","fees_collected_msat":54,"lightning-dir":"/home/clightning/.lightning/regtest"}
一つ一つ書くのが面倒だったので JSON に変換して文字列を出力しています。
注意点としては、 glightning
の戻り値は JSON-RPC での戻り値と同じではないということです。例えば以下が getinfo
の仕様ですが、「RETURN VALUE」にある値がすべて表示されているわけではないことが分かります。
今回 JSON で出力しているのは golang の構造体を JSON に変換しただけで、JSON-RPC の戻り値を出力しているわけではありません。 glightning.GetInfo()
の戻り値は NodeInfo
で、構造体のタグとJSON-RPCの戻り値が一致したものだけ取得できていることになるでしょう。他のパラメータがほしければ glightning
を自分で拡張するのが簡単かもしれません。
おわりに
かなり久々にCLNを触りましたが、同じ Lightning Network のノードでもパラメータなどの文化が違うという感想です。いろいろ触ってみらんといかんですな。