Tokens no fungibles (NFT) en el ecosistema Lisk
Tutorial de token no fungible (NFT)
Cómo crear una aplicación blockchain que admita NFT. Aprenderá a crear un módulo personalizado que agrega la función para crear y comprar NFT en una aplicación blockchain, y un complemento personalizado que proporciona funciones adicionales relacionadas con NFT.
Fichas fungibles vs no fungibles
Descripción general de la cadena de bloques NFT
En nuestro ejemplo, diseñaremos las siguientes características para la aplicación blockchain:
El módulo NFT (en cadena).
Tres nuevos activos de transacción para el módulo NFT.
El complemento NFT (fuera de la cadena).
Además de la aplicación blockchain, también implementaremos una aplicación frontend , que nos permitirá interactuar con la aplicación blockchain a través de una interfaz de usuario en el navegador.
1. Configuración del proyecto
Cree una nueva carpeta, que contendrá todos los archivos de la aplicación NFT:
index.js
luego copie y pegue lo siguienteEste fragmento de código crea una aplicación de cadena de bloques predeterminada, que está configurada para fines de desarrollo. Usaremos esta aplicación como base para la aplicación NFT y la ampliaremos con un módulo y un complemento en los siguientes pasos, para que se adapte al caso de uso deseado.
Crea una nueva carpeta nft_module/
y dentro de un nuevo archivo index.js
:
2. Funciones relacionadas con NFT
Para una mejor descripción, cree un nuevo archivo nft.js
en la nft_module/
carpeta.
Ahora abra nft.js
y defina las funciones relacionadas con la NFT, que se utilizarán en los activos y el módulo en los siguientes pasos.
Se implementan las siguientes funciones:
registeredNFTTokensSchema
: El esquema, cómo se guardan las NFT en la base de datos. Cada NFT tiene las siguientes propiedades:identificación
valor
ownerAddress
minPurchaseMargin
nombre
CHAIN_STATE_NFT_TOKENS
: La clave con la que se guardan las NFT en la base de datos.createNFTToken()
: Crea un nuevo NFT en base a la previstaname
,ownerAddress
,nonce
,value
yminPurchaseMargin
. El ID para el NFT se crea combinando y aplicando un hash a la dirección del propietario y su 'nonce actual', que en combinación siempre crea un valor único. De esta forma se asegura que cada NFT recién creado tenga un ID único en la base de datos.setAllNFTTokens()
: Guarda las NFT proporcionadas en la base de datos.getAllNFTTokens()
: Recupera NFT de la base de datos.getAllNFTTokensAsJSON()
: Devuelve todos los NFT de la base de datos como JSON.
Es posible que haya notado que usamos parámetros especiales en las funciones, como 3. Activos de transacciónEl usuario tendrá la capacidad de crear, comprar y transferir NFT en la red. Para ello, creamos los activos de transacción correspondientes para el módulo NFT. Cada uno de estos activos de transacción define tanto el esquema de activos para los datos de la transacción como la lógica, cómo se aplican y almacenan estos datos en la base de datos. 3.1. Crear activo NFTCrea un nuevo archivo Ahora abra el archivo y copie y pegue el siguiente código: Ahora defina todas las propiedades requeridas para el activo de transacción una tras otra. 3.1.1. ID y nombre del activo3.1.2. Esquema de activosEl esquema de activos describe los tipos de datos requeridos y la estructura de los datos en el activo de transacción respectivo.
Para crear una nueva NFT, necesitamos la siguiente información:
Por lo tanto, cree el esquema como se describe a continuación: Ahora que 3.1.3. La |
La mejor práctica Es una buena práctica nombrar los activos de transacción importados después de su nombre de clase correspondiente. En este ejemplo: 4.4. ComportamientoLa última característica restante del módulo NFT consiste en crear la siguiente acción Para implementarlo, utilizamos la función La variable 5. El complemento NFTAhora que toda la lógica en cadena para los NFT está definida en el módulo NFT, agreguemos un complemento NFT correspondiente, que manejará la lógica fuera de la cadena para la aplicación NFT. El complemento NFT proporcionará una API HTTP que ofrece nuevos puntos finales para datos relacionados con NFT de la cadena de bloques. Navegue fuera de la |
index.js
y cree el esqueleto, que contendrá todas las partes del complemento NFT:5.1. Funciones relacionadas con la base de datos
Para obtener una descripción general mejorada, primero, cree otro archivo que contendrá las funciones relacionadas con la base de datos del complemento. Aquí, usamos un almacén de clave-valor para guardar los datos, similar a cómo se guardan los datos relacionados en la cadena en el almacén de clave-valor predeterminado de la aplicación blockchain.
Crea un nuevo archivo db.js
. Copie y pegue el siguiente fragmento en el archivo recién creado db.js
.
db.js
contiene varias funciones que se ocupan de los siguientes aspectos:
getDBInstance(dataPath,dbName)
: Crea un nuevo almacén de valores-clavenft_plugin.db
para el complemento NFT. El almacén de valores clave se utiliza para almacenar información de la cadena de bloques relacionada con NFT del complemento en un esquema que lo hace convenientemente accesible para servicios de terceros.saveTransactions(db, payload)
: Guarda nuevas transacciones en la base de datos.getAllTransactions(db, registeredSchema)
: Devuelve una lista de todas las transacciones de la base de datos.getNFTHistory(db, dbKey)
: Devuelve el historial del propietario de una NFT.saveNFTHistory(db, decodedBlock, registeredModules)
: Filtros para transacciones del módulo NFT en el bloque decodificado. Actualiza el historial de NFT según la transacción de NFT encontrada en el bloque. Guarda el historial del propietario individual para las NFT correspondientes en la base de datos.
5.2. La lógica del complemento
Ahora regrese index.js
e implemente la lógica del complemento deseada.
El complemento proporcionará los siguientes datos adicionales a la aplicación:
una lista de todas las NFT existentes y su historial de propietario correspondiente.
detalles de una NFT, incluido el historial del propietario, por ID de NFT.
una lista de todas las transacciones, incluidos sus ID de módulo y activo y el activo de la transacción.
Para crear estos datos, el complemento necesita escuchar eventos para nuevos bloques en la aplicación blockchain. Cuando se crea un nuevo bloque, el complemento verifica si el bloque contiene transacciones y, de ser así, las guarda en el almacén de valores clave del complemento. En caso de que el bloque contenga transacciones del módulo NFT, también actualizará el historial del propietario de las NFT en la tienda de clave-valor.
Luego crearemos un servidor HTTP y también crearemos los puntos finales de API requeridos para entregar los datos a la aplicación frontend.
Todo esto se definirá dentro de la load()
función. Todo el código dentro de la load()
función es ejecutado por la aplicación blockchain cuando carga el complemento.
El código de la unload()
función se ejecuta en complemento por la aplicación blockchain cuando descarga el complemento.
6. Registro de módulo y complemento
Ahora que se han implementado el módulo y el complemento NFT, es necesario informar a la aplicación blockchain sobre ellos.
Esto se hace registrándolos con la aplicación blockchain como se muestra a continuación.
Abra el nft/blockchain_app/index.js
archivo nuevamente y copie y pegue el siguiente código:
Guarde y cierre el index.js
.
Ahora, cuando la aplicación se inicie nuevamente con node index.js
, la aplicación blockchain cargará el módulo NFT recién creado y los complementos y las nuevas funciones estarán disponibles para la aplicación blockchain.
En el siguiente paso, crearemos una interfaz React simple, que nos permite interactuar con la aplicación blockchain a través del navegador.
7. Aplicación frontend
La parte final de la aplicación NFT es la aplicación frontend.
El desarrollo de la aplicación frontend es completamente flexible y puede utilizar cualquier pila de tecnología con la que se sienta cómodo. En este ejemplo, usamos React para construir la aplicación cliente. |
Este tutorial trata principalmente de explicar cómo construir con Lisk SDK, por lo tanto, otras partes de la aplicación frontend no se explican con mucho detalle aquí. Puede encontrar más información sobre cómo crear una aplicación React, por ejemplo, en la documentación oficial de React .
Para mayor comodidad, clone la development
rama del lisk-sdk-examples
repositorio de GitHub y use la aplicación NFT frontend_app preparada de los ejemplos de sdk
En este punto, ahora es posible probar la interfaz y verificar que la aplicación NFT blockchain funciona como se esperaba:
Primero, abra una segunda ventana de terminal y navegue hasta nft/blockchain_app
. Ahora inicie la aplicación blockchain con node index.js
, si aún no se está ejecutando.
En la primera ventana de terminal, inicie la aplicación frontend con lo siguiente:
Esto debería abrir la aplicación React en el navegador en http: // localhost: 3000 / .
7.1. Caminata frontal
Antes de explorar el código de la aplicación de interfaz, primero hagamos un recorrido por la interfaz en el navegador para ver cómo funciona todo en conjunto.
Realizaremos lo siguiente:
Crea 3 cuentas diferentes.
Envíe una cantidad inicial de tokens a cada cuenta.
Cree un nuevo NFT con la primera cuenta.
Transfiera el NFT recién creado a la segunda cuenta.
Compre el NFT con la tercera cuenta.
Cree un segundo NFT con la primera cuenta, que no se puede comprar.
En las capturas de pantalla de ejemplo, usamos las siguientes credenciales de cuenta:
Sin embargo, también puede crear nuevas credenciales mediante el Create Account
cuadro de diálogo:
7.1.1. La pagina de inicio
La página de inicio es la página de destino que ve al abrir la aplicación de interfaz http://localhost:3000/
en el navegador.
En el primer inicio de la aplicación, la página está bastante vacía. Sin embargo, una vez que hayamos creado las primeras NFT, la página de inicio mostrará todas las NFT existentes y sus detalles.
En la barra superior, hay un enlace al explorador de transacciones, que muestra una lista de todas las transacciones que están incluidas en la cadena de bloques. Actualmente, también debería estar vacío, ya que aún no hemos enviado ninguna transacción.
En la parte inferior derecha, hay un botón que se puede utilizar para abrir los diferentes cuadros de diálogo para crear una nueva cuenta, transferir tokens de una cuenta a otra y, lo más importante, para crear nuevas NFT.
Para poder crear y comprar un nuevo NFT, una cuenta debe tener algunos tokens en el saldo de la cuenta. Por lo tanto, primero debemos transferir algunos tokens a las cuentas creadas.
7.1.2. Transferencia de fondos
Haga clic en el Transfer tokens
cuadro de diálogo y transfiera una cantidad adecuada de tokens a las cuentas de demostración descritas anteriormente. En nuestro ejemplo, transferimos 2000 tokens a la cuenta del artista y 1000 tokens cada uno a las cuentas de coleccionista.
Para la contraseña, use la contraseña de la cuenta de génesis, haciendo clic en el botón Use genesis account
. Ahora haga clic en Send funds
. Esto enviará los tokens especificados de la cuenta de génesis a la cuenta especificada en el Recipient Address
campo.
Esto publicará una transacción de transferencia correspondiente a la aplicación blockchain.
Es posible verificar que la transacción fue incluida en un bloque observando los registros de la aplicación blockchain:
15:20:56 INFO lisk-framework: transacción agregada al grupo (módulo = lisk: aplicación) { "id": "b9d81d996886f28d2f9fd102c2d8407dc86df941eeea0b03c004080e0f100f27", "nonce": "0", "senderPublicKey": "836d4f07c7db6d10c84394c60549d3f95cf61354e2ab5b0965a3fe7120e2f70d" } 15:21:00 INFO lisk-framework: Nuevo bloque agregado a la cadena (module = lisk: app) { "id": "f6d2ee7cb0e76938340f0b8a946389d518e7f27c062759f2c78f47d2841a7010", "altura": 787, "numberOfTransactions": 1 }7.1.3. Creando una nueva NFT
Ahora que todas las cuentas tienen algunos tokens en el saldo de su cuenta, use la frase de contraseña de la cuenta del artista para crear un nuevo NFT.
Después de aproximadamente 10 segundos, la NFT debería aparecer en la página de inicio, después de actualizar la página.En la parte inferior de la tarjeta NFT, el usuario ahora tiene la opción de transfero purchaseNFT.
7.1.4. Transferencia de una NFT
Para probar la Transfer NFTopción, transfiera el NFT ahora a la cuenta Collector1:
Debe utilizar la frase de contraseña del propietario actual de la NFT para firmar esta transacción.
Si una cuenta diferente a la del propietario intenta transferir el NFT, la aplicación arrojará un error An NFT can only be transferred by the owner of the NFT., que definimos previamente en la sección de activos de TransferNFT
7.1.5. Comprar un NFT
Para probar la
Purchase NFT
opción, compre el NFT con la cuenta Collector2:Ahora espere nuevamente 10 segundos, para ver el propietario actualizado y el historial de la NFT.
Haga clic en las direcciones de las cuentas en el historial de NFT para ver los detalles de la cuenta correspondiente en una nueva página:
Detalles de la cuenta de Collector1
En la página de la cuenta de Collector2, ahora se incluye NFT.
Observe de cerca la
Token value
propiedad, que ha aumentado de 120 a 132 debido a la compra.7.1.6. El explorador de transacciones
Haga clic en el
Transactions
enlace de la barra superior para ir al explorador de transacciones.
7.1.7. Creación de NFT no adquiribles
Para familiarizarse más con el proceso, juegue un poco más con la aplicación NFT creando más NFT.
Por ejemplo, también es posible crear NFT no adquiribles estableciendo el margen mínimo de compra en cero.
Eso es todo, el recorrido de la interfaz en el navegador ahora está completo.
A continuación, echemos un vistazo a las partes más importantes de la aplicación frontend, con respecto a la lógica relacionada con blockchain.
7.2. Funciones relacionadas con la API
Al principio, defina múltiples funciones que obtengan datos de la API HTTP de la información de la cadena de bloques.
La aplicación NFT blockchain ofrece dos API HTTP diferentes:
http: // localhost: 4000 / api / : la API de
HTTPAPIPlugin
. Se utiliza para recuperar información general de blockchain de la base de datos.http: // localhost: 8080 / api / : la API de
NFTAPIPlugin
. Se utiliza para recuperar información relacionada con NFT de la base de datos.Usaremos tanto las API como sus puntos finales proporcionados para recuperar o publicar los siguientes datos:
Información general de blockchain
fetchNodeInfo()
: Devuelve información sobre el nodo conectado.
fetchAccountInfo(address)
: Devuelve detalles de una cuenta específica, según su dirección.
sendTransactions(tx)
: Envía un objeto de transacción especificadotx
al nodo.Información relacionada con NFT
fetchAllNFTTokens()
: Obtiene una lista de todas las NFT registradas en la red.
fetchNFTToken()
: Devuelve detalles de un NFT específico, según su ID.
getAllTransactions()
: Devuelve una lista de todas las transacciones registradas en la red.7.3. Funciones para crear transacciones
La
utils/
carpeta de la aplicación frontend almacena ciertas funciones de utilidad para crear los diferentes tipos de transacciones.Las funciones se utilizarán en los cuadros de diálogo siguientes para crear y enviar los objetos de transacción en función de los datos del formulario en el cuadro de diálogo.
Las transacciones se crean y firman utilizando el
signTransaction()
del@liskhq/lisk-client
paquete.El nonce de cada transacción se recupera de la cuenta del remitente ejecutándose
fetchAccountInfo()
desde la sección de funciones relacionadas con la API .7.3.1. Crear NFT
7.3.2. Compra NFT
7.3.3. Transferir fondos
7.3.3. Transferir fondos
7.3.4. Transferir NFT
7.4. Diálogos
7.4.1. Crear diálogo de cuenta
El cuadro de diálogo para crear una cuenta crea nuevos detalles de la cuenta cada vez que se abre.
Tenga en cuenta que estos detalles de la cuenta solo se crean localmente y aún no están incluidos en la cadena de bloques.
Para incluir una cuenta en la cadena de bloques, simplemente envíe algunos fondos a la cuenta con el cuadro de diálogo Transferir fondos .
Para crear los detalles de la cuenta, se utilizan la biblioteca
passphrase
ycryptography
del@liskhq/lisk-client
paquete.7.4.2. Crear cuadro de diálogo NFT
El cuadro de diálogo Crear NFT permite al usuario crear una nueva NFT.
Presenta un formulario donde un usuario puede ingresar toda la información importante para crear el NFT:
Nombre : el nombre de la NFT.
Valor inicial del token : el valor inicial del token. El monto se debitará del saldo de la cuenta que crea el NFT.
Margen mínimo de compra : el margen mínimo en%, que se suma al valor del token en la compra.
Tarifa : la tarifa de transacción por la
createNFT
transacción.Frase de contraseña: la frase de contraseña de la cuenta que crea el NFT.
Luego usa la
createNFTToken()
función que definimos en la sección Crear NFT para crear lacreateNFT
transacción y lasendTransactions()
función de la sección de funciones relacionadas con la API para publicar la transacción en la aplicación blockchain.7.4.3. Comprar cuadro de diálogo NFT
El cuadro de diálogo de compra de NFT permite al usuario comprar una NFT existente.
Presenta un formulario donde un usuario puede ingresar toda la información importante para comprar el NFT:
Token Name (precargado): el nombre de la NFT.
ID de token (precargado): el ID de la NFT.
Valor de compra : el valor que el comprador desea pagar por el NFT. Para obtener ayuda, el margen de compra mínimo válido para este NFT en particular se muestra a continuación.
Tarifa : la tarifa de transacción por la
purchaseNFT
transacción.Frase de contraseña: la frase de contraseña de la cuenta que compra el NFT.
Luego usa la
purchaseNFTToken()
función que definimos en la sección Comprar NFT para crear lapurchaseNFT
transacción y lasendTransactions()
función de la sección de funciones relacionadas con la API para publicar la transacción en la aplicación blockchain.7.4.4. Diálogo de transferencia de fondos
El cuadro de diálogo de transferencia de fondos permite a un usuario transferir tokens de una cuenta a otra.
Presenta un formulario donde un usuario puede ingresar toda la información importante para transferir los tokens:
Dirección del destinatario : la dirección base 32 de la cuenta que recibe los fondos.
Cantidad : la cantidad de tokens que se transfieren.
Tarifa : la tarifa de transacción por la
transfer
transacción.Frase de contraseña: la frase de contraseña de la cuenta que envía los fondos.
Luego usa la
transfer()
función que definimos en la sección Transferir fondos para crear latransfer
transacción y lasendTransactions()
función de la sección de funciones relacionadas con la API para publicar la transacción en la aplicación blockchain.7.4.5. Cuadro de diálogo Transferir NFT
El cuadro de diálogo Transferir NFT permite al propietario de una NFT transferir la NFT.
Presenta un formulario donde el propietario actual puede ingresar toda la información importante para transferir el NFT:
Token Name (precargado): el nombre de la NFT.
ID de token (precargado): el ID de la NFT.
Dirección del destinatario : la dirección base 32 de la cuenta que recibe el NFT.
Tarifa : la tarifa de transacción por la
purchaseNFT
transacción.Frase de contraseña: la frase de contraseña del propietario de la NFT.
Luego usa la
transferNFT()
función que definimos en la sección Transferir NFT para crear latransferNFT
transacción y lasendTransactions()
función de la sección de funciones relacionadas con la API para publicar la transacción en la aplicación blockchain.7.5. Componentes
En React, los componentes son como funciones de JavaScript. Aceptan entradas arbitrarias (llamadas "props") y devuelven elementos React que describen lo que debería aparecer en la pantalla.
Para el frontend definimos los siguientes componentes:
HomePage
: Un componente para renderizar la página de inicio .
NFTToken
: Un componente para renderizar una NFT que incluye sus detalles y acciones relacionadas.
TransactionsPage
: Un componente para renderizar el explorador de transacciones .
AccountPage
: Un componente para representar la página de la cuenta .
Account
: Un componente para representar detalles en una cuenta específica.Los ejemplos de código para los componentes
HomePage
yNFTToken
se pueden encontrar a continuación.
Direcciones de cuenta en la interfazComo es de su conocimiento, la dirección de la cuenta puede ser representado en diferentes formatos, tales como
bytes
,Buffer
,hex
oLisk32
.El
Lisk32
formato es la representación más legible por humanos de una dirección de cuenta y, por lo tanto, los usuarios de la aplicación solo deberían ver esta dirección en la interfaz de usuario.Puede encontrar más información sobre los diferentes formatos de datos en la página de referencia de esquemas .
7.5.1. Componente NFT
El componente NFT presenta la siguiente información:
Nombre : el nombre de la NFT como título.
ID de token : el ID único de la NFT.
Valor del token : el valor actual del token.
Margen mínimo de compra : el margen mínimo en%, que se suma al valor del token en la compra.
Propietario actual : el propietario actual de la NFT.
Historial de NFT : el historial completo del propietario de NFT.
Este componente hace uso de los creados anteriormente
PurchaseNFTTokenDialog
yTransferNFTDialog
cuadros de diálogo y agregados ellos en la parte inferior del NFT.7.5.2. Componente de la página de inicio
El componente de la página de inicio muestra la siguiente información:
Una lista de todas las NFT existentes, representada como componente NFT .
Los NFT se obtienen utilizando la
fetchAllNFTTokens()
función de las funciones relacionadas con la API .Resumen
¡Eso es todo! Ahora debería tener una aplicación de cadena de bloques NFT de ejemplo completa en ejecución, que incluye:
una aplicación blockchain con
un módulo personalizado para manejar NFT.
un complemento personalizado que agrega funciones adicionales para las NFT.
una aplicación de interfaz que le permite usar y probar las aplicaciones en el navegador.
- Fuente: tutorials de Lisk