儘管我的氣體限制非常低,但我收到“錯誤:超過塊氣體限制”
我正在嘗試使用 Web3.js、Ethereumjs-tx 和 Alchemy 節點在 Rinkeby 測試網中創建一個簡單的事務。我只設法以 0.001 Gwei 的氣體推動交易,並且已經等待了一個多小時。這是一個 TxHash:https ://rinkeby.etherscan.io/tx/0xdd9e7673ca54a8c4b034f214a85027f246584c21478f3143e024999bce38ffa8
我可以通過 MetaMask 立即發送 1.5 Gwei 的 gas,但即使在我的程序中輸入 0.01 Gwei gasPrice 也會引發“超過塊 gas 限制”錯誤。錢包裡有足夠的 Gwei。我不知道問題是什麼。
這是我的程式碼:
var Tx = require('ethereumjs-tx').Transaction; const Web3 = require('web3'); const web3 = new Web3('MyAlchemyHTTPKeyForRinkeby'); const account1 = 'PublicKey1'; const account2 = 'PublicKey2' const privateKey1 = Buffer.from('MyPrivateKey1', 'hex'); const privateKey2 = Buffer.from('MyPrivateKey1', 'hex'); web3.eth.getTransactionCount(account2, (err, txCount)=> { const txObject = { nonce: web3.utils.toHex(txCount), to: account1, value: web3.utils.toHex(web3.utils.toWei('1000000', 'gwei')) , gasLimit: web3.utils.toHex(web3.utils.toWei('1.5', 'gwei')), gasPrice: web3.utils.toHex(web3.utils.toWei('1', 'gwei')), from: account2 } //sign const tx = new Tx(txObject,{chain:4}); tx.sign(privateKey2); const serializedTransaction = tx.serialize(); const raw = "0x" + serializedTransaction.toString('hex'); web3.eth.sendSignedTransaction(raw, (err, txHash)=> { console.log('txHash:', txHash); console.log('error:', err); }) })
你誤解了什麼是氣體。
在 Wei 中它不是一個值,它是它自己的一個度量單位,與 EVM 支持的各種指令的計算成本有關。1氣不等於X wei或任何東西,它只是一種氣。
通過查看Etherscan Rinkeby,我們可以看到在撰寫本文時,該區塊的氣體限制為 30,000,000 GAS(不是 wei)。當您提供 1.5 gwei 轉換為 wei 時:1,500,000,000 wei,您將其用作氣體值。所以你確實遠遠超過了區塊氣體限制。
從 EOA 到 EOA 的簡單轉移應該花費 21,000 氣體(為了安全起見,請隨意將此值提高一點:60,000 左右綽綽有餘)。
目前的 gasPrice 似乎略高於 1 Gwei。
所以這些設置應該為你做:
gasLimit: 60000, gasPrice: web3.utils.toWei('1.1', 'gwei')),
如果您想要一些更強大的東西,請不要猶豫使用 gas price helpers,例如Web3 中包含的那個,而您的 tx 使用的 gas 將是恆定的,而 gas 價格不是。
您可以查看Alchemy的文件中的 EIP-1559 天然氣價格機制。
我只設法以 0.001 Gwei 的氣體推動交易,並且已經等待了一個多小時。
您連結的 tx 的汽油價格為 0.01 Gwei,因此“礦工”無法獲得它的價格。不到目前價格的 1%……難怪它為什麼會無限期等待。
希望這能回答你的問題 !