本文介绍了Aptos区块链的用户交易、代币和数据访问等关键概念,重点阐述了交易在区块中的处理、资产的表示及其类型,以及数据查询的过程与工具。文章提供了对Aptos各项功能的深入分析,并展望了未来的研究方向。
Aptos 每秒生成多个 区块,具备即时终局性(使用 AptosBFT 共识)。区块内最有趣的交易类型是用户交易。区块内的交易是通过 BlockSTM 在 MoveVM 内并行执行的。区块生成通常优化于延迟(快速区块),但是在负载较高时可以减慢以优化吞吐量,每个区块可以处理多达 几千个 交易(例如:79432868,140517934)。区块被分组到纪元中(每 ~2 小时在主网)并且这时允许验证者更换。
Aptos 主网验证者的 IP 地理分布
我们有 100 多个验证者分布在 地理上 以实现去中心化并减少交易提交的延迟。运行验证者需要相当高的质押要求,不过,进行 委托质押 只需 10 APT。
我们目前托管 3 个 网络:主网、测试网和开发网(每 ~2 周重置一次)。
Aptos 探测器上的交易类型及其符号
对于用户交易,一个地址提交一个交易,内容包括:
Gas 以 octa 进行交易支付(1e8 octa = 1 APT),使用以下公式:gas_fee = gas_unit_price * gas_used - storage_refund
。其中 gas_unit_price
默认值为 100 octa。在区块中可以通过增加 gas_unit_price
来进行优先级排序,钱包在拥堵时(当区块空间有限时)会建议提高 gas_unit_price
。
交易至少会有一个 事件(gas 费用声明,列出在 I/O、存储和存储退款上花费的 gas 量)并发生某些资源变化。由于这些变化仅显示交易引起的差异,因此合约最好发出事件以提供关于发生的操作的上下文(而不是尝试从变化中推断)。然而,事件无法被其他交易访问,旨在供索引程序使用。
可以使用交易哈希识别交易,但是,Aptos 的交易还包括一个单调递增的交易版本,版本通常用于交易标识。
在链上表示资产时,一个考虑因素是资产的“可堆叠性”。表示货币的资产是可互换的(同质化的),应当可以堆叠在一起,而表示艺术品的资产是独特的(应当进行更高层次的集合分组以便堆叠)。具有耐久性的物品表示是一个模糊的领域。
我们有两个“可堆叠”资产的表示:
0x1::coin::CoinStore<type>
(默认)0x1::coin::
函数进行操控0xa
从货币迁移到同质化资产0x1::fungible_asset::
函数进行操控我们还拥有两个非可堆叠资产的表示:
0x3::token::TokenStore
0x3::
函数进行操控0x4::
函数进行操控货币的供应追踪是可选的。非遗留表示是对象,使其更易于追踪,并允许更复杂的权限控制能力。对象还可以导致有趣的表示,例如将货币发送到同质资产存储中,并且需要索引程序来查找由账户拥有的所有对象(对象的地址通过一致哈希生成)。
当可堆叠资产进入/退出 CoinStore 和 FungibleAssetStore 时,会发出 withdraw 和 deposit 事件(复式记账)。
当非可堆叠资产移动时,会发出 Transfer 事件或 Deposit 事件。此外,这些资产还会发出 mint 和 burn 事件。
Aptos 有一个 开源索引器实现( 文档),提供以下资产的表:
(同质资产的处理器代码见 fungible asset,数字资产的处理器代码见 digital asset)。
对这些表的公共查询访问通过 graphql 端点( 表参考)进行,尽管强烈建议 请求一个免费的开发 API 密钥 以获得更高的速率限制。
有 多个供应商 提供对 Aptos 数据的访问。一些比较受欢迎的包括 dune、flipside、bigquery(示例 查询 及其 rust ETL)。原始表的结构与 API 返回的数据类似,具有以下大致关系。
一些 Aptos 核心数据表之间的关系
通过 每日活跃用户查询 来分析数据(我们常常将用户和账户互换使用)。

WITH final AS (
SELECT
tx_version,
block_date,
signer_address,
tx_success,
signer_type,
type
FROM aptos.signatures s
)
SELECT
block_date,
COUNT(1) as n_sig,
COUNT(DISTINCT tx_version) as n_txn,
COUNT(DISTINCT signer_address) as daily_active_user,
MIN(tx_version),
MAX(tx_version)
FROM final
WHERE 1=1
AND block_date
BETWEEN DATE_ADD('day', -31, current_date)
AND DATE_ADD('day', -1, current_date)
-- AND tx_version BETWEEN 1669545227 AND 1670475367
AND tx_success
AND signer_type != 'fee_payer'
GROUP BY 1
ORDER BY 1
在 Aptos,我们将活跃账户定义为一个签名交易的地址。我们可以在一笔交易上有多个签名(多重签名),因此一笔交易可以代表多个活跃账户,尽管它只能有一个发送账户(发送者通常用作代理)。
上述查询从签名表获取数据,并过滤出过去 30 天内的成功交易的非费用支付签名,并按天进行汇总以获得总的签名数(n_sig
)、交易数(n_txn
)、活跃账户数(daily_active_user
)以及最小/最大版本,这对调试有用。
来自 dune 的每日活跃地址查询
要检查个别交易(例如:2203280000),可以针对探测器和其他 Aptos API 进行查找。
docker run — rm fullstorydev/grpcurl:v1.8.7 -d '{ "starting_version": 2203280000, "transactions_count": 1 }' -max-msg-sz 30000000 -H "authorization:Bearer aptoslabs_SECRET_KEY_HERE" grpc.mainnet.aptoslabs.com:443 aptos.indexer.v1.RawData/GetTransactions
( 文档)我希望这个概述能帮助其他人开始查询 Aptos 数据。在第 2 部分,我将深入探讨以下主题:
记得为更高的查询速率限制 创建一个免费的开发者账户。我期待看到社区制作的仪表板。
- 原文链接: medium.com/aptoslabs/dat...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!