¿Por qué hay una diferencia entre una matriz pública y una función que la devuelve?

Ejemplo en cadena:

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;
    }
}

Ejemplo fuera de la cadena:

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);
    });
});

Como puede ver, la getArrayfunción devuelve la matriz.

Pero cuando "llamo" al array, necesito pasar un índice (en otras palabras, array"devuelve" un elemento).

Intentando ejecutar:

let array = await myContract.array();

Resultados con:

Invalid number of arguments to Solidity function

¿Por qué el estándar Solidity lo ha definido de esta manera?

¡Gracias!

Sorprende lo difícil que es encontrar una buena respuesta a esta pregunta. Lo único que he encontrado es que las consideraciones de gas influyeron en el diseño. Tal vez un ejemplo de (sobre)protección del usuario...

Respuestas (2)

Solidity crea funciones getter automáticamente para variables públicas. Como su matriz es pública, se genera automáticamente una función captadora pública. La función getter se usa para acceder a las variables de la matriz directamente y no para recuperar la matriz en sí.

Para los tipos de matriz, la función getter requiere un parámetro de número entero para indicar el índice de acceso. Lea más en https://solidity.readthedocs.io/en/v0.4.24/types.html#arrays

Entonces, su código JavaScript simplemente está accediendo a su función de obtención pública. Pero, como notó, también puede obtener la matriz original si tiene una función de obtención personalizada.

Gracias. Básicamente, describió todo lo que ya sé (y ya me describí a mí mismo como parte de la pregunta), dejando la pregunta real sin responder: ¿por qué el lenguaje estándar decidió que las funciones de captación para matrices deben devolver un elemento en la matriz en lugar del toda la matriz en sí (como uno esperaría normalmente de una función getter)?
Ah, lo siento, leí mal esa parte y malinterpreté el tema de tu pregunta.

This mechanism exists to avoid high gas costs when returning an entire array.

Tomado de Documentación, que es interesante entender para mí que podría estar relacionado con las mejores prácticas para resumir datos y también los costos asociados a ellos. Puede haber casos especiales en los que se le necesite la lista de quiénes. Supongo que almacenado para esos casos sería mejor almacenarlo en alguna tecnología IPFS. No soy el experto, pero trato de colaborar y explorar más sobre esto incluso.