链资讯 链资讯
Ctrl+D收藏链资讯
首页 > OKB > 正文

ENS:理解以太坊事件日志_CAS

作者:

时间:

当你在区块链浏览器上查询交易时,是否只是查看概览和内部交易?那么事件日志呢?是否在不起眼的角落被你忽略了。

交易事件日志对于用户以及开发者来说实际上都是至关重要的。通过触发事件不仅能将链上智能合约的交易通知给外界,还能让智能合约开发者对合约进行测试、保证合约安全。

接下来就帮助大家详细理解下关于以太坊的事件日志以及关于它所延伸出来的一些基础知识。

一、 什么是事件

事件是能方便地调用以太坊虚拟机日志功能的接口。

而 Solidity 事件就是 EVM 的日志功能之上的抽象。应用程序可以通过以太坊客户端的 RPC 接口订阅和监听这些事件,允许我们打印在区块链上的信息。

所以通过 Solidity 事件,我们可以做到:

测试智能合约中的特定变量

索引变量以重建存储状态

监听事件用于改变前端状态

创建子图以更快地读取数据

二、声明和触发事件

我们以官方 ERC20 合约代码为例,在 IERC20.sol 文件中通过 event 关键字进行声明。

我们可以把事件看作是一个特殊类型,上面的代码中我们创建了一个名为 Transfer 的事件,在该事件中有两种参数类型:有索引 (indexed) 和无索引。其中 from 和 to 参数是有索引的,而 value 参数是没有索引的。

在 ERC20.sol 的 _transfer 函数中通过 emit 关键字触发相应事件(之前的版本里并不需要使用 emit)。

CZ:FUD是可理解的正常市场行为,目前Binance平台资金流向已扭转为净流入:12月14日消息,Binance 创始人CZ 在 CZ AMA 中就近期市场中出现 Binance 相关 FUD 的问题发表看法表示:虽然 FTX 的崩溃为用户带来了恐惧,但这不意味着所有交易平台都有问题。客户希望现在把钱从 Binance 取走,那么他们就可以去提,他们也随时可以再次回来参与交易,这是用户的自由。Binance 拥有充足的现金储备,所有用户资产都是 1:1 获得储备支持的。目前我们已经看到了有资金在回流入 Binance,所以我认为本次 FUD 只是市场上很正常的一个行为,Binance 作为市场参与者有责任保持稳定。[2022/12/14 21:44:49]

一、什么是日志

在以太坊中,日志是用来存储事件。当事件被调用时,会触发参数存储到交易的日志中。其不能被智能合约访问,但是可以提供关于交易和区块中发送的信息。

我们随意点开一条交易 (0x477ed7208127bea597142622d52df46d3e4967835bd3609995581eb5aaeeec3e),查看其日志 Logs。

通过日志我们可以将日志分为四个部分:

1、Address: 地址。即发出事件的合约地址或者账户的地址。

2、Name: 名字。即触发的事件名及其参数。

3、Topics: 主题。即事件中有索引 (indexed) 的参数。

4、Data: 数据。即事件中没有索引的参数。

Lido DAO提议变更治理系统,引入面向质押者和LDO持有者的双重治理解决方案:6月18日消息,Lido DAO提议变更Lido治理系统,以“减少其代币持有者的现有治理范围”。虽然Lido DAO目前部署在以太坊上,但LDO持有者对其他链上的流动质押协议拥有治理权力,包括Polygon和Solana。

在该DAO当前的多链治理系统下,LDO持有者有与其他链相关的激励,“不一定与以太坊网络参与者的激励相一致,”Lido的智能合约开发者Sam Kozin在一篇博客文章中写道。

为了解决这个问题,Lido团队提出了一个双重治理解决方案,提议引入“一种针对质押者和LDO持有者之间不当激励的争议和解决机制”。(Blockworks)[2022/6/18 4:36:02]

二、日志记录中的主题

上面我们有说到主题 (Topics),接下来我们详细说下主题。

每个日志记录都包含「主题 (topics)」和「数据 (data)」。主题是 32 字节(256 位),用于描述事件中发生的事情。不同的操作码 (LOG0 LOG1 LOG2 LOG3 LOG4) 用以描述需要包含在日志记录中的主题数。

EVM 中有 5 个操作码用于触发事件日志并创建日志记录,分别是 LOG0,LOG1,LOG2,LOG3 以及 LOG4,它们用于描述智能合约中的事件,例如代币的转移、所有权的变更等。LOG1 即包含了一个主题,而单个日志记录中最多可以包含的主题就是 LOG4 的四个主题。

Topics0 通常为发生事件名称的签名(keccak256 的哈希值),包括其参数的类型(address,uint256 等),Topics1 为第一个索引参数的值,Topics2 为第二个索引参数的值。

GateChain主网v1.0.4新升级,新增代理解除委托交易类型:GateChain主网已进行v1.0.4最新升级,新版修改区块奖励分配机制为动态比例,并新增代理解除委托交易类型。本次主要升级内容为:1.共识协议版本升级到v4,升级高度为110655;2. 区块奖励分配比例修改为动态比例;3.保险账户增加新的交易类型:代理解除委托;4.修正了/v1/tx/gentxid与实际Tx Hash不一致的Bug。据悉,本次升级后,GateChain将把工作重点放在资产跨链、智能合约、稳定币和DEFI支持上。[2020/8/8]

该主题中 Topics0 的值为 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef,其事件为上一行 Name 的内容。

而我们对事件 Transfer(address,address,uint256) 进行 keccak256 加密后得到的结果和 Name 的值一样,说明 Name 的值的确为事件名称的签名。当然,有一个例外是没有事件签名的,那就是触发「匿名事件」时。

Topics1 就是第一个索引参数的值,即 form 地址的值。Topics2 就是第二个索引参数的值,即 to 地址的值。从内部调用分析也能看到的确是这样。

主题只能包含 32 个字节的数据,所以像可能超过 32 个字节的内容如数组、字符串等的内容不能用作主题,如果要尝试包含大于 32 个字节的数据,则该主题必须进过 hash 计算,所以超过 32 个字节后最好当做数据包含在日志记录中。

三、日志记录中的数据

日志记录除了主题,还有一部分内容就是数据,数据就是事件的非索引参数的 ABI 编码或者 hash 值,我们可以使用 Dec 或 Hex 查看数据 data 的值。

动态 | Block.One新游戏将使编码过程更容易理解:据cryptodaily消息,Block.One透露了一款新的视频游戏,旨在增加积极参与网络工作的EOS开发人员的数量,该游戏被称为元素战斗,使EOS.IO编码过程更容易理解。游戏教程有不同的阶段,供开发人员学习在EOS.IO上构建分散式应用程序所需的每个步骤。这包括如何编写EOS智能合约,游戏逻辑验证和编程人工智能代码的一般指南。Block.One表示,它是新想法的一部分,以增加网络上的编程社区。[2018/10/26]

数据和主题都有各自的优劣:

主题是可以搜索到的,数据不能搜索到。

数据比主题所需要的 gas 少。

由于主题是带有索引的参数,所以我们可以直接在日志中进行搜索,而数据是 ABI 编码或 hash 值,所以不能直接搜索。

根据黄皮书我们可以找到日志的相关 gas 成本,日志的基础费用是 375 gas,每个主题也是 375 gas,而数据字节的成本是 8 gas。

我们可以通过黄皮书知道日志的 gas 费用非常便宜,一个 ERC20 代币转账事件的成本最多只花费 1756 gas(日志基础的 375 gas,转账事件 3 个主题的 375 * 3 =1125 gas,数据字节最大的 32 字节为 8 * 32 = 256 gas),而标准以太币的转账需要花费 21000 gas。当然了,前面说的只是日志记录操作自身的成本,智能合约开发中不能单纯值计算日志记录操作的成本,但在开发中,我们可以仅在状态变量中保存智能合约所需要使用的数据,其他的就用事件来处理,这样能省下很多的 gas 费用。

动态 | 埃森哲公布区块链集成管理解决方案:据日经TECH报道,今日埃森哲公布了基于区块链技术的集成管理解决方案“Block Chain·Hub”。“Block Chain·Hub”作为一款集成管理软件,可以管理多个区块链基础设施,也可在外部系统与区块链基础设施之间进行调解。日本福冈金融集团旗下的iBank Marketing公司已经在积分服务相关的再建项目中先行引入“Block Chain·Hub”。[2018/8/3]

接下来以一个实例进行说明触发事件,下面的代码实现了符合 ERC20 标准的代币合约所使用的转账事件。

由于上面不是一个「匿名事件」,所以第一个主题将包含事件的签名(签名时只需要参数的类型)。

然后我们看一下该事件的参数,其中 from 和 _to 地址都是有索引的,value 值是没有索引的。所以 _from 和 _to 地址会被当成主题,而 _value 值会被当成数据。

在 3.3 节中我们说到过主题能被搜索,而数据不能,所以我们能在日志中搜索 from 地址和 _to 地址值的相关转账日志,却不能够搜索到转账金额为 _value 值的转账日志。由于该事件具有 3 个主题(事件的签名,from,_to),所以该日志记录操作将使用 LOG3 操作码。

那如果我们想要找到数据的内容呢?这里就需要知道操作码在 EVM 中的参数。LOG3 虽然包含 3 个主题,在 EVM 中却有 5 个参数。

如果要读取数据的内容,通过以下的方式就可以从内存中读取事件数据了。

一、事件在钓鱼中的使用

前面介绍了那么多日志事件,那这些是如何和钓鱼联系到一起的呢?攻击者一般会通过日志事件伪装成交易所或者名人等给受害者转币(该币无实际交易价值,是钓鱼代币),受害者看到是交易所或者名人转来的代币则放松警惕,此时攻击者会引导受害者到有钓鱼代币的池子中,受害者看到该代币交易价值极高,会立刻授权进行交易,而此时就陷入了攻击者设置的圈套,攻击者会让受害者授权从而盗取走受害者钱包中的钱。

下图就是之前发生的一起钓鱼事件,攻击者伪装成币安热钱包给其他人转钓鱼代币。

我们可以在 BSC 浏览器上通过标签找到官方地址。

通过查询,发现 Binance Hot Wallet 6 地址正是 0x8894e0a0c962cb723c1976a4421c95949be2d4e3

由于浏览器记录是根据事件来的,所以说 topics1 的值即 sender 的值就是 0x8894e0a0c962cb723c1976a4421c95949be2d4e3

二、复现

下下面是 BEP20 的伪代码,以 BNB Chain 主网为例进行复现,攻击者创建一个名为「Phishing Token」的钓鱼代币。

如下图所示,新增 Binance 参数其值为 0x8894E0a0c962CB723c1976a4421c95949bE2D4E3

然后,我们要修改如下图红色标记代码,将 emit 触发事件中的 sender 地址修改为 Binance。

部署好合约(https://bscscan.com/address/0x7c08aa19b8da2c14591506d7d3c385fc702e0630)后调用 transfer 函数将钓鱼代币转发给受害者。

查看交易信息,发现这里的 from 地址并不是攻击者的地址 0x95E2Ea34dEB5C0954B91a47f459770D20568A15B,而是 Binance: Hot Wallet 6 的地址 0x8894E0a0c962CB723c1976a4421c95949bE2D4E3

查看 Logs 日志,Topics1 记录的 sender 地址同样也是 Binance Hot Wallet 6 地址,而  Topics2 记录的 recipient 就是受害者的地址了。

细节决定成败,不要认为事件日志是微不足道的沧海一粟。在区块链世界越是细节的地方越容易被黑客攻击利用,往往需要更加谨慎小心。同时需要注意的是,我们也不能因为日志所展示出来的内容掉入子设计好的局中。再次提醒大家,不要随意点击陌生链接,更不要随意授权他人。当我们更加深入理解事件日志的时候,才能更好的防止自己上当受。

知道创宇区块链安全实验室

企业专栏

阅读更多

金色早8点

金色财经 Willis

Zixi

链茶馆

道说区块链

Dorahacks

PANews

老雅痞

Web3笔记

TalentDAO

区块律动BlockBeats

标签:ENSCASTASTCASbensojdBROADCASTINGAstral AIBABYDOGECASH价格

OKB热门资讯
NFT:CPI缓和意味着转机?了解美联储及其货币政策的几个关键_ERO

如果说在今年之前,很多加密市场的投资者对宏观经济和货币政策对市场的影响没有认知,那么经过这一年的“打”,想必不会再忽略宏观对加密市场带来的影响了.

区块链:垂直化的 NFT 市场才有未来_Electronero

撰文:Carv 来源:FastDaily 图片来源:由无界版图AI工具?生成。随着熊市的持续,市场上的 NFT 活动与一般的加密货币行业一起暴跌.

STE:Web3.0 社交协议:谁将突围?_FAR

主要观点 到目前为止,10 月份 Lens 拥有 20,000 名活跃用户,这是该协议的历史最高水平,是 Farcaster 的近 8 倍;虽然 Lens 的整体参与度更高.

GAS:狼来了?大空头香橼将继续做空 ETH_Yfilabs Finance

近日,知名空头机构 Citron Research(香橼研究)在官方推特称,FBI 没有对民主党的第二大捐款人(SBF)进行调查,放任一个人如此近的接近政府内部获得影响力,甚至没有检查纳税申报.

ICS:Web 3化的迈阿密 20年前的硅谷?_DEFILANCER

作者| Chenglin Pua(马来西亚)编审 | 于百程 排版 | 王纪珑琰Web 3在近期得到了许多人的关注,众多企业纷纷布局.

比特币:熊市购币指南:在基本面和未来叙事都不错的前提下 该在何时买入?_GLASS币

撰文:Miles Deutscher如果你想买入某种币,而且已经做了研究,发现基本面不错。但问题是,你不知道该在什么时候买入?那么,不如看看我在熊市中购币的终极指南.