El lenguaje de programación de Solana
El principal lenguaje de programación de Solana es Rust, pero C, C++, e incluso Python son compatibles.
El lenguaje de programación de Solana utiliza Rust, C y C++ de manera similar. Hablaremos de Python en una sección posterior.
Rust es un lenguaje compilado. Si compilas Rust en tu computadora, finalmente se convertirá en LLVM-IR (representación intermedia de máquina virtual de bajo nivel), y LLVM lo convierte en el bytecode que puede ejecutarse en tu máquina (x86, arm64, etc.).
En Solana, la secuencia es la siguiente: 1) Compilar Rust a LLVM-IR, luego a BPF (Berkeley Packet Filter) y almacenar el bytecode en la blockchain. 2) Los validadores realizan la compilación JIT (just in time compile) del BPF al conjunto de instrucciones compatible con su hardware, generalmente x86, aunque arm64 podría ser otro objetivo común.
¿Packet Filter (Filtro de paquetes), te preguntarás? ¿Qué tendría que ver el lenguaje de programación de Solana con los paquetes de internet?
Esto es en realidad una elección de diseño muy inteligente por parte de Solana.
Espacio de usuario vs espacio del kernel
Linux tiene la noción de espacio del kernel (kernel space) y espacio de usuario (user space). Si deseas hacer cosas como abrir un archivo o iniciar otro proceso, tu ejecutable debe pedirle al sistema operativo que lo haga por él. Digamos que escribes un script en python para abrir un archivo e imprimir cada línea par. La carga real del bytecode del archivo ocurre en el espacio del kernel, pero una vez que el bytecode se entrega al script, la interpretación a ASCII y la determinación de si un número de línea es par o impar ocurre en el espacio de usuario.
Esta abstracción existe por varias razones, pero una obvia es la seguridad. No todos los usuarios o ejecutables deberían poder abrir o ejecutar archivos arbitrarios. El sistema operativo determina qué “APIs” están permitidas. (Por cierto, la “API” para abrir un archivo se llama técnicamente una “llamada al sistema” o system call en la jerga de los sistemas operativos).
De manera similar, a los programas y ejecutables no se les debería permitir acceder arbitrariamente a los paquetes de internet entrantes. Deben, por defecto, realizar llamadas al sistema para pedir permiso al sistema operativo para ver los paquetes, a los cuales solo se puede acceder desde el espacio del kernel.
Aquí se debe enfatizar un concepto importante: la transición de ida y vuelta entre el espacio de usuario y el espacio del kernel es generalmente lenta.
Si estás filtrando paquetes de internet entrantes, entonces hay una gran cantidad de saltos de un lado a otro entre el espacio de usuario y el espacio del kernel. Imagina copiar cada paquete entrante del espacio del kernel al espacio de usuario. Eso crearía mucha sobrecarga (overhead).
Es por esto que se inventó BPF. Puedes ejecutar ejecutables dentro del espacio del kernel para evitar estos saltos.
Pero si sabes algo acerca de tener privilegios de kernel, ¡sabes que esto es extremadamente peligroso! Tener el control sobre el kernel (sistema operativo) podría hacer que la computadora colapse si hay un error (bug). Peor aún, si se ejecuta código malicioso, el daño es ilimitado.
Por supuesto, los diseñadores de BPF pensaron en esto. Antes de que se ejecute el código BPF, se valida para asegurar que se ejecute durante un período de tiempo fijo, es decir, debe terminar, solo puede acceder a un área de memoria designada y sigue otras restricciones adecuadas.
Como nota al margen, desde su invención, BPF ha expandido su uso más allá del simple filtrado de paquetes, pero su nombre se ha mantenido.
Por qué el lenguaje de Solana utiliza BPF
Al aprovechar la investigación existente que se invirtió en hacer que los programas BPF sean seguros, Solana puede ejecutar smart contracts donde corren más rápido: ¡dentro del kernel! Esto es bastante notable si lo piensas. Puedes ejecutar smart contracts no confiables, que podrían haber sido escritos por cualquier persona, en la parte más sensible (pero eficiente) del sistema operativo: el kernel del sistema operativo. Solana logra aprovechar décadas de investigación e inversión en esta área para obtener un buen impulso en su rendimiento.
BPF no son instrucciones de máquina; sigue siendo su propio conjunto de bytecode. Sin embargo, puede ser compilado con JIT a una variedad de arquitecturas de CPU.
Volviendo a Rust, C y C++
Estos tres lenguajes de programación han sido soportados durante mucho tiempo por LLVM. Esta es otra área en la que Solana puede aprovechar décadas de inversión (sí, es extraño hablar de tecnología en términos de décadas, pero LLVM salió en 2003).
Puedes usar C o C++ como lenguaje de programación de Solana, pero tendrás mucho menos soporte con las herramientas. Generalmente se recomienda usar Rust, incluso si eres un experto en C o C++. Rust será fácil de aprender si ya tienes fluidez en C++.
¿Cuánto Rust necesitas saber para programar en Solana?
No tanto, pero de todas formas requiere algo de estudio. Rust no es un lenguaje en el que puedas “abrirte paso buscando en Google”. Por ejemplo, supongamos que estás programando en Ruby viniendo de un entorno de Java o Scala. En ese caso, puedes preguntarle a Google bastante fácil por los patrones de programación equivalentes (tu código podría no verse idiomático, pero será legible y funcional). Si (cuando) copias y pegas código de Stack Overflow, seguirás teniendo una buena intuición sobre lo que hace el código.
Sin embargo, si haces esto con Rust, te encontrarás con algunos obstáculos frustrantes. Rust tiene una sintaxis que es difícil de buscar (intenta buscar un “#” en el motor de búsqueda), y tiene conceptos que no se encuentran en otros lenguajes de programación.
Rust es un lenguaje vasto. Sin embargo, solo necesitas conocer un subconjunto del mismo. Nuestro curso de desarrollo de Solana enseña Rust junto con Solana para que solo te enfoques en las partes de Rust que necesitas.
Cómo Solana puede usar Python
Compilar Rust, C o C++ a BPF es sencillo. Con Python, es bastante diferente; Python, obviamente, es un lenguaje interpretado, no un lenguaje que se pueda compilar con LLVM.
Para simplificar demasiado, Python es transpilado a Rust, y luego todo se comporta como se describió anteriormente.
Si quieres el flujo de trabajo exacto, está documentado visualmente en el github de seahorse-lang
Los programas de Solana normalmente no se escriben en Rust puro; la mayoría de los desarrolladores usan el Anchor Framework. Por lo tanto, aunque Seahorse realiza una transpilación bastante típica, también está aprovechando las similitudes planificadas con el framework.
El Seahorse Framework modela muy de cerca el Anchor Framework para que el código de Python pueda ser traducido a código Rust de una forma que reproduzca estrechamente la manera en que se escribiría en un entorno Anchor.
Ten en cuenta que este proyecto está en fase beta en este momento.
¿Solana usa Solidity?
Sí, es posible escribir aplicaciones de Solana en Solidity, pero es algo experimental. El compilador solang solidity fue construido para soportar la compilación de Solidity a BPF.
El lenguaje de programación del cliente de Solana
El cliente de Solana en sí, el programa que se ejecuta en los nodos y que impulsa la blockchain, a diferencia de los programas (smart contracts), está escrito en Rust. Actualmente hay una reimplementación en curso del cliente de Solana, firedancer de Jump Crypto, que está escrito completamente en C.
Apéndice: Rust está migrando de BPF a SBF.
A partir de octubre de 2022, Solana comenzó a migrar de BPF a SBF (formato binario de Solana). Al momento de escribir esto, la documentación sobre este cambio es bastante escasa, pero esto no afectará a la mayoría de los desarrolladores. Si tu build tool está configurada para compilar a BPF, recibirás un deprecation warning, pero todo seguirá funcionando. Simplemente cambia tus build flags.
Aprende más con RareSkills
¿Quieres dominar el desarrollo en Ethereum? Mira nuestro Bootcamp de Solidity
Recursos
https://www.kernel.org/doc/html/latest/bpf/instruction-set.html
https://docs.rs/solana_rbpf/latest/solana_rbpf/ebpf/index.html
https://www.youtube.com/watch?v=5jQvuPWpzcE
https://ebpf.io/what-is-ebpf/
https://www.youtube.com/watch?v=Q8eY67hDvkc
Publicado originalmente el 1 de dic. de 2022