主页 > imtoken钱包官网客服 > 以太坊区块链事件日志分析

以太坊区块链事件日志分析

imtoken钱包官网客服 2023-09-25 05:12:12

传统上,应用程序经常使用日志来捕获和描述特定时刻发生的事情。 这些日志通常用于调试应用程序、检测某些事件或通知日志查看者某些情况。 在编写智能合约或与智能合约交互时,它们也非常有用! 那么以太坊是如何做到的呢?

登录以太坊

EVM 目前有 5 个用于发出事件日志的操作码:LOG0、LOG1、LOG2、LOG3 和 LOG4。

这些操作码可用于创建日志记录。 日志记录可用于描述智能合约中的事件,例如代币转移或所有权变更。

以太坊区块链上的事件日志分析讲解  第1张

每条日志记录都包含主题和数据。 主题是一个 332 字节(256 位)的“世界”,用于描述事件中发生的事情。 需要不同的操作码(LOG0...LOG4)来描述需要包含在日志记录中的Topic数量。 例如,LOG1 包含一个 Topic,LOG4 包含四个 Topic。 因此,一条日志记录最多可以包含四个 Topic。

以太坊日志中的主题

日志记录的第一部分由一系列 Topic 组成。 这些主题用于描述事件。 第一个主题通常由发生的事件名称的签名(keccak256 哈希)组成,包括其参数类型(uint256、字符串等)。 不将此签名作为第一个主题的一个例外是在发出匿名事件时。 由于主题最多只能容纳 32 个字节的数据,因此您不能可靠地使用数组或字符串之类的东西作为主题。 相反以太坊映射的合集,它应该作为数据而不是主题包含在日志记录中。 如果您尝试包含大于 32 字节的主题,该主题将被散列。 所以只有当你知道原始输入时,你才能反转这个散列。 总而言之,主题应该只可靠地用于可以大大缩小搜索查询范围的数据,例如地址。 总之,一个主题可以被认为是所有映射到相同值的事件的索引键,我们将在下面讨论。

以太坊日志中的数据

日志记录的第二部分包含附加数据。 主题和数据可以很好地协同工作,因为它们各有优缺点。 例如,虽然主题是可搜索的,但数据不是。 但是包含数据比包含主题便宜得多。 此外,虽然主题被限制为 4*32 字节,但事件数据不是,这意味着它可以包含大型或复杂的数据,例如数组或字符串。 所以事件数据(如果有的话)可以被视为价值。

让我们看一些示例,看看如何使用主题、数据和日志记录。

事后

以下合约实现了符合 ERC20 标准的代币合约使用的 Transfer 事件:

以太坊区块链上的事件日志分析讲解  第2张

由于这不是匿名事件,因此第一个主题将包含事件签名:

以太坊区块链上的事件日志分析讲解  第3张

现在让我们看看这个 Solidity 事件的参数(from以太坊映射的合集,to,value):

以太坊区块链上的事件日志分析讲解  第4张

由于前两个参数被声明为索引,因此它们被视为其他主题。 我们的最终参数不会被索引,这意味着它将作为数据附加(而不是单独的主题)。 这意味着我们可以搜索诸如“查找从地址 0x0000... 到地址 0x0000... 的所有传输日志”或什至“查找地址 0x0000... 的所有传输日志”之类的内容,但不能搜索“查找所有传输日志以获取价值” x" 的东西。 我们知道这个事件将包含 3 个主题,这意味着这个日志操作将使用 LOG3 操作码。

以太坊区块链上的事件日志分析讲解  第5张

现在,我们只需要了解如何像我们的最终论点一样包含数据。 LOG3 需要 5 个参数:

LOG3(memoryStart, memoryLength, topic1, topic2, topic3)

通过以下方式从内存中读取事件数据:

内存[memoryStart ...(memoryStart + memoryLength)]

幸运的是,Solidity、Vyper 或 Bamboo 等高级智能合约编程语言会为我们处理将事件数据写入内存,这意味着您通常可以在发出日志时直接将数据作为参数传递。

检索事件日志

使用 web3(一个流行的 JavaScript 库,用于与本地或远程以太坊节点交互),我们可以订阅新的事件日志:

以太坊区块链上的事件日志分析讲解  第6张

每次发生新的 SAI 代币转移时,此代码都会提醒我们,这对于各种应用程序非常有用。 例如,只要您在以太坊地址上收到代币,钱包界面就会提醒您。

日志记录操作的成本

以太坊区块链上的事件日志分析讲解  第7张

测井操作的基本成本是 375 gas。 最重要的是,每个包含的主题都需要额外支付 375 gas 费。 最后,每个字节的数据消耗8个gas。

以太坊区块链上的事件日志分析讲解  第8张

那真的很便宜! 让我们想象一下 ERC-20 令牌传输。 首先,我们的基本成本是 375 gas。 接下来“transfer”事件包含 3 个主题,又是 375*3=1125 gas 最后我们为包含的每个字节数据添加 8 gas。 由于数据仅包含 ERC-20 传输的值,最多可达 32 个字节(“²”),因此用于记录数据的最大气体量应为 8 * 32 = 256 gas。 这加起来就是 1756 gas 的总 gas 成本。 作为参考,标准的以太坊(非代币)转账成本为 21,000 gas,是其十倍以上!

如果我们假设 gas 价格为 1 gwei,则操作的总成本将为 1756 gwei,相当于 0.000001756 ETH。 如果以太坊的当前价格在 200 美元左右,那么加起来也只有 0.0000012 美元。 请记住,这是在全球范围内永久存储数据的代价。

免责声明:这只是日志操作本身的成本。 任何以太坊交易都以 21000 gas 开始,交易的输入数据每字节花费高达 16 gas。 通常有一个 ERC-20 代币需要转移和记录,成本在 40,000-60,000 gas 之间。

综上所述

日志是一种以低廉的价格在以太坊区块链上存储少量数据的优雅方式。 具体来说,事件日志有助于让其他人知道发生了什么,而无需他们单独查询合约。