我试图通过在脱机计算机上签署事务,然后将字节码传输到在线系统进行部署,从而将智能契约部署到Ethereum块链上。因此,我无法即时查询现时的汽油价格和汽油限额。
我得到一个'Error:返回的错误:超过块气体限制‘。
我认为部署合同的代价更多地取决于运行了多少函数和使用了多少资源,因此度量的大小可能过于粗糙,无法判断发生了什么,但我的是: 3984字节。
我目前的汽油限值为120万(120万),汽油价格为2千兆(20亿或20亿)。Note:我刚试过,用50万的气体限制,它失败了!WTF?
I不明白当 https://ethstats.net/ <#>consistently报告的块限制约为800万(800万)时,我是如何超过块限制的。
我正在使用多个solidity源文件,我将这些源文件读入sol_input_array中,然后以主文件为目标,该主文件使用parent_file_and_object字符串提取依赖程序的函数。
关于这个错误,互联网上似乎有更多的问题而不是答案,所以也许我们可以就一个详尽的清单进行协作,这样当我们遇到错误时,这个错误就不会那么令人费解了!
~$ geth version
Geth
Version: 1.8.2-stable
Architecture: amd64
Protocol Versions: [63 62]
Network Id: 1
Go Version: go1.10
Operating System: darwin
GOPATH=
GOROOT=/usr/local/opt/go/libexec项目版本数据:
Node: v9.10.0
web3: web3@1.0.0-beta.33
file-system (fs): mac:fs@0.0.1-security linux: file-system@2.2.2
solc: solc@0.4.21
ethereumjs-tx: ethereumjs-tx@1.3.4 这是我的合同签署功能:
function compile_and_sign_transaction_offline (p_key, address, gasPriceHex, parent_file_and_object){
var privateKey = new Buffer(p_key, 'hex')
const compiled_contract = solc.compile({sources: sol_input_array}, 1);
const bytecode = compiled_contract.contracts[parent_file_and_object].bytecode;
const contractData = '0x' + bytecode;
//I have currently have been testing gas prices of 1.2-3 Gwei
const gasLimitHex = '0x124F80'; //1,200,000 gas
const rawTx = {
nonce: 0x00,
gasPrice: gasPriceHex,
gasLimit: gasLimitHex,
data: contractData,
from: address
};
const tx = new Tx(rawTx);
tx.sign(privateKey);
const serializedTx = tx.serialize();
const signed_transaction = serializedTx.toString('hex');
fs.writeFileSync("signed_tx", signed_transaction);
}发布于 2018-04-28 00:36:26
因此,这个函数工作得很好。问题出在通往封锁链的管道里。我不确定我的发件人函数、geth实例或我下载的区块链本身是否是问题所在。
但最疯狂的是,使用相同的代码(包括脱机签名和在线部署流程),我能够很好地部署到rinkeby,而部署到mainnet时返回了这个“超出块气体限制”的错误。
因此,孩子们,除了测试网测试之外,还要确保在发布前在do上测试!
https://ethereum.stackexchange.com/questions/46124
复制相似问题