Contrato inteligente que devuelve valores como ceros

pragma solidity ^0.4.18;

contract TransManager {
  //state variables

  // contract owner
  address private creator;

  uint transCounter;

  // File Meta metaData
  struct metaData{
    uint id;
    address owner;
    string docType;
    string fileHash;
  }

  //Array to store tranasactions
  mapping (address => metaData[])  fileLogs;


  //Send a trnsactionId

  function regTransaction(string _docType, string _fileHash) public {
    transCounter++;
    var fileLog = metaData(transCounter, msg.sender, _docType, _fileHash );

    fileLogs[msg.sender].push(fileLog);

  }

  function getTransactions() public returns (uint []){
    var temp = fileLogs[msg.sender];


    uint[] memory ids = new uint[](transCounter);


    for (uint i=0; i<= transCounter; i++){
        ids[i]=temp[i].id;
    }

    return ids;
  }



  // constructor
    function TransManager() {
        creator = msg.sender;
    }

  // kills contract and sends remaining funds back to creator
   function kill() {
       if (msg.sender == creator) {
           selfdestruct(creator);
       }
   }

}

getTransactions: siempre devuelve una matriz de ceros. Pero espero devolver el número indexado.

truffle console --network ganache
truffle(ganache)> TransManager.deployed().then(function(instance){app=instance;})
undefined
truffle(ganache)> app.regTransaction("EDI","Hash",{from: web3.eth.accounts[1]})
{ tx: '0x46785333bce5f682c586ccf995682203a78d26bfba54957bb0bd5593d6cc4542',
  receipt: 
   { transactionHash: '0x46785333bce5f682c586ccf995682203a78d26bfba54957bb0bd5593d6cc4542',
     transactionIndex: 0,
     blockHash: '0x26bf163083f35bade4aca17c2d05706846b4dd8f555efa7117cdea0b64da51ca',
     blockNumber: 5,
     gasUsed: 146345,
     cumulativeGasUsed: 146345,
     contractAddress: null,
     logs: [],
     status: 1 },
  logs: [] }
truffle(ganache)> app.getTransactions()

Error: VM Exception while processing transaction: invalid opcode
    at XMLHttpRequest._onHttpResponseEnd (/usr/local/lib/node_modules/truffle/build/webpack:/~/xhr2/lib/xhr2.js:509:1)
    at XMLHttpRequest._setReadyState (/usr/local/lib/node_modules/truffle/build/webpack:/~/xhr2/lib/xhr2.js:354:1)
    at XMLHttpRequestEventTarget.dispatchEvent (/usr/local/lib/node_modules/truffle/build/webpack:/~/xhr2/lib/xhr2.js:64:1)
    at XMLHttpRequest.request.onreadystatechange (/usr/local/lib/node_modules/truffle/build/webpack:/~/web3/lib/web3/httpprovider.js:128:1)
    at /usr/local/lib/node_modules/truffle/build/webpack:/~/truffle-provider/wrapper.js:134:1
    at /usr/local/lib/node_modules/truffle/build/webpack:/~/web3/lib/web3/requestmanager.js:86:1
    at Object.InvalidResponse (/usr/local/lib/node_modules/truffle/build/webpack:/~/web3/lib/web3/errors.js:38:1)
¿ No getTransactionssiempre se desborda? Parece asignar espacio solo para transCounterelementos, pero luego escribe transCounter + 1elementos (debido a la i <= transCountercondición).

Respuestas (1)

Creo que el único problema con su código es la condición terminal del forbucle. i <= transCounterdebería i < transCounterser (Por supuesto, transCounteres global, por lo que este es solo el recuento correcto siempre que solo haya una cuenta que use el contrato, pero ese es un problema ortogonal).

Aquí hay una versión simplificada y limpia de su código que parece funcionar correctamente cuando se prueba en Remix:

pragma solidity ^0.4.21;

contract TransManager {
    uint transCounter;

    struct MetaData{
        uint id;
        address owner;
        string docType;
        string fileHash;
    }

    mapping (address => MetaData[])  fileLogs;

    function regTransaction(string _docType, string _fileHash) public {
        transCounter++;
        MetaData memory fileLog = MetaData(transCounter, msg.sender, _docType, _fileHash );

        fileLogs[msg.sender].push(fileLog);
    }

    function getTransactions() public view returns (uint[]) {
        MetaData[] storage temp = fileLogs[msg.sender];

        uint[] memory ids = new uint[](transCounter);

        for (uint i = 0; i < transCounter; i++){
            ids[i]=temp[i].id;
        }

        return ids;
    }
}
Gracias smarx. Está funcionando en Remix cuando invoco la función desde la consola de trufas y obtengo el siguiente error. truffle(ganache)> app.getTransactions() Error: Excepción de VM al procesar la transacción: código de operación no válido en Object.InvalidResponse (/usr/local/lib/node_modules/truffle/build/cli.bundled.js:41484:16) en / usr/local/lib/node_modules/truffle/build/cli.bundled.js:329530:36
Si no puede depurarlo usted mismo, edite su pregunta para incluir el código con el que tiene problemas.
Es el mismo código anterior que funciona en Remix pero no en la consola truffle.
Me refería al código de Trufa.
truffle console --network ganache truffle(ganache)> TransManager.deployed().then(función(instancia){aplicación=instancia;}) undefined truffle(ganache)> app.regTransaction("EDI","Hash",{from : web3.eth.accounts[1]}) truffle(ganache)> app.getTransactions() Error: Excepción de VM al procesar la transacción: código de operación no válido en XMLHttpRequest._onHttpResponseEnd (/usr/local/lib/node_modules/truffle/build/webpack :/~/xhr2/lib/xhr2.js:509:1) en Object.InvalidResponse (/usr/local/lib/node_modules/truffle/build/webpack:/~/web3/lib/web3/errors.js:38 :1)
Edite su pregunta para incluir este código. (Es más fácil formatear allí). Y también incluya su último código de Solidity. Pero supongo que el código que está implementando a través de Truffle no coincide con el código que está implementando con Remix.
Edita tu pregunta, no mi respuesta. :-)