Programando para RSK

Published on Author lopez

Hace ya casi cuatro años que trabajo como desarrollador de software en RSK. Entré sin conocer mucho de programación de blockchain, pero en estos años, gracias a esta experiencia, pude ir aprendiendo muchos temas interesantes.

Si un programador quiere colaborar con el código de RSK pero, como yo en mis inicios, no conoce de blockchain, van en este posts algunas recomendaciones. Algunas ya las escribí en la serie de 2017 Aprendiendo Ethereum/RSK. Lo que sigue, son comentarios y recomendaciones personales, de lo que me resultó interesante e importante para aprender.

Si bien el proyecto base de RSK, su nodo (ver https://github.com/rsksmart/rskj) está escrito en Java, hay varios proyectos para colaborar, aplicando desde JavaScript a Go, y veremos también aplicando Solidity (un lenguaje de contratos inteligentes).

Bitcoin

Es la blockchain por antonomasia (wikipedia). El principal producto de RSK es una sidechain (cadena lateral) conectada con Bitcoin: se pueden transferir BTC (bitcoins) de la red principal de Bitcoin a RSK y viceversa. Más abajo comento cuál es la idea básica de esa sidechain RSK.

Si bien no es indispensable para programar para RSK (ya sea en hackathons, colaborando en código abierto, o trabajando dentro de la empresa), es importante conocer cómo funciona Bitcoin. Para eso puedo recomendar el recurso de Andreas Antonopolous (sitio personal)(twitter)(wikipedia)

Mastering Bitcoin 2nd Edition

Leo ahí:

This book is mostly intended for coders. If you can use a programming language, this book will teach you how cryptographic currencies work, how to use them, and how to develop software that works with them. The first few chapters are also suitable as an in-depth introduction to bitcoin for noncoders—those trying to understand the inner workings of bitcoin and cryptocurrencies.

Tiene capítulos como: How Bitcoin WorksBitcoin CoreKeys and AddressesWalletsTransactions, Advanced Transactions and ScriptingBlockchainBitcoin NetworkMining and Consensus, Alternative Blockchains, ApplicationsBitcoin Security, Blockchain Applications.

Aunque no es totalmente necesario para entender gran parte de RSK, es interesante leer sobre la Lightning Network, lo que se llama un Layer 2 de Bitcoin (RSK también tendrá su Layer 2). Pueden empezar por:

A Deep Dive into LND: Overview and Channel Funding Process

Es un tema muy interesante, vean todo lo que está apareciendo, incluso en Ethereum (y van a ver que en RSK):

Layer 2’s Cambrian Explosion by Ben Jones of Plasma Group

Blockchain

Puede parecer extraño que este item aparezca en segundo lugar, luego de Bitcoin, pero pienso que es un camino adecuado: primero ver una implementación en particular (Bitcoin) y luego ver el panorama que desde ese entonces se abrió para todos, y para nosotros los programadores.

Hay infinidad de tutoriales, pero puedo mencionar algunos:

A Hitchhiker’s Guide to the Blockchain Universe
Best Resources for Learning Blockchain Development in 2019
Understanding Blockchain Fundamentals, Part 1: Byzantine Fault Tolerance
Understanding Blockchain Fundamentals, Part 2: Proof of Work & Proof of Stake
Understanding Blockchain Fundamentals, Part 3: Delegated Proof of Stake

Ethereum

Es la segunda blockchain más conocida. Ver sitio. Iniciada por programadores que colaboraban con el proyecto Bitcoin, su novedad es el soporte de smart contracts (contratos inteligentes). El nodo RSK nace como fork modificado del nodo Ethereum implementado en Java en el proyecto EthereumJ (ahora deprecated) (hay nodos implementados en otros lenguajes como Go, Rust, Python, etc)

Para entender RSK entonces sí: es necesario entender Ethereum (y luego, las diferencias con RSK). De nuevo, Antonopolous con Gavin Wood (uno de los creadores de Ethereum):

Mastering Ethereum

Tiene muchos de los temas de los tratados en el libro de Bitcoin, pero desde la implementación de Ethereum. Incluye además la novedad por la que nació este proyecto: smart contracts.

Luego leer el Ethereum Yellow Paper donde se explica el funcionamiento interno de Ethereum.

Algunos temas adicionales que pueden ver son:

What is Ethereum?
Learn Ethereum
Getting started with Ethereum as a developer
What is Ethereum? Everything you need to know!
A Guide to Gas
Understanding the ethereum trie
Data structure in Ethereum | Episode 1: Recursive Length Prefix (RLP) Encoding/Decoding
Data structure in Ethereum | Episode 1+: Compact (Hex-prefix) encoding
Data structure in Ethereum | Episode 2: Radix trie and Merkle trie
Data structure in Ethereum | Episode 3: Patricia trie
Data structure in Ethereum | Episode 4: Diving into examples
CryptoZombies is a free, interactive code school that teaches you to build games on Ethereum
A curated list of awesome Ethereum Resources
Ethereum Virtual Machine Awesome List
The Hitchhiker’s Guide to Smart Contracts in Ethereum
Ethereum Explained: Merkle Trees, World State, Transactions, and More
Ethereum Under the Hood: Part-1 (ver 0.1)
Ethereum Under the Hood- Part 2 (RLP Encoding)
Ethereum Under The Hood Part 3 (RLP Decoding)
EVM Evolution Roadmap
Ethereum Yellow Paper Walkthrough: Merkle Trees
A guide to Ethereum’s ERC standards
Diving into Ethereum’s world state
Mastering The Fundamentals of Ethereum (For New Blockchain Devs) Part III — Wallets, Keys, And Accounts

Yo recomendaría estudiar principalmente, de los enlaces de arriba, los temas:

  • Entidades principales de Ethereum: bloques, transacciones, cuentas
  • Estado del mundo, el Trie y Merkle Trees
  • Encodeado de la información usando RLP
  • Firma de transacciones usando curvas elípticas

Sobre el tema criptografía de curvas elípticas, ver mis referencias en el proyecto personal (WIP) de curvas elípticas.

RSK

El código actual del nodo lo pueden estudiar en https://github.com/rsksmart/rskj.

Los principales casos de usos que cubre tanto un nodo Ethereum como el nodo RSK (aunque los implementan de distinta forma) son:

  • Comunicarse con clientes externos via JSON RPC ver TBD
  • Comunicarse con otros nodos usando TCP basado en un protocolo Peer to Peer (P2P)
  • Enviar mensajes a otros nodos informando
    • El estado actual del nodo
    • Nuevas transacciones
    • Nuevos bloques o avisos de nuevos bloques
    • Otros mensajes request/response para conversar nodo a nodo, por ejemplo, cuando un nodo está atrasado (no tiene todos los bloques de la blockchain actual) le pide bloques a otro
  • Recibir transacciones de clientes externos
  • Dada una transacción recibida de un cliente externo o de otro nodo, validarla y distribuirla a otros nodos amigos
  • Dado un bloque recibido de un nodo amigo, validarlo, ver si pertenece a alguna cadena, y si todo está bien, reenviarlo a nodos amigos
  • Conectarse inicialmente a nodos llamados bootstrap, para conseguir una lista inicial de nodos a los que conectarse

Espero en próximos post escribir un poco más en detalle sobre estas implementaciones.

Como entidades, maneja las mismas que Ethereum: bloque, cuenta, transacción, recibo de transacción, pero con algunas diferencias, principalmente en los campos de bloque. La transacción es prácticamente la misma que las de Ethereum, lo que posibilita que se pueda reusar el ecosistema de wallets (programas clientes externos) para enviarlas a un nodo de la red RSK.

Otros temas a estudiar (y espero a cubrir en futuros post, dejaré por acá los enlaces a medida que vayan apareciendo): redes RSK testnet y mainnet, explorer, status, merge mining, two-way peg, storage distribuido, layer 2 a la raiden, etc.

Si tienen alguna duda técnica pueden escribir en https://gitter.im/rsksmart/rskj.

Mi experiencia personal

Como saben, me gusta programar para realmente entender un tema. Pueden ver algunos de mis primeros pasos en la serie Armando una Blockchain.

Cada tanto doy charlas de programación blockchain para desarrolladores, pueden ver algunas de mis presentaciones y algún video.

También estoy escribiendo una blockchain desde cero (el nodo de una blockchain) basada en las ideas de Ethereum (y por lo tanto, parecido a RSK) en Java, ver mi proyecto personal BlockchainJ  (hay otro que por ahora no estoy actualizando, en C# BlockchainSharp)

Más recursos de blockchain, programación, ethereum y solidity en los README de mis repositorios:

https://github.com/ajlopez/aprendiendoblockchain
https://github.com/ajlopez/aprendiendoSolidity
https://github.com/ajlopez/SoliditySamples

Algunos proyectos personales, más orientados a smart contracts (hay recursos sobre cada tema, en los README de cada proyecto):

Solidity Compiler
Ethereum Virtual Machine Compiler (from AST (Abstract Syntax Tree) to bytecodes)
Ethereum Virtual Machine to Code
Decentralized Exchange for ERC20 Tokens
Simple Ethereum/RSK Bridge
Metatransactions in Ethereum RSK

Nos leemos!

Angel “Java” Lopez
https://twitter.com/ajlopez
https://github.com/ajlopez