跳转到内容

Go SDK:获取数据

可使用 Aptos 客户端和多种辅助函数获取链上数据。具体来说,参考文档中列出的许多函数都会获取链上数据,例如 AccountAccountResourcesTransactions

以下示例展示如何获取应用中可能需要的常见数据:

client, err := aptos.NewClient(aptos.DevnetConfig)
if err != nil {
panic("Failed to create client:" + err.Error())
}
address := aptos.AccountAddress{}
err := address.ParseStringRelaxed("0x123")
if err != nil {
panic("Failed to parse address:" + err.Error())
}
accountInfo, err := client.Account(address)
resources, err := client.AccountResources(address)
transactions, err := client.Transactions()

Aptos 客户端开箱即用,既可查询全节点中的网络数据,也可查询包含聚合和增强数据的 Indexer API。若要为 Indexer API 数据使用自定义查询,可按如下方式使用 client.QueryIndexer()

var out []CoinBalance
var q struct {
Current_coin_balances []struct {
CoinType string `graphql:"coin_type"`
Amount uint64
OwnerAddress string `graphql:"owner_address"`
} `graphql:"current_coin_balances(where: {owner_address: {_eq: $address}})"`
}
variables := map[string]any{
"address": address.StringLong(),
}
err := ic.Query(&q, variables)
if err != nil {
return nil, err
}
for _, coin := range q.Current_coin_balances {
out = append(out, CoinBalance{
CoinType: coin.CoinType,
Amount: coin.Amount,
})
}

可通过 client.View 调用返回自定义链上数据的 view 函数。

例如,可通过 chain_id view 函数查询正在使用的网络:

viewResponse, err := client.View(&aptos.ViewPayload {
Module: aptos.ModuleId{Address: aptos.AccountAddress{}, Name: "chain_id"},
Function: "get",
ArgTypes: []aptos.TypeTag{},
Args: [][]byte{},
)
chainId := viewResponse[0]

在后台,某些请求会使用 Indexer API 访问已处理或聚合的数据。这些额外解析需要一些时间,因此数据可能略微落后于最新账本。

如果要确保数据新鲜,可以等待 indexer 达到特定版本。

// Wait on processorName to reach version 12345
err := client.WaitOnIndexer("processorName", 12345)