首頁 >後端開發 >Golang >go呼叫solidity合約新方法

go呼叫solidity合約新方法

Linda Hamilton
Linda Hamilton原創
2024-12-31 13:34:10426瀏覽

go呼叫solidity合約新方法

上週在群聊吹牛,吹吹我寫的golang 調用solana合約的東西。有人說他要學go呼叫solidity的方法。我看了看我在登鏈的無abi調用合約的方法,寫的python的,ethers的,solidity的,就是沒寫golang的,確實可以寫寫。

那個群組裡人都說用chatgpt都會用abigen的方式產生go包的方式來呼叫合約方法。
所以我講種不需要使用abigen產生go包的方法來呼叫合約。

我還是喜歡用我的曉道fork版,https://github.com/daog1/ethgo
fork自,umbracle/ethgo
好處我不講,自己讀程式碼。

合約呼叫最早都是需要abi檔案產生的方式,後面還是有了更簡單方式,最早我是ethers裡面看到叫

A Human-Readable ABI

ethers是這麼寫的:

// A Human-Readable ABI; for interacting with the contract, we
// must include any fragment we wish to use
const abi = [
    // Read-Only Functions
    "function balanceOf(address owner) view returns (uint256)",
    "function decimals() view returns (uint8)",
    "function symbol() view returns (string)",

    // Authenticated Functions
    "function transfer(address to, uint amount) returns (bool)",

    // Events
    "event Transfer(address indexed from, address indexed to, uint amount)"
];

// This can be an address or an ENS name
const address = "0x70ff5c5B1Ad0533eAA5489e0D5Ea01485d530674";

// Read-Only; By connecting to a Provider, allows:
// - Any constant function
// - Querying Filters
// - Populating Unsigned Transactions for non-constant methods
// - Estimating Gas for non-constant (as an anonymous sender)
// - Static Calling non-constant methods (as anonymous sender)
const erc20 = new ethers.Contract(address, abi, provider);

// Read-Write; By connecting to a Signer, allows:
// - Everything from Read-Only (except as Signer, not anonymous)
// - Sending transactions for non-constant functions
const erc20_rw = new ethers.Contract(address, abi, signer);

ethgo 有點fork ethers的意思,所以也支援Human-Readable ABI 的方式。
程式碼這麼寫

package main

import (
    "fmt"
    "math/big"

    "github.com/umbracle/ethgo"
    "github.com/umbracle/ethgo/abi"
    "github.com/umbracle/ethgo/contract"
    "github.com/umbracle/ethgo/jsonrpc"
)

func handleErr(err error) {
    if err != nil {
        panic(err)
    }
}

func main() {
    var functions = []string{
        "function totalSupply() view returns (uint256)",  //Human-Readable ABI 
    }

    abiContract, err := abi.NewABIFromList(functions)
    handleErr(err)

    // Matic token
    addr := ethgo.HexToAddress("0x7d1afa7b718fb893db30a3abc0cfc608aacfebb0") 

    client, err := jsonrpc.NewClient("https://eth.llamarpc.com")
    handleErr(err)

    c := contract.NewContract(addr, abiContract, contract.WithJsonRPC(client.Eth()))
    res, err := c.Call("totalSupply", ethgo.Latest)  //call totalSupply
    handleErr(err)

    fmt.Printf("TotalSupply: %s", res["0"].(*big.Int))
}

原版程式碼在這裡:https://github.com/daog1/ethgo/blob/main/examples/contract-call-basic.go
我的那個fork 版,如果你發現什麼問題,可以跟我說。
我通常用Human-Readable ABI 的方式調用,abigen這種太麻煩了,容易搞錯。

以上是go呼叫solidity合約新方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn