Solidity
獲取“錯誤:執行 eth_call 時出現 VM 異常:操作碼無效”
我正在嘗試部署/與我的第一個乙太坊智能合約進行互動,
testrpc
但是當我嘗試向我部署的合約“發送交易”時,我收到以下錯誤。
Error: VM Exception while executing eth_call: invalid opcode
我正在使用 web3
v0.14.0
, solcv0.4.11
進行編譯,並使用 ethereumjs-testrpc^4.0.1
作為我的客戶端。這是我的可靠程式碼..
pragma solidity ^0.4.11; contract Voting { mapping (bytes32 => uint8) public votesReceived; bytes32[] public candidateList; function Voting(bytes32[] candidateNames) { candidateList = candidateNames; } function totalVotesFor(bytes32 candidate) returns (uint8) { if (validCandidate(candidate) == false) throw; return votesReceived[candidate]; } function voteForCandidate(bytes32 candidate) { if (validCandidate(candidate) == false) throw; votesReceived[candidate] += 1; } function validCandidate(bytes32 candidate) returns (bool) { for(uint i = 0; i < candidateList.length; i++) { if (candidateList[i] == candidate) { return true; } } return false; } }
這是我的 JavaScript 文件..
const fs = require('fs'); const solc = require('solc') const Web3 = require('web3'); const web3 = new Web3(); web3.setProvider(new web3.providers.HttpProvider('http://localhost:8545')); const address = web3.eth.accounts[0]; const code = fs.readFileSync('Voting.sol').toString() const compiledCode = solc.compile(code) const abiDefinition = JSON.parse(compiledCode.contracts[':Voting'].interface) const byteCode = compiledCode.contracts[':Voting'].bytecode const VotingContract = web3.eth.contract(abiDefinition) const deployedContract = VotingContract.new(['Rama','Nick','Jose'], { data: byteCode, from: web3.eth.accounts[0], gas: 4712388 }); const contractInstance = VotingContract.at(deployedContract.address) contractInstance.totalVotesFor.call('Rama') // Error: Error: VM Exception while executing eth_call: invalid opcode
關於我做錯了什麼的任何想法?另外,請讓我知道我的語言是否正確..
如果您需要更多資訊,我的倉庫在這裡:https ://github.com/iMuzz/hello-world-ethereum-contract
deployContract.address 未定義,因為 VotingContract.new 是一個非同步呼叫。
你可以做這樣的事情。我不知道為什麼它呼叫了兩次該函式,我認為它呼叫一次是為了返回交易ID,第二次是為了設置合約地址。
您還可以查看truffle -contract以獲得更好的 web3 包裝器。
遇到同樣的問題。優秀的答案。非同步請求需要在呼叫 deployContract.address 之前完成。我修改後的程式碼如下:
//creating a new instance of contract, this is an async call - hence the need to wait otherwise invalid opcode error will occur deployedContract = VotingContract.new([],{data: byteCode, from: web3.eth.accounts[0], gas: 4700000}, (err, contract) => { if (contract.address !== undefined) console.log(contract.address) } );