如何高效分析 Aptos Event

本文涉及的产品
.cn 域名,1个 12个月
简介: 随着 Aptos 生态的发展,上链数据分析的需求也随之出现,在这篇文章里,我们能简单了解 1)对 Aptos 事件的认识及其在 Aptos 设计中的地位;2)如何使用 Node API 轮询事件的数据;3)举例:一些查询/索引事件数据的更好方法!

什么是 Event?

在当前的区块链技术里面,大部分的公链项目都有 event 的定义。

它担任着区块链交互中非常重要的角色。因为在传统的 Web 开发中,客户端与服务端交互的大部分情况可以读写同步响应,而在区块链网络交互更像一个异步的读写分离系统,比较像目前流行的 CQRS 架构模式,有很多合约的结果返回是需要等待区块打包挖掘后产生的,所以在合约中提交 event 是一个很重要的与用户交互的方式。

总结来看,event 有以下2个用途:

  1. 获取交易中合约的返回数据;
  2. 监听合约的各种操作状态;

Aptos 架构中的 Event 设计

在 Aptos 的设计里面,可以通过 fullnode 的 rest service 以 Node API 的形式进行区块链的交互。对于一次 tx (transaction),大概经过的步骤:

  1. 从 rest service 代理 transaction 到 validator 的 mempool 组件进行缓存;
  2. 通过几个组件的努力,最终区块达成共识,由 Execution 调用 Storage 组件进行区块下交易的永久保存,其中也包括了代表运行结果的 event 数据;
  3. rest service 通过 Storage 组件获取 event 的数据;

如何通过 Node API 查询 Event?

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接口。请求:

https://aptos-mainnet.s.chainbase.online/{your-api-key}/v1/accounts/0x867ed1f6bf916171b1de3ee92849b8978b7d1b9e0a8cc982a3d19d535dfd9c0c/modules

提取这里关键的 event 定义的信息,我们通过 Get events by event handle 构造出可以获取该事件的请求:

https://aptos-mainnet.s.chainbase.online/{your-api-key}/v1/accounts/0x867ed1f6bf916171b1de3ee92849b8978b7d1b9e0a8cc982a3d19d535dfd9c0c/events/0x867ed1f6bf916171b1de3ee92849b8978b7d1b9e0a8cc982a3d19d535dfd9c0c::domains::SetNameAddressEventsV1/set_name_events

  • address = 0x867ed1f6bf916171b1de3ee92849b8978b7d1b9e0a8cc982a3d19d535dfd9c0c
  • event_handle = 0x867ed1f6bf916171b1de3ee92849b8978b7d1b9e0a8cc982a3d19d535dfd9c0c::domains::SetNameAddressEventsV1
  • field_name = set_name_events

这样可以通过 Node API 不断轮询获取这些事件的数据。其中 domain_name 就是域名,new_address 就是映射的 address

Node API 具有局限性

通过上面的例子,我们可以不间断地获取最新的事件。但是如果我们希望查询某个 domain 最新的映射地址是什么,或者希望分析每天 domain 的注册量,类似这样的需求,基于 Node API 是无法被满足的。

从本质来看,Aptos 的 Node API 是为了满足最基本的区块链网络交互,其背后的存储和组件不是为了数据的各种维度的分析、检索、索引来设计的。

如何使用 Chainbase 处理 Node API 的局限性

Chainbase Data Cloud通过数据结构化、清洗、索引,计算导入到更加符合数据分析场景的云端数据仓库服务,让用户可以更加高效、轻松地访问 Aptos 的任意数据,并且可以基于 SQL 生成定制化的 API 服务

  • Aptos Raw Data: 如events,transactions,table_items,move_modules,move_resources 等等 文档
  • Aptos Abstract Data: 如 coin,token 等等 文档

下面我们还是以上面 Aptos name v1 的数据场景举例

当域名=000.apt 的时候,如何查询address 和 expiration time

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'

如何查询 Top 10 holder accounts

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 玩得开心!

目录
相关文章
|
4月前
|
机器学习/深度学习 分布式计算 数据处理
Spark是一个基于内存的通用数据处理引擎,可以进行大规模数据处理和分析
【5月更文挑战第2天】Spark是一个基于内存的通用数据处理引擎,可以进行大规模数据处理和分析
89 3
|
4月前
|
SQL 人工智能 JSON
【AI大模型应用开发】2.2 Function Calling连接外部世界 - 【实战】查询数据库
【AI大模型应用开发】2.2 Function Calling连接外部世界 - 【实战】查询数据库
128 0
|
4月前
|
存储 消息中间件 分布式计算
流计算中的状态管理是什么?请解释其作用和常用方法。
流计算中的状态管理是什么?请解释其作用和常用方法。
53 0
onInterceptTouchEvent() 与 onTouch() 事件分析
onInterceptTouchEvent() 与 onTouch() 事件分析
onInterceptTouchEvent() 与 onTouch() 事件分析
|
设计模式 Java 数据库
业务解耦利器Event/Listener
``ApplicationEvent``以及``Listener``是Spring为我们提供的一个事件监听、订阅的实现,内部实现原理是观察者设计模式,设计初衷也是为了系统业务逻辑之间的解耦,提高可扩展性以及可维护性。事件发布者并不需要考虑谁去监听,监听具体的实现内容是什么,发布者的工作只是为了发布事件而已。
|
XML Java BI
JFR详细介绍与生产问题定位落地 - 2. 通过实例了解JMC 与 Event 结构与详细配置
JFR详细介绍与生产问题定位落地 - 2. 通过实例了解JMC 与 Event 结构与详细配置
JFR详细介绍与生产问题定位落地 - 2. 通过实例了解JMC 与 Event 结构与详细配置
|
监控 前端开发 数据挖掘
高性能 MobX 模式(part 2)- 响应变化
在 Part 1 我们看到如何去建立一个 MobX 状态树并且让它可观察。在这个基础上,我们下一步要做的是开始响应数据的变化。坦白说,有趣的部分是从这里开始的。
267 0
|
开发工具
定义无处不在的 Event 事件之 CloudEvents
Event 事件无处不在,然而如果没有一套事件统一的定义标准,那么对于事件处理的开发者来说无疑是痛苦的。CloudEvent 的出现统一了事件的标准,本篇文章简要介绍了这一标准规范协议,以及实际场景中使用的方式。
5307 1
|
SQL 监控 API
TSQL:让监控分析更简单更高效
阿里时序时空数据库TSDB最新推出TSQL,支持标准SQL的语法和函数。用户使用熟悉的SQL,不仅仅查询更简单易用,用户还可以利用SQL强大的功能,实现更加复杂的计算分析。
4474 0