Aunque require()
se usa sustancialmente más que assert()
, hay lugares donde assert()
se usa. Un ejemplo estaría en la SafeMath
biblioteca ampliamente adoptada por OpenZeppelin:
function add(uint256 a, uint256 b) internal pure returns (uint256 c) { c = a + b; assert(c >= a); return c; }
donde a + b
se comprueba después de la suma para evitar el desbordamiento.
Parece que require(c >= a)
se puede usar en lugar de assert(c >= a)
para la misma funcionalidad con una oportunidad adicional para reembolsar el gas no utilizado. ¿Hay alguna razón para no usar require()
aquí? ¿Se assert()
usa solo para obligar a las personas a no realizar operaciones que tengan malas consecuencias, como desbordamiento/desbordamiento?
Salud
require
es para asegurarse de que no se haya pasado una entrada ilegal a la función.
assert
es para asegurarse de que algo que nunca debería suceder, no suceda.
En otras palabras, require
es para cuando desea protegerse de un posible escenario y assert
es para cuando desea protegerse de un escenario imposible (es decir, un error en su código).
Piense assert
en algo que finalmente eliminaría si estuviera 100% seguro de que su código es impecable.
require
?Antes de la actualización de la red de Byzantium, require() y assert() en realidad se comportaban de manera idéntica, pero su salida de código de bytes es ligeramente diferente.
afirmar () usa el código de operación 0xfe para causar una condición de error require () usa el código de operación 0xfd para causar una condición de error
Una diferencia principal muy importante entre el código de operación es que assert() le costará gasolina mientras que require() no lo hará.
Por favor, eche un vistazo a la descripción muy detallada y excelente en:
¡Espero que esto ayude!
usuario38075