El patrón de retiro en Solidity
Retira, no envíes: pon el saldo en cero antes de mandar.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
// Pull, don't push: zero the balance before sending anything.
contract StallPayouts {
mapping(address => uint256) public owed;
function credit(address vendor) external payable {
owed[vendor] += msg.value;
}
function withdraw() external {
uint256 amount = owed[msg.sender];
require(amount > 0, "nothing owed");
owed[msg.sender] = 0; // effects before interaction
(bool ok, ) = msg.sender.call{value: amount}("");
require(ok, "send failed");
}
}
Cómo funciona
- Los créditos se acumulan en
owed; a nadie se le paga sin pedir. - El saldo se anula antes del envío — efectos primero.
call{value: amount}("")envía; el bool se verifica.
Palabras clave y builtins usados aquí
addressboolcontractexternalfunctionmappingpayablepublicrequireuint256
El intento, en números
- Líneas
- 19
- Caracteres a escribir
- 505
- Tokens
- 95
- Ritmo de tres estrellas
- 55 tpm
Al ritmo de tres estrellas de 55 tokens por minuto, este intento toma unos 104 segundos.
Paso 3 de 3 en Ether y eventos; paso 13 de 28 en Fundamentos del lenguaje.