Обновление
Поскольку я не могу достичь этого, используя подход, описанный в этом вопросе, я создал свою собственную библиотеку, чтобы сделать то же самое ( ссылка ). Он не зависит от пакета go-ethereum, а использует обычный пакет net/http
для выполнения запроса JSON RPC.
Я все еще люблю знать, что я сделал неправильно в моем подходе ниже.
Определения
- владелец =
public
переменная в контракте с address
тип
- контракт = смарт-контракт с владельцем
Это прокручиваемый запрос на получение владельца контракта. Мне удалось получить владельца. ( JSON RPC документы )
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"}
Но когда я пытаюсь скопировать его в Golang (код ниже), я получаю json: не могу распаковать строку в значение Go типа main.response error. ( код go-ethereum, который я использую )
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)
}
Что мне здесь не хватало?
Ожидаемый результат:
Адрес в строковом формате. Например. 0x3ab17372b25154400738C04B04f755321bB5a94b
P / S - мне известно о abigen , и я знаю, что лучше и проще сделать это, используя abigen. Но я пытаюсь решить эту конкретную проблему, не используя abigen метод.