Private-Blockchain
在私有網路上免費部署合約(gasPrice 0)
為了實現我的私人網路的無硬幣引導,我正在嘗試部署第一個在所有者錢包中具有零資金的特殊合約(這個私人網路的每個錢包都應該有零餘額)並使用松露來做到這一點,gasPrice 是在 truffle.js 配置文件上設置為 0。
然而,在部署 truffle Migrations 合約時,會拋出以下錯誤:
"Migrations" could not deploy due to insufficient funds * Account: 0x5FBF29a8Ad77EA087275858d874AcD55526cFbDF * Balance: 0 wei * Message: sender doesn't have enough funds to send tx. The upfront cost is: 9400000000000000 and the sender's account only has: 0
問題是:當gasPrice為0時,9400000000000000怎麼可能是預期成本。成本也不應該是0嗎?
節點控制台上的一些測試表明,即使在 gasPrice=0 的礦工簡單交易上將標誌 gasPrice 設置為 0,也不會被開採。因此,問題可能不在於部署合約,而在於零成本進行交易。
松露.js:
var HDWalletProvider = require("truffle-hdwallet-provider"); var mnemonic = "..."; module.exports = { networks: { development: { gas : 4700000, gasPrice : 0, provider: function() { return new HDWalletProvider(mnemonic, "http://127.0.0.1:port...", 0, 10) }, network_id: "*" // Match any network id }, ropsten: { gas : 4700000, gasPrice : 10000000000, provider: function() { return new HDWalletProvider(mnemonic, "https://ropsten.infura.io/...", 0, 10) }, network_id: "*" // Match any network id } }, compilers: { solc: { version: "0.4.24", docker: false, settings: { optimizer: { enabled: true, } } } } };
Truffle 預設 gas-price 為 20000000000 wei。
您可以在原始碼中看到它:
var default_tx_values = { gas: 6721975, gasPrice: 20000000000, // 20 gwei, from: null };
當您
gasPrice: 0
在 Truffle 配置文件中設置時,將使用預設值。您可以通過在遷移腳本中添加以下列印輸出來觀察它:
console.log(web3.eth.gasPrice)
,如果您使用的是 Truffle v4.x (Web3 v0.x)console.log(await web3.eth.getGasPrice())
,如果您使用的是 Truffle v5.x (Web3 v1.x)如果將此預設值乘以
gasPrice
您的gas
配置,您將得到:20000000000 * 4700000
如果沒有放入計算器,我猜它等於
9400000000000000
。請注意,在官方文件中,他們告訴您:
gas
:用於部署的氣體限制。預設值為 4712388。gasPrice
:用於部署的 Gas 價格。預設值為 100000000000(100 香農)。這在 Truffle 的早期版本中曾經是正確的,但在目前版本中,它分別為 6721975 和 20000000000(正如我上面引用的,直接來自原始碼)。
更新:
上面的所有細節都是準確的,但是,之所以
gasPrice
是 20000000000,並不是因為它是 Truffle 的預設配置,而是因為它是 Ganache 的預設配置。我在這里大膽猜測您的專用網路上的提供商確實是 Ganache…