Estoy tratando de compilar un contrato en remix y me encontré con la siguiente advertencia:
Use assert(x) si nunca quiere que x sea falso, en ninguna circunstancia (aparte de un error en su código). Utilice require(x) si x puede ser falso, debido, por ejemplo, a una entrada no válida oa un componente externo defectuoso.
Las partes de mi código que usan afirmar son:
assert(checkPlayerExists(msg.sender) == false);
assert(number >= 1 && number <= 10);
assert(msg.value >= minimumBet);
Me encantaría que alguien explicara esto, ya que parece un poco críptico.
Este es un mal uso de assert
porque, dependiendo de la entrada, las expresiones pueden evaluarse como false
. Utilice require()
en su lugar.
assert()
está destinado a verificar errores lógicos en el contrato mismo. Afirma afirmar hechos que siempre deben ser verdaderos bajo cualquier circunstancia, por lo que cualquier posibilidad de falsedad sería una cuestión de lógica.
Considerar:
uint balanceAlice = 10;
uint balanceBob = 5;
uint conserveFunds = balanceAlice + balanceBob;
// do stuff
uint conservedFunds = balanceAlice + balanceBob;
// whatever we did, we should always end up with the same funds accounted for.
// ANY departure from this principal means the contract contains a logic error.
assert(conserveFunds == conservedFunds)
Espero eso ayude.
asserts
con require
pero la advertencia sigue ahí... ¿es este el comportamiento esperado?require
comportarme de la misma manera. Tal vez es una queja diferente.
Román Frólov
0xsegfault
require
?Román Frólov