Ciclo de vida del contrato
Desarrollo
El desarrollo de contratos puede realizarse en un ordenador local con tan solo 3 componentes necesarios: un IDE, una copia del conjunto de herramientas Rust y una copia del SDK de Soroban.
El SDK contiene una copia funcional completa del entorno host, así como una versión "mock" del ledger para el almacenamiento persistente de datos del contrato. Por lo tanto, es posible (y recomendable) editar, compilar, probar y depurar contratos directamente contra esta copia "local" del host, completamente sin conexión y sin siquiera acceder a una test net.
Para hacer que el proceso de desarrollo local sea aún más conveniente y rápido, el contrato que se está desarrollando puede (y debe) ser compilado como código nativo y vinculado directamente al host local, en lugar de compilarse a Wasm y ejecutarse en una sandbox de VM local. Ambas configuraciones son posibles, pero la configuración nativa es la más rápida y ofrece la experiencia más completa de prueba y depuración.
El host de contrato local provisto por el SDK también contiene un servidor web local que ofrece el endpoint HTTP necesario para que las aplicaciones cliente interactúen con un contrato. Esto puede usarse para el desarrollo local de aplicaciones, nuevamente sin necesidad de desplegar contratos en ninguna red de prueba o red activa.
Despliegue
Una vez que un contrato ha sido probado y depurado localmente, puede desplegarse. Para hacerlo, 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 Rust con la configuración correcta para producir un paquete Wasm para su implementación, pero los desarrolladores también pueden construir esto por sí mismos.
Antes de enviarlo a la red, los desarrolladores deben inspeccionar el binario Wasm resultante emitido por el compilador Rust para asegurarse de que contenga únicamente el código y los datos previstos y que sea lo más pequeño posible. La utilidad de línea de comandos del SDK contiene comandos de diagnóstico para asistir en 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. La implementación requiere credenciales suficientes en la red para firmar una transacción que realice la implementación y pague sus tarifas. Los contratos deben implementarse en redes de prueba y probarse exhaustivamente allí antes de ser implementados en la red activa.
Ejecución
Los contratos implementados viven en cadena dentro de una entrada del ledger CONTRACT_DATA. Se ejecutan dentro de una sandbox de VM gestionada por un entorno host dentro de stellar-core. Cada transacción que conduce a la ejecución de un contrato se ejecuta en un entorno host separado, y cada contrato llamado por dicha transacción (ya sea directamente o indirectamente desde otro contrato) se ejecuta en una VM Wasm invitada separada contenida dentro del entorno host de la transacción.
La ejecución se inicia mediante una función host llamada "call". La función host "call" puede ser invocada de dos maneras diferentes: bien por alguien que envía una transacción a la red que invoca "call" directamente, o indirectamente por otro contrato que invoca "call".
En cualquiera de los dos casos, a la función host "call" se le proporciona el ID de un contrato para invocar, el nombre de una función dentro del contrato, y un vector de valores para pasar como argumentos. Luego, la función host "call" configura una sandbox de VM para el contrato invocado, 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 se completa con éxito o genera un error (trap). Si la ejecución termina con éxito, todas las entradas del ledger modificadas durante la ejecución se escribirán de nuevo en el ledger atómicamente. Si la ejecución genera un error (trap), todas las entradas modificadas del ledger serán descartadas y el contrato no tendrá efecto en el ledger.
Diversas condiciones en los entornos host o invitado pueden provocar que un contrato genere un error (trap). Por ejemplo, si se llama a una función host con argumentos inválidos, el host generará un error (trap). Del mismo modo, si el contrato ejecuta un bytecode Wasm erróneo como una división por cero o acceso a memoria fuera de límites, la VM Wasm generará un error (trap). Además, si el contrato utiliza más recursos de los que ha pagado su transacción contenedora, el contrato generará un error (trap).
Monitoreo
Los contratos pueden ser monitoreados de dos maneras principales: observando los eventos emitidos durante su ejecución y examinando las entradas del ledger que escriben.
Pendiente: ampliar esta sección.
Actualizar contratos
Consulta la página de actualización de contratos para más detalles al respecto.