Avata API 合约服务使用说明
当 Avata API 其它功能无法满足需求时,开发者可通过自定义合约来实现定制的业务逻辑。Avata API 合约服务接口可以帮助开发者在不需要关心私钥托管、Gas 代付的前提下实现对自定义合约的调用。
Avata API 合约服务满足以下需求和场景:
- 简化开发流程:开发者无需关心私钥管理、交易发送等底层技术细节,只需专注于自身业务逻辑的实现;
- 提高安全性:Avata 平台提供链账户密钥和助记词安全托管服务,可根据收到的操作请求使用已托管的密钥进行上链交易签名。
:::note
开发者可以通过 Avata 非托管模式部署合约,结合托管模式通过 Avata 对用户地址进行托管和代付,实现对开发者已部署好的合约的调用。
:::
前置条件
该接口面向智能合约开发者,需要具备一定的智能合约开发经验和基础知识。
使用流程
调用合约和查询合约的区别
- 调用合约,是通过向链上发送交易,执行合约中指定方法的业务逻辑,更新合约中的状态。例:ERC-721 合约中的 mint、transfer 等方法。
- 查询合约,是调用合约中只读的查询方法,查询合约在链上的最新状态。例:ERC-721 合约中的 balanceOf、ownerOf 等方法。
调用合约的过程符合「AVATA API 最佳实践」
合约接口中 data 参数的生成步骤说明
- 获取 ABI: 读取合约的 ABI ,初始化 ABI 对象;
- Pack 计算 data : abi.Pack 中传入合约中的方法名与参数,计算出 hex 字符串,即为 data;
Avata API 与标准合约接口调用流程的区别
对于标准的合约调用,步骤为:
- 构建交易: 包括合约地址、要调用的合约方法、方法参数等;
- 签名交易: 使用发送者的私钥对交易进行签名;
- 发送交易: 将签名的交易发送到网络;
- 交易确认: 等待交易确认,进行上链。
如果使用 Avata API 接口,开发者只需实现步骤 1,步骤 2-4 由 Avata 完成。开发者只需传入 Avata 托管的链账户地址(即「调用合约」接口中的 from 字段),Avata 将会使用该地址的私钥进行签名上链,大大节约了开发者的工作量。
代码示例
以下是调用标准 ERC721 合约,生成 hex data 的 GO 语言代码示例
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
}
ERC721MetaData.ABI:
最后修改时间: 8 个月前