RPC-Aufruf an lnd

Ich möchte mit golang eine einfache "getinfo"-Anfrage an lnd senden. Ich habe derzeit

package main

import (
    "fmt"
    "log"
    "net/rpc"
)

func main() {
    client, err := rpc.Dial("tcp", "localhost:10009")
    if err != nil {
        log.Fatal("dialing:", err)
    }

    type Rep struct {
        identity_pubkey       string
        alias                 string
        num_pending_channels  uint32
        num_active_channels   uint32
        num_peers             uint32
        block_height          uint32
        block_hash            string
        synced_to_chain       bool
        testnet               bool
        chains                string
        uris                  string
        best_header_timestamp int64
    }

    var reply Rep

    args := ""

    err = client.Call("getinfo", args, &reply)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(reply)
}

aber ich bekomme2018/04/12 23:41:09 unexpected EOF

Antworten (1)

Lnd verwendet

Hier ist ein Beispielcode zum Herstellen einer Verbindung mit lnd und zum Ausführen einer getinfo-Anfrage. Es wird davon ausgegangen, dass Sie Makronen verwenden. Möglicherweise müssen Sie die richtigen Pfade für das tls-Zertifikat und die Makronendatei einfügen.

package main

import (
    "context"
    "fmt"
    "github.com/davecgh/go-spew/spew"
    "github.com/lightningnetwork/lnd/lnrpc"
    "github.com/lightningnetwork/lnd/macaroons"
    "google.golang.org/grpc"
    "google.golang.org/grpc/credentials"
    "gopkg.in/macaroon.v2"
    "io/ioutil"
    "os/user"
    "path"
)

func main() {
    usr, err := user.Current()
    if err != nil {
        fmt.Println("Cannot get current user:", err)
        return
    }
    fmt.Println("The user home directory: " + usr.HomeDir)
    tlsCertPath := path.Join(usr.HomeDir, ".lnd/tls.cert")
    macaroonPath := path.Join(usr.HomeDir, ".lnd/admin.macaroon")

    tlsCreds, err := credentials.NewClientTLSFromFile(tlsCertPath, "")
    if err != nil {
        fmt.Println("Cannot get node tls credentials", err)
        return
    }

    macaroonBytes, err := ioutil.ReadFile(macaroonPath)
    if err != nil {
        fmt.Println("Cannot read macaroon file", err)
        return
    }

    mac := &macaroon.Macaroon{}
    if err = mac.UnmarshalBinary(macaroonBytes); err != nil {
        fmt.Println("Cannot unmarshal macaroon", err)
        return
    }

    opts := []grpc.DialOption{
        grpc.WithTransportCredentials(tlsCreds),
        grpc.WithBlock(),
        grpc.WithPerRPCCredentials(macaroons.NewMacaroonCredential(mac)),
    }

    conn, err := grpc.Dial("localhost:10009", opts...)
    if err != nil {
        fmt.Println("cannot dial to lnd", err)
        return
    }
    client := lnrpc.NewLightningClient(conn)

    ctx := context.Background()
    getInfoResp, err := client.GetInfo(ctx, &lnrpc.GetInfoRequest{})
    if err != nil {
        fmt.Println("Cannot get info from node:", err)
        return
    }
    spew.Dump(getInfoResp)
}

Es gibt eine großartige Ressource über lnd https://dev.lightning.community/

Hoffe das hilft.

Vielen Dank, aber ich erhalte einen ./client.go:49:61: cannot use mac (type *"gopkg.in/macaroon.v2".Macaroon) as type *"github.com/lightningnetwork/lnd/vendor/gopkg.in/macaroon.v2".Macaroon in argument to macaroons.NewMacaroonCredential ./client.go:57:36: cannot use conn (type *"google.golang.org/grpc".ClientConn) as type *"github.com/lightningnetwork/lnd/vendor/google.golang.org/grpc".ClientConn in argument to lnrpc.NewLightningClientFehler. Ich werde es für den Moment als beantwortet markieren :)
Benutzt du dep? Anscheinend haben Sie google.golang.org/grpc nicht zu Ihren Abhängigkeiten hinzugefügt. Einige Bibliotheken werden also vom Anbieter übernommen, andere nicht.
Mit dep hat es funktioniert, ich verstehe nicht ganz warum, aber es funktioniert, danke.