¿Por qué usar assert, ya que consumiría todo el gas?

Dado assertque consumiría todo el gas y requiredevolvería todo el gas, ¿hay alguna razón para assertno usar require? ¿ Usar requirepara reponer gasolina parece siempre una mejor opción que consumirlas?

Vi alguna explicación en Diferencia entre requerir y afirmar y la diferencia entre revertir y lanzar pero todavía no lo entiendo: ¿cuál es el beneficio de elegir un comando que consume todo el gas?

Respuestas (4)

Puede usar assert(sobre require) para indicar su intención a los analizadores de código fuente como oyente. Si bien requirees bueno para validar la entrada, a veces puede ser falso porque el usuario hizo algo inapropiado. assert, por otro lado, pretende indicar algo que nunca debería ser falsebajo ninguna circunstancia. Sabiendo esto, un analizador de código fuente posiblemente pueda detectar un error lógico en el sistema al descubrir cualquier situación en la que assertpodría no sertrue.

Espero eso ayude.

Si quieres castigar a los usuarios traviesos que aportan malos argumentos a tus funciones, deberías gastar todo su gas :-)

Aquí hay un buen artículo: https://codeforgeek.com/assert-vs-require-in-solidity/

Filosóficamente, pretenden significar dos cosas muy diferentes. requirees "el usuario debería haber hecho esto antes de llamar a la función", mientras que assertsignifica "algo fundamentalmente está mal".

Pragmáticamente, depende de cuál sea tu intención. Si el objetivo es garantizar el menor impacto en el usuario, entonces requirese prefiere sólo porque se devuelve el gas. Sin embargo, si su intención es seguridad/auditabilidad/mantenibilidad/claridad de intención, entonces hay situaciones en las que preferiría una sobre la otra.

Debe usar assertpara ayudarlo a encontrar invariantes que han sido violados.

Usas assertpara ayudarte a atrapar cuando sucede lo imposible.

Solidity también tiene un SMTChecker que puede probar que sus invariantes son verdaderas:

Solidity implementa un enfoque de verificación formal basado en SMT (teorías del módulo de satisfacción) y resolución de Horn . El módulo SMTChecker intenta probar automáticamente que el código cumple con las especificaciones dadas por requirey assertdeclaraciones. Es decir, considera requirelas declaraciones como suposiciones e intenta demostrar que las condiciones dentro de las assertdeclaraciones son siempre verdaderas. Si se encuentra una falla en la aserción, se le puede dar un contraejemplo al usuario que muestre cómo se puede violar la aserción. Si el SMTChecker no da ninguna advertencia para una propiedad, significa que la propiedad es segura.

El tutorial de SMTChecker proporciona un buen ejemplo de assertque es demasiado largo para incluirlo aquí: recomiendo leerlo.

Como assertnunca debe ser falso, no hay que preocuparse por consumir todo el gas del usuario.

Si el SMTChecker lo emociona para comenzar a usar assert, eso es algo muy bueno. Pero recuerde que son para invariantes , como mencionan los documentos de Solidity :

Assert solo debe usarse para probar errores internos y verificar invariantes. El código que funciona correctamente nunca debe crear un pánico, ni siquiera en una entrada externa no válida. Si esto sucede, entonces hay un error en su contrato que debe corregir. Las herramientas de análisis de lenguaje pueden evaluar su contrato para identificar las condiciones y llamadas de función que causarán un pánico.