Следующий фрагмент кода не работает.
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;
}
}
Выход:
> test1.putX.sendTransaction(11, {from: eth.accounts[0]})
> test1.getA()
[]
> test1.getB()
[]
Следующий фрагмент кода, напротив, работает.
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;
}
}
Выход:
> test2.putX.sendTransaction(12, {from: eth.accounts[0]})
> test2.getA()
[[12, 1151]]
Мне интересно, почему... Я использую последнюю стабильную версию geth (1.7)
Я также пытался использовать массив с динамическим размером + сопоставление, и это тоже не работает.
Я даже сомневаюсь, что код в официальном документе может работать, поскольку он использует несколько переменных с динамическим размером:
https://solidity.readthedocs.io/en/develop/solidity-by-example.html
Кто-нибудь знает, почему это произошло?
Я пробовал ваш код с обоими ремиксами, geth v1.7.2 и v1.7.3, и оба они работают, как и ожидалось.
Возможно, ваша проблема заключается в том, что вы делаете запрос до того, как транзакция будет добыта. Это заставит контракт вернуться в предыдущее состояние.
debug.traceTransaction(txhash)
, у byzantinum eth.getTransactionReceipt(hash)
есть поле «статус», которое указывает, что транзакция была выполнена правильно или отменена.
Исмаэль
putX
транзакция была заминирована до звонкаgetA
? Вы используете web3 v1.0 или v0.20, или трюфель? Некоторые из них возвращают обещание, и вам нужно подождать, прежде чем вызывать геттер.хеботу