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

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

以太坊中的日志





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

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

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

每个日志记录都包含topics和data。Topics是332-byte(256 bit)的“world”,用于描述事件中发生的事情。需要不同的操作码(LOG0…LOG4)来描述需要包含在日志记录中的Topics数。例如LOG1包含一个Topic,而LOG4包含四个Topics。因此一个日志记录中最多可以包含四个Topics。

以太坊日志记录中的Topics

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

以太坊日志记录中的数据

日志记录的第二部分包含其他数据。topics和data可以很好地协同工作,因为每种都有优点和缺点。例如虽然topic是可搜索的,但数据却不可以。但是包含data比包含topic便宜很多。另外尽管topic限制为4*32字节,但事件数据不是,这意味着它可以包含大型或复杂的数据,例如数组或字符串。因此事件数据(如果有)可以看作是值。
让我们看一些示例,看看如何在使用topic,data和日志记录。

发布事件

以下合约实现了由符合ERC20的令牌合约使用的Transfer事件:


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

由于这不是匿名事件,因此第一个topic将包括事件签名:

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

现在让我们看一下此Solidity事件的参数(from,to,value):

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

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

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

现在,我们只需要了解如何包含数据(如我们的最终论点)即可。LOG3需要5个参数:
LOG3(memoryStart, memoryLength, topic1, topic2, topic3)

通过以下方式从内存中读取事件数据:
memory[memoryStart…(memoryStart + memoryLength)]

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

检索事件日志

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


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

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

logging操作的成本

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

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

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

那真的很便宜!让我们想象一下ERC-20令牌转移。首先,我们的基本成本为375gas。其次“转移”事件包含3个topics,这是另外375*3=1125个gas 最后我们为所包含的每个字节数据添加8个gas。由于数据仅包含ERC-20传输的值,该值最多可以为32个字节(“²”),因此用于记录logging数据的最大gas量应为8 * 32 = 256 gas。这总计要花费1756 gas的总gas成本。作为参考,标准的以太坊(非令牌)转让要花费21000 gas,或者是它的十倍以上!

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

免责声明:这只是日志记录操作本身的成本。任何以太坊交易都从21000 gas开始,并且交易的输入数据每字节最多花费16 gas。通常要传输和记录ERC-20令牌,其成本在40,000-60,000 gas之间。

结   论

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

关键词: 以太坊  以太坊区块链  

该内容来自于互联网公开内容,非区块链原创内容,如若转载,请注明出处:https://htzkw.com/archives/28114

联系我们

aliyinhang@gmail.com