主页 > imtoken官方app > 以太坊区块链事件日志分析说明

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

imtoken官方app 2023-03-21 07:55:47

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

登录以太坊

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

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

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

以太坊日志主题

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

以太坊大事件

以太坊日志中的数据

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

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

发布事件

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

以太坊大事件

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

现在让我们看看这个 Solidity 事件的参数(from、to、value):

由于前两个参数声明被索引,所以它们被视为其他主题。我们的最终参数不会被索引,这意味着它将作为数据附加(而不是单独的主题)。这意味着我们可以搜索“从地址 0x0000... 查找所有传输日志...到地址 0x0000...”甚至“查找所有日志到地址 0x0000...”,而不是类似于“找到所有传输日志”对于值 x"。我们知道该事件将包含 3 个主题,这意味着该日志记录操作将使用 LOG3 操作码。

以太坊大事件

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

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

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

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

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

检索事件日志

以太坊大事件

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

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

日志记录操作的成本

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

以太坊大事件

真的很便宜!让我们想象一个 ERC-20 代币转移。首先,我们的基本成本是 375gas。二、“转帐”事件 包括3个话题,这又是375*3=1125个gas 最后我们为每个包含的数据字节添加8个gas。由于数据只包含 ERC-20 传输的值,该值最多可以是 32 个字段(“²”),因此用于记录测井数据的最大 gas 量应为 8 * 32 = 256 gas。这加起来总共花费了 1756 个 gas。作为参考,一个标准的以太坊(非代币)转账需要 21000 gas,或者是十倍以上!

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

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

结论

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

本文中的区块链哈希:e664d9827d4019edd96b7b70a8caa07e64c3e83a

免责声明:本文由Leo分享并发布,不代表链世界赞同其观点或证实其描述。文章内容仅供参考,不构成投资建议。投资者自行承担相应的操作风险。如果本文侵犯了您的合法权益,请通过kefu@lianshijie.com与我们联系