媒介

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

交易事务日记关于用户以及开发者来说现实上都是至关重要的。通过触发事务不只能将链上智能合约的交易通知给外界,还能让智能合约开发者对合约停止测试、包管合约平安。

接下来就帮忙各人详细理解下关于以太坊的事务日记以及关于它所延伸出来的一些根底常识。

事务

一、 什么是事务

事务是能便利地挪用以太坊虚拟机日记功用的接口。

而 Solidity 事务就是 EVM 的日记功用之上的笼统。应用法式能够通过以太坊客户端的 RPC 接口订阅和监听那些事务,允许我们打印在区块链上的信息。

所以通过 Solidity 事务,我们能够做到:

测试智能合约中的特定变量索引变量以重建存储形态监听事务用于改动前端形态

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

二、声明和触发事务

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

理解以太坊事务日记  第1张

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

在 ERC20.sol 的 _transfer 函数中通过 emit 关键字触发响应事务(之前的版本里其实不需要利用 emit)。

理解以太坊事务日记  第2张

日记

一、什么是日记

在以太坊中,日记是用来存储事务。当事务被挪用时,会触发参数存储到交易的日记中。其不克不及被智能合约拜候,但是能够供给关于交易和区块中发送的信息。

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

理解以太坊事务日记  第3张

通过日记我们能够将日记分为四个部门:

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

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

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

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

二、日记记录中的主题

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

每个日记记录都包罗「主题 (topics)」和「数据 (data)」。主题是 32 字节(256 位),用于描述事务中发作的工作。差别的操做码 (LOG0 LOG1 LOG2 LOG3 LOG4) 用以描述需要包罗在日记记录中的主题数。

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

理解以太坊事务日记  第4张

Topics0 凡是为发作事务名称的签名(keccak256 的哈希值),包罗其参数的类型(address,uint256 等),Topics1 为第一个索引参数的值,Topics2 为第二个索引参数的值。

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

理解以太坊事务日记  第5张

而我们对事务 Transfer(address,address,uint256) 停止 keccak256 加密后得到的成果和 Name 的值一样,申明 Name 的值确实为事务名称的签名。当然,有一个破例是没有事务签名的,那就是触发「匿名事务」时。

理解以太坊事务日记  第6张

Topics1 就是第一个索引参数的值,即 form 地址的值。Topics2 就是第二个索引参数的值,即 to 地址的值。从内部挪用阐发也能看到确实是如许。

理解以太坊事务日记  第7张

主题只能包罗 32 个字节的数据,所以像可能超越 32 个字节的内容如数组、字符串等的内容不克不及用做主题,若是要测验考试包罗大于 32 个字节的数据,则该主题必需进过 hash 计算,所以超越 32 个字节后更好当做数据包罗在日记记录中。

三、日记记录中的数据

日记记录除了主题,还有一部门内容就是数据,数据就是事务的非索引参数的 ABI 编码或者 hash 值,我们能够利用 Dec 或 Hex 查看数据 data 的值。

理解以太坊事务日记  第8张

数据和主题都有各自的好坏:

主题是能够搜刮到的,数据不克不及搜刮到。数据比主题所需要的 gas 少。

因为主题是带有索引的参数,所以我们能够间接在日记中停止搜刮,而数据是 ABI 编码或 hash 值,所以不克不及间接搜刮。

按照黄皮书我们能够找到日记的相关 gas 成本,日记的根底费用是 375 gas,每个主题也是 375 gas,而数据字节的成本是 8 gas。

理解以太坊事务日记  第9张

我们能够通过黄皮书晓得日记的 gas 费用十分廉价,一个 ERC20 代币转账事务的成本最多只破费 1756 gas(日记根底的 375 gas,转账事务 3 个主题的 375 * 3 =1125 gas,数据字节更大的 32 字节为 8 * 32 = 256 gas),而尺度以太币的转账需要破费 21000 gas。当然了,前面说的只是日记记录操做本身的成本,智能合约开发中不克不及单纯值计算日记记录操做的成本,但在开发中,我们能够仅在形态变量中保留智能合约所需要利用的数据,其他的就用事务来处置,如许能省下良多的 gas 费用。

理解以太坊事务日记  第10张

触发事务

接下来以一个实例停止申明触发事务,下面的代码实现了契合 ERC20 尺度的代币合约所利用的转账事务。

理解以太坊事务日记  第11张

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

理解以太坊事务日记  第12张

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

理解以太坊事务日记  第13张

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

理解以太坊事务日记  第14张

那若是我们想要找到数据的内容呢?那里就需要晓得操做码在 EVM 中的参数。LOG3 固然包罗 3 个主题,在 EVM 中却有 5 个参数。

理解以太坊事务日记  第15张

若是要读取数据的内容,通过以下的体例就能够从内存中读取事务数据了。

理解以太坊事务日记  第16张

垂钓

一、事务在垂钓中的利用

前面介绍了那么多日记事务,那那些是若何和垂钓联络到一路的呢?攻击者一般会通过日记事务假装成交易所或者名人等给受害者转币(该币无现实交易价值,是垂钓代币),受害者看到是交易所或者名人转来的代币则放松警觉,此时攻击者会引导受害者到有垂钓代币的池子中,受害者看到该代币交易价值极高,会立即受权停止交易,而此时就陷入了攻击者设置的圈套,攻击者会让受害者受权从而窃取走受害者钱包中的钱。

下图就是之前发作的一路垂钓事务,攻击者假装成币安热钱包给其别人转垂钓代币。

理解以太坊事务日记  第17张

理解以太坊事务日记  第18张

我们能够在 BSC 阅读器上通过标签找到官方地址。

理解以太坊事务日记  第19张

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

理解以太坊事务日记  第20张

因为阅读器记录是按照事务来的,所以说 topics1 的值即 sender 的值就是 0x8894e0a0c962cb723c1976a4421c95949be2d4e3

理解以太坊事务日记  第21张

二、复现

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

理解以太坊事务日记  第22张

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

理解以太坊事务日记  第23张

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

理解以太坊事务日记  第24张

摆设好合约(https://bscscan.com/address/0x7c08aa19b8da2c14591506d7d3c385fc702e0630)后挪用 transfer 函数将垂钓代币转发给受害者。

理解以太坊事务日记  第25张

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

理解以太坊事务日记  第26张

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

理解以太坊事务日记  第27张

总结

细节决定成败,不要认为事务日记是微不敷道的沧海一粟。在区块链世界越是细节的处所越容易被黑客攻击操纵,往往需要愈加隆重小心。同时需要留意的是,我们也不克不及因为日记所展现出来的内容掉入骗子设想好的圈套中。再次提醒各人,不要随意点击目生链接,更不要随意受权别人。当我们愈加深切理解事务日记的时候,才气更好的避免本身受骗被骗。

参考文献《Solidity 中文文档》《Solidity 中的事务和日记》《Understanding event logs on the Ethereum blockchain》《以太坊黄皮书 》

from https://www.freebuf.com/articles/blockchain-articles/349885.html