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?
Las funciones se pueden invocar de dos maneras diferentes:
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 counter
realmente se incrementaría de manera persistente. En esencia, view
es una pista para los clientes de que deberían usar una llamada en lugar de una transacción.
matthias_buehlmann
usuario19510
counter
valor 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.