Me quede pensando… nuestra querida Ethereum o nuestro querido Ethereum? Que difícil se pone el mundo a veces, absolutamente dominado por la incertidumbre. Una de las mejores armas contra dicha incertidumbre es… el Optimismo. Pero no me voy a poner modo vendedor shillero, tranqui. Simplemente quise aprovechar el juego de palabras. Vamos a lo nuestro.
Bloques fuera y dentro de Ethereum
La magia de los rollups es que ejecutan transacciones de Ethereum fuera de Ethereum. Luego envían la información de dichos rollups guardándolos en la parte de calldata de una transacción. Optimism, puntualmente, envía transacciones a la siguiente dirección: 0xff00000000000000000000000000000000000010. Podemos ir a verlo en Etherscan:
Si entramos a una transacción, vemos la información de los bloques de OP comprimida en la parte del calldata (la ventanita que dice Input Data):
Sí, ya sé que parecen una bocha de números raros. Pero son los bloques de la Layer 2 comprimidos. Optimism ejecuta transacciones, las agrupa en un batch, y las envía a la red principal. Mientras más comprimidas estén las transacciones, menos bytes de información va a haber que guardar en Ethereum. Esto hace que la transaccion en Ethereum sea más barata, por lo que las transacciones en Optimism también van a ser más baratas.
Acordate que cuando pagamos el gas en Optimism para hacer una transacción X, lo que estamos haciendo es pagar nuestra parte del costo del gas de guardar la transacción X en Ethereum. Es como viajar en auto con amigos y compartir gastos. Como cada transacción de Ethereum incluye muchas transacciones dentro de Optimism, el costo de cada transacción de Optimism es exponencialmente más bajo. Si encima la información está comprimida, se hace todavía más barato.
¿Cómo se crea un bloque en Optimism?
Bien todo muy lindo, pero nos adelantamos un poquito. Estamos viendo los bloques comprimidos y guardados en Ethereum pero todavía no sabemos ni como se crean. El flujo es bastante parecido al de Ethereum, con algunas diferencias importantes.
En Ethereum tenemos a los nodos, que distribuyen las transacciones, y a los validadores, que las agregan en bloques y hacen las attestations y todo. Pueden revisar los detalles en este link.
En Optimism, en cambio, tenemos 2 roles principales: Validator y Sequencer. El Sequencer es quien recibe las transacciones de los usuarios y las convierte en bloques, mientras que el validator simplemente valida que lo que hace el secuencer esté bien, y puede levantar el dedo en caso de ver algo raro.
Es muy fácil hacerse una ensalada con los nombres; pero el validator de Optimism es como el nodo típico de Ethereum y el Sequencer de Optimism es como el Validator de Ethereum.
Entonces ¿cómo se crea un bloque en Optimism? El Sequencer recibe transacciones en una mempool (privada), las ejecuta y luego las agrega a un bloque. Voilá. Es bastante sencillo. Ahora veamos las diferencias con Ethereum para que nos quede todo más claro.
- Hay que enviar la información a Ethereum
El Sequencer, además de crear el bloque, está encargado de todo el proceso de compresión de las transacciones y del envío de la información a la red principal. Es todo un flujo bastante complejo de explicar, pero involucra varias tareas. Lo importante es que envía la info en batches (no en bloques).
- El Sequencer es centralizado
A diferencia de Ethereum, que tiene miles de validadores, en Optimism hay un sólo Sequencer que depende de la Optimism Foundation. El objetivo es ir descentralizando de a poco. Lo interesante es que el Sequencer no puede “abusar” el sistema porque los validadores tienen herramientas para detectar y revertir transacciones maliciosas. Solamente podría censurar transacciones pero….
- Las transacciones caen por todos lados
Hay dos formas de enviar transacciones:
- enviárselas directamente al Sequencer
- enviarlas a través de la layer 1. Esto evita que el Sequencer aplique censura. Es una forma de “saltearlo” en caso de ser necesario. También es la forma de hacer depósitos.
Para cerrar esta sección veamos una transacción en el Optimistic Etherscan; incluye un “Block Number” o número de bloque (en la Layer 2), un “L1 State Batch Index” y el hash de la transacción en mainnet donde se guardó toda la data.
Hay mucho para profundizar en este parte, así que vamos a cortar por acá y nos vemos en el siguiente artículo.