REST API [.Net]でLNDにアクセスする

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のアプリ開発する人はいないかな、結構簡単にできるんですけどね。。

ではまた。

Remaining : 0 characters / 0 images
1,000

Sign up / Continue after login

Related stories

Writer

Share

Popular stories

DEXアービトラージ自動化への道(序)

649

UNISWAP(V2) テストネットRopstenでETHからDAIの交換をしてみる!

451

UNISWAP SDK(V2)をいじってみる!

283