Aktualisierung 12.11.2018
Jemand teilte eine sehr nahe Lösung zu dem, wonach ich hier suchte .
Aktualisierung 10. November 2018
Da ich dies mit dem Ansatz in dieser Frage nicht erreichen kann, habe ich meine eigene Bibliothek erstellt, um dasselbe zu tun ( Link ). Es ist nicht auf das go-ethereum-Paket angewiesen, sondern verwendet das normale net/http
Paket, um JSON-RPC-Anforderungen auszuführen.
Ich würde immer noch gerne wissen, was ich bei meinem Ansatz unten falsch gemacht habe.
Definitionen :
public
Variable im Vertrag mit address
TypDies ist die Curl-Anforderung, um den Eigentümer eines Vertrags zu erhalten. Ich habe es geschafft, den Besitzer zu bekommen.
curl localhost:8545 -X POST \
--header 'Content-type: application/json' \
--data '{"jsonrpc":"2.0", "method":"eth_call", "params":[{"to": "0x_MY_CONTRACT_ADDRESS", "data": "0x8da5cb5b"}, "latest"], "id":1}'
{"jsonrpc":"2.0","id":1,"result":"0x000000000000000000000000_OWNER"}
Aber wenn ich versuche, es in Golang zu replizieren (Code unten), bekomme ich json: Zeichenfolge kann nicht in den Go-Wert des Typs main.response entpackt werden .
package main
import (
"fmt"
"log"
"os"
"github.com/ethereum/go-ethereum/rpc"
)
func main() {
client, err := rpc.DialHTTP(os.Getenv("RPC_SERVER"))
if err != nil {
log.Fatal(err)
}
defer client.Close()
type request struct {
To string `json:"to"`
Data string `json:"data"`
}
type response struct {
Result string
}
req := request{"0x_MY_CONTRACT_ADDRESS", "0x8da5cb5b"}
var resp response
if err := client.Call(&resp, "eth_call", req, "latest"); err != nil {
log.Fatal(err)
}
fmt.Printf("%v\n", resp)
}
Was habe ich hier verpasst?
Erwartetes Ergebnis:
Adresse im Zeichenfolgenformat. Z.B0x3ab17372b25154400738C04B04f755321bB5a94b
P/S — Ich kenne abigen und ich weiß, dass es besser und einfacher ist, dies mit abigen zu tun. Aber ich versuche, dieses spezielle Problem zu lösen, ohne die abigen-Methode zu verwenden.
Anstatt
type response struct {
Result string
}
Übergeben Sie einfach die Ergebniszeichenfolge
var result string
if err := client.Call(&result, "eth_call", req, "latest")
und analysieren Sie die Adresse
owner := common.HexToAddress(result)
fmt.Printf("%s\n", owner.Hex())
Vollständiger Code
package main
import (
"fmt"
"log"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/rpc"
)
func main() {
client, err := rpc.DialHTTP("https://mainnet.infura.io")
if err != nil {
log.Fatal(err)
}
defer client.Close()
type request struct {
To string `json:"to"`
Data string `json:"data"`
}
var result string
req := request{"0xcc13fc627effd6e35d2d2706ea3c4d7396c610ea", "0x8da5cb5b"}
if err := client.Call(&result, "eth_call", req, "latest"); err != nil {
log.Fatal(err)
}
owner := common.HexToAddress(result)
fmt.Printf("%s\n", owner.Hex()) // 0x281017b4E914b79371d62518b17693B36c7a221e
}