Recuperar una entrada de ledger de código de contrato utilizando el SDK de JavaScript
Cuando despliegas un contrato, primero el código se "instala" (es decir, se sube a la blockchain). Esto crea una LedgerEntry
que contiene el código en bytes Wasm, que se identifica de manera única por su hash (es decir, el hash del código subido en sí). Luego, cuando el contrato está "desplegado," creamos una LedgerEntry
con una referencia al hash de ese código. Por lo tanto, obtener el código del contrato es un proceso de dos pasos:
- Primero, buscamos el contrato en sí, para ver a qué hash de código está haciendo referencia.
- Luego, podemos buscar el código en bytes Wasm sin procesar utilizando ese hash.
import { Contract } from "@stellar/stellar-sdk";
function getLedgerKeyContractCode(contractId) {
const instance = new Contract(contractId).getFootprint();
return instance.toXDR("base64");
}
console.log(
getLedgerKeyContractCode(
"CCPYZFKEAXHHS5VVW5J45TOU7S2EODJ7TZNJIA5LKDVL3PESCES6FNCI",
),
);
// OUTPUT: AAAABgAAAAGfjJVEBc55drW3U87N1Py0Rw0/nlqUA6tQ6r28khEl4gAAABQAAAAB
Luego tomamos nuestra salida de esta función y la usamos como el elemento en el parámetro de array keys
en nuestra llamada al método getLedgerEntries
.
{
"jsonrpc": "2.0",
"id": 8675309,
"method": "getLedgerEntries",
"params": {
"keys": ["AAAABgAAAAGfjJVEBc55drW3U87N1Py0Rw0/nlqUA6tQ6r28khEl4gAAABQAAAAB"]
}
}
Y la respuesta que obtenemos contiene los datos de LedgerEntryData
que pueden ser utilizados para encontrar el hash
que debemos usar para solicitar el código en bytes Wasm. Este hash es el LedgerKey
que ha sido asociado con el código de contrato desplegado.
{
"jsonrpc": "2.0",
"id": 8675309,
"result": {
"entries": [
{
"key": "AAAABgAAAAGfjJVEBc55drW3U87N1Py0Rw0/nlqUA6tQ6r28khEl4gAAABQAAAAB",
"xdr": "AAAABgAAAAAAAAABn4yVRAXOeXa1t1POzdT8tEcNP55alAOrUOq9vJIRJeIAAAAUAAAAAQAAABMAAAAA5DNtbckOGVRsNVb8L7X/lIhAOy2o5G6GkLKXvc7W8foAAAAA",
"lastModifiedLedgerSeq": 261603
}
],
"latestLedger": 262322
}
}
Ahora toma el campo xdr
del objeto result
de la respuesta anterior y crea un LedgerKey
a partir del hash contenido dentro.
import { xdr } from "@stellar/stellar-sdk";
function getLedgerKeyWasmId(contractCodeLedgerEntryData) {
const entry = xdr.LedgerEntryData.fromXDR(
contractCodeLedgerEntryData,
"base64",
);
const wasmHash = entry
.contractData()
.val()
.instance()
.executable()
.wasmHash();
let ledgerKey = xdr.LedgerKey.contractCode(
new xdr.LedgerKeyContractCode({
hash: wasmHash,
}),
);
return ledgerKey.toXDR("base64");
}
console.log(
getLedgerKeyWasmId(
"AAAABgAAAAAAAAABn4yVRAXOeXa1t1POzdT8tEcNP55alAOrUOq9vJIRJeIAAAAUAAAAAQAAABMAAAAA5DNtbckOGVRsNVb8L7X/lIhAOy2o5G6GkLKXvc7W8foAAAAA",
),
);
// OUTPUT: AAAAB+QzbW3JDhlUbDVW/C+1/5SIQDstqORuhpCyl73O1vH6
Ahora, finalmente tenemos un LedgerKey
que corresponde al código en bytes Wasm que ha sido desplegado bajo el ContractId
con el que comenzamos hace tanto tiempo. Este LedgerKey
puede ser utilizado en una solicitud final al punto final Stellar-RPC.
{
"jsonrpc": "2.0",
"id": 8675309,
"method": "getLedgerEntries",
"params": {
"keys": ["AAAAB+QzbW3JDhlUbDVW/C+1/5SIQDstqORuhpCyl73O1vH6"]
}
}
Y la respuesta que obtenemos contiene (aún más) LedgerEntryData
que podemos decodificar y analizar para obtener el código de contrato desplegado y real. Dejaremos ese ejercicio en tus manos. Puedes consultar lo que contiene utilizando la "Ver XDR" página del Stellar Lab.
{
"jsonrpc": "2.0",
"id": 8675309,
"result": {
"entries": [
{
"key": "AAAAB+QzbW3JDhlUbDVW/C+1/5SIQDstqORuhpCyl73O1vH6",
"xdr": "AAAABwAAAADkM21tyQ4ZVGw1Vvwvtf+UiEA7LajkboaQspe9ztbx+gAAAkgAYXNtAQAAAAEVBGACfn4BfmADfn5+AX5gAAF+YAAAAhkEAWwBMAAAAWwBMQAAAWwBXwABAWwBOAAAAwUEAgMDAwUDAQAQBhkDfwFBgIDAAAt/AEGAgMAAC38AQYCAwAALBzUFBm1lbW9yeQIACWluY3JlbWVudAAEAV8ABwpfX2RhdGFfZW5kAwELX19oZWFwX2Jhc2UDAgqnAQSSAQIBfwF+QQAhAAJAAkACQEKOutCvhtQ5QgEQgICAgABCAVINAEKOutCvhtQ5QgEQgYCAgAAiAUL/AYNCBFINASABQiCIpyEACyAAQQFqIgBFDQFCjrrQr4bUOSAArUIghkIEhCIBQgEQgoCAgAAaQoSAgICgBkKEgICAwAwQg4CAgAAaIAEPCwAACxCFgICAAAALCQAQhoCAgAAACwQAAAALAgALAHMOY29udHJhY3RzcGVjdjAAAAAAAAAAQEluY3JlbWVudCBpbmNyZW1lbnRzIGFuIGludGVybmFsIGNvdW50ZXIsIGFuZCByZXR1cm5zIHRoZSB2YWx1ZS4AAAAJaW5jcmVtZW50AAAAAAAAAAAAAAEAAAAEAB4RY29udHJhY3RlbnZtZXRhdjAAAAAAAAAAFAAAAAAAbw5jb250cmFjdG1ldGF2MAAAAAAAAAAFcnN2ZXIAAAAAAAAGMS43Ni4wAAAAAAAAAAAACHJzc2RrdmVyAAAALzIwLjMuMSNiYTA0NWE1N2FmOTcxZmM4M2U0NzU3NDZiNTlhNTAzYjdlZjQxNjQ5AA==",
"lastModifiedLedgerSeq": 368441,
"liveUntilLedgerSeq": 2442040
}
],
"latestLedger": 370940
}
}
Guías en esta categoría:
📄️ Generar parámetros de clave de ledger con una clave de símbolo utilizando el SDK de Python
Generar parámetros de clave de ledger con una clave de símbolo utilizando el SDK de Python
📄️ Recuperar una entrada de ledger de código de contrato utilizando el SDK de JavaScript
Recuperar una entrada de ledger de código de contrato utilizando el SDK de JavaScript
📄️ Recuperar una entrada del libro de contabilidad del código del contrato usando el SDK de Python
Recuperar una entrada del libro de contabilidad del código del contrato usando el SDK de Python