区块链网络交互模式,很像一个异步的读写分离系统,在合约中提交event 对于 Aptos 上的开发者来说,是非常重要的交互方式。本文将系统地带大家认识和分析 aptos 的 event。
🥳 随着 Aptos 生态的发展,上链数据分析的需求也随之出现,在这篇文章里,我们能简单了解 1)对 Aptos 事件的认识及其在 Aptos 设计中的地位; 2)如何使用 Node API 轮询事件的数据; 3)举例:一些查询/索引事件数据的更好方法!
在当前的区块链技术里面,大部分的公链项目都有 event 的定义。
它担任着区块链交互中非常重要的角色。因为在传统的 Web 开发中,客户端与服务端交互的大部分情况可以读写同步响应,而在区块链网络交互更像一个异步的读写分离系统,比较像目前流行的 CQRS 架构模式,有很多合约的结果返回是需要等待区块打包挖掘后产生的,所以在合约中提交 event 是一个很重要的与用户交互的方式。
总结来看,event 有以下2个用途:
在 Aptos 的设计里面,可以通过 fullnode 的 rest service 以 Node API 的形式进行区块链的交互。对于一次 tx (transaction),大概经过的步骤:
Chainbase 现在已经提供了稳定高效的 fullcode 节点集群,可以注册生成 Aptos Mainnet 的 Node API endpoint,参见文档 点击。
简单创建后,我们就拥有了自己的 Node API 服务:https://aptos-mainnet.s.chainbase.online/{your-api-key}/v1
(注意:需要将 {your-api-key} 替换成你的 API KEY)
以查询官方 domain 项目 Aptos name v1 的域名映射事件为例子。通过链上数据的分析,项目的 account address 是:0x867ed1f6bf916171b1de3ee92849b8978b7d1b9e0a8cc982a3d19d535dfd9c0c.
我们先看一下 ABI 的事件定义(这也是 Aptos 比较友好的地方,可以通过链上查询 ABI),通过Get account modules接口。请求:
提取这里关键的 event 定义的信息,我们通过 Get events by event handle 构造出可以获取该事件的请求:
0x867ed1f6bf916171b1de3ee92849b8978b7d1b9e0a8cc982a3d19d535dfd9c0c
0x867ed1f6bf916171b1de3ee92849b8978b7d1b9e0a8cc982a3d19d535dfd9c0c::domains::SetNameAddressEventsV1
set_name_events
这样可以通过 Node API 不断轮询获取这些事件的数据。其中 domain_name 就是域名,new_address 就是映射的 address
通过上面的例子,我们可以不间断地获取最新的事件。但是如果我们希望查询某个 domain 最新的映射地址是什么,或者希望分析每天 domain 的注册量,类似这样的需求,基于 Node API 是无法被满足的。
从本质来看,Aptos 的 Node API 是为了满足最基本的区块链网络交互,其背后的存储和组件不是为了数据的各种维度的分析、检索、索引来设计的。
Chainbase Data Cloud通过数据结构化、清洗、索引,计算导入到更加符合数据分析场景的云端数据仓库服务,让用户可以更加高效、轻松地访问 Aptos 的任意数据,并且可以基于 SQL 生成定制化的 API 服务
下面我们还是以上面 Aptos name v1 的数据场景举例
select
JSONExtract(data, 'domain_name', 'String') as domain,
JSONExtract(JSONExtract(data, 'new_address', 'String'), 'vec', 'Array(String)') as registered_address,
toDateTime(JSONExtract(data, 'expiration_time_secs', 'String')) as expiration,
transaction_version
from
aptos.events
where
type = '0x867ed1f6bf916171b1de3ee92849b8978b7d1b9e0a8cc982a3d19d535dfd9c0c::domains::SetNameAddressEventV1'
and account_address = '0x867ed1f6bf916171b1de3ee92849b8978b7d1b9e0a8cc982a3d19d535dfd9c0c'
and domain = '000'
select
count(1)
from
aptos.events
where
type = '0x867ed1f6bf916171b1de3ee92849b8978b7d1b9e0a8cc982a3d19d535dfd9c0c::domains::RegisterNameEventV1'
and account_address = '0x867ed1f6bf916171b1de3ee92849b8978b7d1b9e0a8cc982a3d19d535dfd9c0c'
select
JSONExtract(JSONExtract(data, 'new_address', 'String'), 'vec', 'String') as registered_address,
count(*) as holder_total
from
aptos.events
where
type = '0x867ed1f6bf916171b1de3ee92849b8978b7d1b9e0a8cc982a3d19d535dfd9c0c::domains::SetNameAddressEventV1'
and account_address = '0x867ed1f6bf916171b1de3ee92849b8978b7d1b9e0a8cc982a3d19d535dfd9c0c'
and registered_address != "[]"
group by registered_address
order by holder_total desc
limit
10
从上述案例可看到,Chainbase 的 Data Cloud 非常快速高效地获取了 Aptos 上的 Event 数据,在开发者文档中,你能获取更多的案例和代码,欢迎大家前来探索。
祝你们在 Aptos 玩得开心!
Chainbase 是一个开放的 Web3 数据基础设施,用于大规模地访问、组织和分析链上数据。
文章来源:How to Efficiently Get Aptos Event Data - Full Walkthrough
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!