9月27日,据Etherscan显现,Bitfinex买卖所的一个主要钱包以7676.62ETH的Gas费用进行了一笔10万美元USDT的转账,最终接收方为2019年从Bitfinex分拆出来的非保管买卖所DeversiFi。这笔巨额矿工费随后被不知名矿工转至币安买卖所。
9月28日,工作得到一个满意的结局。通过Bitfinex和币安及矿工交涉,以太坊区块13307440显现,矿工归还了Bitfinex钱包昨夜误操作而付出的7626ETH Gas费用,DeversiFi给矿工保留了50 ETH作为感谢费。
9月29日,DeversiFi发布了这一事件的完整陈述。
事件回忆
产生了什么
UTC +1时刻11.10.08 AM,用户向DeversiFi存入10万USDT。
这笔买卖在 1 分钟内得到确认......但这笔买卖的买卖费高达7,676 ETH(约2300 万美元)
https://etherscan.io/tx/0x2c9931793876db33b1a9aad123ad4921dfb9cd5e59dbb78ce78f28717595
为什么产生
EthereumJS库中的潜在问题,再加上在某些状况下和EIP-1559晋级相关的gas费用变化,或许导致买卖费用极高
又遇上Ledger硬件钱包有时或许以非人类可读的方式显现Gas费用,失去用户肉眼安全查看
只要ETH数量非常大的钱包才会受到影响,其他用户会看到买卖失败
DeversiFi做了什么
到UTC+1下午12:30:00,DeversiFi团队意识到这个问题并开端了调查。
很快确认了两个主要关注点,开端积极测试,试图重现和解说过错买卖是怎么创建的。
与区块链社区共享了一个解说,注意到这个买卖https://twitter.com/deversifi/status/1442487743922286594
到UTC + 1时刻16:45,禁用Ledger用户存款
到晚上,找到gas费用函数中或许的元凶巨恶,并着手施行改善
增加了额定的安全和健全性查看,以保证与买卖相关的gas费用不会超越不切实际的阈值,以避免用户过错、极端网络费用飙升,并作为避免任何未来编码过错的额定保护层
向EthereumJs维护者提交问题,描述了EthereumJs库中的缺陷
最终与Ledger团队就测试期间发现的反常状况进行了沟通,这些反常状况或许会混淆任何以太坊买卖的反常高额费用
在28/09/21 15:30 之前推出了安全改善和重开存款
追回资金
不知名矿工在13307440区块打包的巨额Gas费,之后发现此矿工将挖到的ETH存入币安,DeversiFi马上联系了币安。
币安赞同将DeversiFi的电子邮件地址传递给矿工
UTC + 1时刻20:36 ,收到矿工的电子邮件,达到安全返还资金的流程
一个小时内,矿工完成退款买卖,共退款7626枚ETH
https://etherscan.io/tx/0x85294effd53126b3bfa9e7f655267e00ac1ae2ef76f4569644670bf5403637d6
DeversiFi给矿工保留了50 ETH作为感谢费
到底产生了什么
背景常识
先回忆一下EIP-1559怎么改动以太坊买卖费用的处理方式。
EIP-1559买卖由三部分组成:
基本费用 - 由网络决议并毁掉
Max Fee Per Gas - 为获得区块打包而为每单位Gas付出的最大金额
Max Priority Fee - 用户可选的、直接付出给矿工的小费
EIP-1559 买卖包括这些新字段,称为类型 2,而供给原始 Gas Price 字段的留传买卖仍受支撑,称为类型 0。咱们不评论类型 1 产生了什么。
一个常见的误解是EIP-1559买卖彻底消除了用户为买卖付出过高Gas费的或许性。但在优先费用和最高费用都设置得太高的状况下,无法避免意外多付。
详细调查
DeversiFi是以太坊上用于DeFi的第2层协议,其具有一个前端,供给一个简略的界面来从各种钱包访问协议,包括Metamask和Ledger。大约一个月前,DeversiFi更新了前端,以运用伦敦硬分叉激活供给的EIP-1559买卖,用最新版本的以太坊库并依照文档实现了新功能。
Metamask在生成音讯和签名时执行了很多繁重的作业,可是对于Ledger等其他钱包,DeversiFi运用@ethereumjs/tx npm包(https://github.com/ethereumjs/ethereumjs-monorepo)自己生成买卖。
具体来说,创建了一个EIP1559买卖主体,在与Ledger钱包库接口之前生成音讯注入参数和费用,以提示用户在他们的硬件设备上签名。
处理固定精度和扩展数值范围的库在以太坊生态系统中很重要,因为智能合约能够回来高达 256位的数字。JavaScript自身无法处理导致截断或浮点过错的精度。并非所有的大数字库都支撑浮点值,不幸的是,ethereumjs库运用了BN (https://github.com/indutny/bn.js/),而BN也不支撑。看起来这有些道理,因为Solidity不直接支撑除整数以外的任何内容,但它确实将职责推给了任何集成其库的人,也不运用十进制小数数值。
这是这个过程第一个出现问题的地方,特别是计算gas和优先费用然后转换成一个大数字目标时。因为运用最近几个区块用于预测优先费用,因而计算结果或许是十进制小数型数值(MyCrypto的Tay现已警告一段时刻了)
当生成的gas值为整数时,底层的ethereumjs库代码完美运行,可是当gas值为十进制小数数值时变得古怪。以太坊库代码运用的 BN库抛出一个过错,标明传递了一个无效值,可是因为该值首先被转换为缓冲区,因而没有触发过错处理。
例如,传递值33974230439.550003将得到一个整数35624562649959629,或许比预期高六个数量级。
当这种过错的数字解说产生时,它要么因为优先gas金额高于每个gas的最大费用而失败,要么因为用户在钱包中具有的ETH数量简直总是不或许足够高来付出这笔巨额的Gas费超标。
这意味着,除了遇到此问题的少量硬件钱包用户,简直所有人都不会了解他们的买卖失败的原因。
在Ledger上签署买卖时,会向用户显现最高费用,以便他们验证将要授权的买卖。让工作进一步恶化的要素是,当时Ledger将非常大的费用显现为十六进制值。
在测验重现该问题时,DeversiFi遇到了如上所示的费用提示。在显现该问题的示例买卖中,B526167CF91FECE4 的十六进制值等于 13053145295991336164,这相当于13053145295991.336164 Gwei或 13.05 ETH的天文费用。
如果此买卖被承受(而且钱包中存在用于付出它的资金),用户将签署最高216,564 ETH 的费用。
DeversiFi置疑区块13307440是否或许就是这种状况,其间已付出的最高费用超越了授权的ETH费用2倍。
原文出处:金色财经,不代表云顶量化立场,如有侵权,请联系删除
云顶量化是币圈专业量化策略团队,团队成员均有3年以上金融量化实战经验,主要针对比特币量化(BTC),以太坊量化(ETH),狗狗币(DOGE),SHIB等各种虚拟数字货币推出资金费率套利策略和合约趋势型量化机器人策略。经过长时间实盘测试,策略的稳定型,实用型,可行性都是顶尖水平。