Я хотел бы вернуть 2D-массив из кода Solidity и посмотреть на него с помощью web3.js
это функция прочности:
uint8 [10][10][100][100] public blocks;
function getBlock(uint x, uint y) returns (uint8[10][10]) {
if (x < blockStoreSide && y < blockStoreSide) {
return blocks[x][y];
}
}
но то, что я получаю getBlock
в web3.js, это число:
0xf5027db1aeac4c95acf2c3c32651cfd3f5561906399e19bd14818a6c7cc2d9cb
Я предполагаю, что это адрес?
Я пытался web3.eth.getStorageAt
ввести этот адрес, но получаю только нули, а не то значение, которое я на самом деле установил.
ABI выглядит хорошо для меня:
{ constant: false,
inputs:
[ { name: 'x', type: 'uint256' },
{ name: 'y', type: 'uint256' } ],
name: 'getBlock',
outputs: [ { name: '', type: 'uint8[10][10]' } ],
type: 'function' }
Итак, как мне на самом деле прочитать хранилище? Более общий вопрос: как я могу эффективно читать большие объемы памяти?
Шестнадцатеричный номер, который вы получили, был хешем транзакции. Если вы хотите читать из хранилища, вы должны добавить constant
ключевое слово в свою функцию:
uint8 [10][10][100][100] public blocks;
function getBlock(uint x, uint y) constant returns (uint8[10][10]) {
if (x < blockStoreSide && y < blockStoreSide) {
return blocks[x][y];
}
}
Как вариант, можно использовать call
метод.
myContract.getBlock.call(3,4)
Пол С
Пол С
Пол С