No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Uso del Atributo Payable en Contratos Inteligentes

9/21
Recursos

¿Qué es el atributo payable en Solidity?

El atributo payable es fundamental al trabajar con contratos inteligentes en Solidity. Este atributo se aplica tanto a direcciones como a métodos de un contrato, permitiéndoles recibir la criptomoneda nativa del ecosistema, como Ether en redes basadas en Ethereum o Zerogold, dependiendo del mismo. Es esencial para la transferencia de valores y transacciones dentro de los contratos inteligentes.

¿Cómo se estructura un contrato payable?

El concepto de "payable" se ve reflejado en el siguiente código de ejemplo, que incluye variables de estado y dos funciones críticas: Deposit y Withdraw. Veamos cómo se integra el atributo payable en este contexto:

contract CharityDonation {
    address payable charity;
    mapping(address => uint) public donations;

    constructor() {
        charity = payable(msg.sender); // El desplegador es la dirección de charity
    }

    function deposit() public payable {
        donations[msg.sender] += msg.value;
    }

    function withdraw() public {
        charity.transfer(address(this).balance);
    }
}

¿Cómo funciona cada componente del código?

  1. Variables de Estado:

    • address payable charity: Esta es la dirección de charity que recibe las donaciones. Se configura como 'payable', lo que le permite recibir Ether.
    • mapping(address => uint): Este mapeo registra las donaciones realizadas por cada dirección.
  2. Funciones:

    • constructor: Al desplegar el contrato, el constructor establece la dirección del deployer como la charity.
    • deposit: Esta función está marcada como 'payable', lo que la califica para recibir criptomonedas. Registra la cantidad de Ether recibida bajo la dirección de quien dona.
    • withdraw: Transfiere todo el saldo del contrato a la charity.

¿Cómo se despliega y prueba un contrato inteligente con payable?

Para desplegar y probar este contrato, se siguen los siguientes pasos en un entorno como Remix:

  1. Compilación y Despliegue: Se compila el contrato en Remix para asegurar que no haya errores. Luego se despliega seleccionando la cuenta desde la cual se desea efectuar el despliegue.

  2. Métodos Disponibles: Una vez desplegado, se observa que el método deposit tiene un distintivo rojo, indicando que es 'payable'.

  3. Simulación de Donaciones:

    • Cambiando de cuenta (wallet), se puede simular una transferencia de cripto ingresando el monto en el campo 'Value' y seleccionando la unidad de moneda.
    • Al ejecutar la función deposit, se envía la cantidad especificada al contrato y se registra en el mapeo de donaciones.
  4. Función de Retiro:

    • Con withdraw, el contrato transfiere su saldo a la dirección de charity, asegurándose que sea 'payable' para recibir la transferencia.

Consejos para el uso de payable en Solidity

  • Gestión de Seguridad: Al implementar contratos con pagos, asegúrate de manejar correctamente los fondos y considerar medidas de seguridad adicionales.
  • Unidades Monetarias: Comprende las conversiones entre unidades, como Ether y Wei, para evitar errores en los cálculos y transferencias.
  • Pruebas Extensas: Prueba a fondo en un entorno de prueba antes de desplegar en la red principal para evitar pérdida de fondos debido a errores.

Anímate a explorar más sobre Solidity y sus funcionalidades avanzadas. Con el tiempo, podrás crear contratos más complejos y seguros, fortaleciendo tus habilidades en el desarrollo blockchain. ¡Continúa aprendiendo y creciendo en este fascinante campo!

Aportes 2

Preguntas 3

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Atributo payable

  • Aplica:
    • a las direcciones
    • métodos del contrato inteligente
  • autoriza a recibir la criptomoneda nativa del ecosistema CeloGLD

Código del ejemplo

pragma solidity ^0.8.0;

contract Payables {

    address public charity; // variable de estado

    mapping(address=>uint) public donations; // variable de estado (relación entre una dirección y un número entero)

    constructor() {
        charity = msg.sender;
    }

    function deposit() payable public { // permite recibir critpomoneda
        donations[msg.sender] = msg.value;
    }

    function withdraw() public {
        payable(charity).transfer(address(this).balance); // recibe una transferencia
    }
}

Aquí les dejo un enlace que les ayudará en las conversiones de las unidades de Ethereum.