¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Fundamentos de blockchain

Aquí está la lección completa para leer. Crea una cuenta gratuita para practicarla en un laboratorio en vivo.

Laboratorio de contenedores12 min de lectura7 comandos

¿Quién cuida la lista compartida?

Imagina que una clase lleva una página compartida de quién ha pagado a quién. ¿Cómo evitarías que alguien borrase una línea sin que se note y escribiera otro importe? Una blockchain responde con matemáticas en lugar de con alguien al mando. Este laboratorio es un juguete: unos pocos archivos cortos de Python que muestran las ideas, sin moneda, sin red y sin valor.

Al terminar esta lección

Nota

Puedo explicar cómo los bloques enlazados por hashes hacen que se note un cambio en un registro antiguo.

Palabras clave

  • Hash: una huella de longitud fija calculada a partir de unos datos. Cambia una letra y la huella es completamente distinta.
  • Bloque: un grupo de registros, con el hash del bloque anterior.
  • Cadena: bloques en orden, cada uno con el hash del anterior.
  • Nonce: un número que se cambia una y otra vez hasta que el hash tiene el aspecto que piden las reglas.
  • Minado: probar nonces hasta que el hash de un bloque empieza con suficientes ceros.
  • Firma: la prueba de que un mensaje viene de quien tiene una clave secreta.

Para empezar: lo que ya sabes

Nota

Responde mentalmente. 1. ¿Por qué se compara un archivo descargado con su suma de comprobación? 2. Si cambias una letra de un mensaje largo, ¿su huella debe cambiar poco o mucho? 3. ¿Qué hace un bucle? Respuestas: para comprobar que nada ha cambiado; mucho; repite un paso.

Antes de empezar

Nota

Pulsa Iniciar el laboratorio en la barra de arriba de la lección y espera a que diga que está en marcha. Hay un solo contenedor, jupyter, y el terminal llega a su Python con docker exec jupyter, que ejecuta una orden dentro de él. El enlace JupyterLab abre su página web, en el puerto 8888. Cada botón Ejecutar de abajo escribe su orden en el terminal de tu laboratorio, una detrás de otra en la misma sesión. Para verlas o escribir las tuyas, pulsa Abrir terminal (pestaña nueva) en la barra.

Una cadena son bloques que guardan las huellas de los demás

ls lista la carpeta de trabajo: tres archivos cortos de Python, el cuaderno y la carpeta steps. El primer script construye tres bloques. Cada línea muestra el número del bloque, el hash del bloque anterior y el suyo propio, acortados. El bloque 0 no tiene nada antes, así que su hash anterior son solo ceros. El hash anterior de cada uno de los demás es el de la línea de arriba. Todos los hashes empiezan por 000, que es lo que el minado les obligó a hacer.

Comando
docker exec jupyter ls

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Comando
docker exec jupyter python3 steps/link.py

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Cambia un importe y la cadena lo nota

El script comprueba la cadena, cambia un importe dentro del bloque 1 y vuelve a comprobar. La primera respuesta es (True, None): válida, ningún bloque malo. Tras el cambio es (False, 1): no válida, y el bloque 1 es el lugar. La huella del bloque 1 ya no coincide con su contenido. Falsificar la huella no sirve. Minar otra vez el bloque 1 lo deja bien, pero ahora la respuesta es (False, 2), porque el bloque 2 sigue guardando el hash antiguo del bloque 1.

Comando
docker exec jupyter python3 steps/tamper.py

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Minar es probar números hasta que el hash sale bien

Para añadir un bloque, las reglas piden un hash que empiece por algunos ceros. La única forma de encontrarlo es probar un nonce, luego el siguiente y el siguiente. El script mina el mismo bloque con cuatro dificultades. Hicieron falta 15 intentos para un cero, 835 para dos, 7992 para tres y 109028 para cuatro. Cada cero más cuesta mucho más trabajo, y la respuesta es la misma cada vez porque el bloque y el punto de partida están fijados.

Comando
docker exec jupyter python3 steps/mine.py

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Comprueba

Consejo

¿Por qué es más difícil cambiar un bloque antiguo que uno nuevo? Respuesta: cada bloque posterior guarda el hash antiguo, así que hay que minarlos todos otra vez, y cada uno cuesta intentos.

Un libro de cuentas se calcula a partir de los pagos

Nadie guarda un saldo. El script da 10 a Asha, 5 a Ben y 0 a Cara, y luego repite cuatro pagos por orden. La última línea dice que se rechazó el pago de 8 de Cara a Asha, porque Cara solo tenía 6 en ese momento. Los saldos son Asha 6, Ben 0 y Cara 9.

Comando
docker exec jupyter python3 steps/balances.py

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Una firma muestra quién envió un mensaje

Cualquiera puede escribir «Asha pays Ben 5». Una firma muestra que lo escribió Asha. Esta está hecha solo de hashes: una clave secreta de 256 pares, una clave pública que es el hash de cada uno y una firma que revela un secreto de cada par. El mensaje firmado se comprueba como True. Cambia una letra del mensaje, deja la misma firma y se comprueba como False. Una clave así firma un solo mensaje, así que es una lección y no algo para usar.

Comando
docker exec jupyter python3 steps/sign.py

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Cuando dos cadenas no coinciden, decide el trabajo

Dos personas pueden añadir bloques distintos a la misma cadena a la vez, y entonces hay dos cadenas. El script construye las dos a partir de los mismos dos primeros bloques. La cadena A tiene 3 bloques y la B tiene 4. Las dos son válidas. La regla es seguir la cadena con más trabajo, aquí 768 frente a 1024, así que gana B y el bloque extra de A se descarta.

Comando
docker exec jupyter python3 steps/fork.py

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Un error frecuente

Advertencia

Mucha gente piensa que una cadena válida significa que cada pago que contiene es verdadero. Significa solo que nadie ha cambiado el registro desde que se escribió. Decidir si un pago debe estar ahí es otro trabajo: el libro de cuentas rechaza un gasto excesivo y una firma muestra quién lo envió. Mantén separadas las tres preguntas: si se cambió, si está permitido y quién lo envió.

El mismo trabajo en un cuaderno

Abre JupyterLab desde la barra y haz doble clic en start.ipynb. Construye una cadena, la comprueba, cambia un bloque y vuelve a comprobar. Haz clic en una celda y pulsa Mayús y Intro para ejecutarla. La última celda es el sitio de tu propia pregunta, y chain.py es lo bastante corto para leerlo entero.

Comprobación final

Consejo

Responde sin volver atrás. 1. ¿Qué guarda un bloque que lo enlaza con el anterior? 2. ¿Qué prueba una y otra vez el minado? 3. ¿Por qué falló la comprobación en el bloque 2 después de minar otra vez el bloque 1? 4. ¿Una cadena válida demuestra que cada pago es verdadero? Respuestas: el hash del bloque anterior; nonces; el bloque 2 seguía guardando el hash antiguo del bloque 1; no, solo que no se ha cambiado.

Para los docentes

Consejo

Esta lección es un pequeño ejemplo de una lección practicada en un laboratorio: los pasos y los botones Ejecutar son la lección, y el laboratorio es la copia propia de cada alumno. El laboratorio es un solo servicio, JupyterLab con una cadena de juguete escrita con la biblioteca estándar de Python, y nada de lo que hay aquí se corrige solo: el alumno entrega un cuaderno propio, descargado desde JupyterLab, y una frase sobre lo que mostró. Ideas clave: 1. Un hash enlaza los bloques, así que un cambio se nota. 2. Minar es ensayo y error cuyo coste crece con la dificultad. 3. Una cadena válida, un pago permitido y una firma son tres comprobaciones distintas. Error frecuente: leer una cadena válida como si todos los pagos fueran verdaderos. El laboratorio es un juguete para las ideas y no habla de ninguna moneda, mercado ni precio. Material: el laboratorio y un navegador. Consejo: pida al alumnado que adivine cuántos intentos pide la siguiente dificultad antes de ejecutar. Cópiela en su propio módulo y modifíquela, o cree una desde cero con el menú Laboratorio del constructor de lecciones.

Sobre este laboratorio y su código: Laboratorio de blockchain: una cadena de juguete en Python para leer, romper, minar y firmar

¿Enseñas a una clase? Asigna estas lecciones a tus estudiantes con calificación y un laboratorio para cada uno.