Saltar al contenido principal

Seguir pagos recibidos

Este tutorial muestra lo fácil que es usar Horizon para observar los pagos entrantes en una cuenta utilizando JavaScript y EventSource. Evitaremos usar js-stellar-sdk, la biblioteca de ayuda de alto nivel, para mostrar que es posible que realices esta tarea por tu cuenta con cualquier lenguaje de programación que desees usar.

Este tutorial asume que tú:

  • Tienes node.js instalado localmente en tu máquina.
  • Tienes curl instalado localmente en tu máquina.
  • Estás ejecutando en Linux, macOS o cualquier otro sistema que tenga acceso a un shell similar a bash.
  • Estás familiarizado con iniciar y ejecutar comandos en un terminal.

En este tutorial aprenderemos:

  • Cómo crear una nueva cuenta.
  • Cómo financiar tu cuenta usando friendbot.
  • Cómo seguir los pagos a tu cuenta usando curl y EventSource.

Esqueleto del proyecto

Comencemos construyendo el esqueleto de nuestro proyecto:

$ mkdir follow_tutorial
$ cd follow_tutorial
$ npm install --save stellar-base
$ npm install --save eventsource

Esto debería haber creado un package.json en el directorio follow_tutorial. Puedes verificar que todo salió bien ejecutando el siguiente comando:

$ node -e "require('stellar-base')"

Todo fue exitoso si no se generó salida del comando anterior. Ahora escribamos un script para crear una nueva cuenta.

Creando una cuenta

Crea un nuevo archivo llamado make_account.js y pega el siguiente texto en él:

var Keypair = require("stellar-base").Keypair;

var newAccount = Keypair.random();

console.log("New key pair created!");
console.log(" Account ID: " + newAccount.publicKey());
console.log(" Secret: " + newAccount.secret());

Guarda el archivo y ejecútalo:

$ node make_account.js
New key pair created!
Account ID: GB7JFK56QXQ4DVJRNPDBXABNG3IVKIXWWJJRJICHRU22Z5R5PI65GAK3
Secret: SCU36VV2OYTUMDSSU4EIVX4UUHY3XC7N44VL4IJ26IOG6HVNC7DY5UJO
$

Antes de que nuestra cuenta pueda hacer nada, debe ser financiada. ¡De hecho, antes de que una cuenta se financie, no existe realmente!

Financiando tu cuenta

La red de prueba de Stellar proporciona el Friendbot, una herramienta que los desarrolladores pueden usar para obtener testnet lumens para propósitos de prueba. Para financiar tu cuenta, simplemente ejecuta el siguiente comando curl:

$ curl "https://friendbot.stellar.org/?addr=GB7JFK56QXQ4DVJRNPDBXABNG3IVKIXWWJJRJICHRU22Z5R5PI65GAK3"

No olvides reemplazar el ID de cuenta anterior con el tuyo. Si la solicitud tiene éxito, deberías ver una respuesta como:

{
"hash": "ed9e96e136915103f5d8978cbb2036628e811f2c59c4c3d88534444cf504e360",
"result": "received",
"submission_result": "000000000000000a0000000000000001000000000000000000000000"
}

Después de unos segundos, la red Stellar llevará a cabo un consenso, cerrará el ledger y tu cuenta habrá sido creada. A continuación, escribiremos un comando que esté atento a los nuevos pagos a tu cuenta y de salida un mensaje en el terminal.

Siguiendo pagos usando curl

Para seguir los nuevos pagos conectados a tu cuenta, simplemente necesitas enviar el encabezado Accept: text/event-stream al endpoint /payments.

$ curl -H "Accept: text/event-stream" "https://horizon-testnet.stellar.org/accounts/GB7JFK56QXQ4DVJRNPDBXABNG3IVKIXWWJJRJICHRU22Z5R5PI65GAK3/payments"

Como resultado, verás algo como:

retry: 1000
event: open
data: "hello"

id: 713226564145153
data: {"_links":{"effects":{"href":"/operations/713226564145153/effects/{?cursor,limit,order}","templated":true},
"precedes":{"href":"/operations?cursor=713226564145153\u0026order=asc"},
"self":{"href":"/operations/713226564145153"},
"succeeds":{"href":"/operations?cursor=713226564145153\u0026order=desc"},
"transactions":{"href":"/transactions/713226564145152"}},
"account":"GB7JFK56QXQ4DVJRNPDBXABNG3IVKIXWWJJRJICHRU22Z5R5PI65GAK3",
"funder":"GBS43BF24ENNS3KPACUZVKK2VYPOZVBQO2CISGZ777RYGOPYC2FT6S3K",
"id":713226564145153,
"paging_token":"713226564145153",
"starting_balance":"10000",
"type_i":0,
"type":"create_account"}

Cada vez que recibas un nuevo pago, obtendrás una nueva fila de datos. Los pagos no son el único endpoint que admite streaming. También puedes transmitir transacciones /transactions y operaciones /operations.

Siguiendo pagos usando EventStream

Advertencia! El objeto EventSource no se reconecta para ciertos tipos de error, por lo que puede dejar de funcionar. Si necesitas una conexión de streaming fiable, por favor utiliza nuestro SDK.

Otra forma de seguir pagos es escribiendo un simple script de JS que transmitirá pagos e imprimirlos en la consola. Crea un archivo stream_payments.js y pega el siguiente código en él:

var EventSource = require("eventsource");
var es = new EventSource(
"https://horizon-testnet.stellar.org/accounts/GB7JFK56QXQ4DVJRNPDBXABNG3IVKIXWWJJRJICHRU22Z5R5PI65GAK3/payments",
);
es.onmessage = function (message) {
var result = message.data ? JSON.parse(message.data) : message;
console.log("New payment:");
console.log(result);
};
es.onerror = function (error) {
console.log("An error occurred!");
};

Ahora, ejecuta nuestro script: node stream_payments.js. Deberías ver la siguiente salida:

New payment:
{ _links:
{ effects:
{ href: '/operations/713226564145153/effects/{?cursor,limit,order}',
templated: true },
precedes: { href: '/operations?cursor=713226564145153&order=asc' },
self: { href: '/operations/713226564145153' },
succeeds: { href: '/operations?cursor=713226564145153&order=desc' },
transactions: { href: '/transactions/713226564145152' } },
account: 'GB7JFK56QXQ4DVJRNPDBXABNG3IVKIXWWJJRJICHRU22Z5R5PI65GAK3',
funder: 'GBS43BF24ENNS3KPACUZVKK2VYPOZVBQO2CISGZ777RYGOPYC2FT6S3K',
id: 713226564145153,
paging_token: '713226564145153',
starting_balance: '10000',
type_i: 0,
type: 'create_account' }

Probándolo

Ahora sabemos cómo obtener un stream de transacciones a una cuenta. Verifiquemos si nuestra solución realmente funciona y si aparecen nuevos pagos. Observemos mientras enviamos un pago (create_account operation) desde nuestra cuenta a otra cuenta.

Usamos la operación create_account porque estamos enviando un pago a una nueva cuenta no financiada. Si estuviéramos enviando un pago a una cuenta que ya está financiada, usaríamos la operación payment.

Primero, verifiquemos el número de secuencia de nuestra cuenta para que podamos crear una transacción de pago. Para hacerlo, enviamos una solicitud a horizon:

$ curl "https://horizon-testnet.stellar.org/accounts/GB7JFK56QXQ4DVJRNPDBXABNG3IVKIXWWJJRJICHRU22Z5R5PI65GAK3"

El número de secuencia se puede encontrar bajo el campo sequence. Para nuestro ejemplo, el número de secuencia actual es 713226564141056. Guarda tu valor en algún lugar.

Ahora, crea el archivo make_payment.js y pega el siguiente código en él, reemplazando el número de secuencia según corresponda:

var StellarBase = require("stellar-base");
var StellarSdk = require("stellar-sdk");

var keypair = StellarBase.Keypair.fromSecret(
"SCU36VV2OYTUMDSSU4EIVX4UUHY3XC7N44VL4IJ26IOG6HVNC7DY5UJO",
);
var account = new StellarBase.Account(keypair.publicKey(), "713226564141056");

var amount = "100";
var transaction = new StellarSdk.TransactionBuilder(account, {
networkPassphrase: StellarBase.Networks.TESTNET,
fee: StellarSdk.BASE_FEE,
})
.addOperation(
StellarBase.Operation.createAccount({
destination: StellarBase.Keypair.random().publicKey(),
startingBalance: amount,
}),
)
.setTimeout(180)
.build();

transaction.sign(keypair);

console.log(transaction.toEnvelope().toXDR().toString("base64"));

Después de ejecutar este script, deberías ver un blob de transacción firmado. Para enviar esta transacción, la enviamos a Horizon o Stellar-Core. Pero antes de hacerlo, abramos una nueva consola y comencemos nuestro script anterior con node stream_payments.js.

Ahora, para enviar una transacción, solo usa Horizon:

curl -H "Content-Type: application/json" -X POST -d '{"tx":"AAAAAgAAAAB+kqu+heHB1TFrxhuALTbRVSL2slMUoEeNNaz2PXo90wAAAGQAAoitAAAAAQAAAAEAAAAAAAAAAAAAAABgJHaDAAAAAAAAAAEAAAAAAAAAAAAAAAByS4gefO1iu/ZfYlr+PMA2AZsHJmSK/4NActJ1Oa1BIgAAAAA7msoAAAAAAAAAAAE9ej3TAAAAQPo1YHJMpdWKatEQxj7DqP1rrR6pA+OjK9q3WcU/sBwvKk6GhpdwA3gkUDrkREU0cFQSNKwugNFkGkR0zFmROgw="}' "https://horizon-testnet.stellar.org/transactions"

Deberías ver un nuevo pago en una ventana que ejecuta el script stream_payments.js.