Obtener el identificador de activos detr谩s de un espacio de nombres con recibos

Obtenga la resoluci贸n para un alias y una transacci贸n determinados mediante recibos.

Obtener la resoluci贸n para un alias y una transacci贸n utilizando los recibos.

Casos de uso

Los Bitxor pueden vincular nombres de espacio registrados a otras cuentas o tokens mediante la publicaci贸n de una transacci贸n de TokenAliasTransaction. Esta funci贸n te permite reemplazar identificadores largos y complejos con nombres cortos y familiares para tus cuentas y tokens.

Imagina un vendedor de boletos que env铆a boletos a sus clientes en la cadena p煤blica de Bitxor. La empresa necesita enviar 1 0dc67fbe1cad29e3 a SCVG35-ZSPMYP-L2POZQ-JGSVEG-RYOJ3V-BNIU3U-N2E6. Con los alias, el vendedor de boletos puede definir la misma transacci贸n como enviar 1 ticketsales.event1.ticket a @alice en su lugar.

../../_images/namespace-tickets.png

Tokens y direcciones reconocibles

Para asegurarse de que las transacciones se env铆en al lugar correcto con el token correcto, puedes consultar directamente a la red sobre el identificador de token actual detr谩s de un nombre de espacio ejecutando el siguiente fragmento de c贸digo:

// replace with namespace name
const namespaceId = new NamespaceId('bitxor');

// replace with node endpoint
const nodeUrl = 'NODE_URL';
const repositoryFactory = new RepositoryFactoryHttp(nodeUrl);
const namespaceHttp = repositoryFactory.createNamespaceRepository();

namespaceHttp.getLinkedTokenId(namespaceId).subscribe(
  (tokenId) => console.log(tokenId!.toHex()),
  (err) => console.log(err),
);
// replace with namespace name
const namespaceId = new bitxor_sdk_1.NamespaceId('bitxor');
// replace with node endpoint
const nodeUrl = 'NODE_URL';
const repositoryFactory = new bitxor_sdk_1.RepositoryFactoryHttp(nodeUrl);
const namespaceHttp = repositoryFactory.createNamespaceRepository();
namespaceHttp.getLinkedTokenId(namespaceId).subscribe(
    (tokenId) => console.log(tokenId.toHex()),
    (err) => console.log(err),
);
        // replace with node endpoint
        try (final RepositoryFactory repositoryFactory = new RepositoryFactoryVertxImpl(
                "NODE_URL")) {
            final NamespaceRepository namespaceRepository = repositoryFactory.createNamespaceRepository();
            final NamespaceId namespaceId = NamespaceId.createFromName("bitxor");
            final TokenId tokenId = namespaceRepository.getLinkedTokenId(namespaceId)
                    .toFuture().get();
            System.out.print(tokenId.getIdAsHex());
        }

Sin embargo, el mismo m茅todo no se puede utilizar para verificar transacciones del pasado. Esto se debe a los siguientes hechos:

  • Las transacciones que utilizan tokens o cuentas con alias se almacenan en la cadena de bloques utilizando el identificador del espacio de nombres, no la direcci贸n real o el ID del token detr谩s de 茅l.

  • Los v铆nculos son editables. El creador del espacio de nombres puede vincular su espacio de nombres a otro activo.

  • Los espacios de nombres caducan. El v铆nculo del espacio de nombres podr铆a ser eliminado.

En este punto, es posible que te preguntes: 驴c贸mo podemos obtener entonces la relaci贸n precisa entre un espacio de nombres y su identificador real para una transacci贸n pasada? La respuesta est谩 en los recibos. Para cada bloque, los nodos de Bitxor almacenan recibos que contienen cada cambio de estado invisible que no se puede recuperar directamente de la transacci贸n o el encabezado del bloque.

Prerrequisitos

  • Completa la secci贸n de introducci贸n.

  • Crea una nueva cuenta.

  • Carga la cuenta con suficiente bitxor para pagar las tarifas de transacci贸n.

Adentr谩ndonos en el c贸digo

En este ejemplo, vamos a anunciar una TransferTransaction utilizando bitxor en lugar del ID de token de la moneda nativa. Una vez que la red confirme la transacci贸n, obtendremos la altura del bloque donde se ha registrado la transacci贸n. Con esta informaci贸n, luego obtendremos la relaci贸n entre el espacio de nombres y el token mirando los recibos del bloque.

  1. Define el token que deseas enviar. Utiliza un identificador de espacio de nombres vinculado (por ejemplo, bitxor) en lugar del identificador del token.

const aliasedToken = new Token(
  new NamespaceId('bitxor'),
  UInt64.fromUint(1000000),
);
const aliasedToken = new bitxor_sdk_1.Token(
    new bitxor_sdk_1.NamespaceId('bitxor'),
    bitxor_sdk_1.UInt64.fromUint(1000000),
);
  1. Adjunta el token a una TransferTransaction.

// replace with network type
const networkType = NetworkType.TEST_NET;
const transferTransaction = TransferTransaction.create(
  Deadline.create(epochAdjustment),
  Address.createFromRawAddress('BXRBDE-NCLKEB-ILBPWP-3JPB2X-NY64OE-7PYHHE-32I'),
  [aliasedToken],
  PlainMessage.create('Test aliased token'),
  networkType,
  UInt64.fromUint(2000000),
);

// replace with sender private key
const privateKey =
  '1111111111111111111111111111111111111111111111111111111111111111';
const account = Account.createFromPrivateKey(privateKey, networkType);
// replace with meta.networkGenerationHash (nodeUrl + '/node/info')
const networkGenerationHash =
  '1DFB2FAA9E7F054168B0C5FCB84F4DEB62CC2B4D317D861F3168D161F54EA78B';
const signedTransaction = account.sign(
  transferTransaction,
  networkGenerationHash,
);
console.log(signedTransaction.hash);
// replace with network type
const networkType = bitxor_sdk_1.NetworkType.TEST_NET;
const transferTransaction = bitxor_sdk_1.TransferTransaction.create(
    bitxor_sdk_1.Deadline.create(epochAdjustment),
    bitxor_sdk_1.Address.createFromRawAddress(
        'BXRBDE-NCLKEB-ILBPWP-3JPB2X-NY64OE-7PYHHE-32I',
    ), [aliasedToken],
    bitxor_sdk_1.PlainMessage.create('Test aliased token'),
    networkType,
    bitxor_sdk_1.UInt64.fromUint(2000000),
);
// replace with sender private key
const privateKey =
    '1111111111111111111111111111111111111111111111111111111111111111';
const account = bitxor_sdk_1.Account.createFromPrivateKey(
    privateKey,
    networkType,
);
// replace with meta.networkGenerationHash (nodeUrl + '/node/info')
const networkGenerationHash =
    '1DFB2FAA9E7F054168B0C5FCB84F4DEB62CC2B4D317D861F3168D161F54EA78B';
const signedTransaction = account.sign(
    transferTransaction,
    networkGenerationHash,
);
console.log(signedTransaction.hash);
  1. Anuncia la TransferTransaction. Una vez confirmada la transacci贸n, recupera los recibos adjuntos al bloque y busca la resoluci贸n del espacio de nombres.

// replace with node endpoint
const nodeUrl = 'NODE_URL';
const repositoryFactory = new RepositoryFactoryHttp(nodeUrl);
const receiptHttp = repositoryFactory.createReceiptRepository();
const transactionHttp = repositoryFactory.createTransactionRepository();
const listener = repositoryFactory.createListener();
const transactionService = new TransactionService(transactionHttp, receiptHttp);

listener.open().then(() => {
  transactionService
    .announce(signedTransaction, listener)
    .pipe(
      mergeMap((transaction) =>
        transactionService.resolveAliases([transaction.transactionInfo!.hash!]),
      ),
      map((transactions) => transactions[0] as TransferTransaction),
    )
    .subscribe(
      (transaction) => {
        console.log('Resolved TokenId: ', transaction.tokens[0].id.toHex());
        listener.close();
      },
      (err) => console.log(err),
    );
});
// replace with node endpoint
const nodeUrl = 'NODE_URL';
const repositoryFactory = new bitxor_sdk_1.RepositoryFactoryHttp(nodeUrl);
const receiptHttp = repositoryFactory.createReceiptRepository();
const transactionHttp = repositoryFactory.createTransactionRepository();
const listener = repositoryFactory.createListener();
const transactionService = new bitxor_sdk_1.TransactionService(
    transactionHttp,
    receiptHttp,
);
listener.open().then(() => {
    transactionService
        .announce(signedTransaction, listener)
        .pipe(
            operators_1.mergeMap((transaction) =>
                transactionService.resolveAliases([transaction.transactionInfo.hash]),
            ),
            operators_1.map((transactions) => transactions[0]),
        )
        .subscribe(
            (transaction) => {
                console.log('Resolved TokenId: ', transaction.tokens[0].id.toHex());
                listener.close();
            },
            (err) => console.log(err),
        );
});

驴Qu茅 sigue?

Los recibos no solo almacenan resoluciones para alias, sino tambi茅n todos los cambios de estado invisibles que no se pueden recuperar directamente de las transacciones o del encabezado del bloque. Puede consultar bajo el documentaci贸n de recibos la lista completa de cambios registrados.