Почему существует разница между общедоступным массивом и функцией, которая его возвращает?

Пример в цепочке:

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 определил это таким образом?

Спасибо!

Удивительно, как трудно найти хороший ответ на этот вопрос. Единственное, что я обнаружил, это то, что газовые соображения сыграли свою роль в дизайне. Может быть, пример (чрезмерной) защиты пользователя...

Ответы (2)

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. Я не эксперт, но пытаюсь сотрудничать и исследовать больше в этом вопросе.