Restaurar un contrato utilizando el SDK de JavaScript
Como puedes imaginar, si tu instancia de contrato desplegada o el código que la respalda está archivado, no se puede cargar para ejecutar tus invocaciones. Recuerda, hay una relación distinta de uno a muchos en la cadena entre el código de un contrato y las instancias desplegadas de ese contrato:
Necesitamos ambos que estén en vivo para que nuestras llamadas al contrato funcionen.
Trabajemos en cómo se pueden recuperar. El proceso de recuperación es ligeramente diferente por una razón conveniente: no necesitamos simulación para averiguar las huellas. En su lugar, podemos aprovechar Contract.getFootprint()
, que prepara una huella con las claves del ledger utilizadas por una instancia de contrato dada (incluido su código WASM de respaldo).
Desafortunadamente, aún necesitamos simulación para averiguar las tarifas para nuestra restauración. Esto, sin embargo, puede ser fácilmente cubierto por el helper Server.prepareTransaction()
del SDK, que hará simulación y ensamblaje por nosotros.
Esta guía hace uso de la función (bien nombrada) submitTx
que creamos en otra guía.
import {
BASE_FEE,
Contract,
Keypair,
Networks,
TransactionBuilder,
SorobanDataBuilder,
Operation
} from "@stellar/stellar-sdk";
import { Server, Api } from "@stellar/stellar-sdk/rpc";
const server = new Server("https://soroban-testnet.stellar.org");
async function restoreContract(
signer: Keypair,
c: Contract,
): Promise<Api.GetTransactionResponse> {
const instance = c.getFootprint();
const account = await server.getAccount(signer.publicKey());
const wasmEntry = await server.getLedgerEntries(
getWasmLedgerKey(instance)
);
const restoreTx = new TransactionBuilder(account, { fee: BASE_FEE })
.setNetworkPassphrase(Networks.TESTNET)
.setSorobanData(
// Set the restoration footprint (remember, it should be in the
// read-write part!)
new SorobanDataBuilder().setReadWrite([
instance,
wasmEntry
]).build(),
)
.addOperation(Operation.restoreFootprint({}))
.build();
const preppedTx = await server.prepareTransaction(restoreTx);
preppedTx.sign(signer);
return submitTx(preppedTx);
}
function getWasmLedgerKey(entry: xdr.ContractDataEntry): {
return xdr.LedgerKey.contractCode(
new xdr.LedgerKeyContractCode({
hash: entry.val().instance().wasmHash()
})
);
}
Guías en esta categoría:
📄️ Crear manualmente una huella de restauración para restaurar datos archivados usando el SDK de JavaScript
Configurar manualmente una huella de restauración con el SDK de JavaScript
📄️ Restaurar un contrato utilizando el SDK de JavaScript
Restaurar una instancia de contrato archivada o el código del contrato utilizando el SDK de JavaScript
📄️ Restaurar datos de contrato archivados utilizando el SDK de JavaScript
Restaurar datos de contrato persistentes archivados utilizando el SDK de JavaScript
📄️ Probar la lógica de extensión de TTL en contratos inteligentes
Probar contratos que extienden el tiempo de vida (TTL) de los datos del contrato