Publicación
Comparte tu conocimiento.
Vulnerabilidad de reingreso
Hola a todos, he notado que la función de oferta utiliza el método .call {value: amount} («») para enviar Ether a la dirección del destinatario.
¿Alguien podría darnos una idea de si esta función es realmente vulnerable al reingreso y sugerir alguna de las mejores prácticas o modificaciones para mitigar dichos riesgos?
function _offer(address to, uint256 amount) internal {
balance -= amount;
(bool success, ) = to.call{value: amount}("");
if (!success) {
revert TransferFailed(address(0), address(this), to, amount);
}
}
- Smart Contract
- Solidity
- Solidity Compiler
Respuestas
1Una de las mejores prácticas en Solidity es el CEI (comprobaciones, efectos, interacciones). Describe el orden en el que se estructura el código para evitar comportamientos inesperados o ejecuciones malintencionadas.
Comprobacionesconsistiría require
en implementar algunas para garantizar que los parámetros de tu función sean correctos. No hay ninguno en tu _offer()
función, pero puedes añadirlo, por ejemplo require(balance >= amount);
(no es necesario) al principio de la función para asegurarte de que el usuario no gaste más de lo que posee.
Losefectosconsisten básicamente en cambiar las variables de estado de tu contrato para adaptarlo a lo que quieres que sea ahora. Aquí está la línea, que balance -= amount;
reduce el saldo de los usuarios.
Las interaccionesson llamadas a otros contratos o direcciones que pueden activar algún código desconocido (por ejemplo, cuando call
envías dinero, puede activar una receive()
función del contrato inteligente que llame a tu función).
Como sigues esta regla en este código, no debería ser posible volver a entrar.
Sabes la respuesta?
Inicie sesión y compártalo.
Solidity is an object-oriented, high-level language for implementing smart contracts. It is a curly-bracket language designed to target the Ethereum Virtual Machine (EVM).
- My ERC721 contract successfully deploys, but I can't verify the contract's source code with hardhat21
- Solidity y ethers.js calculan diferentes direcciones a partir de la misma firma21
- no puedo entender cuáles son las ubicaciones (uint256)22
- Cómo revertir keccak256 en Solidity22
- Aclaración sobre los reembolsos de gas y comparación entre «requerir» y «revertir» en los contratos inteligentes21