以太坊采用不同的事务类型来定义不同的操作,例如,将以太币发送至某个地址、部署合约等等。
在最近的柏林升级之前,以太坊主要有4种不同的事务「类型」:
·带有收款方地址、数据字段的常规事务
·不带有收款方地址的合约部署事务,其数据字段填写的是合约代码
·签名?v?值不含链ID的事务
·签名?v?值含有链ID的事务??
上述事务类型都采用相同的格式。不同的以太坊客户端、库和其它工具必须分析每个事务来判断它属于哪个类型。这四种不同的事务类型引入了很多复杂的情况。我们需要查看事务的所有字段来判断其所属类型。这是人们在提议新的事务类型时不得不面对的重大难题,直到EIP2718出现才打破这一困境。
以太坊现在有了新的事务标准TypedTransactionEnvelope,由?EIP2718?的提议者?MicahZoltu?定义。该标准为以太坊上的一些新功能和即将开发的功能奠定了基础。在本文中,我们将回顾柏林升级引入的一些标准以及未来有可能引入的其它标准。
Beosin:Skyward Finance项目遭受攻击事件简析:金色财经报道,根据区块链安全审计公司Beosin旗下Beosin EagleEye 安全风险监控、预警与阻断平台监测显示,Near链上的Skyward Finance项目遭受漏洞攻击,Beosin分析发现由于skyward.near合约的redeem_skyward函数没有正确校验token_account_ids参数,导致攻击者5ebc5ecca14a44175464d0e6a7d3b2a6890229cd5f19cfb29ce8b1651fd58d39传入相同的token_account_id,并多次领取了WNear奖励。本次攻击导致项目损失了约108万个Near,约320万美元。Beosin Trace追踪发现被盗金额已被攻击者转走。[2022/11/3 12:12:36]
标准化的事务封套??
过去,以太坊的事务都采用同一种格式。每个以太坊事务都有6个字段:nonce、gasprice、gaslimit、toaddress、value、data、v、r和s。这些字段需要经过?RLP编码,如下所示:
慢雾:跨链互操作协议Nomad桥攻击事件简析:金色财经消息,据慢雾区消息,跨链互操作协议Nomad桥遭受黑客攻击,导致资金被非预期的取出。慢雾安全团队分析如下:
1. 在Nomad的Replica合约中,用户可以通过send函数发起跨链交易,并在目标链上通过process函数进行执行。在进行process操作时会通过acceptableRoot检查用户提交的消息必须属于是可接受的根,其会在prove中被设置。因此用户必须提交有效的消息才可进行操作。
2. 项目方在进行Replica合约部署初始化时,先将可信根设置为0,随后又通过update函数对可信根设置为正常非0数据。Replica合约中会通过confirmAt映射保存可信根开始生效的时间以便在acceptableRoot中检查消息根是否有效。但在update新根时却并未将旧的根的confirmAt设置为0,这将导致虽然合约中可信根改变了但旧的根仍然在生效状态。
3. 因此攻击者可以直接构造任意消息,由于未经过prove因此此消息映射返回的根是0,而项目方由于在初始化时将0设置为可信根且其并未随着可信根的修改而失效,导致了攻击者任意构造的消息可以正常执行,从而窃取Nomad桥的资产。
综上,本次攻击是由于Nomad桥Replica合约在初始化时可信根被设置为0x0,且在进行可信根修改时并未将旧根失效,导致了攻击可以构造任意消息对桥进行资金窃取。[2022/8/2 2:52:59]
RLP()
Grim Finance 被黑简析:攻击者通过闪电贷借出 WFTM 与 BTC 代币:据慢雾区情报,2021 年 12 月 19 日,Fantom 链上 Grim Finance 项目遭受攻击。慢雾安全团队进行分析后以简讯的形式分享给大家。
1. 攻击者通过闪电贷借出 WFTM 与 BTC 代币,并在 SpiritSwap 中添加流动性获得 SPIRIT-LP 流动性凭证。
2. 随后攻击者通过 Grim Finance 的 GrimBoostVault 合约中的 depositFor 函数进行流动性抵押操作,而 depositFor 允许用户指定转入的 token 并通过 safeTransferFrom 将用户指定的代币转入 GrimBoostVault 中,depositFor 会根据用户转账前后本合约与策略池预期接收代币(预期接收 want 代币,本次攻击中应为 SPIRIT-LP)的差值为用户铸造抵押凭证。
3. 但由于 depositFor 函数并未检查用户指定转入的 token 的合法性,攻击者在调用 depositFor 函数时传入了由攻击者恶意创建的代币合约地址。当 GrimBoostVault 通过 safeTransferFrom 函数调用恶意合约的 transferFrom 函数时,恶意合约再次重入调用了 depositFor 函数。攻击者进行了多次重入并在最后一次转入真正的 SPIRIT-LP 流动性凭证进行抵押,此操作确保了在重入前后 GrimBoostVault 预期接收代币的差值存在。随后 depositFor 函数根据此差值计算并为攻击者铸造对应的抵押凭证。
4. 由于攻击者对 GrimBoostVault 合约重入了多次,因此 GrimBoostVault 合约为攻击者铸造了远多于预期的抵押凭证。攻击者使用此凭证在 GrimBoostVault 合约中取出了远多于之前抵押的 SPIRIT-LP 流动性凭证。随后攻击者使用此 SPIRIT-LP 流动性凭证移除流动性获得 WFTM 与 BTC 代币并归还闪电贷完成获利。
此次攻击是由于 GrimBoostVault 合约的 depositFor 函数未对用户传入的 token 的合法性进行检查且无防重入锁,导致恶意用户可以传入恶意代币地址对 depositFor 进行重入获得远多于预期的抵押凭证。慢雾安全团队建议:对于用户传入的参数应检查其是否符合预期,对于函数中的外部调用应控制好外部调用带来的重入攻击等风险。[2021/12/19 7:49:04]
EIP2718?为类型化事务定义了一种新的通用封套。在新的标准下,事务如下所示:
慢雾:Avalanche链上Zabu Finance被黑简析:据慢雾区情报,9月12日,Avalanche上Zabu Finance项目遭受闪电贷攻击,慢雾安全团队进行分析后以简讯的形式分享给大家参考:
1.攻击者首先创建两个攻击合约,随后通过攻击合约1在Pangolin将WAVAX兑换成SPORE代币,并将获得的SPORE代币抵押至ZABUFarm合约中,为后续获取ZABU代币奖励做准备。
2.攻击者通过攻击合约2从Pangolin闪电贷借出SPORE代币,随后开始不断的使用SPORE代币在ZABUFarm合约中进行`抵押/提现`操作。由于SPORE代币在转账过程中需要收取一定的手续费(SPORE合约收取),而ZABUFarm合约实际接收到的SPORE代币数量是小于攻击者传入的抵押数量的。分析中我们注意到ZABUFarm合约在用户抵押时会直接记录用户传入的抵押数量,而不是记录合约实际收到的代币数量,但ZABUFarm合约在用户提现时允许用户全部提取用户抵押时合约记录的抵押数量。这就导致了攻击者在抵押时ZABUFarm合约实际接收到的SPORE代币数量小于攻击者在提现时ZABUFarm合约转出给攻击者的代币数量。
3.攻击者正是利用了ZABUFarm合约与SPORE代币兼容性问题导致的记账缺陷,从而不断通过`抵押/提现`操作将ZABUFarm合约中的SPORE资金消耗至一个极低的数值。而ZABUFarm合约的抵押奖励正是通过累积的区块奖励除合约中抵押的SPORE代币总量参与计算的,因此当ZABUFarm合约中的SPORE代币总量降低到一个极低的数值时无疑会计算出一个极大的奖励数值。
4.攻击者通过先前已在ZABUFarm中有进行抵押的攻击合约1获取了大量的ZABU代币奖励,随后便对ZABU代币进行了抛售。
此次攻击是由于ZabuFinance的抵押模型与SPORE代币不兼容导致的,此类问题导致的攻击已经发生的多起,慢雾安全团队建议:项目抵押模型在对接通缩型代币时应记录用户在转账前后合约实际的代币变化,而不是依赖于用户传入的抵押代币数量。[2021/9/12 23:19:21]
TransactionType?||?TransactionPayload
慢雾:Spartan Protocol被黑简析:据慢雾区情报,币安智能链项目 Spartan Protocol 被黑,损失金额约 3000 万美元,慢雾安全团队第一时间介入分析,并以简讯的形式分享给大家参考:
1. 攻击者通过闪电贷先从 PancakeSwap 中借出 WBNB;
2. 在 WBNB-SPT1 的池子中,先使用借来的一部分 WBNB 不断的通过 swap 兑换成 SPT1,导致兑换池中产生巨大滑点;
3. 攻击者将持有的 WBNB 与 SPT1 向 WBNB-SPT1 池子添加流动性获得 LP 凭证,但是在添加流动性的时候存在一个滑点修正机制,在添加流动性时将对池的滑点进行修正,但没有限制最高可修正的滑点大小,此时添加流动性,由于滑点修正机制,获得的 LP 数量并不是一个正常的值;
4. 随后继续进行 swap 操作将 WBNB 兑换成 SPT1,此时池子中的 WBNB 增多 SPT1 减少;
5. swap 之后攻击者将持有的 WBNB 和 SPT1 都转移给 WBNB-SPT1 池子,然后进行移除流动性操作;
6. 在移除流动性时会通过池子中实时的代币数量来计算用户的 LP 可获得多少对应的代币,由于步骤 5,此时会获得比添加流动性时更多的代币;
7. 在移除流动性之后会更新池子中的 baseAmount 与 tokenAmount,由于移除流动性时没有和添加流动性一样存在滑点修正机制,移除流动性后两种代币的数量和合约记录的代币数量会存在一定的差值;
8. 因此在与实际有差值的情况下还能再次添加流动性获得 LP,此后攻击者只要再次移除流动性就能再次获得对应的两种代币;
9. 之后攻击者只需再将 SPT1 代币兑换成 WBNB,最后即可获得更多的 WBNB。详情见原文链接。[2021/5/2 21:17:59]
上述字段的定义是:
·TransactionType:0至0x7f范围内的某个值,最多可代表128种事务类型。
·TransactionPayload:由事务类型定义的任意一个字节数组。??
将上述字段连接起来,即可得到一个类型化事务。EIP2718?没有为事务的有效负载定义格式。因此,事务的有效负载可以是任意一段经过编码的字节序列,只要采用符合新的事务类型定义的编码器即可。之所以选择简单的字节相连方式,是因为读取字节数组的第一个字节非常简单,无需使用任何库或工具。也就是说,你不需要使用RLP或SSZ解析器来判断事务类型。
这个方法可以避免新的EIP在引入新的事务类型时增加现有事务格式的复杂性,并让不同的以太坊工具更容易区分不同的事务。
在增加复杂性这一点上,EIP-155?就是一个很好的例子。它通过在事务中引入链ID来实现重放攻击保护。由于在事务参数中增加新的字段会破坏向后兼容性,链ID被编码进了事务签名的恢复参数,就像我在上一篇关于数字签名的文章中解释的那样。实行EIP2718后,我们可以在不影响向后兼容性的情况下定义新的事务类型。??
向后兼容性和传统事务
EIP2718的一大特点就是向后兼容。EIP2718是完全向后兼容的。也就是说,现有的工具、库、钱包和事务都是开箱即用的,但是它们无法使用EIP2718提供的新「功能」。以太坊网络上的新事务依然可以使用旧的事务格式。
新的事务类型最多可达0x7f种。选择这一上限是为了保证向后兼容传统事务。经过RLP编码的事务的第一个字节始终大于或等于0xc0,因此类型化事务永远不会与传统事务产生冲突,而且类型化事务和传统事务之间可以通过第一个字节来区分。??
EIP2718本身并未定义任何事务类型,不过已经出现了一些采用这一新标准的EIP:
·EIP1559:改革ETH1.0链的交易费市场。你肯定听说过这个EIP。
·EIP2711:代付事务、限期事务和批量事务。这个EIP同样由MicahZoltu提出,EIP-2718中定义的标准就是为此创建的。
·EIP2930:可选访问列表。??
我们将在下文详细解释其中一些标准。??
为什么要引入新的事务类型?
新的事务类型可以实现原本需要借助于Solidity合约或第三方解决方案的功能集成。以限期事务为例。在现有解决方案中,你可以将资金发送至Solidity合约,签署一个事务并将其发送到专门的节点,让该事务获得额外的参数。然后,该节点会处理该事务,确保它在有效期之前执行,否则该事务不会被广播。一些dApp和合约内置该功能,但是对于大多数事务而言很难实现。
EIP2711可以将该功能添加到以太坊网络上,同时保证向后兼容传统事务,而且无需使用智能合约或专门的节点。但是,EIP2711目前还是草案,我们还无法确定它近期是否会在以太坊网络上实行。EIP2711也有可能被拆分成几个小的EIP。??
?-图源:f2pool-??
EIP1559提出的新的事务格式
在EIP1559中,gas的运作方式发生了巨大变化:gas会被部分销毁,不再全部支付给矿工。本文不会具体阐述EIP1559的所有变化,但是EIP1559确实提出了一种新的事务格式:??
0x02||RLP()??
最显著的变化包括:
·用「每单位gas的最高优先费用」和「每单位gas的最高费用」来代替gasprice。
·链ID是单独编码的,不再包含在签名v值内。这实际上是使用更简单的实现来代替EIP155。
·签名v值变成了一个简单的校验位,不是0就是1,具体取决于使用椭圆曲线上的哪个点。??
EIP1559还提供了一种基于EIP2930指定访问列表的方法。这样可以减少事务的gas成本。
由于EIP1559极大地改变了gas费的运作方式,它并不能直接兼容传统事务。为了保证向后兼容性,EIP1559提出了一种将传统事务升级成兼容EIP1559事务的方法,即,使用「每单位gas的最高优先费用」和「每单位gas的最高费用」来代替?「gas价格」。??
原生元事务和批量事务
元事务诞生已经有几年了,但是到目前为止都需要依靠智能合约。和限期事务一样,元事务也要求用户将以太币发送至专为元事务创建的智能合约。
EIP2711使得原生元事务和批量事务成为可能,无需依赖于智能合约。这里定义了一个新的事务格式,事务类型是?0x02。交易如下所示:??
0x02?||?RLP()??
EIP2711主要包括gas付款方的有效负载和签名。这样一来,即使不持有任何以太币的地址也能发送ERC20代币。
发送方的有效负载和签名等均基于事务子类型定义。例如,如果交易类型为?1,发送方的有效负载被定义为:??
,?nonce,?ChainId,?ValidUntil,?gasLimit,?gasPrice]??
ChildTransaction?被定义为?,可以在单个事务内指定收款方地址、值和数据。例如,ChildTransaction?可以用来在单笔事务中调用ERC20的?approve?和?transferFrom。
如果你想了解更多关于EIP2711的事务子类型的信息,我建议你阅读?EIP2711的规范。??
结论
类型化事务为以太坊网络带来了更多可能性。我们在创建类型化事务时不会增加以太坊客户端、库和其它工具的复杂性。
目前,由于EIP2718最近才被添加到网络中,新的事务类型还没有得到广泛应用,但是目前还有一些很棒的EIP正在开发中,例如,EIP2711提出了限期事务、批量事务和代付事务。由于以太坊上可以定义新的事务类型,提出新的EIP也会变得更容易。
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。