Core LightningのAPIを呼んでみよう

uenohiro
Nayuta エンジニアブログ
7 min readNov 18, 2023

--

Core Lightning の API をgolang で呼び出してみよう。

一昔前までは c-lightning という名称でしたが、今では Core Lightning となっています。略称は CLN なので、以下 CLN と記載します。

ちなみにLNDで getinfo した例の記事・コードもあります。

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ファイルになります(設定ファイル configrpc-fileがそのファイル名なので RPCファイルと呼びました)。

呼び出すコードは難しいものではないです。今回サンプルを作っています。

getinfo.godirRPC にディレクトリ名を書いてください。文字列は .../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 のノードでもパラメータなどの文化が違うという感想です。いろいろ触ってみらんといかんですな。

--

--