„Fehler: VM-Ausnahme beim Ausführen von eth_call: ungültiger Opcode“ beim Zugriff auf das Array

Ich versuche, die Speicherung in einen Smart Contract zu integrieren, in dem die Adresse der Vertragsteilnehmer in einer address[]Nachschlagetabelle gespeichert wird participationAddressLUT.

Der Vertrag wird mit 2 Adressen in der Nachschlagetabelle über die Funktion initialisiert bootstrapParticipation(). Der participationSize()Getter gibt uns die Größe der Nachschlagetabelle.

Wenn Sie jedoch versuchen, die Größe der Nachschlagetabelle mit web3 abzurufenv0.20.2

TokenSale.at(this.state.contractAddress).then((instance) => {
    instance.participationSize.call().then((r) => {
        console.log('participationSize: ', r)
    })
})

wir erhalten den kryptischen Fehler

Nicht erfasster (versprochener) Fehler: Fehler: VM-Ausnahme beim Ausführen von eth_call: ungültiger Opcode

Was ist falsch am aktuellen Vertragscode, der dies verhindert hat?

Vertragscode:

pragma solidity ^0.4.15;
import "./libs/zeppelin/crowdsale/CappedCrowdsale.sol";
import "./libs/zeppelin/crowdsale/FinalizableCrowdsale.sol";

contract TokenSale is CappedCrowdsale, FinalizableCrowdsale {

    mapping (address => uint256) public participationWeis;
    address[] public participationAddressLUT;

    function TokenSale(uint256 _startTime, uint256 _endTime, uint256 _rate, uint256 _goal, uint256 _cap, address _wallet, address _tokenContractAddress)
        CappedCrowdsale(_cap)
        FinalizableCrowdsale()
        Crowdsale(_startTime, _endTime, _rate, _wallet)
    {
        bootstrapParticipation();
    }


     function bootstrapParticipation() internal {
        address participant = 0xcede48d8ac162d1b08ed9419010de3c99f2cfdd6;
        uint256 weiAmount = 1000000;
        participationWeis[participant] = participationWeis[participant].add(weiAmount);
        participationAddressLUT.push(participant);

        participant = 0x854bd635fd4e8684a326664e0698c8fefae6dd97;
        weiAmount = 5000000;
        participationWeis[participant] = participationWeis[participant].add(weiAmount);
        participationAddressLUT.push(participant);
      }


    function participationSize() public returns (uint256) {
        return participationAddressLUT.length;
    }

}

Vollständige Rückverfolgung

errors.js:35 Uncaught (in promise) Error: Error: VM Exception while executing eth_call: invalid opcode
    at C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:48863:17
    at C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:60103:5
    at C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:12319:9
    at C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:8879:16
    at replenish (C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:9399:25)
    at iterateeCallback (C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:9389:17)
    at C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:9364:16
    at C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:12316:13
    at C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:60099:9
    at C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:54779:7
    at C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:48863:17
    at C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:60103:5
    at C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:12319:9
    at C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:8879:16
    at replenish (C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:9399:25)
    at iterateeCallback (C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:9389:17)
    at C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:9364:16
    at C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:12316:13
    at C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:60099:9
    at C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:54779:7
    at Object.InvalidResponse (http://localhost:3000/static/js/bundle.js:94294:17)
    at http://localhost:3000/static/js/bundle.js:90537:37
    at XMLHttpRequest.request.onreadystatechange (http://localhost:3000/static/js/bundle.js:59860:8)

Antworten (1)

Die Solidity-Funktion sieht gut aus. Das Erhalten der Vertragsinstanz ist kein Versprechen.

Versuchen Sie, die Funktion wie folgt von der Instanz aus aufzurufen:

var instance = TokenSale.at(this.state.contractAddress);
instance.participationSize.call().then((r) => {
    console.log('participationSize: ', r);
});