Avata API 合约服务使用说明
1.
2.
备注
前置条件
使用流程
调用合约和查询合约的区别
1.
2.
合约接口中 data 参数的生成步骤说明
1.
2.
Avata API 与标准合约接口调用流程的区别
1.
2.
3.
4.
代码示例
package erc721_test
import (
"log"
"math/big"
"strings"
"testing"
"github.com/ethereum/go-ethereum/accounts/abi"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
)
func Test_CallContract(t *testing.T) {
// 获取 abi
abi := GetERC721Abi()
// 生成调用合约 hex data,以 ERC721 中 mint 方法为例
packData, err := abi.Pack("mint", []interface{}{
common.HexToAddress("0x"), // 接收者地址
big.NewInt(1), // token ID
}...)
if err != nil {
t.Fatal(err)
}
t.Logf("解析器设置 mint 编码数据:%s", hexutil.Encode(packData))
}
func Test_QueryContract(t *testing.T) {
// 获取 abi
abi := GetERC721Abi()
// 生成查询合约 hex data,以 ERC721 中 ownerOf 方法为例
packData, err := abi.Pack("ownerOf", []interface{}{
big.NewInt(1), // token ID
}...)
if err != nil {
t.Fatal(err)
}
t.Logf("解析器查询 ownerOf 编码数据:%s", hexutil.Encode(packData))
// 解析查询合约结果数据
resultHex := "0x" // Avata API 「查询合约」接口返回的数据
resultBytes, err := hexutil.Decode(resultHex)
if err != nil {
t.Fatal(err)
}
resultData, err := abi.Methods["ownerOf"].Outputs.Unpack(resultBytes)
if err != nil {
t.Fatal(err)
}
t.Logf("解析结果为:%v", resultData)
}
func GetERC721Abi() abi.ABI {
// 初始化 abi
// ERC721MetaData.ABI 来源于 ERC721.go 中的 ABI 编码
erc721Abi, err := abi.JSON(strings.NewReader(ERC721MetaData.ABI))
if err != nil {
log.Fatal(err)
}
return erc721Abi
}
修改于 2024-03-15 09:15:14