Saltar al contenido principal

Contratos Inteligentes

nota

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

Un contrato inteligente es un conjunto programado de código ejecutable y estado que se puede al invocar un contrato en la red Stellar.

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.

WebAssembly (Wasm) en Contratos Inteligentes de Stellar

WebAssembly (Wasm) es un formato de instrucción binaria ligero y portátil, diseñado para una ejecución de alto rendimiento en diversos entornos, incluyendo blockchains, navegadores web y servicios en la nube. En Stellar, Wasm sirve como la base para los contratos inteligentes al permitir un entorno de ejecución seguro y eficiente.

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.

Ejecución y Aislamiento de Máquina Virtual (VM)

Cuando una transacción de Stellar llama a una función de contrato, la red recupera el bytecode Wasm correspondiente del ledger. Para garantizar una ejecución segura, Stellar instancia una máquina virtual (VM) de tiempo de ejecución aislada específicamente para esa transacción. Este enfoque ofrece varios beneficios, incluyendo seguridad (ya que la VM opera en un entorno aislado) y ejecución determinista.

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.

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.).