Обновить
Поскольку я не могу добиться этого, используя подход, описанный в этом вопросе, я создал свою собственную библиотеку, чтобы сделать то же самое (ссылка). Он не полагается на пакет go-ethereum, но использует обычный пакет net/http
для выполнения запроса JSON RPC.
Мне все еще нравится знать, что я сделал не так в моем подходе, приведенном ниже.
Определения:
- владелец =
public
переменная в контракте с типомaddress
- контракт = смарт-контракт, у которого есть владелец
Это запрос curl для получения владельца контракта. Мне удалось заполучить хозяина. (документы 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: cannot unmarshal string into Go value type 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.