Crea tu propio SDK
Esto es para crear un SDK para escribir contratos inteligentes.
Soroban actualmente tiene un SDK mantenido por SDF para escribir contratos en Rust, que se puede encontrar aquí. Un SDK mantenido por la comunidad está disponible para escribir contratos en AssemblyScript, que se puede encontrar aquí.
Para crear SDKs para otros idiomas, se deben incluir varias cosas en el SDK para proporcionar a los contratos la base que necesitan para aceptar entradas, decodificarlas, almacenar datos, llamar a otros contratos, etc.
A continuación se muestra una lista de funcionalidades que un SDK de Soroban necesita admitir para esas cosas, así como algunos detalles sobre lo que un SDK puede proporcionar en cuanto a capacidades de prueba.
Funcionalidad
Conversiones de Valor
- Val codificar/decodificar
- [Objeto] codificar/decodificar
- [Símbolo] codificar/decodificar
- Error codificar/decodificar
Funciones Host
Las funciones host definidas en env.json son funciones que se pueden llamar desde el entorno Wasm Guest. Estas necesitan estar disponibles para que los contratos las llamen, de alguna forma, preferiblemente envueltas para que los contratos tengan una interfaz más amigable.
Las funciones host tienen nombres amigables en el archivo anterior, como get_ledger_version
, sin embargo, en el Wasm solo se pueden importar a través de nombres cortos, como x.4
. La letra que precede al punto es el módulo, y el valor después del punto es el nombre de la función. Las asignaciones están disponibles en env.rs.
Tipos de SDK
Todos los tipos en soroban-sdk deberían ser admitidos. Notablemente:
Tipos Definidos por el Usuario
Los contratos deberían poder crear tipos definidos por el usuario, como estructuras, uniones o enumeraciones, y hacer que se transmitan al host para almacenamiento y se transmitan de vuelta para carga.
Los SDK hacen esto al convertir objetos hacia y desde un Val
. En el soroban-sdk esto se refiere a un Val.
Estructuras
Las estructuras con campos nombrados deben ser traducidas a un Mapa
con claves como Símbolos
y los valores como el valor del campo, es decir, Mapa<Symbol, V>
.
Las estructuras con campos no nombrados deben ser traducidas a un Vec
con los valores como los elementos. es decir, Vec<V>
.
Uniones
Las uniones (o enumeraciones en algunos idiomas) con variantes nombradas y valores de unidad o tupla deben ser traducidas a un Vec
con el primer elemento como un Símbolo
del nombre de la variante, y cero o más elementos adicionales representando un valor almacenado con la variante.
Enumeraciones
Las enumeraciones con valores enteros deben ser traducidas a un u32
.
Errores Definidos por el Usuario
Los errores son valores u32
que se traducen a un Error.
Generación de Meta del Entorno
Los contratos deben contener una sección personalizada de Wasm con el nombre contractenvmetav0
y contener un SCEnvMetaEntry
serializado. La versión de la interfaz almacenada dentro debe igualar la versión de las funciones host admitidas.
Generación de Especificaciones de Contrato
Los contratos deben contener una sección personalizada de Wasm con el nombre contractspecv0
y contener un flujo serializado de SCSpecEntry
. Debería haber un SCSpecEntry
para cada función, estructura y unión exportada por el contrato.
Generación de Meta del Contrato
Los contratos pueden contener opcionalmente una sección personalizada de Wasm con el nombre contractmetav0
y contener un SCMetaEntry
serializado. Los contratos pueden almacenar cualquier metadato en las entradas que pueden ser utilizados por aplicaciones y herramientas fuera de la red.
Pruebas
Cualquier SDK de Soroban preferiblemente proporciona un entorno de prueba para ejecutar funciones de contrato en el contexto de un entorno de ejecución de Soroban. El soroban-sdk hace esto al incrustar la biblioteca de Rust del entorno Soroban, soroban-env-host.
El entorno de prueba debería incluir:
- Invocación de funciones de contrato.
- Pruebas de integración entre múltiples contratos.