У меня есть контракт в тестовой сети Ropsten, и я пытаюсь вернуть массив структур, но получаю следующую ошибку в своей консоли JS.
Я включаю следующее в верхнюю часть моего контракта
pragma solidity ^0.4.18;
pragma experimental ABIEncoderV2;
и это функция, которую я вызываю
function getAllLand() external view returns (Land[]) {
return landRegister;
}
Я знаю, что эта конкретная функция является экспериментальной, но есть идеи, почему может возникнуть эта ошибка?
Спасибо
Ошибка заключается в объекте 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...' })
пользователь 2336139
пользователь 2336139