亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用 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 關注
  • 214 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號