Private-Blockchain

在私有網路上免費部署合約(gasPrice 0)

  • June 19, 2019

為了實現我的私人網路的無硬幣引導,我正在嘗試部署第一個在所有者錢包中具有零資金的特殊合約(這個私人網路的每個錢包都應該有零餘額)並使用松露來做到這一點,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…

引用自:https://ethereum.stackexchange.com/questions/68387