En este nuevo paradigma de programación, el dinero es software. Para entenderlo, debemos arrancar por identificar el potencial de los mecanismos de encriptación asimétrica. Claves pública y privada.
Entonces, ¿alguna vez tuviste poder ejecutivo dentro de un servidor? ¿Te acordás cómo conseguiste permisos? En mi experiencia, los conseguí bajo dos mecanismos. En el primero, el servidor te solicita usuario y contraseña. Pero previo a esto, durante el inicio del handshake, el server provee a tu software de autenticación de una clave pública con la cual cifrarás y luego enviarás tus credenciales al servidor. Puesto que este mensaje puede únicamente ser descifrado con la clave privada progenitora de la clave pública que nos fue dada, nos garantizamos que el server realiza la validación de nuestras credenciales dentro de sus fronteras, lejos de terceros en el medio.
El segundo mecanismo requiere que tu clave pública haya sido asociada, a priori, dentro del servidor, al usuario con el que buscas conectarte. Así, ante un posterior intento de logueo, tu “Buenas, soy Juan Carlos; quiero ingresar” se comunicará cifrado –y por lo tanto firmado– con tu clave privada. Ahí, aplicando voodoo matemático, la máquina huésped verifica, no tu usuario y password, sino que la clave pública que ya residía en los registros de la máquina sirva para descifrar el mensaje. De evaluar a true, bien te conectaste o alguien más lo hizo usando la clave privada que de alguna manera te robó. No queremos que eso pase.
Esto, hasta acá, es la base del inminente cambio de paradigma del sistema financiero mundial.
¿Cuál es el punto de partida de un smart contract?
Las aplicaciones descentralizadas (dApps) carecen de void main(String args[]). Tampoco hay instalación. Para dejarla funcionando, te conectas a un nodo por RPC1, tras lo cual compilas y luego deployas tus smart contracts. Similarmente a OOP, la máquina virtual de la blockchain le asigna una posición en memoria a cada instancia, deployada, de un smart contract. La diferencia reside en que mientras que la programación tradicional esto sucede en RAM y es por lo tanto volátil, en una blockchain esta asignación es permanente. Eterna y Verdadera: Bloque n, transacción j, código de smart contract deployado en posición x.
Ahora, bajo este modelo, como programadores nos nacen algunas preguntas.
¿Qué pasa cuando quiero modificar mi código? ¿Cómo funciona el versionado? ¿Es posible dar de baja, deprecar, remover o desactivar alguna funcionalidad subida a la blockchain (o como se llame)? ¿Se puede ser dueño de su código? Y si otros devs ya pasaron por estas dudas, ¿Qué convenciones emergieron, hasta ahora, en el desarrollo de contratos inteligentes?
Mi conceptualización preferida encasilla a una blockchain como una base de datos donde pagás para escribir pero no para leer. La diferencia reside en que, en vez de actualizar una fila, la nueva transacción queda grabada como un evento precedido por todas las transacciones anteriores. Un bloque de la blockchain apunta al hash del bloque anterior… como cada commit de git apunta a su precedente.
Puesto que todas las operaciones que mutan un dato son en realidad inserciones, notarás sin esfuerzo las operaciones que requieren fondos; porque son de escritura. Desplegar un contrato inteligente o transferir aquello que te pertenece, sean fichas, monedas o tokens, cuesta. En este mundo, la encriptación asimétrica respalda tu propiedad privada. No necesitás el aparato legal de un estado, un rey o la iglesia. La blockchain es la institución.
¿Cómo se interactúa con un Smart Contract?
Tras deployar un conjunto de contratos, la máquina virtual te informará en donde encontrarás a cada contrato desplegado. Esta address es un tipo de dato nativo representado con 40 caracteres hexadecimales. De desplegar el mismo contrato de nuevo, con el mismo nombre, no encontrarás colisiones. Terminás con menos dinero contratos con el mismo nombre, bajo dos address distintas. Cada uno verá su constructor llamado por única vez, dejando su estado inicial limpio, y será autogobernado por la lógica definida dentro sus funciones.
Después tenemos las billeteras. Estoy seguro de que sabés que las usás para administrar el dúo de claves pública/privada que usás para firmar transacciones criptográficas y demostrar la posesión de una cuenta. En las blockchains de tipo Ethereum Virtual Machine (EVM), la VM guarda en la address de tu cuenta todas tus transacciones pasadas junto al historial de tus tokens.
Esas son los dos tipos de cuenta que maneja la VM. Las billeteras reciben el nombre de cuentas externas. Y el otro tipo referencia a los contratos que hemos desplegado nosotros u otros devs.
Para conectarse a la blockchain, los navegadores usan librerías de JS. Las más conocidas son Ethers y Web3, siendo Ethers la predilecta hoy por la comunidad. Para enviar y recibir mensajes, usan el protocolo JSON-RPC. Y parte de la magia de estas librerías reside en su integración con las billeteras de tipo add-on, que podemos instalar en nuestro browser2. Estas billeteras te permiten crear un nuevo par de claves como también importar las 12 palabras a partir de las cuales la wallet derivará tu clave privada, y, de esta última, tu clave pública & consecuente address.
¿Qué es lo fundamental para entender Solidity?3
Cuando te metas a ver código, a menudo vas a ver al término ERC20. Refiere a un standard que emergió para transaccionar con tokens.4 ERC20 es también una interfaz.
En tu proyecto, lo normal es tener un contrato por archivo en disco. Los contratos que implementan ERC20 definen las reglas de creación, transferencia y destrucción de tokens que, por lo general, son del mismo tipo del contrato. También, los smart contracts pueden, como las billeteras, almacenar más de un tipo de token. Así que, ahora, cuando leas Total Value Locked (TVL) ya sabés que alude al monto de dinero almacenado dentro del smart contract en forma de tokens. ¿Cómo se hace? Teniendo una variable de instancia de tipo mapping donde las keys son de tipo address y su valor corresponde su balance de tokens:
mapping(address => uint256) myBalances;
Viendo la interfaz ERC20 que copié acá abajo, notarás 3 funciones de tipo view, indicando su naturaleza read-only, y 3 funciones adicionales en donde algún tipo de fondos será requerido. Todas son de tipo external porque no son privadas —es una interfaz (:
Metí varias cositas juntas. El tema es profundo pero apunté a condensar varias cosas como intro para que vaya tomando forma.