Saltar al contenido principal

Contratos Inteligentes

Los datos relacionados con los contratos inteligentes Stellar se almacenan en varias entradas del ledger. En resumen:

  • Código del contrato (bytecode Wasm): Se almacena como una entrada CONTRACT_DATA en el ledger, identificada por su hash Wasm.

  • Instancia del contrato: Las instancias del contrato se almacenan en entradas separadas del ledger. La instancia del contrato hace referencia al bytecode Wasm, pero tiene sus propios datos, estado y configuración.

  • Almacenamiento de datos: Datos vinculados a las instancias del contrato. Existen tres tipos: Temporal, Persistente e Instancia, cada uno con su propio costo, TTL (tiempo de vida) y reglas de restauración.

WebAssembly (Wasm)

Una vez que un desarrollador haya escrito un contrato inteligente y lo haya compilado en un archivo ejecutable Wasm, se puede cargar en la red Stellar. Una entrada de ledger CONTRACT_DATA es creada para almacenar estos datos binarios y su identificador único es el hash del archivo ejecutable. This binary executable is stored independently from its deployed contract(s). Cuando una transacción de Stellar intenta invocar una función de contrato, el bytecode de Wasm se recupera primero del ledger y se instancia una máquina virtual de tiempo de ejecución segura y aislada ("VM") para que pueda ejecutar el bytecode del contrato y luego salir.

Compilación y Carga de Wasm

Una vez que un desarrollador escribe un contrato inteligente en un lenguaje admitido, como Rust, el contrato se compila en un archivo ejecutable Wasm. Este archivo contiene bytecode de bajo nivel que puede ser ejecutado de manera eficiente dentro de un entorno aislado. Después de la compilación, el ejecutable Wasm se carga en la red Stellar, donde se almacena como una entrada de CONTRACT_DATA en el ledger. El identificador único para esta entrada se deriva del hash del binario compilado y se llama hash de Wasm.

Para recuperar el archivo ejecutable Wasm de la red Stellar para cargar en tu red local, es posible hacerlo utilizando getLedgerEntries del RPC, o usar Explorador de Contratos de Stellar Lab.

Funciones Wasm y Host

Los contratos inteligentes basados en Wasm de Stellar interactúan con el protocolo a través de funciones de host: operaciones predefinidas que permiten a los contratos leer y escribir en el ledger. Estas funciones de host abstraen las interacciones de bajo nivel con la blockchain, proporcionando a los desarrolladores una interfaz simplificada pero poderosa para construir aplicaciones descentralizadas. Para saber más sobre las funciones y entornos host, lee Conceptos del Entorno.

Instancias de contrato

información

Importante, el bytecode Wasm en sí mismo se almacena por separado de las instancias de contrato desplegadas. Esta separación permite que múltiples instancias de contrato hagan referencia al mismo ejecutable Wasm mientras mantienen su propio estado y configuraciones.

Después de que el bytecode ejecutable se carga en on-chain, se pueden desplegar instancias de contrato que hagan referencia al bytecode mencionado anteriormente. Un ejecutable de contrato inteligente puede tener una relación de uno a muchos con "instancias de contrato" que funcionan de manera independiente. Esto significa que el mismo código ejecutable puede ser utilizado por múltiples instancias de contrato que se comportan de manera idéntica (debido al código ejecutable compartido), mientras mantienen datos de estado separados y distintos (porque los datos están vinculados a la instancia del contrato). Una instancia de contrato se almacena como su propia entrada de ledger, y cualquier almacenamiento de instancia del contrato se almacena en esa misma entrada de ledger junto a la instancia del contrato.

Almacenamiento de contrato

Además de las entradas del ledger que se crean durante el proceso de carga/despliegue del contrato, cada contrato puede crear y acceder a su propio conjunto de entradas del ledger. Estas entradas de ledger (así como el código del contrato y las entradas de ledger de la instancia del contrato) están sujetas a las vidas útiles de archivaje de estado (el "TTL ledger" de una entrada de ledger). Aunque todas funcionan de manera similar, cada tipo tiene su propio comportamiento de tarifas y TTL.

Almacenamiento temporal

  • Tarifas más baratas.
  • Eliminado permanentemente cuando se alcanza su TTL ledger, no se puede restaurar.
  • Suitable for time-bounded data (i.e. price oracles, signatures, etc.) y datos fácilmente recreables.
  • Cantidad ilimitada de almacenamiento.

Almacenamiento persistente

  • Tarifas más caras (mismo precio que el almacenamiento Instance).
  • Recuperable después de archivado, puede ser restaurado usando la operación RestoreFootprintOp.
  • No comparte la misma vida útil que la instancia del contrato. Si la instancia del contrato no ha alcanzado su TTL ledger, los datos Persistent aún pueden ser archivados y necesitar ser restaurados antes de invocar el contrato.
  • Cantidad ilimitada de almacenamiento.
  • Adecuado para datos de usuario que no pueden ser Temporary (es decir, saldos).

Almacenamiento de instancia

información

Mientras hacemos una distinción aquí entre almacenamiento "persistente" y "de instancia", el almacenamiento de instancia es realmente solo un tipo conveniente y abstracto de almacenamiento persistente. Bajo el capó, el almacenamiento de instancia funciona igual que el almacenamiento persistente, excepto que su propio TTL está vinculado al de la instancia del contrato.

  • Tarifas más caras (mismo precio que el almacenamiento Persistent).
  • Recuperable después de archivado, puede ser restaurado usando la operación extendFootprintTTLOp.
  • Comparte la misma vida útil que la instancia del contrato. Si la instancia del contrato no ha alcanzado su TTL ledger, los datos de instancia están garantizados que serán accesibles.
  • Cantidad limitada de almacenamiento disponible.
  • Adecuado para el estado del contrato "compartido" que no puede ser Temporary (es decir, cuentas administrativas, metadatos del contrato, etc.).
nota

Aprende a escribir un contrato inteligente en Stellar siguiendo esta guía de Comenzar.