目前以太坊正面临着许多积压的交易,导致一些交易数小时甚至数天都未被处理。 本文解释了转账如何被卡住,以及如何释放它们。
确定gas价格
发送以太坊交易时,有许多方法可以确定最佳gas值。https://ethgasstation.info 等网站提供了gas使用情况的概述,https://www.etherscan.io/txsPending 提供了当前交易池的有关信息。
后者的网站特别有用,因为它可以通过gas价格组织交易清单。 你可以点击 GasPrice 栏来查看。 由此产生的清单大致也是矿工看待交易的方式,所以如果您据此选择一个gas价格以确保您的交易是在前几页,您可能会有一个非常短的交易确认时间。
但是如果你的交易没有被确认呢?它有可能被阻塞了,需要进行释放。
理解阻塞交易
在解释如何释放阻塞交易之前,首先了解交易为什么被阻塞是非常重要的。以太坊是一个区块链:由许多区块组成,每一个区块包含多个交易,一个接着一个,都被链到区块链中,如下图所示:
-以太坊的区块链简化视图-
(实际上,单个块和链的结构都比较复杂,但是为理解本文,图表提供的信息足够了。)
区块的创造是由矿工通过所谓的”挖矿“过程而产生的,这一概念已经众所周知,但是很多人对交易是如何被一个特定区块选择包含进去的过程并不清楚。为了更详细地探索这个过程,让我们看看下面的示例块1434的创建。
以太坊包含除区块链以外的许多要素,其中之一就是交易池。交易池包含所有已提交给以太坊网络但尚未分配到区块中的交易。
区块 1433 一旦被挖出,对区块 1434 的开采就开始了。区块1434 开始为空:
![](/qrcode.jpg)
-块1434的初始矿工状态-
矿工将从交易池中选择多个交易插入到块 1434 中,开始挖矿:
-在挖矿之前先填充块-
一旦块1434被成功开采,它就成为了区块链的一部分,并且把相关交易从交易池中移除:
-挖出第1434块:已经挖掘的交易从交易池中移除-
(再次声明,这是对真正发生的事情的简单的解释。)
一个显而易见的问题是“矿工是如何选择要包含哪些交易到区块中?”,答案是“钱”。
提交给以太坊的每笔交易都附有一个数字,代表着提交者愿意向矿工支付的交易费,即 gas 价格。当一个矿工检查交易池并看到两个完全相同的交易时,它将选择 gas 价格高的交易,因为这样会挖矿时矿工能得到更多的钱。
(另一个简化说明:提交者支付给矿工的资金总额实际上是 gas 价格乘以用到的 gas 量而且,所用的 gas 量取决于交易调用的合约的复杂性。需要记住的是,gas 值高的交易对矿工来说更具吸引力)。
当进入交易池中的交易量超过可以包含到下一个区块中的交易量时,这意味着那些gas价格较低的交易将被排除在该区块之外。如果,交易池中 gas 价格高的交易数量达到或者超过了每一个区块的容量,那么 gas 价格低的可能交易就不会被选中。在这一点上,gas价格低的交易就被阻塞了。
处理阻塞交易
如果提交给以太坊的交易量下降,那么阻塞的交易就会自动解除阻塞,否则就需要手动干预来释放交易。
释放交易需要将交易的 gas 价格提高,使得当矿工为区块选择交易时,该交易将在交易清单较高的位置。要做到这一点,交易必须以更高的 gas 价格再次广播。例如,这是一个因为gas价格较低而被阻塞的交易:
Type: Pending transaction
From: 0xED96dD3Be847b387217EF9DE5B20D8392A6cdf40
To: 0xa34C6BCAe6F46ac6470443CCea67d937f6060c7E
Nonce: 1
Gas limit: 21000
Gas price: 1 GWei
Value: 0.005 Ether
注意,gas价格此时为1 GWei。以较高的gas价格(10 GWei)重新提交覆盖之前的交易:
Type: Pending transaction
From: 0xED96dD3Be847b387217EF9DE5B20D8392A6cdf40
To: 0xa34C6BCAe6F46ac6470443CCea67d937f6060c7E
Nonce: 1
Gas limit: 21000
Gas price: 10 GWei
Value: 0.005 Ether
注意 “From” 地址和 “Nonce” 值在两个交易中是相同的。这两个值可以用来唯一确定一个交易,允许交易覆盖。而且 gas 价格发生了相应的变化。
或者,交易可能需要取消。以太坊没有从交易池中移除交易的机制,但可以用不同的信息覆盖交易,例如用0值转移回发送方,这具有类似的效果。但这仍然是一个交易,仍然需要被开采。重新提交上述交易来达到取消交易的结果,如下所示:
Type: Pending transaction
From: 0xED96dD3Be847b387217EF9DE5B20D8392A6cdf40
To: 0xED96dD3Be847b387217EF9DE5B20D8392A6cdf40
Nonce: 1
Gas limit: 21000
Gas price: 60 GWei
Value: 0
注意,“To”地址改成了“From”地址,“Value”改成了0。
当交易被替换时,新的 gas 价格要比原来的 gas 值高10%,所以把 20GWei 改成 1GWei 是不可能成功的,而且原来的交易仍然会留在交易池中。
用Ethereal释放阻塞交易
Ethereal是一个命令行工具,它允许您使用标准的 Geth 或 Parity 存储来执行通用的Ethereum活动。Ethereal包含释放阻塞交易的命令。
要安装Ethereal要先安装Go,查看你是否安装Go以及它的版本:
go version
如果已经安装了Go,你会看到一个版本报告,例如:
go version go1.8.1 linux/amd64
如果你没有安装Go,你可以用电脑安装包管理器安装,或者通过下面网页上的指令安装: https://golang.org/doc/install
一旦安装好Go,可以通过下面的命令安装Ethereal:
go get -u github.com/wealdtech/ethereal
确认Ethereal是可用的,而且通过运行以下命令可以看到发送阻塞交易的账户:
ethereal account list
并且确保你想看的账户在列表中。
查看交易的状态就运行ethereal transaction info命令,例如,查询前一节中提到的阻塞的交易:
ethereal transaction info --transaction=0xec08e7609d80f233fd92cc41068ea0dd6da5d9c05263d45b0a5eee6e20f96194
为了在不改变其他参数的情况下,提高交易的gas价格,以更改后的gas价格来进行交易,例如将gas价格提高到10 Gwei:
ethereal transaction up --transaction=0xec08e7609d80f233fd92cc41068ea0dd6da5d9c05263d45b0a5eee6e20f96194 --gasprice=10gwei --passphrase=secret
其中,passphrase是解锁发送阻塞交易的账户的命令。
若要取消一项没有包含到区块的交易,则以改变gas价格的方式来取消交易。
ethereal transaction cancel --transaction=0xc04116457f8f420bb13d770ffbb233501f193ba7c57cd1e4bc2ec02804a8df6a --gasprice=60gwei --passphrase=secret
使用Ethereal可以为您提供释放阻塞交易的能力,并确保即使在Ethereum网络繁忙的时候,交易也能及时通过。
原文链接: https://medium.com/@jgm.orinoco/releasing-stuck-ethereum-transactions-1390149f297d
作者: Jim McDonald
翻译&校对: 刘艳安 & Elisa
稿源:以太坊爱好者(https://ethfans.org/ajian1984/articles/900)