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?
En su caso, ambas elementIndex
funciones returnAllElements
no 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.
maxpeinas
view
solo cuesta gasolina cuando se llama desde la función normal (cambio de estado), ¿no? No creo que importe si llamaview
desde otro contrato siempre que la función en otro contrato también seaview
. ¿O estoy equivocado?Alex
the function can be resolved in the local node that you are using
parte ¿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?Jaime