Smart Contracts
Los smart contracts de ULedger son programas WebAssembly (WASM) desplegados on-chain y ejecutados por la ULVM (ULedger Virtual Machine). Se ejecutan en un entorno determinista y aislado (sandbox) y no pueden acceder a estado externo ni realizar E/S más allá de lo que ofrece la interfaz del host.
ULVM: el runtime
La ULVM es un runtime WASM escrito íntegramente en Go y construido sobre wazero. Cada invocación de un contrato se ejecuta en una instancia WASM aislada con:
| Propiedad | Detalle |
|---|---|
| Medición de gas | Cada instrucción WASM consume gas. La ejecución se detiene si se alcanza el límite de gas. |
| Almacenamiento de estado | Los contratos leen/escriben estado clave-valor mediante las llamadas al host ul_storage_get / ul_storage_set. |
| Contexto de la transaction | Los contratos pueden leer la dirección de la billetera que invoca, la altura del bloque y el ID de la transaction. |
| Determinismo | Sin punto flotante, sin E/S externa, sin syscalls no deterministas. |
| Aislamiento | La memoria está aislada por invocación. Los contratos no pueden acceder directamente al estado de otros contratos. |
Ciclo de vida del contrato
| Fase | Transaction | Quién |
|---|---|---|
| Despliegue | DEPLOY_CONTRACT | La billetera propietaria carga el bytecode WASM |
| Invocación | INVOKE_SMART_CONTRACT | Cualquier billetera autorizada llama a una función |
| Modificación | ALTER_CONTRACT | El propietario habilita/deshabilita o actualiza los metadatos |
| Consulta | Lectura de estado de solo lectura vía HTTP | Cualquier cliente, sin necesidad de transaction |
Un contrato desplegado se identifica por su dirección de contrato (el ID de transaction de la transaction DEPLOY_CONTRACT).
Interfaz del host (ABI de la ULVM)
Los contratos interactúan con el estado de ULedger mediante un conjunto de funciones del host importadas del módulo ul:
| Función del host | Propósito |
|---|---|
ul_storage_get(key) | Leer un valor del estado del contrato |
ul_storage_set(key, value) | Escribir un valor en el estado del contrato |
ul_caller() | Obtener la dirección de la billetera que invoca |
ul_block_height() | Obtener la altura actual del bloque |
ul_emit(event, data) | Emitir un evento visible para los suscriptores |
Los contratos exportan un punto de entrada call(function_name_ptr, args_ptr). La ULVM despacha a la función correcta según el nombre.
Estándares de token
La ULVM admite tres estándares de token integrados, implementados como contratos WASM:
| Estándar | Equivalente | Descripción |
|---|---|---|
| Token fungible | ERC-20 | Tokens de suministro fijo o acuñables con transfer/approve/allowance |
| Token no fungible | ERC-721 | IDs de token únicos con seguimiento del propietario |
| Multi-token | ERC-1155 | Operaciones por lotes sobre múltiples tipos de token |
Referencias detalladas
- Smart Contracts (sección Billeteras de los Agentes) - ABI completa de la ULVM, tabla de gas, recorrido del contrato de votación del council
- Smart Contracts y Tokens (Glosario) - implementaciones de los estándares de token
- Guía para escribir smart contracts
- API REST: Smart Contracts