Wie kann ich mit Go programmgesteuert mit dem JSON-RPC-Server kommunizieren?

Gibt es eine Möglichkeit, direkt in Go mit dem JSON-RPC-Server zu interagieren?

Folgendes habe ich versucht:

  1. Starten des RPC-Servers mit "geth --rpc"

  2. Ausführen des folgenden Codes:

    package main
    
    import (
        "fmt"
    
        "github.com/ethereum/go-ethereum/rpc"
        "github.com/ethereum/go-ethereum/rpc/comms"
    )
    
    func main() {
    
        client, err := comms.ClientFromEndpoint("rpc:127.0.0.1", 0)
        if err != nil {
            panic(err)
        }
    
        xeth := rpc.NewXeth(client)
    
        type p interface {
        }
    
        response := make(map[string]interface{}, 0)
        var params []interface{}
        response, err = xeth.Call("eth_gasPrice", params)
    
        if err != nil {
            panic(err)
        }
    
        fmt.Println(response)
    }
    

Die Verbindung scheint zu funktionieren, aber ich erhalte folgende Fehlermeldung:

panic: interface conversion: interface {} is string, not map[string]interface {}

goroutine 1 [running]:
panic(0x48c3d00, 0xc820098380)
    /usr/local/go/src/runtime/panic.go:481 +0x3e6
github.com/ethereum/go-ethereum/rpc.(*Xeth).Call(0xc8201bdc80, 0x49ee5f0, 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
    /Users/tim/Documents/go_workspace/src/github.com/ethereum/go-ethereum/rpc/xeth.go:72 +0x4dc
main.main()
    /Users/tim/Documents/go_workspace/src/eth_test/main.go:23 +0x12e
exit status 2

Wenn ich hier die „Call“-Methode ändere: https://github.com/ethereum/go-ethereum/blob/master/rpc/xeth.go , kann ich die Typzusicherung auf den richtigen Typ ändern und erhalte das richtige Ergebnis der Rücken.

Abgesehen davon sagen die Kommentare in der verlinkten Datei (xeth.go), dass es sich um eine Schnittstelle zu einem entfernten Knoten handelt, ich möchte jedoch eine Schnittstelle zu einem lokalen Knoten.

Ich dachte mir, dass es möglich sein muss, den RPC-Server (der sonst mit "geth --rpc" auf der Konsole gestartet wird) erstens rein programmgesteuert zu starten, da der Konsolenbefehl schließlich Go-Methoden aufruft und zweitens sollte es möglich sein, RPC zu senden Anfragen mit GO.

Was mache ich hier falsch?

Ich habe den Code getestet und denke, dass es einen Fehler in xeth.go gibt, habe aber keine Problemumgehung ausgearbeitet, und wie in @makevoidder Antwort von würde ich einfach eine andere JSON-RPC-Client-Bibliothek verwenden, während ich darauf warte, dass xeth.go vorhanden ist Fest. Warten auf Antwort von karalabe@githubaka .@Péter Szilágyi
Vielen Dank! Ich dachte schon, dass es ein Bug sein könnte. Ist das Problem nicht, dass der Typ der Antwort nicht immer map[string]interface {} ist? Ich weiß nicht, ob Sie diese Art von Behauptung aufstellen können.

Antworten (2)

Sie können sich einen vereinfachten Ansatz ansehen, den wir für Etherapis gewählt haben: https://github.com/etherapis/etherapis/blob/master/etherapis/geth/api.go

Es ist jedoch ein RPC-Client in Arbeit, der auch bereits Abonnements unterstützen sollte. Ich bin mir jedoch nicht sicher, wann Felix seine PR damit eröffnen wird.

Ich habe keine Lösung für Ihren Code, weil ich mich nicht mit der Verwendung der Go-Ethereum-Interna für RPC-Aufrufe befasst habe, aber ich habe eine sehr kleine RPC-Client-Bibliothek erstellt, die Sie auf meinem Github finden können, die gorequest und simplejson verwendet ( Ich bin kein Go-Experte ;) )

Es gibt auch die "Hauptdatei", in der ich angefangen habe, die Aufrufe zu verpacken, indem ich zu einer besser definierten API gegangen bin. Sie können hier überprüfen, wie die einfachste Methode implementiert wird. Ich rufe im Grunde nur die Mini-Bibliothek mit der richtigen Methode und den richtigen Argumenten auf in In diesem Fall keine, wandeln Sie den Wert um und geben Sie ihn zurück.

Auch dies wird Ihnen den Code geben und sofort funktionieren, wenn Ihr Geth das --rpc aktiviert hat und es auf dem Standardport ist:

go get github.com/makevoid/web3_go

cd in das Verzeichnis und dann ausführen:

go run web3_go.go

Hoffe, das hilft, sagen Sie mir, wenn Sie Probleme beim Ausführen haben.

Vielen Dank!! Ich glaube, ich hätte am Ende so etwas geschrieben, sieht so aus, als hätte es jemand schon getan :D