为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
ITMISS 2023-05-08 15:26:45
更新由于我无法使用此问题中的方法实现此目的,因此我创建了自己的库来做同样的事情(链接)。它不依赖 go-ethereum 包,而是使用普通net/http包来做 JSON RPC 请求。我仍然很想知道我在下面的方法中做错了什么。释义:owner =与类型public约定的变量addresscontract = 拥有所有者的智能合约这是获取合同所有者的 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 of type main.response错误。(我使用的 go-ethereum 代码)package mainimport (    "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)}我在这里错过了什么?预期结果:字符串格式的地址。例如0x3ab17372b25154400738C04B04f755321bB5a94bP/S — 我知道abigen,而且我知道使用 abigen 更好更容易地做到这一点。但我试图在不使用 abigen 方法的情况下解决这个具体问题。
查看完整描述

3 回答

?
慕森王

TA贡献1777条经验 获得超3个赞

您可以使用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())

}


查看完整回答
反对 回复 2023-05-08
?
慕容708150

TA贡献1831条经验 获得超4个赞

如果您查看客户端库代码,您会看到 JSON RPC 响应对象已经被反汇编,失败时返回错误,或者解析的实际结果

然而,解析器已经解包了包含的“结果”字段。你的类型仍然想做额外的解包:

type response struct {
    Result string}

删除外部结构,只需将字符串指针传递给 的client.Call第一个参数。


查看完整回答
反对 回复 2023-05-08
?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

您的响应结构不显示响应的 json 具有的数据


尝试这个


type response struct {

    Jsonrpc string `json:"jsonrpc"`

    ID      int    `json:"id"`

    Result  string `json:"result"`

}


查看完整回答
反对 回复 2023-05-08
  • 3 回答
  • 0 关注
  • 105 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信