Metamask在生成消息和签名方面做了大量繁重的工作,但是对于Ledger等其他钱包,饰德弗西菲使用@ethereumjs/txNPM包(https://github/ethereumjs/ethe
9月27日,据Etherscan报道,Bitfinex交易所的一个主要钱包以7676.62ETH的油费进行了USDT10万的转账最终的接收方是DeversiFi,这是一家2019年从Bitfinex分拆出来的非托管交易所。这个巨大的矿工';这笔费用随后被身份不明的矿工转移到货币证券交易所。9月28日,事情有了一个圆满的结局。。在Bitfinex与Bi'安和矿工,以太坊第13307440块显示矿工昨晚因误操作退回了Bitfinex钱包支付的7626eth
燃气费。DeversiFi为矿工保留了50ETH作为感谢费。
9月29日,DeversiFi发布了关于这一事件的完整报告。
事件回顾
1、发生了什么
At11:10:08a.m.UTC1time,theuserdeposited100,000USDtintoDevicefield.
交易在1分钟内确认.但这笔交易的交易费却高达7,676ETH(约2300万美元)
?2.为什么
EthereumJS库中会出现潜在问题?此外,在某些情况下,与EIP-1559升级相关的燃气费的变化可能会导致极高的交易费
,有时账本硬件钱包可能会以非人类可读的方式显示燃气费,这可能会错过用户';肉眼安全检查
。只有ETH数量非常多的钱包才会受到影响,其他用户会看到交易失败
3。DeversiFi
在UTC1时间12:30:00之前做了什么?DeversiFi团队意识到了这个问题,并开始了调查。
我们很快确定了两个主要问题,并开始积极测试,试图重现并解释错误的事务是如何创建的。
与区块链社区分享了一个解释,并注意到了这一交流。从
到UTC1的16:45,总账
的用户存款被禁止,直到晚上,发现了气费功能的可能元凶,开始改进
,增加了额外的安全性和健全性检查。,保证与交易相关的燃气费用不会超过不切实际的门槛,防止用户错误和极端网络费用飙升,将问题提交给EthereumJs维护人员,作为额外的保护层,防止未来出现任何编码错误
。,描述了EthereumJs库
中的缺陷。最后,我们与Ledger团队就测试中发现的异常情况进行了沟通,这些异常情况可能会混淆任何以太坊交易的异常高的成本
。28/09/21
15:30之前推出安全改进和重开存款?4.追回13307440
区块不明矿工打包的巨额气费。后来发现矿工把挖出的ETH存入了货币券。DeversiFi立即联系了Bi'安。
Bi';安同意在20:36将DeversiFi的邮箱地址发送给矿工
UTC1,并收到矿工的邮件,从而实现了安全返还资金
的过程。一个小时内矿工完成退款交易,共7626ETH
deversfi为矿工预留50ETH作为感谢费
5。怎么回事
背景知识
。首先,让';让我们回顾一下EIP-1559是如何改变以太坊交易成本的处理方式的。
EIP-1559交易由三部分组成:
基本费用-由网络决定并销毁
。每气最大费用为获得块状包装而支付的每单位气的最大金额
最大优先费用直接支付给矿工的用户可选小费
。EIP-1559交易包括这些新字段,称为类型2,而提供原始天然气价格字段的遗留交易仍受支持,称为类型0。我们不';不要讨论1型
发生了什么。
一个常见的误解是,EIP-1559交易完全消除了用户为交易支付过多燃气费的可能性。但是,当优先权费用和最高费用设置得过高时,就无法防止意外的超额支付。
详细调查
DeversiFi是以太坊中用于DeFi的第2层协议,它有一个前端,并提供一个简单的接口来访问来自各种钱包的协议,包括Metamask和Ledger。大约一个月前,DeversiFi更新了前端。,以便利用EIP-1559交易提供的伦敦硬叉激活,并利用最新版本的以太坊库和根据文档实现新功能。
Metamask在生成消息和签名方面做了大量繁重的工作,但是对于Ledger等其他钱包,饰德弗西菲使用@ethereumjs/tx
NPM包(https://github/ethereumjs/ethereumjs-monorepo)ErstellenSieselbsttransactionen
具体而言,创建EIP1559交易主题,以在与分类帐钱包库连接之前生成消息注入参数和费用,从而提示用户签署其硬件设备。
处理具有固定精度和扩展数值范围的库在以太坊生态系统中非常重要,因为智能合约可以返回高达
256位的数字。JavaScript本身无法处理导致截断或浮点错误的精度。。并非所有的大数字字体都支持浮点值。可惜ethereumjs库用的是BN
(https://github/indutny/BN.js/),BN不支持。看来这话有些道理。因为坚固性不会';不直接支持除整数之外的任何东西,它把责任转移到任何集成它的库的人身上,它不';不要使用十进制十进制数值。
这是这个过程中的第一个问题。,尤其是在计算汽油和优先成本,然后将其转换为大型数字对象时。因为最近的块是用来预测优先级代价的,所以计算结果可能是一个十进制的小数(MyCrypto的Tay已经警告一段时间了)
。当生成的gas值为整数时,底层的ethereumjs库代码运行的很完美,但是当gas值为十进制小数时就变得很奇怪了。以太坊库代码使用的
BN库抛出错误,表示传递了无效值。但是,由于该值首先被转换为缓冲区,因此不会触发错误处理。
例如,传递一个值339430439将得到一个整数3559,这可能比预期值高六个数量级。3000000000005
当这种错误的数字解释发生时,它要么因为优先气量高于每种气体的最大成本而失败,要么因为用户的钱包中几乎不可能有足够的ETH来支付这种巨大的气体成本超支。这意味着除了少数硬件钱包用户遇到过这个问题,几乎所有人都不会明白自己交易失败的原因。
在Ledger上签署交易时,将向用户显示最高费用,以便他们可以验证待授权的交易。更糟糕的是目前,分类帐以十六进制值显示非常大的费用。
尝试重现此问题时,DeversiFi遇到如上图所示的成本提示。在显示该问题的示例交易中B526167CF91FECE4的十六进制值等于
13053145295991336164。这相当于1305491964gwei或13.05ETH的天文费用。
如果交易被接受(并且钱包中有资金支付交易),用户将签署高达216,564ETH的费用。
DeversiFi怀疑在块13307440中是否存在这种情况,其中最高支付费用超过授权ETH费用的2倍。(金财经)