gpt4 book ai didi

go - 如何使用 Golang 正确发送 RPC 调用以获取智能合约所有者?

转载 作者:IT王子 更新时间:2023-10-29 01:56:40 25 4
gpt4 key购买 nike

更新

由于我无法使用此问题中的方法实现此目的,因此我创建了自己的库来做同样的事情 ( link )。它不依赖于 go-ethereum 包,而是使用普通的 net/http 包来做 JSON RPC 请求。

我仍然很想知道我在下面的方法中做错了什么。


定义:

  • owner = public 契约(Contract)中的变量,类型为 address
  • contract = 具有owner
  • 的智能合约

这是获取契约(Contract)所有者的 curl 请求。我设法得到了主人。 ( JSON RPC docs )

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 of type main.response 错误。 ( go-ethereum code that I use )

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 方法的情况下解决这个具体问题。

最佳答案

您可以使用 go-ethereum/ethclient 最好地解决问题:

package main

import (
"context"
"log"

"github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/ethclient"
)

func main() {
client, _ := ethclient.Dial("https://mainnet.infura.io")
defer client.Close()

contractAddr := common.HexToAddress("0xCc13Fc627EFfd6E35D2D2706Ea3C4D7396c610ea")
callMsg := ethereum.CallMsg{
To: &contractAddr,
Data: common.FromHex("0x8da5cb5b"),
}

res, err := client.CallContract(context.Background(), callMsg, nil)
if err != nil {
log.Fatalf("Error calling contract: %v", err)
}
log.Printf("Owner: %s", common.BytesToAddress(res).Hex())
}

关于go - 如何使用 Golang 正确发送 RPC 调用以获取智能合约所有者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53237759/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com