1. 程式人生 > >釋放阻塞的以太坊交易

釋放阻塞的以太坊交易

在這裡插入圖片描述
目前以太坊正面臨著許多積壓的交易,導致一些交易數小時甚至數天都未被處理。 本文解釋了轉賬如何被卡住,以及如何釋放它們。

確定gas價格

傳送以太坊交易時,有許多方法可以確定最佳gas值。https://ethgasstation.info 等網站提供了gas使用情況的概述,https://www.etherscan.io/txsPending 提供了當前交易池的有關資訊。

後者的網站特別有用,因為它可以通過gas價格組織交易清單。 你可以點選 GasPrice 欄來檢視。 由此產生的清單大致也是礦工看待交易的方式,所以如果您據此選擇一個gas價格以確保您的交易是在前幾頁,您可能會有一個非常短的交易確認時間。

但是如果你的交易沒有被確認呢?它有可能被阻塞了,需要進行釋放。

理解阻塞交易

在解釋如何釋放阻塞交易之前,首先了解交易為什麼被阻塞是非常重要的。以太坊是一個區塊鏈:由許多區塊組成,每一個區塊包含多個交易,一個接著一個,都被鏈到區塊鏈中,如下圖所示:

在這裡插入圖片描述

-以太坊的區塊鏈簡化檢視-

(實際上,單個塊和鏈的結構都比較複雜,但是為理解本文,圖表提供的資訊足夠了。)

區塊的創造是由礦工通過所謂的”挖礦“過程而產生的,這一概念已經眾所周知,但是很多人對交易是如何被一個特定區塊選擇包含進去的過程並不清楚。為了更詳細地探索這個過程,讓我們看看下面的示例塊1434的建立。

以太坊包含除區塊鏈以外的許多要素,其中之一就是交易池。交易池包含所有已提交給以太坊網路但尚未分配到區塊中的交易。

區塊 1433 一旦被挖出,對區塊 1434 的開採就開始了。區塊1434 開始為空:

在這裡插入圖片描述

-塊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)