Transaction order dependence
La dependencia del orden de ejecución, también conocida como Transaction Order Dependence (TOD), es una vulnerabilidad en los contratos inteligentes que surge cuando el resultado de la ejecución de una función de contrato depende del orden de las transacciones. Esto puede ser problemático porque los mineros de blockchain pueden manipular el orden de las transacciones para su beneficio. Por ejemplo, un atacante podría observar una transacción pendiente y enviar una transacción similar antes de que la transacción original se ejecute, obteniendo así una ventaja injusta.
Veamos un ejemplo de cómo podría ocurrir esto en un contrato de crowdfunding:
En este contrato, los usuarios pueden contribuir a un proyecto y la meta del proyecto se alcanza cuando la suma total de las contribuciones alcanza la meta. Un atacante podría observar una transacción de contribución pendiente y enviar una transacción de contribución similar. Si el minero elige incluir primero la transacción del atacante, entonces el atacante recibirá crédito por su contribución antes que el usuario original, lo que podría hacer que el atacante alcance la meta antes que el proyecto.
Para prevenir esta vulnerabilidad, puedes utilizar un esquema de commit-reveal, que divide la transacción en dos partes: un «commit» que revela intenciones y un «reveal» que realiza la transacción. Aquí hay un ejemplo de cómo se podría implementar un esquema de commit-reveal en Solidity:
En este contrato, los usuarios pueden hacer un «commit» enviando ether y un valor hash. Luego, pueden revelar el valor original para recuperar el ether. Si otro usuario intenta revelar el mismo valor antes de que el original lo haga, no podrá recuperar el ether porque el contrato ha sido eliminado del mapeo de compromisos.
Otra técnica para prevenir la dependencia del orden de ejecución es el uso de listas de acceso permitidas. Si se conocen todas las direcciones que necesitarán acceder a una función, se puede usar un modificador para permitir solo a esas direcciones .
Finalmente, también puedes considerar el uso de herramientas automatizadas como Mythril, Oyente y Securify para descubrir estas vulnerabilidades durante el proceso de auditoría. Estas herramientas pueden ayudarte a identificar si una función cambia el estado del contrato inteligente y si la salida de dicha función depende del orden de las transacciones.
También puedes ver este mismo artículo en Linkedin aqui.