宇宙链 宇宙链
Ctrl+D收藏宇宙链
首页 > 中币 > 正文

理解以太坊事件日志

作者:

时间:1900/1/1 0:00:00

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

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

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

一、 什么是事件

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

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

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

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

索引变量以重建存储状态

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

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

二、声明和触发事件

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

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

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

SGS将在28个机场实施DocCerts区块链管理解决方案:金色财经报道,沙特机场地勤服务提供商SGS将与区块链公司IR4LAB合作,在沙特的28个机场实施DocCerts区块链管理解决方案,适用于SGS提供地面服务的所有培训相关数字文件和地面服务设备许可证。(Zawya)[2023/2/9 11:56:42]

一、什么是日志

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

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

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

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

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

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

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

二、日志记录中的主题

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

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

动态 | BM 讨论EOS 治理解决方案:据MEET.ONE消息,EOS Go 今日发表文章解释 BM 的 EOS 治理提案,对此 BM 回复到:我今天与团队讨论,想到一个新方案:计划启用基于系统库 的 wasm 动态链接,从而使 BP 能部署到系统帐户。他还可以用来填充这些类型的内部函数,而不必每次添加新函数时都使用硬分叉。[2019/10/17]

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

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

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

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

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

声音 | Coinbase首席运营官:Earn平台已收回成本,其价值未被行业真正理解:6月3日,The Block分析师Larry Cermak在推特上分享了一张关于Coinbase新任首席运营官Emilie Choi对于Earn业务的评价图片。图片显示,Choi强调了Earn平台的重要性,认为斥资1.2亿美元收购付费消息网站Earn.com已全方位回收成本,同时还促进了Coinbase的交易和托管业务。她表示:“我们将继续看到该平台的巨大价值,我不认为目前的加密生态真的理解其价值。”Cermak对此评论道,我就是不理解的其中一人。有懂的人吗?[2019/6/3]

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

三、日志记录中的数据

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

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

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

数据比主题所需要的 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 操作码。

高晓松再提比特币:数字货币可理解为南非地底下的黄金:在近日的视频节目《晓说》中,高晓松表示,数字货币可理解为南非地底下的黄金,但是没被挖出来。而区块链技术可以用来证明,我们大家都承认南非地底下有金子,只是大家没把它挖出来变成金币,或放在纽约银行发行纸币。然后,你信、他信、她信,这就是区块链。只要链上的人都相信那地底下有黄金,然后今天你就获得了一磅黄金。大家就都来证明你有了一磅黄金,你就有了一磅黄金。[2018/5/6]

那如果我们想要找到数据的内容呢?这里就需要知道操作码在 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

标签:区块链TOPICSPIC区块链币圈大佬排行榜DTOP币magicstonePichiu

中币热门资讯
金色早报 | DeFi的TVL在6个月时间下滑67%

▌DeFi的TVL在6个月时间下滑67%金色财经报道,在过去的125天或大约四个月中,去中心化金融 (DeFi) 的锁定总价值 (TVL) 一直在500亿美元到650亿美元之间.

1900/1/1 0:00:00
区块链行为报告:加密货币采用率上升 Reddit指明方向

来源:Dappradar作者:Sara Gherghelas尽管宏观经济形势存在不确定性,但Web3开发人员仍在继续建设。今年已发布和确认的所有智能合约中,近36%已被执行。即使在严酷的熊市中,对Dapp行业的炒作依然存在.

1900/1/1 0:00:00
零版税 NFT:创作者经济的范式转变 or 投机者的阴谋?

作者:Gabriel Foo,Spartan Labs 编译:DeFi 之道 随着 Web3 世界中一个两极分化的辩题的升温.

1900/1/1 0:00:00
金色Web3.0日报 | Twitter正在为NFT启动“Tweet Tiles”功能

DeFi数据 1、DeFi代币总市值:421.52亿美元 DeFi总市值及前十代币 数据来源:coingecko2、过去24小时去中心化交易所的交易量22.

1900/1/1 0:00:00
黑客盗币or蓄意跑路 FTX卷款事件全分析(持续)

市场尚未从FTX大厦倾塌、几日宣布破产重组的震惊中恢复,一波未平,一波又起。近日以来,尽管用户存款无法提取,但FTX依在开放交易,用户的存款也被戏称为“欢乐豆”,不少用户扔抱有希望进行操作.

1900/1/1 0:00:00
浅析Move语言背后的设计思想:“不授权”到底安不安全?

作者:/img/20221111235812/0.jpg" />2. 可能有部分合约可以通过设置条件,让一部分用户预执行的时候无法发现状态变更.

1900/1/1 0:00:00