Gas para ver funciones

Leí en muchos lugares que las funciones de vista no cuestan gasolina, sin embargo, eso no es cierto porque cuestan gasolina para las operaciones de blockchain, incluso si no cambian el estado. Corrígeme si me equivoco Por ejemplo:

pragma solidity ^0.4.17;

contract myContract {
    uint[] public anArray;   /// assume it has 1,000,000 (1Million) elements

/* function which returns how many times a specific element is in the n array*/

    function elementIndex(uint element) public view returns(uint){
        uint counter;
        for(uint i; i<anArray.length; i++){
            if(anArray[i] == element){
                counter++;
            }
        }
        return counter;
    }
function returnAllElements() public view returns(uint[]){
return anArray;
}}

El verdadero problema surge en el front-end cuando la matriz tiene 1 millón de elementos. Ejecutar elementIndex() nunca funcionará porque la iteración llevará demasiado tiempo. returnAllElements tampoco funcionará (supongo).

¿Qué se puede hacer en tales circunstancias?

Respuestas (2)

En su caso, ambas elementIndexfunciones returnAllElementsno costarán gasolina, ya que ambas funciones leen variables de estado de la cadena de bloques y dan un resultado previsto.

Puede optimizar las funciones anteriores para reducir el tiempo que tardan.

Consulte la siguiente pregunta para comprender el uso de View/Pure Gas - ¿Coste de gas si otra función lo llama internamente?

Consulte el siguiente blog para comprender la diferencia entre llamadas y transacciones en ethereum:

https://blog.b9lab.com/calls-vs-transactions-in-ethereum-smart-contracts-62d6b17d0bc2

La vista no costará gas solo si se llama desde fuera de la red, es decir, si una función en un contrato es vista y se llama desde otro contrato, costará gas.

La razón por la que no costará gasolina si se llama desde fuera de la red es que la función se puede resolver en el nodo local que está utilizando para conectarse a la red sin enviar una transacción.

Espero que esto ayude.

viewsolo cuesta gasolina cuando se llama desde la función normal (cambio de estado), ¿no? No creo que importe si llama viewdesde otro contrato siempre que la función en otro contrato también sea view. ¿O estoy equivocado?
@Jaime, @Maxpeinas La respuesta sigue sin tener sentido. ¿Me lo podrías aclarar? esta the function can be resolved in the local node that you are usingparte ¿Qué es un nodo local? Si ejecuta un sitio web en Azure, lo más probable es que no tenga acceso a la consola de Unix (a menos que tenga una máquina virtual) y no esté instalando ningún nodo Ethereum localmente. ¿TODAVÍA no paga la tarifa de transacción en tales casos?
Llamo nodo local al nodo al que está conectado, Infura, etc. Si llama a una función de vista, el nodo no tiene que transmitir una transacción, puede obtener el valor simplemente ejecutando la función localmente. Sin embargo, si envía una transacción y una de las operaciones es ejecutar una función de vista, consumirá gas. En resumen, si la función de vista se llama internamente (durante la ejecución de una transacción) tendrá un costo. Si se llama de forma externa (es decir, una webapp que está leyendo el valor de una variable) no tendrá ningún coste.