Registra tu Wallet y Crea Transacciones con el SDK de TypeScript
En la sección anterior, creaste y guardaste un wallet en disco (.ukey).
En esta sección, aprenderás a:
- Cargar ese wallet desde un archivo
.ukey. - Abrir una sesión de transacción contra un node de ULedger.
- Usar esa sesión para:
- registrar el wallet en la cadena (
CREATE_WALLET), - y luego enviar transacciones
DATAusando el mismo wallet.
- registrar el wallet en la cadena (
Conceptualmente:
- Registrar wallet = crear tu identidad en la cadena (
CREATE_WALLET). - Transacciones de datos = escribir datos en la cadena (
DATA).
1. Requisitos previos
Antes de comenzar, deberías tener:
- Un node de ULedger en ejecución (o acceso a nodes de desarrollo).
- Un archivo wallet creado en la guía anterior (p. ej.
./wallets/my_wallet.ukey). - Un archivo de configuración con los endpoints de los nodes.
Ejemplo de config.json:
{
"nodeEndpoints": [
"https://tn-w-1.uledger.net/",
"https://my.node2.uledger.io",
"https://my.node3.uledger.io"
],
"verbose": true
}
2. Cargar configuración y wallet
import fs from "node:fs";
import { getULedgerSDK } from "@uledgerinc/typescript-sdk";
type Config = {
nodeEndpoints: string[];
verbose?: boolean;
};
function loadConfig(path: string): Config {
const raw = fs.readFileSync(path, "utf8");
const cfg = JSON.parse(raw) as Config;
if (!cfg.nodeEndpoints?.length) {
throw new Error("config must contain at least one node endpoint");
}
return cfg;
}
async function loadWalletFromFile(walletPath: string, password = "") {
const sdk = await getULedgerSDK();
const raw = fs.readFileSync(walletPath, "utf8");
const wallet = sdk.walletFromJson(raw, password);
return { sdk, wallet };
}
3. Crear una sesión de transacción
Un TransactionSession se conecta a un endpoint de node, obtiene información de salud/cadena y almacena el ID del node como el suggestor.
Usa el helper del SDK:
sdk.createSession(nodeEndpoint, wallet)
function pickRandom<T>(items: T[]): T {
return items[Math.floor(Math.random() * items.length)];
}
async function newRandomSession(params: {
sdk: any;
nodeEndpoints: string[];
wallet: any;
}) {
const { sdk, nodeEndpoints, wallet } = params;
const nodeEndpoint = pickRandom(nodeEndpoints);
const session = await sdk.createSession(nodeEndpoint, wallet);
console.log("Using node:", session.getNodeEndpoint());
console.log("Suggestor (nodeId):", session.getSuggestor());
return session;
}
4. Registrar tu wallet (registerWallet)
Antes de que un wallet pueda participar en las reglas de la cadena, generalmente debe ser creado en ella.
La sesión expone un helper de alto nivel:
session.registerWallet(blockchainId, walletToRegister?, customAuthGroups?)
Si omites walletToRegister, registra el wallet de la sesión (auto-registro).
import { DEFAULT_ADMIN_AUTH_GROUP } from "@uledgerinc/typescript-sdk";
async function registerWallet(params: {
session: any;
blockchainId: string;
}) {
const { session, blockchainId } = params;
const tx = await session.registerWallet(
blockchainId,
undefined, // omit to self-register the session wallet
DEFAULT_ADMIN_AUTH_GROUP, // optional: defaults to admin full permissions
);
console.log("CREATE_WALLET txId:", tx.transactionId);
console.log("status:", tx.status);
console.log("output:", tx.output);
return tx;
}
5. Enviar transacciones DATA (submitData)
Una vez que el wallet está registrado, puedes enviar transacciones de datos.
Usa:
session.submitData({ blockchainId, to, data })
data puede ser una cadena de texto o un objeto.
async function sendDataTransaction(params: {
session: any;
blockchainId: string;
to: string;
data: string | object;
}) {
const { session, blockchainId, to, data } = params;
const tx = await session.submitData({
blockchainId,
to,
data,
});
console.log("DATA txId:", tx.transactionId);
console.log("status:", tx.status);
console.log("output:", tx.output);
console.log("payloadRoot:", tx.payloadRoot);
return tx;
}
6. Todo junto
Este programa:
- Carga la configuración y el wallet.
- Crea una sesión.
- Registra el wallet (
CREATE_WALLET). - Envía algunas transacciones
DATA.
import fs from "node:fs";
import { getULedgerSDK } from "@uledgerinc/typescript-sdk";
function pickRandom<T>(items: T[]): T {
return items[Math.floor(Math.random() * items.length)];
}
async function main() {
const configPath = "config.json";
const walletPath = "./wallets/my_wallet.ukey";
const password = "";
const blockchainId = "your-blockchain-id-here";
const txCount = 3;
const cfg = JSON.parse(fs.readFileSync(configPath, "utf8")) as {
nodeEndpoints: string[];
};
if (!cfg.nodeEndpoints?.length) throw new Error("Missing nodeEndpoints in config.json");
const sdk = await getULedgerSDK();
const walletJson = fs.readFileSync(walletPath, "utf8");
const wallet = sdk.walletFromJson(walletJson, password);
const nodeEndpoint = pickRandom(cfg.nodeEndpoints);
const session = await sdk.createSession(nodeEndpoint, wallet);
console.log("Using node:", session.getNodeEndpoint());
console.log("Suggestor (nodeId):", session.getSuggestor());
// 1) Register wallet (one-time per wallet/chain)
const regTx = await session.registerWallet(blockchainId);
console.log("Registered wallet tx:", regTx.transactionId, regTx.status, regTx.output);
// 2) Send DATA transactions
for (let i = 0; i < txCount; i++) {
const tx = await session.submitData({
blockchainId,
to: wallet.address,
data: { message: `hello from ${wallet.address}`, index: i + 1 },
});
console.log("DATA tx:", tx.transactionId, tx.status, tx.output, tx.payloadRoot);
}
}
main().catch(console.error);
Notas
registerWallet(...)crea una transacciónCREATE_WALLETinternamente.submitData(...)envía una transacciónDATAy serializa los objetos automáticamente.