以太坊链上 logs和events 解析

Ethereum日志和事件是Ethereum生态系统中的重要组成部分。使开发人员能够通过其跟踪并记录智能合约在区块链上的特定操作或数据。本指南将探讨Ethereum日志和事件的技术细节,包括其架构、存储和实际应用,并通过详细的示例进行说明。

<!--StartFragment-->

Ethereum日志和事件是Ethereum生态系统中的重要组成部分。使开发人员能够通过其跟踪并记录智能合约在区块链上的特定操作或数据。

本指南将探讨Ethereum日志和事件的技术细节,包括其架构、存储和实际应用,并通过详细的示例进行说明。

EVM中的事件和日志

在EVM(以太坊虚拟机)中,事件是智能合约在执行重要操作时发出的消息。例如,当代币转移或合约数据更新时,合约会触发一个事件以通知外部系统。事件通过event关键字在智能合约中定义。

在上述示例中,Transfer事件用于记录代币转移。它有三个参数:

from:发送方地址。

to:接收方地址。

value:转移的金额。

在执行智能合约函数期间使用emit关键字触发时间。发出的事件数据存储在日志中,这些日志是交易回执的一部分。

日志:

日志是这些事件的记录。当事件发生时,它们会存储有关所发生情况的信息,例如发送者、接收者和转移的代币数量。日志被包含在交易回执中,使其易于检索以进行跟踪或分析。

通过触发事件并将其记录为交易收据中的日志,开发人员可以轻松追踪特定的操作,如代币转移、铸造、销毁或合约状态的变更。这种方式节省了存储空间并降低了交易的Gas费用,为与智能合约交互和理解智能合约行为提供了高效且具有成本效益的方法。

Ethereum日志存储在哪里?

Ethereum日志存储在交易回执中,交易回执是Ethereum区块链数据的一部分。这些回执是在交易执行后创建的,并包含有关交易的详细信息,包括在执行智能合约过程中生成的日志。

以下是一些示例:

1.USDT黑名单

以下查询从Tether(USDT)智能合约中检索有关Ethereum AddedBlackList事件的详细信息,每当Tether禁止用户时都会发出该合约。

https://ide.bitquery.io/USDT-Blacklist-event

触发日志的智能合约是 0xdac17f958d2ee523a2206206994597c13d831ec7,即 Tether (USDT),它负责管理黑名单。

  • 日志对应于将地址添加到黑名单时发出的 AddedBlackList 事件。
  • 该事件记录在区块号(Block.Number)中,表明事件在区块链中发生时间。
  • 为了允许用户跟踪触发事件的确切事物,每个日志都链接到一个交易哈希(Transaction.Hash)。
  • 日志签名使用以下命令标识事件及其参数:

名称:AddedBlackList

签名:AddedBlackList(address)

2.跟踪Compound借贷

下面的查询检索了当用户向协议的智能合约提供抵押品时发出的Compound finance上的 SupplyCollateral事件的详细信息。

https://ide.bitquery.io/Tracking-lending-on-Compound

触发日志的智能合约地址是 0xc3d688B66703497DAA19211EEdff47f25384cdc3。

每个事件包含:

from:发起操作的地址。

dst:接收抵押品的目标地址。

asset:交易中涉及的Token地址。

amount:供应的资产数量,单位为Wei。

Block:表示该交易所在的区块编号。

Transaction:包括记录事件的交易的哈希值。

Log:包括事件签名,并指示哪个合约发出来该签名。

SmartContract 字段指向触发事件的智能合约。

可以使用 API 查询 Ethereum 日志,例如 Bitquery 等服务提供的 API。这些 API 允许开发人员和应用程序访问、过滤和分析日志,而无需与区块链节点交互,从而直接节省时间。

 Ethereum中的日志架构

现在我们已经了解了什么是日志,现在通过分解它们的组件来看看它们的结构化是怎样的:

让我们运行这个查询来获取智能合约的事件日志:

https://ide.bitquery.io/Copy-of-Get-logs-for-contract

  • address:发出日志的合约地址。
  • topics:可用于筛选日志的索引参数的集合(数组)。
  • data:具有其他事件信息的非索引参数。
  • blockNumber:创建包含日志的事务的区块。
  • blockTime:创建日志的区块的时间戳。
  • transactionHash:生成日志的交易的唯一哈希。
  • transactionIndex:交易在区块中的位置。
  • blockHash:包含日志的区块的哈希。
  • logIndex:日志在区块中的位置。
  • id:每条日志的唯一标识符。
  • BlockDetails:日志与区块相关,包括区块号和时间戳。
  • LogHeader:与日志条目相关的元数据或摘要信息。
  • LogSignature:指的是日志事件的名称以及它发出的数据类型,例如 Swap(address,uint256,uint256,uint256,uint256,address)。
  • ProgramCounter (Pc):标识日志在智能合约代码中发出的具体位置(例如,Pc: 3397)。
  • Sync:智能合约发出的事件名称,通常用于自动化做市商(AMM),如 Uniswap 和 PancakeSwap。

Solidity事件

Solidity 事件允许智能合约记录外部应用程序(例如去中心化应用程序 (DApp))可以访问的信息。事件在事务期间发出,其数据存储在区块链日志中。它们还支持称为索引参数的功能,该功能可以轻松筛选和搜索特定信息。在 Solidity 中,使用 'event'关键字声明事件。它定义将记录的数据类型。

以下是按方法或签名提取特定事件数据的 API 调用示例:

https://ide.bitquery.io/Getting-specific-method-call-for-a-smart-contract_1

该查询从智能合约地址 0x29469395eaf6f95920e59f858042f0e28d98a20b 提取了最近调用 startAuction 方法的详细信息,此方法用于启动竞价过程。

调用中的参数/参数值

参数和参数值是在调用函数时传递数据的值。它们有助于定义只能合约如何传递和使用数据。

  • 参数: 这是在调用函数时将传递给函数的值的占位符。例如,在像 Transfer(address indexed from, address indexed to, uint amount) 这样的事件中,参数是 from、to 和 amount。
  • 参数值: 这些是在调用函数或事件时实际传递的值。例如,在发出 Transfer(msg.sender, 0x356..., 100) 事件时,msg.sender、0x356... 和 100 是传递给 from、to 和 amount 参数的实际值。

如何获取事件和日志信息?

用于查询智能合约发出的事件的最有效工具之一是 Bitquery API。通过这个 API,开发者可以检索到有关智能合约事件的详细信息,包括事件类型、论据和相关联的交易,从而为区块链分析和事件追踪提供强大的支持。

例如,下面的查询展示了 Uniswap V3 合约发出的最新10个事件。

https://ide.bitquery.io/latest-10-events-emitted-by-the-Uniswap-V3-contract

让我们看一些更多的例子,展示如何跟踪特定的日志,如代币转账、销毁和铸造事件。

1.铸造事件

要获取 Minted 事件,可以使用 Mint 签名过滤事件和日志。

您可以查看以下查询:

ttps://ide.bitquery.io/Latest-Token-Mint-Events

2.销毁事件

要查询 Burn 事件,可以使用 Burn 签名过滤事件和日志。

您可以查看以下查询: 

https://ide.bitquery.io/Latest-Token-Burn-Events

3.合约创建

以下查询回溯自 2025-06-01 以来在以太坊和币安智能链网络上创建的智能合约数量。要查询合约创建事件,我们可以使用 Call.Create 来过滤调用和日志。

https://ide.bitquery.io/ETHBSC-SC-creates-count-over-date_2

4.池创建

要查询池创建事件,我们可以使用 PoolCreated 签名来过滤事件和日志。

您可以在筛选名PoolCreated的事件的查询中找到此内容,该事件是在 Uniswap V3 创建新流动性池时发出的。

5.订阅所有Swap事件

要查询平台上的所有swap事件,我们可以使用 swap 签名。

您可以在查询中找到此内容,该查询使用 swap 在 Chefdotfun 上检索最新的swap交易。

如何使用日志签名过滤特定事件?

日志签名是可用于筛选事务日志中特定事件的唯一标识符。它们依赖于事件名称 或签名哈希来检索准确的日志。

区块链分析工具,如 Bitquery IDE,允许通过 Signature.Name 或 Signature.SignatureHash 字段来筛选日志。

我们来看一个例子:

使用这个查询:https://ide.bitquery.io/Latest-Token-Burn-Events

你可以过滤出最新的“Burn”事件: 在查询中,Log.Signature.Name 用来通过事件名称(例如,“Burn”)过滤事件。

同时,可以使用 Block.Date.after 来筛选特定日期后的事件,并通过 limit 控制返回结果的数量。

如何获取 NFT 市场事件信息?

你可以使用 Bitquery IDE :https://ide.bitquery.io/ 获取关于 NFT 市场活动的信息。这个工具允许你通过查询来过滤和检索来自 NFT 市场的特定事件数据。

查询 NFT 事件的步骤:

1.识别事件:使用相关的签名名称或哈希(例如,LoanTaken,Seize)。

2.应用过滤选项:根据需要进一步细化查询:

  • 使用日期过滤器(例如,Block.Date.after)。
  • 包括特定的地址,如借贷人、借款人或 NFT 智能合约的地址。

3.你还可以添加限制(limit)来控制返回结果的数量,提高查询效率。

以下是一些相关查询的示例:

  • Blur 上的最新贷款

 查询:https://ide.bitquery.io/Latest-Loans-taken-onBlur

-该查询检索在 Blur NFT 市场上借取的贷款详情。

-查询利用了 LoanOfferTaken 事件签名来获取与贷款交易相关的数据。

-该查询检索与特定借款人相关的贷款详情。

-它使用了类似 Transaction.From 或特定的 Log.Signature.Name 过滤器来提取与借款人相关的数据。

\

-该查询检索与被没收NFT相关的事件,通常是由贷款违约等情况导致的。

-它使用了 Seize 过滤器来包括NFT被没收事件的签名。

这些示例展示了如何使用Bitquery IDE检索Blur市场上与NFT相关的详细事件信息。

为什么智能合约有事件,而钱包没有?

智能合约有事件,而钱包没有事件,主要有以下几个原因:

智能合约之所以有事件,是因为它们是可编程的实体,能够记录并传达诸如代币转移或授权等操作。这些事件提供了一种机制,可以在不改变区块链状态的情况下,通知外部系统合约的活动。

同时,钱包是不可编程的工具,用于管理私钥并与区块链交互。它们没有内嵌的逻辑来执行程序或发出日志,但可以监听智能合约发出的事件,以便向用户提供更新,也就是说,它们依赖于智能合约的事件来获取更新信息。

结论

以太坊日志和事件允许智能合约和外部系统之间进行高效通信,在生态系统中发挥着重要作用。它们还提供了一种在不使网络过载的情况下跟踪和记录特定区块链活动的方法。通过理解这些概念并使用 Bitquery 等工具,开发人员可以构建高效且可扩展的应用程序,与 Ethereum 区块链无缝交互。

<!--EndFragment-->

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
居北岛
居北岛
橘子不是唯一的水果