Echand un vistazo al interior del nodo del Protocolo Amadeus
Hace poco me encontré con un interesante repositorio de nodos del equipo de amadeusprotocol. El proyecto se posiciona como un nodo de blockchain de investigación, e inmediatamente destaca por su mezcla de tecnologías. El código principal está vinculado a Rust y al ecosistema BEAM (Erlang/Elixir), mientras que los contratos inteligentes se compilan a WebAssembly directamente desde AssemblyScript.
Aquí no hay herramientas familiares de desarrollo EVM como Hardhat o Foundry. En cambio, los desarrolladores ofrecen gestión directa de red local a través de una consola interactiva de Elixir y ejecución de transacciones sobre una pila UDP optimizada. Analicemos cómo está estructurado esto y cómo configurar un entorno de prueba.
Qué hay dentro del proyecto
Basándose en los scripts de compilación y el código, los autores se centran en dos cosas: alto rendimiento de la capa de red y un modelo simple de ejecución de contratos inteligentes a través de WASM.
Varios detalles interesantes destacan en el repositorio:
- La pila de red está optimizada para tráfico UDP gigabit con configuraciones agresivas de búfer de socket del sistema.
- Los contratos inteligentes se compilan en archivos WASM desde AssemblyScript (un subconjunto de TypeScript), familiar para los desarrolladores web.
- El REPL interactivo integrado permite llamar a métodos de contratos y transferir tokens con una sola línea de código Elixir.
- Los roles de los nodos se dividen en computadores y validadores (entrenadores).
Compilando y ejecutando una testnet local
Necesitarás tener Docker o Podman instalado para compilar. El proyecto se compila en un contenedor aislado con entorno Erlang y Rust:
podman build --tag erlang_builder -f build.Dockerfile
./build.sh
Después de compilar, obtienes un binario ejecutable amadeusd. Para probarlo localmente, los autores sugieren levantar un endpoint local y apuntarlo al host del sistema:
# Прописываем локальный домен в /etc/hosts
echo "127.0.0.1 nodes.amadeus.bot" | sudo tee -a /etc/hosts
# Разрешаем привязку к непривилегированным портам
sudo sysctl -w net.ipv4.ip_unprivileged_port_start=80
# Запускаем локальный узел
TESTNET=true WORKFOLDER=/tmp/testnet HTTP_IPV4=127.0.0.1 HTTP_PORT=80 ./amadeusd
Trabajando con contratos inteligentes a través de la consola
La parte más interesante es interactuar con el nodo a través del REPL. Al iniciar la testnet, puedes obtener inmediatamente las claves de cuenta integradas trainer y desplegar un contrato de contador de prueba.
Así es como se ve el despliegue y la llamada a métodos de contratos:
# Получаем ключи аккаунта
pk = Application.fetch_env!(:ama, :trainer_pk)
sk = Application.fetch_env!(:ama, :trainer_sk)
# Отправляем перевод токенов AMA
Testnet.call(sk, "Coin", "transfer", [pk, "1", "AMA"])
# Деплоим WASM-байткод счетчика
Testnet.deploy "/home/user/project/node/contract_samples/assemblyscript/counter.wasm"
# Читаем значение и вызываем инкремент
Testnet.call(sk, pk, "get", [])
Testnet.call(sk, pk, "increment", ["2"])
El contrato está escrito en AssemblyScript, compilado a WASM, y entregado al nodo para su ejecución. Esto reduce significativamente la barrera de entrada en comparación con aprender DSLs específicos como Move o incluso Solidity.
Optimizando el sistema para altas cargas de red
En la documentación, los autores prestan mucha atención a la configuración de red de Linux. Para manejar tráfico UDP intensivo, sugieren aumentar los búferes de socket y los límites de descriptores de archivo en /etc/sysctl.conf:
net.core.wmem_max = 268435456
net.core.rmem_default = 212992
net.core.rmem_max = 268435456
net.core.netdev_max_backlog = 300000
net.core.optmem_max = 16777216
net.ipv4.udp_mem = 3060432 4080578 6120864
net.ipv4.conf.all.rp_filter = 1
Para el modo en segundo plano, el nodo se empaqueta como un servicio systemd que lanza el proceso dentro de screen. Esto hace posible conectarse a una sesión activa en cualquier momento a través de screen -rd amadeusd y depurar el estado.
A quién podría resultarle interesante este proyecto
La documentación del proyecto aún es bastante mínima, y el aviso sincero establece que este es un prototipo de investigación experimental. Sin embargo, el código fuente será útil para:
- Desarrolladores de Erlang y Elixir que quieran ver implementaciones de primitivas criptográficas y consenso distribuido en BEAM.
- Aquellos que estudien la integración de runtime WASM en aplicaciones de servidor.
- Ingenieros de sistemas interesados en la optimización de la pila UDP para protocolos de red de alta carga.
El código es abierto, y puedes compilar y explorar una testnet local con tus propios contratos WASM en 10-15 minutos.
Proyectos relacionados