¿Qué sucede si la función de vista llama a una función que no es ni 'vista' ni 'pura'?

la vista actual no se aplica. Llamar a una función que no es ni 'vista' ni 'pura' desde dentro de una función que genera una advertencia, pero compila.

Mi pregunta es ¿cuál es el resultado de llamar externamente a tal función? ¿Está bien definido el resultado? ¿Devuelve el resultado correcto pero simplemente no cambia de estado?

Por ejemplo:

contract Test {
    uint counter = 0;
    function A() public returns (uint256) {
        counter++;
        return counter;
    }

    function B() public view returns (uint256) {
        return A();
    }
}

¿Qué sucede si llamo a B() externamente? ¿Seguro que devuelve el contador actual sin consumir gas, solo sin hacer un cambio de estado en el contrato?

Respuestas (1)

Las funciones se pueden invocar de dos maneras diferentes:

  1. A través de una transacción , que se transmite a la red y cambia el estado de la cadena de bloques.
  2. A través de una llamada , que se realiza localmente en una sola red Ethereum y no cambia ningún estado de la cadena de bloques.

En realidad, depende del cliente decidir qué hacer, pero si se marca una función view, el comportamiento predeterminado de la mayoría de los clientes (por ejemplo, Remix, web3.js, etc.) es usar una llamada . Eso básicamente significa ejecutar la transacción pero no registrar ningún cambio de estado.

Entonces, en el caso anterior, si llama B(), en efecto le devolverá el valor counter + 1. (Durante la ejecución, incrementará el contador, pero ese cambio simplemente se descartará).

Dicho esto, podría invocar B()a través de una transacción , en cuyo caso counterrealmente se incrementaría de manera persistente. En esencia, viewes una pista para los clientes de que deberían usar una llamada en lugar de una transacción.

Gran respuesta, gracias! Veo que el valor devuelto sería el mismo en ambos casos. ¿Sería el segundo caso, además de cambiar de estado, más confiable de alguna manera?
Las transacciones en realidad no tienen valores de devolución, por lo que le resultará difícil recuperar el nuevo countervalor si utilizó una transacción. Es difícil decir si una transacción es más "confiable" sin una definición de lo que quiere decir.