Saltar al contenido principal

Desarrollar tu propio SDK de contrato

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
  • Opción 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.

Para ver el Meta del Entorno, considera usar el Explorador de Contratos de Stellar Lab, o el comando de Stellar CLI stellar contract info env-meta --contract-id <contract-id>.

Generación de Meta del Contrato

Los contratos pueden incluir opcionalmente una sección Wasm personalizada llamada contractmetav0, que contiene un SCMetaEntry serializado. Esta sección no es utilizada por la red en sí, pero permite a los contratos incorporar metadatos arbitrarios, incluyendo el nombre del contrato, versión, autor, interfaces admitidas, repositorio de origen o dominio principal. Las aplicaciones y herramientas pueden leer estos metadatos para proporcionar experiencias de desarrollador más ricas, mejor indexación, o un descubrimiento de contratos mejorado.

Para agregar metadatos al Meta del Contrato, utiliza el comando de Stellar CLI stellar contract build --meta <meta>.

Para ver el Meta del Contrato, utiliza el Explorador de Contratos de Stellar Lab, o el comando de Stellar CLI stellar contract info meta --contract-id <contract-id>.

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.

Para ver el Meta del Contrato, utiliza el Explorador de Contratos de Stellar Lab, o el comando de Stellar CLI stellar contract info interface --contract-id <contract-id>.

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.