引介

GasNow:真正的 Gas 价格指示器

Ajian   |     |   426 次阅读

对于以太坊用户来说,真正的灵魂三问莫过于:我在做什么交易?我该给多少的 Gas?应该把 Gas Price 设成多少才经济实惠?

简单来说,Gas 是用来度量以太坊上一笔交易所需花用的计算量的单位。一笔交易的复杂度越高,所需花用的 Gas 也就越多,所以,越是复杂的交易,在发起交易时越要设定(预留)较多的 Gas 额度,如果发起者预留的 Gas 数量不够多,交易会因为计算资源耗尽而失败。

但是好就好在,这事用不着操心,可以设一个自己的账户支付得起又充分大的数值,因为,没有用掉的 Gas 是不会计算手续费的,换言之,虽然你设置了这笔交易可以用掉 100 Gas,但实际上只用掉了 20 Gas,那打包你的交易的出块者就只能得到 20 Gas 的手续费,不能白收你的。此外,现在的 Gas 使用量估算技术已经很普遍了,用户使用 Metamask 钱包插件跟应用交互的时候,会发现自己根本不需要手动设置 Gas Limit,插件已经帮你估算好了。

但是讲到 Gas Price,就头疼了。大家都知道,这个参数表达的是交易发起者自己愿意为每一单位的 Gas 支付的价格,而这部分价格最终会被打包该笔交易的出块者得到;有鉴于此,出块者当然青睐那些 Gas Price 高的交易。但是,谁不想让手续费便宜一些呢?谁不想经济实惠地达成交易呢?

因此,几乎所有的以太坊用户在日常使用中都会接触到一种工具:Gas 价格指示器,它的作用是告诉你,你设置多少的 Gas Price,就能让自己的交易在自己想要的时间内被打包。比如下图展示的就是生态里可能是最常用的 Gas 价格指示器:Gas Station。

- 它的大意是说:如果你想要自己的交易在 2 分钟之内被打包,那就要设置 95 Gwei 乃至更高的 Gas 价格;如果你只需要它在 5 分钟之内被打包,那设置成 79 Gwei 以上就好。 -

大多数像你我一样的用户,在使用 Gas Station 时都不会发觉有什么问题。但是,假如你要做高频的交易呢?或者假如你要写一个交易机器人呢?Gas Station 真的可以依赖吗?

这可不是在找茬,也不是装神弄鬼。这篇文章就提到了 2020 年 3 月 14 日(因 ETH 价格暴跌而导致链上活动大量增加)时候许多用户的艰难遭遇:在以太坊协议中,一个账户发起的交易是有顺序的,由一个只增不减的流水号 nonce 来标记顺序;当你的前序交易因为 Gas Price 太低而被出块节点丢弃的时候,不论你给后序交易设置再高的 Gas Price,都于事无补,因为节点不能越过前序交易直接打包后序交易,但是前序交易已经丢弃了,这就等于使你的账户锁死了。唯一的解救办法就是找回你最早一笔还未上链的交易,使用这笔交易的流水号重发一笔交易,并且 Gas Price 要足够高。同样地,许多交易机器人也因为同样的原因被卡,原因就是因为它们依赖的 Gas 价格报告器对网络 Gas 价格的预估有误,发出几笔交易之后,机器人就卡死了。

这些血淋淋的教训充分说明了,为每一笔交易安排合适的 Gas 价格,有多么重要。因为当链上应用活跃的时候(比如前一段时间的 Yield Farming 热潮),一笔交易的成功不仅会影响这笔交易,还会影响后序交易。

但是,是什么阻碍了我们获得准确的 Gas 价格估计呢?我们能克服吗?

在最根本上来说,阻碍我们的是区块链网络的点对点网络架构:所有节点都是分散的,当某一笔交易被发送到一个节点时,该节点做一定的校验之后会把交易数据广播给其它节点;这种网络结构决定了,没有任何一个节点能实时获得整个网络的未处理交易的全局状态,交易的传播需要时间,也需要偶然(某些节点可能会用更高的 Gas Price 作为门槛、拒收低手续费的交易来保护自己)。对于这一点,我们只能改善,不可能从根本上克服,因为我们不想要一个中心化的网络结构。

但另一方面,至关重要的是我们预估 Gas 价格的方法。目前为止,绝大部分 Gas 价格指示器所用的方法,都是根据过去一段时间里被打包到区块里的交易的 Gas 价格加以统计方法处理,得出对未来 Gas 价格的估计。仔细想想这其实很不合理,在你发交易的这一刻,决定你的交易多快能上链的是现有未处理交易中比你交易的 Gas 价格更高的交易有多少,以及在你的交易还未打包的这段时间里有多少人发出了比你的 Gas 价格更高的交易。拿已经上链的交易,也就是历史数据,去做这样的预估,貌似合理,实则荒谬。当网络活动快速增加、Gas 价格快速攀升的时候,按历史数据估计的方法大概率只能给出低估的 Gas 价格。更准确的估计应该基于现有未处理交易的 Gas 价格分布,哪怕还需要统计方法处理,也会比拿历史数据来估计要更简单。

这就是 GasNow 厉害的地方。它不再基于历史数据来预测未来,它基于的是星火矿池节点的交易池中交易的 Gas 价格分布。为了收益的最大化,矿池一方面要尽可能地收集交易,另一方面,要从高到低打包交易池中待打包的交易。所以,GasNow 给出的数据,是真正具有参考意义的。

- 如图,网页直接告诉了你矿池交易队列中由高到低排序的第 50 笔、第 200 笔、第 400 笔交易的 Gas 价格。这就有的放矢了 -

理论上来说,所有的 Gas 价格指示器,都应该转变成 GasNow 这样的模式,不再根据历史数据,而是根据实时数据,来帮助用户做决策。但饶是如此,GasNow 也是有竞争力的。因为矿池的交易池会比普通的、没有优化的节点的交易池更全面,更有参考意义。

Gas Station 在自述中说,“希望能提高 Gas 价格的透明度”,这当然是个很有意义的目标;而且,Gas 价格的不清晰,其实根值于网络的点对点特性(因此,我个人非常不愿意把这种不清晰当成是一种 “问题”),值得更多人作出更多的尝试,用服务本身的分散性来降低点对点网络带来的不确定性、使我们获得更全局的视野。

但至少,GasNow 应该是离这个理想更近一步了。

https://www.gasnow.org,来试一下。


作者: 阿剑

 
0 人喜欢