Contract-Deployment
離線簽署的契約拋出“超過塊氣體限制”。為什麼我不能部署?
我正在嘗試通過在離線電腦上簽署交易,然後將字節碼傳輸到線上系統進行部署,將智能合約部署到乙太坊區塊鏈上。因此,我無法實時查詢目前的 gas 價格和 gas 限制。
我收到“錯誤:返回錯誤:超出塊氣體限制”。
我認為部署合約的價格更多地取決於執行了多少功能和使用了多少資源,因此衡量的大小可能過於粗略,無法判斷發生了什麼,但我的是:3984 字節。
我目前的 gas 限制設置為 1,200,000(120 萬),gas 價格設置為 2Gwei(2,000,000,000 或 20 億)。 注意:我剛剛嘗試過,但使用 500,000 的氣體限制失敗了!怎麼回事??
當https://ethstats.net/持續報告大約 8,000,000(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); }
所以事實證明這個功能工作正常。問題出在通往區塊鏈的管道中。我不確定我的發送函式、geth 實例或我下載的區塊鏈本身是否是問題所在。
最瘋狂的事情是,使用相同的程式碼(離線簽名和線上部署流程),我能夠很好地部署到 rinkeby 測試網,而部署到主網返回這個“超過塊氣體限制”錯誤。
所以孩子們,除了測試網測試之外,請確保在發布之前在主網上進行測試!