# Construyendo Bitcoin: Encadenando bloques
En esta actividad vamos a encadenar bloques. Para poder realizar esta actividad, necesitas haber completado la actividad de "Construyendo Bitcoin: Estructura de bloques".
## Contexto
Una vez que podemos producir bloques, podemos irlos encadenando entre ellos. En este contexto, "encadenar un bloque" significa hacer una referencia a un bloque anterior.
Listas encadenadas (estructura de datos) son útiles para entender el concepto de "bloques encadenados". Partiendo de ese modelo mental, una cadena de bloques es una especie de lista encadenada sencilla, en donde cada "nodo" nuevo apunta a un nodo predecesor.
Sin embargo, las listas encadenadas tienen una limitación que hacen difícil que puedan funcionar en un contexto de un sistema distribuido: son locales y efímeras (viven en memoria).
Cuando una lista encadenada "apunta" a un nodo anterior, realmente se está refiriendo a una dirección de memoria en donde se encuentra ese nodo.
Podemos persistir un objeto y guardarlo en una base de datos. Sin embargo, tendríamos que guardar alguna referencia a la localización del objeto (ej. un URI). Esto presenta otro reto diferente, ya que no tenemos certeza de que ese URI (una base de datos, endpoint de un webservice, etc.) vayan a estar siempre accesible y disponibles (¿recuerdan los fundamentos de un sistema distribuido?).
A diferencia de una lista encadenada, una cadena de bloques _no_ hace referencia a objetos locales de memoria.
A diferencia de una base de datos distribuida, una cadena de bloques _no_ hace referencia a recursos en Internet.
Una cadena de bloques hace referencia a **hashes criptográficos**.
A pesar de que una cadena de bloques ultimadamente "viva" dentro de una máquina (desde un Raspberry Pi o un servidor dentro de un cluster de minería), la información que contiene la cadena no depende de su dirección específica en memoria, ni de su ubicación en el Internet.
Mientras existan nodos dentro de la red de Bitcoin que tengan guardada la cadena de bloques, cualquier persona puede consultar cualquier transacción dentro de cualquier bloque.
Por lo tanto, los bloques de la cadena de bloques de Bitcoin persisten en un **espacio matemático** 🤯.
## Actividad
Construye una cadena de bloques utilizando la definición de la clase `Block` de la actividad anterior.
Te puedes basar en este esqueleto de solución:
```
class Blockchain:
def __init__(self):
"""
- Lista (ArrayList [Java], Vector [C++]) de objetos Block
Tip: Guarda aquí el hash del bloque previo
"""
pass
def create_genesis_block(self) --> Block:
"""
Produce el bloque cero.
El bloque cero tiene solo una particularidad: no tiene un
hash de bloque previo. Fuera de eso, es exactamente igual
a cualquier otro bloque.
"""
pass
def create_new_block(self) --> Block:
"""
Produce un nuevo bloque.
"""
pass
def add_block(self, block):
"""
Agrega el bloque a la cadena de bloques.
"""
pass
def start_blockchain(self):
pass
```
📌 Sube tu código en Canvas. No olvides agregar la documentación necesaria para que pueda entender tu código y ejecutarlo.
### Notas y recomendaciones
1. No es necesario que crees una lista encadenada para guardar los bloques. Recuerda que las referencias no son a memoria, sino a hashes de bloques.
2. No optimices prematuramente. Empieza desde lo más simple y ve construyendo sobre eso.
3. Esta no es una materia de ingeniería de software. Aunque siempre se aprecia un diseño elegante de una aplicación, con código limpio y legible, lo que importa más es aprender los conceptos.
4. Puedes consultar cualquier recurso que encuentres en internet, sólo no dejes que intervenga en tu proceso de aprendizaje.
5. Cualquier duda, ¡pregunta!
Aquí te dejo el output de mi aplicación, por si le puedes encontrar algo de utilidad:
```
Preparing new block [height: 0, timestamp: 2021-02-28 22:19:1614572345.872697, tx: [The Times 03/Jan/2009 Chancellor on brink of second bailout for banks.], nonce: 0, prev_block: 3af366504b556c3802248387ee16eb51ffee5ba52906bae95f0eff7ea454218e] with hash "eb4f7e9b21323ab96ce784bab42668882b6a818f8663fdaaa4fce923a5033a41"
Added block #0, with hash "eb4f7e9b21323ab96ce784bab42668882b6a818f8663fdaaa4fce923a5033a41"
Added block #0, with hash "eb4f7e9b21323ab96ce784bab42668882b6a818f8663fdaaa4fce923a5033a41"
Preparing new block [height: 1, timestamp: 2021-02-28 22:19:1614572345.872817, tx: [TX data for block #1], nonce: 0, prev_block: eb4f7e9b21323ab96ce784bab42668882b6a818f8663fdaaa4fce923a5033a41] with hash "c7c73cb12e08d09171966b70286ba6afa38333879fcbc846c2fc03edf519c393"
Added block #1, with hash "c7c73cb12e08d09171966b70286ba6afa38333879fcbc846c2fc03edf519c393"
Preparing new block [height: 2, timestamp: 2021-02-28 22:19:1614572345.872851, tx: [TX data for block #2], nonce: 0, prev_block: c7c73cb12e08d09171966b70286ba6afa38333879fcbc846c2fc03edf519c393] with hash "ea6d034ea5c2c83fcf31275b41ab212cd18335a2def4e206a04549528431037d"
Added block #2, with hash "ea6d034ea5c2c83fcf31275b41ab212cd18335a2def4e206a04549528431037d"
Preparing new block [height: 3, timestamp: 2021-02-28 22:19:1614572345.872963, tx: [TX data for block #3], nonce: 0, prev_block: ea6d034ea5c2c83fcf31275b41ab212cd18335a2def4e206a04549528431037d] with hash "18ab1843988e2459431d2cdaa0f5eed8634437fd4156f7e30118eb0fef58cf1a"
Added block #3, with hash "18ab1843988e2459431d2cdaa0f5eed8634437fd4156f7e30118eb0fef58cf1a"
Preparing new block [height: 4, timestamp: 2021-02-28 22:19:1614572345.873006, tx: [TX data for block #4], nonce: 0, prev_block: 18ab1843988e2459431d2cdaa0f5eed8634437fd4156f7e30118eb0fef58cf1a] with hash "acdc359e1a593e4f3a65f79b8724c88152dac30db0fcfddf6b5f38748914a603"
Added block #4, with hash "acdc359e1a593e4f3a65f79b8724c88152dac30db0fcfddf6b5f38748914a603"
Preparing new block [height: 5, timestamp: 2021-02-28 22:19:1614572345.873034, tx: [TX data for block #5], nonce: 0, prev_block: acdc359e1a593e4f3a65f79b8724c88152dac30db0fcfddf6b5f38748914a603] with hash "b76bd801877662a46d6aeb2de870ff775998f058f889c78d5b83fbf5270a0aa4"
Added block #5, with hash "b76bd801877662a46d6aeb2de870ff775998f058f889c78d5b83fbf5270a0aa4"
Preparing new block [height: 6, timestamp: 2021-02-28 22:19:1614572345.873059, tx: [TX data for block #6], nonce: 0, prev_block: b76bd801877662a46d6aeb2de870ff775998f058f889c78d5b83fbf5270a0aa4] with hash "df6e2654f547d58c50c9a4ce6d538cff4156ce474a64c4bbf626a822bce22dda"
Added block #6, with hash "df6e2654f547d58c50c9a4ce6d538cff4156ce474a64c4bbf626a822bce22dda"
Preparing new block [height: 7, timestamp: 2021-02-28 22:19:1614572345.873082, tx: [TX data for block #7], nonce: 0, prev_block: df6e2654f547d58c50c9a4ce6d538cff4156ce474a64c4bbf626a822bce22dda] with hash "a29e638e99f39e51d10423dd04054b73f08dd1c6d23e421869a558172ecabefc"
Added block #7, with hash "a29e638e99f39e51d10423dd04054b73f08dd1c6d23e421869a558172ecabefc"
Preparing new block [height: 8, timestamp: 2021-02-28 22:19:1614572345.873197, tx: [TX data for block #8], nonce: 0, prev_block: a29e638e99f39e51d10423dd04054b73f08dd1c6d23e421869a558172ecabefc] with hash "dae5230b33098a0ff31bcc3be6eb7e1aa83a8339403f2576b996fdea8b08e809"
Added block #8, with hash "dae5230b33098a0ff31bcc3be6eb7e1aa83a8339403f2576b996fdea8b08e809"
Preparing new block [height: 9, timestamp: 2021-02-28 22:19:1614572345.873268, tx: [TX data for block #9], nonce: 0, prev_block: dae5230b33098a0ff31bcc3be6eb7e1aa83a8339403f2576b996fdea8b08e809] with hash "0b56a11c5913bd3181fb6bda441333a41ad8affdccfeb2115175a9da752c8365"
Added block #9, with hash "0b56a11c5913bd3181fb6bda441333a41ad8affdccfeb2115175a9da752c8365"
```