"Error: Excepción de VM al ejecutar eth_call: código de operación no válido" al acceder a la matriz

Estoy tratando de incorporar el almacenamiento en un contrato inteligente donde los participantes del contrato tendrán su dirección almacenada en una address[]tabla de búsqueda participationAddressLUT.

El contrato se inicializa con 2 direcciones en la tabla de búsqueda a través de la función bootstrapParticipation(). El participationSize()getter nos da el tamaño de la tabla de búsqueda.

Sin embargo, al intentar recuperar el tamaño de la tabla de búsqueda usando web3v0.20.2

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

obtenemos el error críptico

Error no capturado (en promesa): Error: Excepción de VM al ejecutar eth_call: código de operación no válido

¿Qué tiene de malo el código de contrato actual que impidió que esto funcionara?

Código de contrato:

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;
    }

}

Rastreo completo

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)

Respuestas (1)

La función Solidez se ve bien. Obtener la instancia del contrato no es una promesa.

Intente llamar a la función desde la instancia, de la siguiente manera:

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