Saltar al contenido principal

Crea tu propio SDK

nota

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.