7676枚ETH巨额矿工费事件完整回顾_币圈问答_鼎鸿网

7676枚ETH巨额矿工费事件完整回顾

angula 0

9月27日,据Etherscan显现,Bitfinex买卖所的一个主要钱包以7676.62ETH的Gas费用中止了一笔10万美元USDT的转账,最终接收方为2019年从Bitfinex分拆进去的非托管买卖所DeversiFi。这笔巨额矿工费随后被不知名矿工转至币安买卖所。

9月28日,事情取得一个完美的结局。经过Bitfinex和币安及矿工商量,以太坊区块13307440显现,矿工归还了Bitfinex钱包昨晚误操作而付出的7626ETHGas费用,DeversiFi给矿工保管了50 ETH作为感谢费。

9月29日,DeversiFi公布了这一事情的完整演讲。

事情回想

1、发生了什么

UTC +1时间11.10.08 AM,用户向DeversiFi取出10万USDT。

这笔买卖在 1 分钟内取得确认……但这笔买卖的买卖费高达7,676 ETH(约2300 万美元)

? ?2、为什么发生

EthereumJS库中的潜在效果,再加上在某些状况下和EIP-1559升级相关的gas费用变化,可以招致交易费用极高

又遇上Ledger硬件钱包有时可以以非人类可读的方式显现Gas费用,错失用户肉眼平安检查

只需ETH数量十分大的钱包才会遭到影响,其他用户会看到交易失利

3、DeversiFi做了什么

到UTC+1下午12:30:00,DeversiFi团队见地到这个效果并末尾了调查。

很快肯定了两个主要关心点,末尾自动测试,试图重现和注释过失交易是如何创立的。

与区块链社区分享了一个注释,留意到这个交

到UTC + 1时间16:45,禁用Ledger用户放款

到早晨,找到gas费用函数中能够的元凶祸首,并入手实施改良

增加了额外的平安和健全性检查,以确保与交易相关的gas费用不会逾越不真实际的阈值,以防止用户过失、极端网络费用飙升,并作为防止任何未来编码过失的额外维护层

向EthereumJs维护者提交效果,描画了EthereumJs库中的缺陷

最后与Ledger团队就测试时期发觉的十分状况中止了沟通,这些十分状况能够会混杂任何以太坊交易的十分高额费用

在28/09/21 15:30 之前推出了平安改良和重封锁款

? ?4、追回资金

不知名矿工在13307440区块打包的巨额Gas费,之后发觉此矿工将挖到的ETH取出币安,DeversiFi立刻联系了币安。

币安赞同将DeversiFi的电子邮件地址传递给矿工

UTC + 1工夫20:36 ,收到矿工的电子邮件,达成平安返还资金的流程

一个小时内,矿工完成退款交易,共退款7626枚ETH

DeversiFi给矿工保管了50 ETH作为感谢费

5、终究发生了什么

背景知识

先回想一下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/txnpm包(https://github/ethereumjs/ethereumjs-monorepo)自己生成交易。

精细来说,创立了一个EIP1559交易主体,在与Ledger钱包库接口之前生成音讯注入参数和费用,以提示用户在他们的硬件装备上签名。

处置活动精度和扩展数值范围的库在以太坊生态系统中很主要,由于智能合约能够前往高达256位的数字。JavaScript自身无法处置招致截断或浮点过失的精度。并非一切的大数字库都支持浮点值,倒运的是,ethereumjs库使用了BN(https://github/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倍。(金色财经)

7676枚ETH巨额矿工费事件完整回顾文档下载: PDF DOC TXT