Saltar al contenido principal

Ciclo de Vida del Contrato

Desarrollo

El desarrollo de contratos puede hacerse en un ordenador local con tan solo 3 componentes necesarios: un IDE, una copia del conjunto de herramientas de Rust y una copia del SDK de Soroban.

El SDK contiene una copia de trabajo completa del entorno de host, así como una versión "simulada" del ledger para el almacenamiento persistente de los datos del contrato. Por lo tanto, es posible (y recomendable) editar, compilar, probar y depurar contratos directamente contra esta copia "local" del host, completamente desconectado y sin siquiera acceder a una test net.

Para hacer el proceso de desarrollo local aún más conveniente y rápido, el contrato que se está desarrollando puede (y debe) compilarse como código nativo y enlazarse directamente al host local, en lugar de compilarse a Wasm y ejecutarse en un sandbox de VM local. Ambas configuraciones son posibles, pero la configuración nativa es la más rápida y proporciona la experiencia más rica de pruebas y depuración.

El host de contrato local proporcionado por el SDK también contiene un servidor web local que sirve el punto final de la API HTTP necesario para que las aplicaciones cliente interactúen con un contrato. Esto puede utilizarse para el desarrollo local de aplicaciones, de nuevo sin necesidad de desplegar contratos en ninguna test net o red activa.

Despliegue

Una vez que un contrato ha sido probado y depurado localmente, puede ser desplegado. Para hacer esto, debe compilarse a código Wasm y luego incluirse por valor en una transacción enviada a la red de despliegue prevista.

El SDK proporciona una utilidad de línea de comandos que invoca al compilador de Rust con las configuraciones correctas para producir un paquete Wasm para el despliegue, pero los desarrolladores también pueden construir esto ellos mismos.

Antes de enviar a la red, los desarrolladores deben inspeccionar el binario Wasm resultante emitido por el compilador de Rust para asegurarse de que contiene solo el código y los datos previstos y es lo más pequeño posible. La utilidad de línea de comandos del SDK contiene comandos de diagnóstico para ayudar con este proceso.

La utilidad de línea de comandos del SDK también puede construir y enviar la transacción que despliega un contrato Wasm en la red. El despliegue requiere credenciales de red suficientes para firmar una transacción que realiza el despliegue y pagar sus tarifas. Los contratos deben desplegarse en test nets y probarse minuciosamente allí antes de ser desplegados en la red activa.

Ejecución

Los contratos desplegados viven en cadena en una entrada de ledger de CONTRACT_DATA. Se ejecutan dentro de un sandbox de VM gestionado por un entorno de host dentro de stellar-core. Cada transacción que conduce a una ejecución de contrato se ejecuta en un entorno de host separado, y cada contrato llamado por tal transacción (ya sea directamente o indirectamente desde otro contrato) se ejecuta en una VM huésped de Wasm separada contenida dentro del entorno de host de la transacción.

La ejecución es iniciada por una función de host llamada "call". La función de host "call" puede invocarse de dos maneras diferentes: ya sea por alguien enviando una transacción a la red que invoque "call" directamente, o indirectamente por algún otro contrato invoque "call".

En cualquier caso, a la función de host "call" se le proporciona el ID de un contrato a invocar, el nombre de una función en el contrato y un vector de valores de argumento a pasar. La función de host "call" luego configura un sandbox de VM para el contrato llamado, carga e instancia su bytecode Wasm e invoca la función nombrada, pasando los argumentos proporcionados.

Cada ejecución de contrato continúa hasta que el contrato o bien se completa con éxito o trapea con una condición de error. Si la ejecución se completa exitosamente, todas las entradas de ledger modificadas durante la ejecución se escribirán de nuevo en el ledger atómicamente. Si la ejecución trapea, todas las entradas de ledger modificadas se descartarán y el contrato no tendrá efecto en el ledger.

Una variedad de condiciones en el entorno huésped o de contrato pueden hacer que un contrato trapea. Si se llama a una función de host con argumentos inválidos, por ejemplo, el host trapea. De manera similar, si el contrato ejecuta un bytecode de Wasm erróneo como una división por cero o acceso a memoria fuera de límites, la VM de Wasm trapea. También, si el contrato utiliza más recursos de los que la transacción que lo encapsula ha pagado, el contrato trapea.

Monitoreo

Los contratos pueden ser monitoreados de dos maneras principales: observando eventos emitidos durante su ejecución y examinando las entradas de ledger escritas por ellos.

TBD: ampliar esta sección.

Actualización de contratos

Consulta la página de Actualización de Contratos para más detalles sobre esto.