Transferencias de Ether
Solidity proporciona varias formas de enviar Ether de un contrato a una dirección externa, cada una con sus propias implicaciones en términos de seguridad, gas y comportamiento en caso de fallo. Estas son transfer
, send
, y llamadas de bajo nivel (call
).
Transfer
El método transfer
es una forma segura de enviar Ether ya que automáticamente revierte toda la transacción si la transferencia falla por cualquier motivo. Es la manera recomendada de enviar Ether cuando se desea que la transacción entera falle en caso de que no se pueda completar la transferencia de Ether.
Si la transferencia falla, la ejecución se detiene y se revierte.
Send
El método send
es similar a transfer
, pero en lugar de revertir automáticamente, devuelve un valor booleano (true
o false
) indicando el éxito o fracaso de la operación. Esto permite al contrato manejar el fallo de la transferencia de una manera más flexible.
send
es menos usado debido a la necesidad de manejar manualmente el caso de fallo, pero puede ser útil cuando se quiere una lógica de manejo de errores específica.
Call
El método call
es aún más flexible y se recomienda en las versiones más recientes de Solidity para enviar Ether. call
devuelve un booleano indicando el éxito o fracaso, y permite especificar datos adicionales para la llamada, lo que lo hace compatible con la ejecución de funciones en el contrato receptor de Ether. Sin embargo, esta flexibilidad viene con la responsabilidad de manejar correctamente la seguridad.
Es importante tener precauciones de seguridad al usar call
para transferir Ether, especialmente para evitar reentrancias, un tipo de vulnerabilidad donde un atacante puede forzar al contrato a ejecutar ciertas funciones de manera recursiva.
Consideraciones de seguridad
Prevención de Reentrancia: Al transferir Ether, especialmente usando
call
, es crucial proteger el contrato contra ataques de reentrancia. Patrones como el chequeo-efectos-interacción y el uso de modificadores de reentrancia pueden ayudar a mitigar este riesgo.Verificar el Éxito de la Transferencia: Siempre se debe verificar el resultado de una transferencia de Ether y manejar adecuadamente el caso de fallo, especialmente cuando se usan
send
ycall
.Gas para Llamadas Externas: Al enviar Ether, se proporciona una cantidad fija de gas (2300 gas al usar
transfer
osend
) que es suficiente para eventos de registro pero no para ejecutar código en el contrato receptor. Concall
, es posible especificar una cantidad mayor de gas, lo cual debe hacerse con cuidado.
Ejemplo
Last updated
Was this helpful?