|分析 Mempool,复盘“黑色星期四”( 二 )


结果就是大量的交易通过网络传播 , 迫使使用默认交易池设置的节点通过下列手段来保护自己的系统资源:

  1. 删除 , 或者说丢弃掉许多有效的交易;
  2. 拒绝 , 或者说无视掉许多有效的交易 。
交易池通常会用最低手续费门槛来选择放弃哪些交易 。 虽说这些被丢掉的交易并没在整个网络中 “完全丢失” , 但被丢掉的交易可能会遭遇显著的时延 , 直至网络条件回归正常 。
|分析 Mempool,复盘“黑色星期四”
本文插图

- 2020 年 3 月 11 日至 3 月 14 日期间 , 到达交易池的被丢弃掉的交易和卡壳交易(不能处理的交易)计数(按小时计)-
更重要的是 , 丢弃交易还会带来一个副作用:增加交易卡壳的可能性 。
删掉一笔交易之后 , 该节点不会留下关于该笔交易的任何信息 , 比如发送地址和交易 nonce 。 因此 , 当同一个地址的一笔新的交易(使用新的一个 nonce)到达交易池 , 该节点会发现该地址已处理交易和这笔新交易之间有 nonce 空缺(nonce gap)(因为该新交易的上一笔交易还没得到处理) , 因此也不能处理这笔新交易 。 受此效果影响的交易就只能放到该节点的交易池中无法处理的队列中 。 这些交易 , 无论所支付的交易手续费(即 Gas 费)有多高 , 都一概会被卡住、无法处理 。 想了解更多细节 , 请看我们此前讲解交易排序的文章:《节点是你通往内存池的网关》 。
与此同时 , 网络的堵塞导致进入内存池的 Gas Price 门槛随之迅速提高 , 因此最初的一些交易现在会因为 Gas Price 太低而被拒绝 。 而且 , 因为之前被删除的交易不能回到交易池中来 , 交易的 nonce 空缺问题又变得更严重了 。 事实上 , 一些节点实现会在一段时间内主动无视掉这些被拒绝的交易 , 以保护自己不受点对点网络中的泛滥攻击(spamming)影响 。 所以 ,nonce 空缺实际上会锁住这些受影响的地址 , 使得他们无法完成新的交易 。
卡壳交易更有可能影响会发出许多新交易的地址 , 包括自动化交易系统、支付网络 , 甚至交易所 。 这些系统想回到正轨 , 但通常会加剧拥堵 , 因为越来越多交易被推迟处理 。
有没有解决办法?你得主动发现自己何时开始遭遇卡壳 。 这可能有点难 , 因为你的交易可能仅在某些节点处是卡壳的 , 但并不是在所有节点处都面临卡壳 。 因此 , 你必须确定第一笔被丢弃、导致 nonce 空缺的交易 , 然后立即用可以得到打包的 Gas Price加速让这笔交易上链 。 最后 , 你还得继续监控一开始发现卡壳的交易 , 确保它从不能处理的队列中移回到了交易池的待打包部分中 , 并成功上链 。 如果你的交易还是卡壳 , 重复上述加速步骤 , 直到你可以确认所有导致 nonce 空缺的交易都已成功上链 。 当然 , 这也是我们开发并运营我们的 Notify API 的理由之一 。
2. 压缩内存池中可上链的部分
网络阻塞的出现 —— 及其导致的交易卡壳 —— 使得交易池中可上链交易的比重迅速缩减 。 我们管这叫 “交易池压缩” 。 矿工的激励分两部分:区块奖励和交易的 Gas Price;所以收益最大化需要打包 Gas Price 最高的那部分交易 , 挖矿时要根据交易池 —— 即候选交易(也可以说候选区块)—— 的情况(也就是各交易愿意给多高的 Gas Price)来决定打包哪些交易 。
在交易池拥堵时 , 多种行为会导致交易池压缩 , 对矿工来说值得考虑的交易比重越来越小:
  1. 资源耗尽:在某些节点实现中 , 卡壳交易数量的迅速上升会消耗掉可观的交易内存池资源 。 这又反过来导致节点处理有效 pending 交易的可用资源进一步减少 。
  2. 不断升高的 Gas Price:ETH 价格的下跌导致许多交易变得 “高度紧急” , 因为这些交易在构造时是希望能够赶在 ETH 进一步下跌时上链确认的 。 这使得个体用户也好、自动化机器人也好 , 都赶紧提高 Gas Price 。 因为不是所有参与者都这样密切关注着堵塞情形 , 待打包交易总体包含了反常比例的低价 —— 因此不可能被打包的 —— 交易 。


    推荐阅读