Saltar al contenido principal

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:

  1. 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 usando setReadOnly() en lugar de setReadWrite() 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
  1. 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 with extendTo: 500_000.

  2. ¿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.