Artículo del Blog

Cómo Stellar.org se Recupera de un Reinicio de Testnet

Autor

Carl Vitullo

Fecha de publicación

Red de Pruebas

El nuevo stellar.org tiene una sección en la página de inicio con ejemplos de código ejecutable que demuestran características de la red. Puedes crear una nueva cuenta, enviar un pago, emitir un activo o incluso crear una oferta en el intercambio descentralizado. Algunas de estas, como crear una cuenta, se pueden hacer completamente desde el navegador, pero algunas requieren ciertos prerrequisitos de la testnet.

Nuestro destino de pago y el script de oferta de compra requieren que las cuentas existan antes de ejecutar el script. La testnet se reinicia cada 3 meses, aunque (puedes encontrar el calendario de reinicio aquí), y configurar un recordatorio trimestral para crear manualmente las cuentas no parecía divertido. En su lugar, configuramos un script.

El script en sí es bastante sencillo. Verifica si existe una cuenta conocida, y si no, envía un puñado de transacciones.


fetch(`https://horizon-testnet.stellar.org/accounts/${paymentAddress}`)
 .then((res) => {
 // Si la cuenta no existe, créala.
 if (res.status === 404) {
 return fetch(`https://friendbot.stellar.org?addr=${paymentAddress}`);
 }
 return Promise.reject("Payment account exists");
 })
 .catch(console.error);

¡Eso es todo! Debido a que crear paymentAddress es parte de este script de reinicio, sabemos que si no existe en la testnet, debe haber habido un reinicio. El resto del script es un poco más verboso, pero sigue el mismo patrón: si nuestra cuenta conocida recibe un 404, envía transacciones para que la testnet tenga todo lo que necesitamos.

Sé amable con friendbot

Una de nuestras preocupaciones al escribir estos ejemplos era la rapidez con la que tenían el potencial de agotar los fondos de Friendbot. La mayoría de estos scripts financian al menos 1 cuenta con 10,000 XLM, y aunque la testnet no está limitada, sí causa algunos problemas a corto plazo si Friendbot se queda sin Lumens. Si alguien decidiera ejecutar el ejemplo de pago una docena de veces, eso sería un montón de lumens de testnet siendo quemados.

Para minimizar las probabilidades de que eso suceda, agregamos una pequeña función para fusionar automáticamente las cuentas que creamos de nuevo en friendbot. Los ojos agudos notarán varias llamadas a recoupLumens() a lo largo de los ejemplos, cuya definición se oculta para mantener los ejemplos cortos. La definición de esa función está abajo.


const recoupLumens = async (secret) => {
 const StellarSdk = require("stellar-sdk");
 const server = new StellarSdk.Server("https://horizon-testnet.stellar.org");

 const keypair = StellarSdk.Keypair.fromSecret(secret);
 const [{ p90_accepted_fee: fee }, account] = await Promise.all([
 server.feeStats(),
 server.loadAccount(keypair.publicKey()),
 ]);
 const tx = new StellarSdk.TransactionBuilder(account, {
 fee,
 networkPassphrase: StellarSdk.Networks.TESTNET
 }).addOperation(
 StellarSdk.Operation.accountMerge({
 destination: "GAIH3ULLFQ4DGSECF2AR555KZ4KNDGEKN4AFI4SU2M7B43MGK3QJZNSR",
 }),
 )
 .setTimeout(100)
 .build();
 tx.sign(keypair);
 await server.submitTransaction(tx).catch(() => {});
};

Esto nos permite crear cuentas libremente sin preocuparnos por impactar la testnet. Entre esta función de recuperación y nuestro script de reinicio ejecutado periódicamente, ¡ahora hemos superado 2 reinicios de testnet sin ninguna interrupción al código de ejemplo en el sitio web!