Soy consciente del hecho de que las funciones pure/view no cuestan gasolina con una simple "llamada". Pero, ¿qué sucede si tengo una función que cambia el estado del contrato en función del resultado de la función pura/vista? ¿Tengo que pagar gasolina por las funciones pure/view en bucle si hago un "envío"?
En mi ejemplo, quiero encontrar un número en una matriz y devolver el índice.
function indexOfUint(uint256[] _array, uint _value) public pure returns (uint256) {
bool exist;
for (uint i=0; i<_array.length;i++){
if(_array[i] == _value){
exist = true;
return i;
}
}
assert(exist == true);
}
Hay dos declaraciones en https://github.com/ethereum/solidity/issues/992
la palabra clave
view
se introduce para funciones (reemplaza aconstant
). Llamar a una vista no puede alterar el comportamiento de futuras interacciones con ningún contrato. Esto significa que dichas funciones no pueden usarSSTORE
, no pueden enviar ni recibir ether y solo pueden llamar a otras vistas o funciones puras.la palabra clave
pure
se introduce para las funciones, sonview
funciones con la restricción adicional de que su valor solo depende de los argumentos de la función. Esto significa que no pueden usarSSTORE
,SLOAD
, no pueden enviar ni recibir ether, no pueden usar msg o block y solo pueden llamar a otras funciones puras.
Significa ver y puro no puede cambiar el estado del contrato. Si necesita cambiar el estado del contrato, debe eliminar pure
las view
palabras clave.
function indexOfUint(uint256[] _array, uint _value) public pure returns (uint256) {
bool exist;
...
}
La función no cambia de estado de contrato. exist
almacenes de variables en la pila
Las funciones pure y view no consumen gas cuando estas se ejecutan en su nodo local (o el nodo que está usando como local, infura, etherscan, etc.). en tales casos la transacción no será enviada.
Por otro lado, si la transacción se envía a la red (como en su caso), las funciones pure y view consumirán gas.
Espero que esto ayude.
Sí, si su función cambia de estado, definitivamente usará gas.
Consulte esto: http://ethdocs.org/en/latest/contracts-and-transactions/account-types-gas-and-transactions.html#estimating-transaction-costs
Un análisis más detallado del costo del gas según el tipo de operación: https://docs.google.com/spreadsheets/d/1m89CVujrQe5LAFJ8-YAUCcNK950dUzMQPMJBxRtGCqs/edit#gid=0
Para las llamadas, el gas se cobra solo cuando se llama por un contrato.
Cuando llama a una función de vista, se ejecuta localmente. la transacción no se transmite. es gratis.
Pero cuando la función de vista es llamada por un contrato. es ejecutado por otros, la transacción puede registrarse en blockchain.