话不多说,请看上图
正常情况下,我们部署合约到以太坊网络上,会花费0.01 - 1个ETH这个区间,当你部署合约时,Gas费超过了1个ETH,部署脚本就会告诉你部署一个合约建议不要超过1个ETH,你应该检查下你的代码或脚本,然后部署脚本终止部署。
但是某种情况是,你自己使用web3.js或者ethers.js部署的合约,gas limit和gas price是你自己设置的值,你没有写提示拦截等逻辑,然后设置了一个很大的值,结果就导致部署一个简单的合约,花费了巨大的价钱。
const fs = require('fs');
const solc = require('solc');
const Web3 = require('web3');
const myContractSol = fs.readFileSync('../contracts/MyContractLogic.sol');
var input = {
language: 'Solidity',
sources: {
'myContractSol': {
content: myContractSol().toString()
}
},
settings: {
outputSelection: {
'*': {
'*': ['*']
}
}
}
};
var output = JSON.parse(solc.compile(JSON.stringify(input)));
console.log(output)
const bytecode = output.contracts.SuperConfig.SuperConfig.evm.bytecode.object;
const abi = output.contracts.SuperConfig.SuperConfig.abi;
let rpcUrl = "https://mainnet.infura.io/v3/your-key";
const web3 = new Web3(new Web3.providers.HttpProvider(rpcUrl));
const privateKey = '0x00xxxxxxx';
const account = web3.eth.accounts.privateKeyToAccount(privateKey);
web3.eth.accounts.wallet.add(account);
web3.eth.defaultAccount = account.address;
const contract = new web3.eth.Contract(abi);
contract.deploy({
data: "0x" + bytecode,
})
.send({
from: account.address,
gas: 5000000,
gasPrice: 800 * (10 ** 9),
}, function(error, transactionHash){
console.log("=====error, transactionHash: ", error, transactionHash)
})
.on('error', function(error){
console.log("=====error: ", error)
})
.on('transactionHash', function(transactionHash){
console.log("=====transactionHash: ", transactionHash)
})
.on('receipt', function(receipt){
console.log("receipt合约地址:", receipt.options)
})
.on('confirmation', function(confirmationNumber, receipt){
console.log("=====confirmation:", confirmationNumber)
})
.then(function(newContractInstance){
console.log("last合约地址:", newContractInstance.options)
});
知道在哪一行了吗?就是Send()那个函数,当时的情况是,网络特别拥堵,我试了2天都不能部署成功,就一直增加gas limit和gas price,结果吧,之前发出去的那些交易,有一些被成交了,有一些超时被取消了。
然后就是设置gas比较的高的那两笔交易被意外成交了,可惜了我的ETH。
发此文章就是警告自己,小心谨慎设值gas limit和gas price,可以跟MetaMask学习,缓慢的增加gas limit和gas price.
|