Extendiendo el TTL de un contrato desplegado utilizando código
Cuando un contrato inteligente se despliega en la red Stellar, su código WebAssembly (Wasm) tiene un Tiempo de Vida (TTL) que determina cuánto tiempo permanece accesible.
El TTL es el número de ledgers entre el ledger actual y el ledger final al que se puede acceder todavía a los datos del contrato. Si el TTL caduca, el código del contrato se archiva y se vuelve inaccesible. Para prevenir esto, necesitas extender periódicamente el TTL del código Wasm del contrato.
Esta guía te mostrará cómo extender el TTL del código Wasm de un contrato desplegado utilizando JavaScript.
Requisitos previos
- SDK de Stellar:
npm install @stellar/stellar-sdk
- Un endpoint RPC de Stellar (por ejemplo,
https://soroban-testnet.stellar.org
) - Conocimientos básicos del SDK de Stellar
Descripción general del proceso
- Obtener la huella del contrato,
- Set a reasonable resource fee (perhaps start at 10,000 stroops as this is a costly operation),
- Establecer los datos de Soroban como de solo lectura,
- Establecer el TTL del ledger deseado para caducar el contrato,
- Crear una operación
StellarSdk.Operation.extendFootprintTtl
, - Ten en cuenta que se cobra tanto una tarifa de recursos como una tarifa base en esta operación.
Código JavaScript
El código a continuación utiliza entorno Nodejs, pero el mismo concepto también se puede aplicar en el navegador utilizando la billetera Freighter o utilizando cualquier otro SDK de Stellar.
import * as StellarSdk from "@stellar/stellar-sdk";
import { Server } from "@stellar/stellar-sdk/rpc";
async function extendContractWasmTTL(contractId, sourceKeypair) {
const server = new Server("https://soroban-testnet.stellar.org");
// Create a new transaction builder
const account = await server.getAccount(sourceKeypair.publicKey());
const fee = "200100"; // Base fee plus resource fee
// Get the contract instance
const contract = new StellarSdk.Contract(contractId);
const instance = contract.getFootprint();
// Set the Soroban data and create an operation to extend the contract's TTL
const sorobanData = new StellarSdk.SorobanDataBuilder()
.setResourceFee(200_000)
.setReadOnly([instance])
.build();
const transaction = new StellarSdk.TransactionBuilder(account, {
fee,
networkPassphrase: StellarSdk.Networks.TESTNET, // Use appropriate network
})
.setSorobanData(sorobanData)
.addOperation(
StellarSdk.Operation.extendFootprintTtl({
extendTo: 500_000,
}),
)
.setTimeout(30)
.build();
// Sign and submit the transaction
transaction.sign(sourceKeypair);
const result = await server.sendTransaction(transaction);
console.log(
"Transaction submitted. Result:",
JSON.stringify(result, null, 2),
);
return result;
}
// Usage
const contractId = "CC6MWZMG2JPQEENRL7XVICAY5RNMHJ2OORMUHXKRDID6MNGXSSOJZLLF";
const sourceKeypair = StellarSdk.Keypair.fromSecret(
"SXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
);
extendContractWasmTTL(contractId, sourceKeypair)
.then(console.log)
.catch(console.error);
Desglosando el código
Vamos a repasar las partes clave de esta función:
- Configurando los datos de Soroban: El
SorobanDataBuilder()
es donde preparamos la información específica de Soroban para nuestra transacción.
- Establecemos una tarifa de recursos con
setResourceFee(200_000)
. Esto cubre los costos adicionales de almacenamiento y ejecución. - Usamos
setReadOnly([instance])
para decirle a la red qué datos del contrato necesitamos acceder. Estamos usandosetReadOnly()
en lugar desetReadWrite()
porque solo estamos extendiendo el TTL, no cambiando ningún dato.
¿Por qué setReadOnly()
? Algunas razones:
- Es más rápido y utiliza menos recursos
- Es más seguro: no podemos cambiar accidentalmente datos que no deberíamos
- La operación
ExtendFootprintTTLOp
lo requiere
-
Añadiendo la operación: Después de configurar los datos de Soroban, agregamos la operación
extendFootprintTtl
a nuestra transacción. We're telling it to extend the TTL to 500,000 ledgers withextendTo: 500_000
. -
¿Cuál es el punto? Todo este proceso trata de mantener los datos de nuestro contrato vivos en el ledger. Es como renovar un contrato de arrendamiento: le estamos diciendo a la red "¡Oye, mantén estas cosas alrededor por más tiempo, aún las estamos usando!"
Esto es súper importante para los contratos que necesitan permanecer por un tiempo. Sin extender el TTL, los datos del contrato podrían caducar y desaparecer del ledger.
¿Quieres profundizar más? Consulta la documentación sobre la operación de extender el TTL de la huella.
Guías en esta categoría:
📄️ Usar __check_auth de maneras interesantes
Dos guías que explican cómo usar __check_auth
📄️ Hacer llamadas entre contratos
Llamar a un contrato inteligente desde otro contrato inteligente
📄️ Desplegar un contrato a partir de bytecode Wasm instalado usando un contrato desplegador
Desplegar un contrato a partir de bytecode Wasm instalado usando un contrato desplegador
📄️ Desplegar un SAC para un activo Stellar utilizando código
Desplegar un SAC para un activo Stellar utilizando el SDK de Javascript
📄️ Organizar errores de contrato con un tipo de enumeración de errores
Gestionar y comunicar errores de contrato utilizando una estructura de enumeración almacenada como valores de Estado
📄️ Extender el TTL de un contrato desplegado con código
Cómo extender el TTL del código Wasm de un contrato desplegado utilizando el SDK de JavaScript
📄️ Actualizando el bytecode de Wasm para un contrato desplegado
Actualizar el bytecode de Wasm para un contrato desplegado
📄️ Escribir metadatos para tu contrato
Usa el contractmeta! macro en Rust SDK para escribir metadatos en contratos Wasm