ホームページ >バックエンド開発 >Golang >go は Solidity コントラクトの新しいメソッドを呼び出します

go は Solidity コントラクトの新しいメソッドを呼び出します

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-31 13:34:10433ブラウズ

go は Solidity コントラクトの新しいメソッドを呼び出します

私は先週グループチャットで、solana コントラクトを呼び出すために書いた golang について自慢していました。 Go が堅牢性を呼び出す方法を学びたいと言う人もいます。リンクに投稿した ABI を使用しないでコントラクトを呼び出す方法を見てみましたが、これらは Python、ethers、solidity で記述されていましたが、実際には記述できませんでした。

そのグループの人々は、chatgpt を使用すると、abigen を使用して go パッケージを生成し、コントラクト メソッドを呼び出すことになると述べました。
そこで、abigen を使用してコントラクトを呼び出す go パッケージを生成する必要がない方法について説明します。

私は今でも Xiaodao のフォーク バージョンを使用するのが好きです (https://github.com/daog1/ethgo)
フォークから、umbracle/ethgo
利点については説明しません。コードを自分で読んでください。

当初、コントラクト呼び出しには abi ファイルの生成が必要でしたが、その後、私が見た最も初期のメソッドは ethers で

と呼ばれるものでした。

人間が判読できる ABI

エーテルは次のように書かれます:

// 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 はエーテルのフォークに少し似ているため、人間が判読できる 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
私のフォークバージョンに問題が見つかった場合は、教えてください。
私は通常、Human-Readable ABI を使用して呼び出しを行っていますが、abigen は面倒で間違いやすいです。

以上がgo は Solidity コントラクトの新しいメソッドを呼び出しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。