возврат 2D-массива фиксированного размера в web3.js

Я хотел бы вернуть 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' }

Итак, как мне на самом деле прочитать хранилище? Более общий вопрос: как я могу эффективно читать большие объемы памяти?

Ответы (1)

Шестнадцатеричный номер, который вы получили, был хешем транзакции. Если вы хотите читать из хранилища, вы должны добавить 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)
как неловко. Благодарю. Не знаю, как я это пропустил.
это был вопрос из двух частей: если я хочу прочитать большой массив, наиболее эффективно читать getStorageAt, но как мне найти адрес массива 4d?
если я верну массив 4d, у меня тихо кончится газ (т.е. ничего программно, просто что-то в лог-файле майнера)