Advertencia de remezcla: Afirmar

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.

afirmar (checkPlayerExists (msg.sender)) devolverá falso y cancelará la ejecución. Intente cortar '== falso' y ejecute el código nuevamente.
Gracias por tu ayuda. En mi caso, quiero que se termine la llamada si el jugador ya existe. ¿Sacarlo no haría lo contrario? ¿ Sería más seguro usarlo require?
Rob Hitchens ya respondió esta pregunta antes que yo. Como se indica en docs , la afirmación debe ser verdadera.

Respuestas (1)

Este es un mal uso de assertporque, 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.

Gracias por esto. Reemplacé el assertscon requirepero la advertencia sigue ahí... ¿es este el comportamiento esperado?
Tal vez publique todo el trabajo para que podamos replicarlo. No esperaría requirecomportarme de la misma manera. Tal vez es una queja diferente.