私有網路上的簡單合約永遠不會被探勘
我正在嘗試在專用網路和本地區塊鏈上執行Frontier 文件中的眾籌範例。我可以創建合約,但似乎無法探勘它。
您可以在此處查看我在
geth
控制台中執行的程式碼的要點。特別是,眾籌範例涉及兩個合約:一個被呼叫
token
,一個被呼叫Crowdsale
。我可以用solc
; 給定合約的來源crowdSrc
和一個名為“foo”的未鎖定帳戶,以下程式碼token
將按預期創建合約:var crowdCompiled = eth.compile.solidity(crowdSrc); var tokenContract = eth.contract(crowdCompiled.token.info.abiDefinition); var token = tokenContract.new( 10000 , { from: foo , data: crowdCompiled.token.code , gas: 300000 } , function(e, contract) { if(!e) { if(!contract.address) { console.log( "Contract transaction send: TransactionHash: " + contract.transactionHash + " waiting to be mined..."); } else { console.log("Contract mined! Address: " + contract.address); } } })
當我通過以下幾個執行緒開始探勘時,這幾乎是在瞬間探勘出來的
miner.start(2)
:Contract mined! Address: 0xaacc2f82f12a54172a0eb6b499a91578a5b7e0b5
我可以檢查它的地址:
> token.address "0xaacc2f82f12a54172a0eb6b499a91578a5b7e0b5"
現在。
crowdCompiled
還包含Crowdsale
合約的編譯程式碼,所以我可以從解鎖帳戶“foo”創建它,如下所示:var crowdContract = eth.contract(crowdCompiled.Crowdsale.info.abiDefinition); var _beneficiary = foo; var _fundingGoal = parseInt(web3.toWei(100, 'ether')); var _duration = 5; var _price = parseInt(web3.toWei(0.02, 'ether')); var _reward = token.address; var crowdsale = crowdContract.new( _beneficiary , _fundingGoal , _duration , _price , _reward , { from: foo , data: crowdCompiled.Crowdsale.code , gas: 300000 } , function(e, contract) { if (!e) { if (!contract.address) { console.log( "contract transaction send: hash " + contract.transactionHash + " waiting to be mined."); } else { console.log("contract mined, address " + contract.address); } }});
再次創建良好:
contract transaction send: hash 0xc813953780a364f91f339a711a301188f9c546a29915ae19fd1722e335076ad8 waiting to be mined.
但是,如果它確實完成了,完成探勘這個合約的時間似乎比預期的要長得多。我已經開始
miner.start(2)
無數次地等待超過五十個街區,但我從未真正設法探勘契約。當礦工處於活動狀態時,我可以確認這
crowdsale._eth.hashrate
是一個有效的數字(例如 139791、206544 等)。檢查crowdsale.address
產量undefined
。為什麼這個簡單的合約要花這麼長時間才能探勘?我錯過了什麼,或者這種行為可能是由於錯誤造成的?我是否缺少任何有用的 web3 方法或其他提示來幫助診斷問題?
一種可能性是您的 gas 用完了(即部署合約需要比您允許的更多的計算量)。請將 gas 限制提高到 300 萬,然後再試一次,看看是否是問題所在。
更一般地說,如果您看到這樣的問題,您可能希望增加日誌記錄以查看是否發生了一些錯誤以及究竟是什麼。一種有用的方法是
--vmdebug
創建 EVM 正在做什麼的大量堆棧轉儲,如果以 終止OUT OF GAS
,那麼您將立即得到答案:)