Недопустимый кортеж типа Solidity[]

У меня есть контракт в тестовой сети Ropsten, и я пытаюсь вернуть массив структур, но получаю следующую ошибку в своей консоли JS.

введите описание изображения здесь

Я включаю следующее в верхнюю часть моего контракта

pragma solidity ^0.4.18;
pragma experimental ABIEncoderV2;

и это функция, которую я вызываю

 function getAllLand() external view returns (Land[]) {
        return landRegister;
    }

Я знаю, что эта конкретная функция является экспериментальной, но есть идеи, почему может возникнуть эта ошибка?

Спасибо

Я сталкиваюсь с проблемами при выполнении того же метода контракта с использованием web3js (1.0.0-beta.36). var abi = JSON.parse('[{"constant":false,"inputs":[{"name":"s","type":"string"},{"components":[{"name": "a", "type": "uint256"}, {"name": "b", "type": "uint256"}], "name": "b", "type": "tuple"}], «имя»: «foo», «выходы»: [], «оплачиваемый»: false, «stateMutability»: «неоплачиваемый», «тип»: «функция»}, {«константа»: истина, «входы»: [ ],"name":"y","outputs":[{"name":"","type":"string"}],"payable":false,"
Обнаружено, что версия web3js неверна. Проблема решена с 1.0.0-beta.36.

Ответы (2)

Ошибка заключается в объекте web3, а не в вашем смарт-контракте. Функция struct еще не реализована там.

См. https://github.com/ethereum/web3.js/issues/1241 , где описана эта проблема.

Таким образом, в основном вы можете работать с Solidity-структурами при взаимодействии с вашими контрактными функциями внутри контракта или с библиотекой, но не для передачи данных из web3 в ваш контракт или для извлечения данных из контракта через web3.

https://github.com/ethereum/web3.js/issues/1241 исправлено и включено в релиз web3.js 1.0.0-beta.36. Теперь вы можете вызывать функции Solidity со структурными параметрами.

Пример из вопроса:

Договор

pragma solidity ^0.4.24;
pragma experimental ABIEncoderV2;

contract Test {

    struct Bar {
        uint a;
        uint b;
    }

    Bar public z;
    string public y;

    function foo(string s, Bar b) public {
        y = s;
    }

}

Javascript-вызов

contract.methods.foo("hello", [ 1, 2 ]).send({ from: '0x...' })