私は先週グループチャットで、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 サイトの他の関連記事を参照してください。