El saldo se calcula repitiendo los pagos
Un libro de cuentas es la lista de quién ha pagado a quién. En una cadena de bloques no se guarda el saldo de nadie, solo los pagos, y el saldo sale de repetirlos desde el principio.
Así se puede rechazar el pago de quien no tiene lo que dice. Piensa en las cuentas de un piso compartido: el saldo de cada persona es lo que sale al sumar todos los apuntes.
Al final de esta lección
Nota
Puedo calcular los saldos de una lista de transacciones y rechazar el pago que supera el saldo.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Libro de cuentas | la lista de todos los pagos, en orden | |
| Transacción | un pago de una persona a otra | Ana paga 5 a Beto |
| Saldo | lo que tiene una persona tras repetir todos los pagos | |
| Doble gasto | gastar dos veces lo que solo se tiene una vez | |
| Rechazar | no aplicar un pago que no se puede cumplir |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Los saldos salen de repetir los pagos
Cada bloque guarda pagos. Para saber cuánto tiene cada uno, partes de los saldos iniciales y aplicas los pagos uno a uno, en el orden de la cadena.
Un pago solo se aplica si quien paga tiene saldo suficiente en ese momento. Si no, se rechaza y el saldo no cambia.
Ejemplo: cuatro pagos repetidos uno a uno
| Pago | Asha | Ben | Cara | Resultado |
|---|---|---|---|---|
| Saldo inicial | 10 | 5 | 0 | |
| Asha paga 4 a Ben | 6 | 9 | 0 | aceptado |
| Ben paga 6 a Cara | 6 | 3 | 6 | aceptado |
| Cara paga 8 a Asha | 6 | 3 | 6 | rechazado: Cara solo tiene 6 |
| Ben paga 3 a Cara | 6 | 0 | 9 | aceptado |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Qué imprime el laboratorio y en qué idioma
El script imprime en inglés: "balances" para los saldos y "refused" para cada pago rechazado. Los nombres son Asha, Ben y Cara.
Los saldos salen como un diccionario de Python, con llaves y dos puntos. Compara el resultado con la última fila de la tabla.
Calcula los saldos de cuatro pagos
docker exec jupyter python3 steps/balances.pySe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Doble gasto: gastar lo mismo dos veces
Ana tiene 10 y firma dos pagos de 10, uno a Beto y otro a Carla. Si todos aplicaran los pagos en distinto orden, Beto y Carla creerían que han cobrado.
La cadena evita esto: tiene un solo orden para todos. El primer pago se acepta y el segundo se rechaza.
Dos pagos con el mismo saldo
saldos = {"Ana": 10, "Beto": 0, "Carla": 0}
pagos = [
{"from": "Ana", "to": "Beto", "amount": 10},
{"from": "Ana", "to": "Carla", "amount": 10},
]
for pago in pagos:
if saldos[pago["from"]] >= pago["amount"]:
saldos[pago["from"]] = saldos[pago["from"]] - pago["amount"]
saldos[pago["to"]] = saldos[pago["to"]] + pago["amount"]
print("aceptado:", pago["from"], "a", pago["to"], pago["amount"])
else:
print("rechazado:", pago["from"], "a", pago["to"], pago["amount"])
print(saldos)
# Cambia el orden de los dos pagos y mira quién cobra.
Un error frecuente
Advertencia
Mucha gente cree que el saldo de cada uno está escrito en un bloque. No es así. Los bloques solo guardan pagos. El saldo es un resultado que cualquiera puede recalcular, y por eso nadie tiene que fiarse de otro.
Para ir más lejos
Escribe en un cuaderno cinco pagos de tu grupo de amigos, con saldos iniciales. Calcula los saldos a mano.
Después cambia el orden de dos pagos. ¿Cambia algún saldo? ¿Se rechaza algún pago nuevo?