Das folgende Code-Snippet funktioniert nicht.
pragma solidity ^0.4.11;
contract Test1 {
uint[] public a;
uint[] public b;
function putX(uint x) public {
a.push(x);
b.push(block.number);
}
function getA() public view returns (uint[]) {
return a;
}
function getB() public view returns (uint[]) {
return b;
}
}
Ausgang:
> test1.putX.sendTransaction(11, {from: eth.accounts[0]})
> test1.getA()
[]
> test1.getB()
[]
Das folgende Code-Snippet hingegen funktioniert.
pragma solidity ^0.4.11;
contract Test2 {
uint[2][] public a;
function putX(uint x) public {
a.push([x, block.number]);
}
function getA() public view returns (uint[2][]) {
return a;
}
}
Ausgang:
> test2.putX.sendTransaction(12, {from: eth.accounts[0]})
> test2.getA()
[[12, 1151]]
Ich frage mich, warum ... Ich verwende das neueste stabile Geth (1.7)
Ich habe auch versucht, ein Array mit dynamischer Größe + eine Zuordnung zu verwenden, und es funktioniert auch nicht.
Ich bezweifle sogar, ob der Code im offiziellen Dokument funktionieren kann, da er mehrere Variablen mit dynamischer Größe verwendet:
https://solidity.readthedocs.io/en/develop/solidity-by-example.html
Weiß jemand warum das passiert ist?
Ich habe Ihren Code mit beiden Remixen, Geth v1.7.2 und v1.7.3, ausprobiert und beide funktionieren wie erwartet.
Vielleicht ist Ihr Problem, dass Sie die Abfrage machen, bevor die Transaktion abgebaut wird. Dadurch kehrt der Vertrag in den vorherigen Zustand zurück.
debug.traceTransaction(txhash)
, von byzantinum eth.getTransactionReceipt(hash)
hat ein 'Status'-Feld, das anzeigt, dass die Transaktion korrekt ausgeführt oder rückgängig gemacht wurde.
Ismael
putX
Transaktion vor dem Anruf abgebaut wurdegetA
? Verwenden Sie web3 v1.0 oder v0.20 oder Truffle? Einige von ihnen geben ein Versprechen zurück, und Sie müssen darauf warten, bevor Sie den Getter aufrufen.hebothu