这几天我被以太坊网络困住了。
我对以太坊网络的使用本就不太熟悉,加上速度慢、Gas 高等缺点,我怀有一定程度的偏见。
3天前,我将手里的 Badger 代币存入 Badger Dao 以获取收益。
在进行了一系列的 Approve、Deposit、Stake 的操作后,Gas 费花了好几百美金。
最崩溃的是我居然卡在了最后一步,钱花了,币却卡在网络中,裂开……
但没相到更让我裂开的是两天后的今天,我又往账号里转了十几个 ETH ,准备通过 Metamask 的聚合交易功能加仓 Badger,一通操作下来,所有交易全部卡住。
看着 Badger 的价格一路攀升,我焦急地求助朋友们,心急如焚。
最后也没得到想要的答案。
最后痛定思痛,下定决心自己解决,于是在网上找各种教程。
我的注意力却因此高度集中了,一边阅读一边思考,在理解了以太坊网络的打包机制后终于找到了解决办法。
过程比想象中简单多了,我真傻,偏见阻碍了我前进的脚步。
我的问题源自一笔 Stake 交易,为了省点钱,Gas费(gwei值)拉太低了,正常情况等几个小时交易会被打包,但是这几天以太坊网络持续拥堵,Gas 费不断攀升,我的小额交易费被矿工无情的嫌弃了。
按照以太坊网络的设计,后一笔交易的 nonce 等于前一笔交易的 nonce+1。
系统按照 nonce值 的顺序来打包每一笔交易,如果前面的交易没有完成,后续所有交易都得排队。
而解决方法是发起一笔新的交易,使用和卡住那笔交易同样 nonce值,并乖乖拉高 Gas费,以此覆盖第一笔交易。
当卡住的交易被覆盖并被打包后,后面卡住的交易就迎刃而解了。
解决问题最有效的方式是直面问题,而不是回避、恐惧或偏见。
风会熄灭蜡烛,却能使火越烧越旺。
注1:不同时段的 gwei 值所对应的 ETH 是不同,网络通畅时 200gwei 可能是 0.001ETH,网络拥堵时 50gwei 可能是0.05ETH。所以我们和以太坊网络交互之前,应该先查看当前网络合理的 gwei 值是多少。
注2:nonce 是以太坊网络的一个可选参数,作用是防止双花。
以下是 nonce 使用的几条规则:
● 当nonce太小(小于之前已经有交易使用的 nonce),交易会被直接拒绝。
● 当nonce太大,交易会一直处于队列之中,这也就是导致我的问题的原因;
● 当发送一个较大的 nonce,然后用多笔交易以此填补第一笔交易 nonce 到那个较大 nonce 之间的差,交易可被执行。
● 通常情况下,覆盖掉一笔处于 pending 状态的交易 gas price 需要高于原交易的110%。
所以,对于每一个地址,在以太坊的交易中,必须严格按照 nonce 往上递增。nonce 不会重复,也不会跳跃。只有等上一笔交易成功之后,才开始下一笔,这样就能很好地防止双花问题。
网友评论