# Blockchain "Masterclass"
## Versión muy (muy) reducida
Hay cinco cosas a entender a la hora de trabajar con una blockchain:
1. Los sistemas _descentralizados_ (como blockchain) son considerados _canales abiertos_ (que pueden ser escuchados y potencialmente intervenidos). Por esto, es necesario usar algoritmos criptográficos para proporcionar unas garantías fundamentales: **confidencialidad, autenticidad, integridad, y no repudio**.
2. Una blockchain es una máquina de estados, de naturaleza atómica y transaccional, compuesta de:
<center><p>
<img style="width: 70%" src="https://polkadot-blockchain-academy.github.io/pba-content/singapore-2024/syllabus/3-Blockchain/img/headers-link-state-body.svg" />
</p></center>
1. **Una cadena de bloques:** lista enlazada por hash del elemento inmediatamente anterior. Esto, para garantizar la integridad de las operaciones, y de merkle trees (arboles n-arios, donde el valor del nodo es el hash de la concatenación de los hashes de los nodos hijos, hasta las hojas, que son o bien las operaciones, o el estado), y que se usan para poder verificar rápidamente cambios en el estado de la base de datos sin necesitar de mucha información.
2. **Un estado:** este estado puede ser cualquier base de datos, pero típicamente es un trie n-ario de llave-valor. Es un trie n-ario, porque así es muchísimo más fácil usar hashes para calcular los prefijos de las llaves, y leer la información muchísimo más rápido. Pero para efectos prácticos, **las bases de datos de una blockchain suelen ser de tipo llave-valor**.
3. Para modificar el estado de una blockchain, **se precisa de una función de transformación del estado** ($STF = f(S_0, tx(...params)) \rightarrow S$). Una colección de estas funciones ejecutadas en un tiempo definido, genera un bloque nuevo.
<center><img src="https://polkadot-blockchain-academy.github.io/pba-content/singapore-2024/syllabus/3-Blockchain/img/state-machine/state-machine-general.svg" /></center>
4. Dependiendo de la blockchain, esas STF pueden ser:
1. Un conjunto fijo de operaciones (como Bitcoin, Litecoin, Dogecoin, Monero, etc), que almacena y verifica transacciones de manera histórica para cada dirección (UTXO)[\[1\]][1],
2. Un sistema de cuentas y balances (como Ethereum, Polygon, etc.) que, junto a una máquina virtual (quasi-Turing completa) permite ejecutar funciones (Smart Contracts) que pueden almacenar su propio estado interno, y tener una API[\[2\]][2], o
3. Un **Runtime** (como Substrate: Polkadot, Kusama, Kreivo, AlephZero, Moonbeam, etc.) que incluye un conjunto de operaciones (API) actualizables en el tiempo[\[3\]][3], y que además, puede correr Smart Contracts.
5. **Desarrollar un protocolo básicamente significa diseñar estas STF**: funciones que que determinen, dado el estado actual, y unos parámetros de entrada, reglas de negocio donde la salida sea un nuevo estado, o un error indicando por qué no se pudo cambiar el estado.
## Versión extendida
Ver https://polkadot-blockchain-academy.github.io/pba-content/singapore-2024/ (capítulos 1 al 3).
[1]: https://polkadot-blockchain-academy.github.io/pba-content/berkeley-2023/syllabus/3-Blockchain/1-Overview_of_Blockchains_slides.html#/9/2/0
[2]: https://polkadot-blockchain-academy.github.io/pba-content/berkeley-2023/syllabus/3-Blockchain/1-Overview_of_Blockchains_slides.html#/9/4
[3]: https://polkadot-blockchain-academy.github.io/pba-content/berkeley-2023/syllabus/5-Substrate/1-Intro-to-Substrate_Slides.html#/7/8