¿Como Funciona Ethereum? Un analisis un poco mas profundo y tecnico.
Published: 2021-09-29 21:56:37

## Esto es una copia de un Hilo de Twitter, por eso mismo puede estar resumido en partes o cortado en una cantidad de caracteres las estrofas.

Hoy voy a enseñarte como funciona Ethereum, a un nivel profundo 🚀 Asi que haya vamos! 🚀

Seguro has escuchado hablar de este tal Ethereum, ETH, Ether, Computadora Global en blockchain, etc, etc...

Empezamos bien basico y vamos hasta algunos detalles muy profundos! 🏎🏎🏎🏎🏎 
En esencia es lo siguiente, una base de datos global publica que mantiene un registro permanente de transacciones, la cual no requiere ninguna autoridad central para mantenerla o protegerla. Funciona en modo "sin confianza plena" donde cualquiera puede hacer una transacción. 🤯🤯 
¿Seguis confundido? Esta muy bien! Es normal, vamos paso a paso, para explicarte de manera tecnica como funciona, no necesitas ser un programador para aprender, algunas cosas seran dificiles de entender y esta bien, de seguro algo nuevo te llevas de este hilo 🧵 
Blockchain ⬜️ 🔗 ⬜️ 🔗 ⬜️
Podemos debatirlo, pero resumamos en que es una maquina transaccional unica, criptograficamente segura, en la que todos pueden acceder, hacer transacciones y participar, no hay entidades centrales. 
La blockchain de ethereum es una maquina de estado basada en transacciones, es decir, "algo" que leera una serie de entradas y en funcion de esas entradas, generara un nuevo estado
![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qu47lath0rexhk288hv2.png)
 
Ethereum es practicamente esto, comenzamos con el primer bloque, GENESIS, un estado vacio practicamente y cuando se ejecutan transacciones, pasara a un nuevo estado global compartido. 
Un estado de Ethereum tiene miles y miles de transacciones. Estas transacciones se agrupan en "bloques". Un bloque contiene una serie de transacciones y cada bloque está encadenado junto con su bloque anterior.
![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qcirzatajpubdcim38hh.png)
 

Para poder generar una transaccion en el sistema, esta debe ser valida. Para que sea valida debe pasar por un proceso de verificacion, llamado mineria. Donde miles de computadoras compiten por tomar un bloque de transacciones pendientes.. 
y calcular un "problema" matematico antes que nadie para poder agregarlo en la cadena. Este mecanismo se conoce como "Proof of Work", PoW o prueba de trabajo. Un minero que hace este trabajo antes que nadie, es recompensado con... 
tokens nativos de Ethereum, llamados Ether, que se crean y se dan al minero ganador cada vez que se agrega un bloque a la cadena.

OKAY!! Por ahora tranqui, la pregunta seria.
¿Que pasa si los mineros crean bloques distintos y se crean dos partes distintas de esta blockchain?
![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zmiqjmaopfbcykatx62u.png)
 

Ethereum utiliza un protocolo, conocido como GHOST, para evitar este tipo de bifurcaciones de la blockchain y que exista información diferente en estados diferentes.
GHOST = Greedy Heaviest Observed Subtree

Hiper resumen: Debemos usar la cadena con mayor trabajo computacional. 
Aclaracion necesaria, el protocolo GHOST no se resume a eso solamente, es bastante amplio y genera un sistema de recomensas complejo de explicar en Twitter. No queria entrar en esa profundidad (para otro hilo tal vez :P ) 
Buenisimo luego de esto hemos pasado por encima algunas cosas importantes, pero llegamos a los detalles de lo que hace funcionar a Ethereum, SI! Es largo, es gigante, pero vamos parte a parte, les prometo que sera 🤯🤯🤯 
Cuentas: El "estado global compartido" de Ethereum, esta compuesto por unidades atomicas, llamadas Cuentas. Cada una de ellas se identifica con un Hash de 160 bit y que es publico para todos.

Hay dos tipos de cuentas:
- Cuentras controladas externamente
- Cuentas de contrato 
Las cuentas controladas externamente, son las cuentas comunes que conocemos todos al interactuar con la red por primera vez, son controladas por medio de la llave privada que nunca debemos compartir. 
Las cuentas de contrato son controladas por su codigo y a diferencia de las primeras, tiene un codigo asociado con el que se puede interactuar.
![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6a4qs4xwe4w7pg5zxzx2.png)
 
DIferencias:
Una cuenta controlada externamente (CCE) puede interactuar con otras CCE (una simple transferencia de valor), con Cuentas de Contrato (donde activa una parte de su codigo con un proposito especifico, ex: mintear tokens, transferir tokens, guardar algo, etc) 
En cambio, las Cuentas de Contrato no pueden iniciar una interaccion por si solas, siempre es en reaccion a una transaccion recibida desde una CCE u otra Cuenta de Contrato).. Podemos hablar de esto un poco mas tarde
![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kvwcdoclxrxue2969s5u.png)
 
En resumen, toda accion que sucedde en el estado global compartido de Ethereum, es siempre en respuesta a una interaccion con una Cuenta Controlada Externamente. Bien, ahora indaguemos un poco mas profundamente.. Que se viene lo bueno! 🚀🚀🚀 Vamos! 🚀🚀🚀 
El estado de una cuenta se compone de 4 cosas:
- Nonce: Si es una CCE, es la cantidad de transacciones(TX)
- Saldo: la cantidad de wei (unidad minima de ether) Hay 1e + 18 Wei por Ether
- storageRoot: Un Hash de un nodo raiz en algo que explico en un momento

falta uno... 
- codeHash: el hash del código EVM (Ethereum Virtual Machine - más sobre esto más adelante) de esta cuenta.

Para las cuentas de contrato, este es el código que se codifica y almacena como codeHash .

Para las CCE, el campo codeHash es el hash de una cadena vacía. 
¿Como se guardan todos los balances de todas las cuentas en Ethereum? ¿Como se organiza toda esa información?

El estado global de Ethereum consiste en un mapeo de cuenta -> Balance de la cuenta.

Se guarda en una estructura de datos tipo Arbol, llamado Merkle Patricia Tree 🌳 
WOW! Dame una imagen @emanuel_hold por favor! Ahi va!
Es una estructura con esta forma, donde los nodos mas externos (leaf nodes) contiene data y los anteriores contienen hashes resultantes de los dos nodos inferiores y asi hasta llegar al Root Node, hash dependiente.
![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/utjyli5ts0acgez5hjgu.png)
 

Para poder acceder a el contenido de los nodos inferiores, se debe de tener una KEY para poder acceder, e ir guiando el camino hasta la data. 
En Ethereum esta key, se forma desde la address hacia la cuenta asociada, incluyendo los 4 elementos que nombre arriba (nonce, balance, codeHash, storageRoot (Este ultimo es otro Merkle tree 🌳))
![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1weoozofn6fsjwgdki3q.png)
 
Ha sido mucho? 🧐 Esto es solo el comienzo, esta estructura tambien se utiliza para guardar las transacciones y los ingresos.
Cada Bloque de la cadena tiene un Header con 15 elementos, entre ellos:
- stateRoot
- transactionsRoot
- receiptsRoot
![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rh4gfed0z2lx8aa9y8ln.png)
 
Esta forma de guardar todo en hashes y estructuras de datos Merkle es increiblemente poderosa, porque nos permite tener Nodos Ligeros y Nodos Completos dentro de la cadena.
Recuerda que toda la red se mantiene de nodos decentralizados que validar y verifican transacciones. 
Hay dos tipos de nodos como dije:
Nodo Completo: Se descarga TODA LA BLOCKCHAIN, ejecuta todas las transacciones y tiene un estado COMPLETO de todo. Por lo general, los mineros tienen este tipo de nodo como requisito para minar. 
Nodo Ligero: Estos no bajan TODA LA BLOCKCHAIN, pero si tienen tienen todas los Headers de toda la blockchain desde su comienzo. Y como ellos tienen los hashes de estos tres Merkles 🌳, pueden generar y recibir respuestas validas sobre cualquier transaccion, balance, etc!! 
Esta forma acotada de tener la info en un nodo ligero funciona porque los hashes de los Merkle se crean de abajo hacia arriba, es decir, desde la data hacia el Root. Si alguien quiere cambiar alguna data, no va a coincidir el rootHash del Merkle y por ende, no sera valido.
![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p2ewelgip7gdj2pyaeap.png)
 
🤯🤯🤯🤯🤯
Este es el gran beneficio de usar esta estructura de datos, 💥💥 MARKLE PATRICIA TREE 💥💥 puedes no tener TODA la blockchain pero si verificar la integridad de los datos en cualquier porcion de la blockchain en si. 🤯🤯🤯🤯🤯 
GAS ⛽️⛽️⛽️
Hemos hablado de transacciones (luego de esto profundizo mucho mas), Ether, etc. Algo fundamental es el GAS y su relacion con las transacciones que se hacen en la red. Toda tx incurre en una tarifa de computo, no hay nada gratis! Por lo general se lo conoce como GAS. 
Gas es la unidad utilizada para determinar la comision necesaria para ejecutar una transaccion.
El "precio del gas" (Gas Price) es la cantidad que estas dispuesto a pagar por cada unidad de Gas utilizado y esta medido en gwei, es decir, 1,000,000,000 Wei. 
Cada vez que se hace una transaccion, el "sender" (quien la hace) setea un GAS LIMIT y un GAS PRICE, es decir, si multiplicamos estos dos elementos, obtenermos la maxima cantidad de dinero que esta dispuesto a pagar por una transaccion.
![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wrxy17vsie54pp8romcr.png)
 
Si la transaccion se hace con exito y hubo un sobrante en el gas, sera enviado nuevamente al sender.
![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w7up3pxm12zpdgpfrvoh.png)

 
La otra cara de la moneda es cuando una transaccion se queda sin gas (Out of Gas), se revierte el estado (queda una TX fallida en la blockchain) y se gasta todo ese gas
![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9sl4tvqeuwwx2sv9xqgt.png)

 
🤯 PERO DONDE SE VA ESE ETHER! DESAPARECE? QUIEN SE LO LLEVA? 🤯
Ese Ether gastado va hacia la "Beneficiary Address", por lo general es el minero que lleva a cabo la computacion requerida. Es decir, esas comisiones son para quien hace el trabajo de hacer el computo requerido. 
Entonces para entender esto, es mucho mas probable que los mineros eligan primero aquellas TXs que esten dispuestas a pagar mas en Fees que las demas. 
No quieres almacenar DATA en la blockchain! 😭

Existe la posibilidad de almacenar informacion en la blockchain, pero es costoso, MUY COSTOSO!
Si queremos incluir DATA en la transaccion, hay dos vias:
Un Smart Contract o enviando un mensaje de una cuenta a otra con la data 
El costo del gas no solo es la cantidad de data, sino que tan compleja es en si. Almacenar unos pocos KB puede llegar a costar muchisimo Ether en forma de GAS.
Muchas veces se recurre a solo guardar la ubicacion en una blockchain especializada en almacenamiento (IPFS) 
TRANSACCIONES ⚡️⚡️⚡️
Dijimos que Ethereum es una maquina basada en transacciones, donde el estado global es el resultado de las mismas txs que se dan en la red.

Una TX es una pieza de instruccion firmada criptograficamente que es generada por una CCE y enviada a la Blockchain 
Hay dos tipos de transacciones:
- Mensajes
- Creacion de Contrato
Habia dicho que estos dos siempre son originadas por CCEs, pero no quiere decir que los Contratos no puedan comunicarse entre si por medio de Txs internas. 
Podriamos pensar que son iguales a las transacciones normales con la diferencia que las originan los contratos hacia otros contratos. Estas no poseen un gasLimit, porque en realidad el gas esta seteado en la transaccion original que da origen a esta tx interna.
![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c16133bg4t06nfav1pls.png)
 
BLOQUES ⬜️🔗⬜️🔗⬜️🔗⬜️
Miles y miles de transacciones se envian segundo a segundo, los mineros la toman, hacen su computo, hacen su trabajo, sudan la frente... Lo mas rapido posible, una carrera contrareloj y BOOM... nuevo BLOQUE en la cadena.. Se cobra una recompensa 🤓 
Antes de explicar lo que tiene un bloque, quiero hablarles de algo que pasa en Ethereum y en la mayoria de blockchains que son rapidas (cuestion de segundos).
Al crear un bloque, es muy probable que otros bloques tambien se hayan creado, debido al poco tiempo que conlleva. 
Esto conlleva a bifurcaciones de la Blockchain y el ya nombrado protocolo GHOST calcula la blockchain que tiene mas trabajo computacional para determinarla como unico camino real a continuar creciendo. Esto pasa todo el tiempo.
![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ujwkd8qb30cnsbjjllum.png)
 
Si eres un minero, creaste un bloque valido pero no es agregado a la blockchain en esa altura porque otro minero fue mas rapido, no te preocupes, ese bloque puede ser incluido en la lista de "UNCLES" o "Ommers" en el bloque que si fue agregado. 
Eres recompensado por el trabajo computacional, aportas en forma de trabajo computacional para validar la seguridad de la cadena, incentiva la descentralizacion en la blockchain
Interesante en comparacion Bitcoin, esta posibilidad no existe y descarta al bloque huerfano 
Si quieren una web para visualizar la creacion de bloques y como se linkean estos bloques "uncle" o "ommer" pueden verlo aqui:
ethviewer.live

Simplemente hermoso!
![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8ftqgvcj8ri4b1zmuiyc.png)
 
Entonces la ESTRUCTURA DE UN BLOQUE en Etherum consiste en 3 principales cosas:
- Block Header
- Informacion de las transacciones que estan incluidas en el bloque
- Una serie de Block Headers de los bloques "Uncle" o "ommer" de este bloque. 
La informacion que contiene un BLOCK HEADER seria como la siguiente imagen
![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ivgb5m0vp8vc4fk29t9v.png)
 
Este es el final! 🤓 MENTIRA! Aun falta mas, queda entender como se logran las transacciones en Ethereum, vamos a profundizar un poco mas. Bajemos un poco mas y entendamos esta parte...
Si has llegado hasta aqui, muchas gracias! Sigamos un poco mas y terminamos! 🙏🏻🙏🏻🙏🏻 
⚙️ ¿COMO SE EJECUTA UNA TRANSACCIÓN? ⚙️
Esta es una de las partes mas complejas de entender, y voy a hacer el intento para explicarlo de una manera consisa, rapida y bajarlo a tierra lo mas explicativamente posible.
![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mpr8ghbslvvfta2rw8v4.png)
 
Para ser ejecutada, una tx debe de cumplir con una serie de requisitos necesarios
- Formateada en RPL: Recursive Length Prefix, es la forma en la que se serializan las cosas en Ethereum.
Una lista ["cat", "dog"] en RPL quedaria:
[ 0xc8, 0x83, 'c', 'a', 't', 0x83, 'd', 'o', 'g' ] 
- Firma de transaccion valida
- Que tenga un Nonce valido: es el numero de tx ya efectuadas por la cuenta. Debe coincidir para ser valido. 
Otro requisito fundamental de las Transacciones es el GAS, el limite del gas (gasLimit), debe ser igual o mayor al gas intrinseco necesario para realizar la transaccion, esto se compone de tres cosas: 
- 21000 gas minimos para realizar la transaccion
- Gas necesario para cubrir la parte de DATA (4 Gas por cada byte enviado igual a cero, y 68 gas por cada dato distinto a cero), esta es la razon por la que es MUY COSTOSO guardar data en la blockchain. 
- Si la transaccion es para crear un contrato, hay 32000 Gas adicionales necesarios.
![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y20przs4n2jaxrjgn5f6.png)
 
Todo esto debe validarse por adelantado y el emisor de la transaccion debe de tener la cantidad suficiente para hacerse cargo antes de empezar la transaccion.

Luego, empieza a procesarse la transaccion, Ethereum genera un subestado donde va haciendo seguimiento de algunas cosas mientras se ejecutan los pasos de la transaccion:
- Cuentas de autodestruccion: Una listas de cuentas que se autodestruyen en esa transaccion. 
-Monto a devolver: Cada vez que e una transaccion se libera DATA de la blockchain (convertir un byte a cero, corregirme si esta mal), se recompensa a quien hace la transaccion, por esto, lleva un registro de esto. (15000 Gas por cada byte a cero)💰💰💰
![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xt41ctnedk7fq01jp65y.png)
 
Una vez finalizados todos los pasos y asumiendo que no hay estados invalidos:
- Ether del gas es enviado al minero
- El gas utilizado se suma a la variable de gas del Bloque que registra todo el gas usado en todas las tx del bloque.
- Si hay cuentas para destruir, se destruyen. 
FIN! FIN! 🤩 Esto ha sido todo por este hilo 🧵 He cubierto los aspectos basicos tecnicos de Ethereum y he dejado fuera cosas interesantes pero mas pesadas (Como se ejecuta el codigo, profundizar en la finalizacion de un bloque, etc) Pero que seguro pondre en otros hilos. 


Si esto les ha gustado, votenlo o compartanlo, se agradece! 
Si quieren seguirme en twitter: 

[@emanuel_hodl](https://twitter.com/emanuel_hodl)

No podria haber sido posible sin articulos como:
- [Link](bit.ly/3CtT053) de @iam_preethi
- [Link](derao.medium.com)
- Ethereum Wiki
- EthDev Reddit

Gracias a todos! Un saludo hasta la proxima!🤩