Agregar datos personalizados a una cuenta.
Bob trabaja como notario digital que sella cuentas en la cadena de bloques pública de Bitxor. Cuando un cliente acude a Bob para certificar un documento, verifica la autenticación de los documentos del cliente y luego etiqueta la cuenta del cliente con el documento digitalizado como metadatos.
Alice es una recién graduada que quiere que su certificado educativo sea acreditado a su Bitxor cuenta para evitar la molestia de proporcionar repetidamente la verificación de su título. Entonces ella va a Bob y le proporciona una prueba de su título. Una vez que Alice paga una tarifa, Bob verifica la autenticidad y sella la cuenta de Alice con metadatos que indican su título.
En este tutorial, implementará un programa para permitir la emisión de cuentas de etiquetas Bob metadata transactions.
Completa la getting started section.
Crea accounts para Alice y bob.
Cargue la cuenta de Bob con suficiente bitxor
para pagar las tarifas de transacción.
bitxor-cli account generate --save
Enter network type (MAIN_NET, TEST_NET): TEST_NET
Do you want to save it? [y/n]: y
Enter a Bitxor Node URL. (Example: http://localhost:3000): <NODE_URL>
Insert profile name: alice
1. Bob tiene que escoger una key para almacenar el certificado de Alice.
Imagina que CERT
es una clave común para almacenar títulos universitarios.
Defina esta clave como una nueva variable.
// replace with key
const key = KeyGenerator.generateUInt64Key('CERT');
// replace with key
const key = bitxor_sdk_1.KeyGenerator.generateUInt64Key('CERT');
2. El título de Alice trae el identificador 123456
para su certificado.
Ayuda a Bob a asignar este valor a la clave definida en el paso anterior.
Para lograrlo, defina una AccountMetadataTransaction que vincule la cuenta de Alice, la clave (CERT) y el valor asociado (123456).
// replace with network type
const networkType = NetworkType.TEST_NET;
// replace with public key
const alicePublicKey =
'D04AB232742BB4AB3A1368BD4615E4E6D0224AB71A016BAF8520A332C9778737';
const alicePublicAccount = PublicAccount.createFromPublicKey(
alicePublicKey,
networkType,
);
// replace with value
const value = '123456';
const accountMetadataTransaction = AccountMetadataTransaction.create(
Deadline.create(epochAdjustment),
alicePublicAccount.address,
key,
value.length,
value,
networkType,
);
// replace with network type
const networkType = bitxor_sdk_1.NetworkType.TEST_NET;
// replace with public key
const alicePublicKey =
'D04AB232742BB4AB3A1368BD4615E4E6D0224AB71A016BAF8520A332C9778737';
const alicePublicAccount = bitxor_sdk_1.PublicAccount.createFromPublicKey(
alicePublicKey,
networkType,
);
// replace with value
const value = '123456';
const accountMetadataTransaction = bitxor_sdk_1.AccountMetadataTransaction.create(
bitxor_sdk_1.Deadline.create(epochAdjustment),
alicePublicAccount.address,
key,
value.length,
value,
networkType,
);
3. Para evitar enviar spam a la cuenta con claves de metadatos no válidas, todos los metadatos se adjuntan solo con el consentimiento del propietario de la cuenta a través de transacciones agregadas. Por lo tanto, Alice tendrá que suscribirse si quiere que la entrada de metadatos se asigne a su cuenta. Envuelva AccountMetadataTransaction dentro de AggregateBondedTransaction y firme la transacción usando la cuenta de Bob. .. example-code:
.. viewsource:: ../../resources/examples/typescript/metadata/AssigningMetadataToAnAccount.ts
:language: typescript
:start-after: /* start block 03 */
:end-before: /* end block 03 */
.. viewsource:: ../../resources/examples/typescript/metadata/AssigningMetadataToAnAccount.js
:language: javascript
:start-after: /* start block 03 */
:end-before: /* end block 03 */
4. Antes de enviar una transacción agregada a la red, Bob debe bloquear 10
bitxor
.
Defina una nueva HashLockTransaction y fírmela con la cuenta de Bob.
// replace with bitxor id
const networkCurrencyTokenId = new TokenId('5E62990DCAC5BE8A');
// replace with network currency divisibility
const networkCurrencyDivisibility = 6;
const hashLockTransaction = HashLockTransaction.create(
Deadline.create(epochAdjustment),
new Token(
networkCurrencyTokenId,
UInt64.fromUint(10 * Math.pow(10, networkCurrencyDivisibility)),
),
UInt64.fromUint(480),
signedTransaction,
networkType,
UInt64.fromUint(2000000),
);
const signedHashLockTransaction = bobAccount.sign(
hashLockTransaction,
networkGenerationHash,
);
// replace with bitxor id
const networkCurrencyTokenId = new bitxor_sdk_1.TokenId('5E62990DCAC5BE8A');
// replace with network currency divisibility
const networkCurrencyDivisibility = 6;
const hashLockTransaction = bitxor_sdk_1.HashLockTransaction.create(
bitxor_sdk_1.Deadline.create(epochAdjustment),
new bitxor_sdk_1.Token(
networkCurrencyTokenId,
bitxor_sdk_1.UInt64.fromUint(
10 * Math.pow(10, networkCurrencyDivisibility),
),
),
bitxor_sdk_1.UInt64.fromUint(480),
signedTransaction,
networkType,
bitxor_sdk_1.UInt64.fromUint(2000000),
);
const signedHashLockTransaction = bobAccount.sign(
hashLockTransaction,
networkGenerationHash,
);
Note
Bob will receive the locked funds back if Alice cosigns the aggregate during the next 480
blocks.
5.Anuncie la HashLockTransaction. Supervise la red hasta que se confirme la transacción y luego anuncie la AgregateTransaction que contiene la AccountMetadataTransaction. .. example-code:
.. viewsource:: ../../resources/examples/typescript/metadata/AssigningMetadataToAnAccount.ts
:language: typescript
:start-after: /* start block 05 */
:end-before: /* end block 05 */
.. viewsource:: ../../resources/examples/typescript/metadata/AssigningMetadataToAnAccount.js
:language: javascript
:start-after: /* start block 05 */
:end-before: /* end block 05 */
6. Una vez que se confirme la transacción, avale el hash obtenido en el cuarto paso utilizando el perfil de Alice. .. code-block:: bash
bitxor-cli transaction cosign –hash <transaction-hash> –profile alice
Si todo va bien, ahora Alice ha asignado el valor de metadatos {bobPublicKey, CERT, 123456}
, que se puede leer como ” La cuenta de Alice tiene el número de certificado 123456 y fue verificada por Bob”.