Solidity

獲取“錯誤:執行 eth_call 時出現 VM 異常:操作碼無效”

  • September 23, 2017

我正在嘗試部署/與我的第一個乙太坊智能合約進行互動,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)
       }
);

引用自:https://ethereum.stackexchange.com/questions/22885