Пример в цепочке:
pragma solidity 0.4.24;
contract MyContract {
uint[] public array;
constructor() public {
array.push(1);
array.push(2);
array.push(3);
}
function getArray() public view returns(uint[]) {
return array;
}
}
Пример вне сети:
contract("MyContract", function(accounts) {
it("Test", async function() {
myContract = await artifacts.require("MyContract.sol").new();
let array = await myContract.getArray();
let item0 = await myContract.array(0);
});
});
Как видите, getArray
функция действительно возвращает массив.
Но когда я «вызываю» array
, мне нужно передать индекс (другими словами, array
«возвращает» элемент).
Попытка выполнить:
let array = await myContract.array();
Результаты с:
Invalid number of arguments to Solidity function
Почему стандарт Solidity определил это таким образом?
Спасибо!
Solidity автоматически создает функции получения для общедоступных переменных. Поскольку ваш массив является общедоступным, для него автоматически создается общедоступная функция получения. Функция получения используется для прямого доступа к переменным массива, а не для извлечения самого массива.
Для типов массивов функция получения требует целочисленного параметра для обозначения индекса для доступа. Подробнее читайте на странице https://solidity.readthedocs.io/en/v0.4.24/types.html#arrays.
Таким образом, ваш код JavaScript просто обращается к своей общедоступной функции получения. Но, как вы заметили, вы также можете получить исходный массив, если у вас есть собственная функция получения.
This mechanism exists to avoid high gas costs when returning an entire array.
Взято из документации, что интересно для меня, чтобы понять, что я мог бы быть связан с передовой практикой для абстрактных данных, а также с затратами, связанными с этим. Могут быть особые случаи, когда вам может понадобиться список ВОЗ. Я предполагаю, что для этих случаев было бы лучше хранить их в какой-либо технологии IPFS. Я не эксперт, но пытаюсь сотрудничать и исследовать больше в этом вопросе.
Чан-Хо Со