Caso de uso : Lisk Bills una aplicación de facturación Blockchain

enero 24, 2021 VICTOR HUGO LAZARTE 0 Comments

 

Como nos gusta el   enfoque Keep it Simple and Stupid (KISS) , hemos creado una interfaz mínima con React que utiliza Lisk Alpha SDK para interactuar directamente con su aplicación blockchain. El PoC incluye dos actores, el cliente y el autónomo.

Imagina a Alice (autónoma) y Bob (cliente). Bob está buscando un nuevo logotipo para su sitio web y decide consultar a un profesional independiente. Mientras busca un buen diseñador, se encuentra con Alice que ofrece algunos diseños espectaculares en su portafolio. Bob está tan emocionado que decide emplear de inmediato las habilidades de Alice.

Pasan unos días y Alice devuelve el logo prometido junto con una factura. Sin embargo, Bob es un gran admirador de la tecnología blockchain, ya que ayuda a facilitar el proceso de liquidación. A menudo sucede que las partes no están de acuerdo con el precio, el producto o incluso los términos de envío acordados. Bob, por lo tanto, cree que blockchain puede ayudar a registrar toda esta información desde el principio, por lo que no pueden ocurrir disputas y se pueden eliminar los errores humanos. La cadena de bloques debe actuar como prueba de la factura.

Por la razón anterior, Bob le pide a Alice que cree la factura a través de una transacción personalizada de Lisk.

Para hacerlo, Alice primero debe iniciar sesión con su contraseña en la aplicación Lisk Bills.

Transacción personalizada 1: factura

Ahora que Alice ha iniciado sesión, puede crear una factura. Para crear la transacción de factura personalizada, Alice debe ingresar los siguientes detalles:

  • Client tiene la dirección o el nombre comercial de Bob's Lisk.
  • RequestedAmount sostiene la cantidad que Bob le debe a Alice.
  • Description para describir el servicio de diseño entregado.

Los siguientes datos se almacenan en el campo de activos de la transacción. Como esta es una BaseTransaction normal  , simplemente podemos especificar la dirección Lisk de Bob como el destinatario de la transacción.

 

Antes de sumergirnos en los aspectos técnicos, asegúrese de  abrir o clonar el  repositorio lisk-sdk-examples . El código para ambas transacciones personalizadas se puede encontrar en  factura / transacciones / factura_transacción.js  y  factura / transacciones / pago_transacción.js .

Técnicas

En primer lugar, echemos un vistazo a la definición de la clase. El  InvoiceTransactionextiende los  BaseTransaction que significa que es heredan sus propiedades. Como sugiere el nombre,  BaseTransaction es la interfaz más básica para crear nuevos tipos de transacciones. También existen otros tipos de transacciones en el sistema, más adelante mostraremos un ejemplo de extensión del  TransferTransaction tipo.

Al extender el  BaseTransaction , podemos proporcionar una lógica comercial adicional para los siguientes métodos:  preparar, validar activos, aplicar activos y deshacer activos . Puede obtener más información sobre estos  métodos en nuestra documentación .

Además, preste atención a la función de captador estático para recuperar el tipo de transacción. Como ejemplo, hemos elegido  13 ser el número de tipo para esta transacción. Además de eso, puede establecer la tarifa que desea que los usuarios paguen por usar este tipo de transacción. Por ahora, lo hemos establecido en 1 LSK (10 hasta la octava sombra).

Aclaración: Para ver completos los codigos se recomienda verlos  desde una PC

class InvoiceTransaction extiende BaseTransaction {
static get TYPE ( ) {
volver 13 ;
}
static get FEE ( ) {
return ` $ { 10 ** 8 } ` ;
}
...
}
ver crudoinvoice-tx.js alojado con ❤ por GitHub

Preparar

La función de preparación es responsable de cargar los datos requeridos utilizados dentro de la   función applyAsset() y  undoAsset()Aquí, intentamos cargar los datos de la cuenta para el remitente ya que queremos agregar datos a su  asset campo en la  applyAsset() función. Estos datos se cargarán desde el   objeto StateStore que proporciona acceso a los datos en la base de datos.

Podemos almacenar en caché la cuenta del remitente de esta manera pasando una matriz con filtros.

aguardar tienda . cuenta . caché ( [
{
dirección : este . senderId ,
} ,
] ) ;

Sin embargo, en realidad no tenemos que almacenar en caché los datos manualmente. Simplemente podemos llamar al método principal para la  prepare función en la BaseTransaction clase abstracta   que, por defecto, almacenará en caché la cuenta del remitente para  deducir la tarifa en el paso de aplicación .

async prepare ( almacenar ) {
espera super . preparar ( almacenar ) ;
}
ver crudoinvoice-tx.js alojado con ❤ por GitHub

Validar activo

Antes de que una transacción llegue al paso de solicitud, se valida. Verifique la corrección de los activos de la transacción desde la perspectiva del esquema (sin acceso  StateStore aquí). Puede invalidar la transacción insertando un error en la matriz de resultados.



Aplicar activo

Como puede ver, finalmente usamos la cuenta cargada que colocamos en la tienda durante el  prepare paso. A continuación, actualizamos el recuento de facturas y registramos el ID de la factura en una matriz con las facturas enviadas. Usaremos estos datos en nuestra interfaz para mostrar todas las facturas.

Deshacer activo

No subestime la importancia de la  undoAsset() función. La   función Deshacer nos permite retroceder a un estado anterior de blockchain. Por lo tanto, debemos decirle exactamente a nuestra aplicación blockchain cómo debe revertir los cambios.

La   función Deshacer es de suma importancia para el mecanismo de recuperación de la horquilla. En caso de que ocurra una bifurcación en una cadena con punta B y queremos retroceder a una altura común para volver a aplicar bloques hasta la punta de la cadena A, necesitamos la   función Deshacer para hacer el retroceso real a esta altura común .

Para la prueba de concepto de factura, el código reduce  invoiceCount y elimina el ID de factura de la  invoicesSent matriz.

Bien, hemos explorado las funciones para la transacción de la factura. Pasemos a la transacción de pago.

Transacción personalizada 2: Pago

Ahora que Bob ha recibido la transacción de la factura en su billetera, decide pagar la factura. Para completar la transacción, normalmente enviamos un  TransferTransaction que es compatible de forma nativa con Lisk SDK.

Sin embargo, hacerlo haría de este un tutorial muy aburrido. Por lo tanto, Bob decide utilizar otra transacción personalizada para mostrar las posibilidades de Lisk. Esta Transacción de pago personalizada tiene lógica para verificar que el monto transferido sea al menos igual al  RequestedAmountAdemás, la transacción requiere que Bob especifique el ID de la factura que desea cumplir.

Si el monto transferido es demasiado bajo o el ID de la factura simplemente no existe, la transacción falla. Bob mantiene su parte del acuerdo y envía la cantidad solicitada al ID de factura de Alice. Bob incluso agrega un consejo por el gran trabajo de Alice.

Así es como se ve la implementación de la interfaz de usuario para pagar una factura con nuestra aplicación Lisk Bills.

Técnicas

Nuevamente, echemos un vistazo a la definición de clase. El  PaymentTransactionextiende el  TransferTransaction que significa que está heredar sus propiedades como una tarifa diferente y comprobaciones de verificación de transferencia relacionada. Además, preste atención a la función de captador estático para recuperar el tipo de transacción. Como no podemos tener tipos de transacciones idénticos, el  PaymentTransaction tipo ha recibido  14.

class PaymentTransaction extiende TransferTransaction {
static get TYPE ( ) {
volver 14 ;
}
...
}
ver crudoinvoice-tx.js alojado con ❤ por GitHub

Además, tenga en cuenta que no definimos una función getter estática para  FEENo lo implementamos aquí porque no queremos sobrescribir lo  FEE definido en  TransferTransactionEn resumen, queremos utilizar la  0.1 tarifa definida en  TransferTransaction.

Preparar

La función de preparación es responsable de cargar los datos requeridos en el  store que se utilizará dentro de la   función applyAsset() y  undoAsset()Para el  PaymentTransaction, estamos cargando la transacción que contiene la factura usando el ID enviado con  this.asset.data.


Validar activo

Como habrás notado, no implementamos la  validateAsset()función para la transacción de pago. La única comprobación que tenemos que realizar es validar si el número de tokens enviados es al menos igual al número solicitado de tokens.

Para validar esto, necesitamos acceder al  StateStore ya que necesitamos almacenar en caché la transacción de la factura. Debido a que solo podemos realizar comprobaciones estáticas en la  validateAsset() función que no utiliza  StateStore, esta comprobación se  traslada al paso de aplicación .

Aplicar activo

La  applyAsset() función primero intenta encontrar la transacción de factura correspondiente. Si esta transacción existe, verificamos además que la cantidad de tokens transferidos sea al menos igual a la cantidad solicitada en la factura. Si esta verificación tiene éxito, se aplica la transacción.



Deshacer activo

No se requiere lógica de reversión para el paso de deshacer de la transacción de pago. No modificamos ningún dato en la tienda con el  set método, por lo que no es necesario definir pasos de deshacer para revertir este cambio de datos.

Sin embargo, no olvide llamar,  super.undoAsset(store) ya que el   paso Deshacer garantizará que la tarifa que pagó Alice se devuelva al saldo de su cuenta.

Conclusión

Lisk tiene como objetivo permitir la creatividad dentro de la industria blockchain al proporcionar la capacidad de procesar datos con lógica empresarial personalizada. Este concepto es muy similar a los contratos inteligentes, ya que también tienen una lógica comercial personalizada. Nos complace presentarle Lisk Bills como el primer ejemplo de lo que es posible con nuestro SDK.

Esperamos que esta libertad provoque un montón de nuevas e innovadoras aplicaciones de blockchain construidas sobre Lisk utilizando el recién lanzado Lisk Alpha SDK. Actualmente, no planeamos admitir transacciones personalizadas en la red principal de Lisk, pero están diseñadas para usarse dentro de su propia aplicación blockchain.

Recursos:

Fuente: blog de Lisk

  

  Como nos gusta el    enfoque  Keep it Simple and Stupid (KISS)  , hemos creado una interfaz mínima con React que utiliza Lisk Alpha SDK pa...