REST API [.Net]でLNDにアクセスする
こんにちはかずみょんです。Lighning network node立ち上げて1か月がたちました。ぼちぼちルーティングはしてますが多分赤字です。たまたまノードを登録したサイトでキャパシティー増やすコンテストやっててなんと3位(^^)v。15万satもらって赤字穴埋しましたw。1か月たって分かったことは「ルーティング収入>リバランスコスト」でないと延々とお金減ってくってことですね(わかるの遅すぎ)。
さて話はさておき自分のLightning network nodeの環境はwindowsなのでこの環境でいろいろできるといいなと思いLNDのREST API Referenceを参考にしてFeeを制御したりリバランスしたりするアプリをつくろうかなと思い少しREST APIをVB.netで動かしてみました。今回はノード情報の取得、チャンネルポリシーのsampleコード載せときます。
1.動作環境
OS: Windows 10 / Visual Studio 2022
surfaceGoにこれ↓入れましたw(重い。。)
Target Framework : .NET 6.0
・LNDのREST API のReferenceはこちら↓↓
https://api.lightning.community/#lnd-rest-api-reference
2.getinfo(v1/getinfo):ノード情報取得
Httpclientのgetメソッドでアクセスする。
Public Function getInfo() As node_info
Dim endpointUri As Uri = New Uri(Form1.uri_path) 'https://localhost:8080
Dim macaroon_path As String = Form1.macaroon_path 'C:\Users\<user>\AppData\Local\Lnd\data\chain\bitcoin\mainnet\
Dim node_info As node_info = New node_info
Dim method As String = "GET"
Dim path As String = "v1/getinfo"
generateMacaroon() 'macaroonのデータ生成
Dim request As HttpRequestMessage = New HttpRequestMessage(New HttpMethod(method), path) ’requestデータをつくる
request.Headers.Add("Grpc-Metadata-macaroon", macaroon_metadata) 'headerに生成したmacaroonのデータ加える
'request.Timeout
Dim task1 = Task.Run(Async Function()
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls Or SecurityProtocolType.Tls11 Or SecurityProtocolType.Tls12
Dim client As HttpClient = New HttpClient()
client.BaseAddress = endpointUri
client.Timeout = TimeSpan.FromMinutes(1)
Dim message As HttpResponseMessage = Await (client.SendAsync(request))
Dim response_json As String = Await (message.Content.ReadAsStringAsync())
Try
Dim JsonObject As Object = JsonConvert.DeserializeObject(response_json) ’JSONに変換
node_info.AliasName = CType(JsonObject("alias"), String)
node_info.PubKey = CType(JsonObject("identity_pubkey"), String)
node_info.LndVersion = CType(JsonObject("version"), String)
node_info.Chain = CType(JsonObject("chains")(0)("chain"), String)
node_info.Network = CType(JsonObject("chains")(0)("network"), String)
'Console.WriteLine("sucssess")
Catch ex As Exception
Console.WriteLine("error")
End Try
End Function)
Try
task1.Wait()
Catch ex As Exception
Console.WriteLine("error")
End Try
Return node_info
End Function
Private Sub generateMacaroon() ’macaroonのデータを作る
Dim fs As New FileStream(Form1.macaroon_path + "admin.macaroon", FileMode.Open, FileAccess.Read) ’admin.macaroonをバイナリーで読み出し
Dim fileSize As Integer = CInt(fs.Length)
Dim buf(fileSize - 1) As Byte
Dim readSize As Integer = fs.Read(buf, 0, fs.Length)
For i = 0 To buf.Count - 1
macaroon_metadata += buf(i).ToString("x2")
Next
End Sub
このままだとSSL通信が確立できないというエラーがでてしまったのでWindows上で以下を実行。
1.[スタート]→[ファイル名を指定して実行]をクリックし、名前の枠に「certmgr.msc」と入力して[OK]をクリック
2.[信頼されたルート証明機関]の証明書フォルダを右クリックして、「すべてのタスク」から「インポート」を選択
3.LNDのディレクトリ下のtls.certファイルをインポート
これやったら通信できました。。
3.ChannelPolicy(v1/chanpolicy):チャンネルのFee等の変更
Httpclientのpostメソッドでアクセスする。
Public Function postChannelPolicy(ByVal chanPointID As String, ByVal feeBase As String, ByVal feeRate As String, ByVal HTLC_max As String, ByVal LockTime As String) As String
Dim res As String = ""
Dim endpointUri As Uri = New Uri(Form1.uri_path) 'https://localhost:8080
Dim macaroon_path As String = Form1.macaroon_path 'C:\Users\<user>\AppData\Local\Lnd\data\chain\bitcoin\mainnet\
Dim method As String = "POST"
Dim path As String = "v1/chanpolicy"
Dim parameters As Dictionary(Of String, Object) = New Dictionary(Of String, Object)
Dim lnrpcChanPoint As Dictionary(Of String, Object) = New Dictionary(Of String, Object)
Dim tmpStr As String() = chanPointID.Split(":") ’チャンネルポイントIDとindex部分と分割
Dim index As Int64 = CType(tmpStr(1), Int64)
lnrpcChanPoint.Add("funding_txid_str", tmpStr(0)) ’チャンネルポイントID設定
lnrpcChanPoint.Add("output_index", index) ’チャンネルポイントIDのindex部分設定
parameters.Add("chan_point", lnrpcChanPoint) ’channel point設定
parameters.Add("base_fee_msat", feeBase) ’Fee Base設定
parameters.Add("fee_rate_ppm", CType(feeRate, Int64)) ’Fee Rate設定
parameters.Add("time_lock_delta", CType(LockTime, Int64)) ’LockTime設定
parameters.Add("max_htlc_msat", HTLC_max) ’MAX_HTL設定
Dim body As String = JsonConvert.SerializeObject(parameters, Formatting.Indented)
generateMacaroon() 'macaroonデータ生成(getinfoと同じ)
Dim request As HttpRequestMessage = New HttpRequestMessage(New HttpMethod(method), path)
Dim content As StringContent = New StringContent(body)
content.Headers.ContentType = New MediaTypeHeaderValue("application/json")
request.Headers.Add("Grpc-Metadata-macaroon", macaroon_metadata)
request.Content = content
'request.Timeout
Dim task1 = Task.Run(Async Function()
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls Or SecurityProtocolType.Tls11 Or SecurityProtocolType.Tls12
Dim client As HttpClient = New HttpClient()
client.BaseAddress = endpointUri
client.Timeout = TimeSpan.FromMinutes(5)
Dim message As HttpResponseMessage = Await (client.SendAsync(request))
Dim response_json As String = Await (message.Content.ReadAsStringAsync())
res = response_json
Try
Dim JsonObject As Object = JsonConvert.DeserializeObject(response_json)
'Console.WriteLine("sucssess")
Catch ex As Exception
Console.WriteLine("error")
End Try
End Function)
Try
task1.Wait()
Catch ex As Exception
Console.WriteLine("error")
End Try
Return res
End Function
4.Windowsフォームで表示
まだつくり途中ですがWindowsフォームでGetinfoで取得した情報を表示させてみました。
こんな感じでREST APIのPrimitive部分を充実させていってUI付ければ、いろいろ効率化できるような気がします。まあ今時VBでWindowsのアプリ開発する人はいないかな、結構簡単にできるんですけどね。。
ではまた。
LNDg的なネーミングにしてみました(笑)