從一天開始,交易在 ropsten 測試網上停滯不前
我正在為 ERC20 代幣轉移方法編寫一個簡單的腳本。它離線簽署交易,然後將其送出到網路。
傳輸方法編碼數據:
var encoded = await MyContract.methods .transfer(receiver_address, 10);
要獲取發件人帳戶的隨機數:
var nonce = await web3.eth.getTransactionCount( sender_address, "pending" );
要獲得最新區塊的估計 Gas:
let estimatedGas = await web3.eth.estimateGas({ "from" : sender_address, "nonce" : nonce, "to" : address_contract, "data" : encoded.encodeABI(), });
在這裡,我使用 ethereumjs-tx cdn 連結創建了一個 tx 對象:
let privateKey = new ethereumjs.Buffer.Buffer(key, 'hex') var tx = { nonce: nonce, gasPrice: web3.utils.toHex(gasPrice), gasLimit: web3.utils.toHex( estimatedGas + 1000000), to: address_contract, data: encoded.encodeABI(), }; let tx_object = new ethereumjs.Tx(tx , { chain: 'ropsten' }) tx_object.sign(privateKey) let serializedTx = tx_object.serialize();
然後我將交易送出給 ropsten 測試網:
web3.eth.sendSignedTransaction('0X'+serializedTx.toString('hex')) .on("transactionHash", function (hash) { document.getElementById("error").innerHTML = "Transaction Hash :" + hash; });
交易的 Gas Limit 為:
Gas Limit:1051110 also tried with gas Limit of latest block 8000029
交易的 Gas 價格為:
Gas Price:0.000000002 Ether (2 Gwei)
但我的問題是交易從兩天開始就陷入待處理狀態。我附上圖片和連結到契約地址
合約連結:https ://ropsten.etherscan.io/address/0xdc11d98aa50b99a948a4fc2e159c30c5ba9a8364
以下是 web3 和 etherumjs-tx 的版本:
- web3 版本 1.0.0-beta.34(也嘗試了 1.0.0-beta.26 和 @latest)
- Ethereumjs-tx 版本 ethereumjs-tx-1.3.3
我不認為我的 gas Price 或 gas Limit 有問題。
你的gas價格太低了。
您可以在此處查看“估計”,目前為 2 gwei,正如我所寫:https ://ropsten-stats.parity.io/
我想你的意思是說 8 gwei,但它相差了幾個數量級。
這是一個了解卡住交易的機會,現在可以解決這些問題,任何大規模發送交易的流程都應該解決這些問題。
要知道的事情。
確保來自任何帳戶的交易都將按隨機數順序進行探勘。很好,但是如果發件人(或錢包)不斷增加隨機數,這些交易也不會被探勘。卡住的交易必須被探勘,或者必須被替換。
這總比沒有好,但它不可靠。
var nonce = await web3.eth.getTransactionCount( sender_address, "pending" );
不可靠性源於從每個節點的角度來看,未決池是主觀的。他們無法報告他們不知道的待處理交易。因此,您想自己管理 nonce 並在進行時增加它。你可以使用這樣的函式來初始化它並使用你得到的東西,但是這樣做的時候你可能會取消或與你的節點沒有聽說過的未決交易競爭。
這為我們提供了有關如何取消交易的線索。
取消
要取消待處理的交易,請先獲取另一個具有相同 nonce 的交易來探勘。
當您的自動化流程(或您)認為它太長時,請關注您的記錄等鏈下問題,然後發出交易以取消目標。它應該有一個高於要取消的交易的 gas 價格(我會為了快速獲得回饋而對 gas 價格比較激進),它應該具有與目標相同的 nonce,並且應該來自同一個帳戶。
您可以
{ from: me, to: me, value: 0, nonce: victim }
在沒有數據的情況下發送。這是一個“什麼都不做”的交易,但它是有效的。如果您相應地對其定價,它將被快速開採,您將能夠確認它像任何其他交易一樣被開採。這將肯定地證明原始目標永遠不會被開採,因此再次進行(無論是什麼)都是安全的。希望能幫助到你。