¿Por qué no usar require() en lugar de assert()?

Aunque require()se usa sustancialmente más que assert(), hay lugares donde assert()se usa. Un ejemplo estaría en la SafeMathbiblioteca 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 + bse 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

Lo usaría para castigar a un usuario que envía argumentos erróneos a propósito

Respuestas (2)

requirees para asegurarse de que no se haya pasado una entrada ilegal a la función.

assertes para asegurarse de que algo que nunca debería suceder, no suceda.

En otras palabras, requirees para cuando desea protegerse de un posible escenario y assertes para cuando desea protegerse de un escenario imposible (es decir, un error en su código).

Piense asserten algo que finalmente eliminaría si estuviera 100% seguro de que su código es impecable.

Incluso "cuando desea protegerse de un escenario imposible", ¿por qué no usar simplemente 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:

https://medium.com/blockchannel/the-use-of-revert-assert-and-require-in-solidity-and-the-new-revert-opcode-in-the-evm-1a3a7990e06e

¡Espero que esto ayude!

Gracias por profundizar en las diferencias entre require() y assert() pero no respondiste mi pregunta directamente. Mi pregunta es por qué no usar require() en lugar de assert() ya que puede ahorrar gasolina al usuario incluso cuando algo sale mal. Tengo una idea similar con siid que afirmar () se puede usar para obligar a las personas a no realizar operaciones que tengan malas consecuencias como desbordamiento/desbordamiento. @goodvibration tuvo una buena explicación al respecto.