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)
Creo que el único problema con su código es la condición terminal del for
bucle. i <= transCounter
debería i < transCounter
ser (Por supuesto, transCounter
es 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;
}
}
usuario19510
getTransactions
siempre se desborda? Parece asignar espacio solo paratransCounter
elementos, pero luego escribetransCounter + 1
elementos (debido a lai <= transCounter
condición).