Tokens fungibles y sus usos en el ecosistema Lisk
En esta próxima edición de la serie en curso que cubre la solución de interoperabilidad Lisk, discutimos uno de los conceptos clave de blockchain: tokens fungibles y sus usos en el ecosistema Lisk. Este tema se discutió en la presentación Lisk Interoperability: Token and NFT Standards dada en Lisk.js.
Esta publicación de blog comienza con una breve introducción al concepto de tokens fungibles. A continuación, describimos el módulo Token propuesto para el ecosistema Lisk. Aquí cubrimos las principales características que están disponibles en el módulo Token. Esta sección debe ser su enfoque si desea una descripción general de este módulo sin profundizar en los detalles del desarrollo de una aplicación de cadena lateral. En la siguiente sección "Uso de las funciones expuestas", describimos cómo usar el módulo Token al crear su propio módulo. Si eres un desarrollador de sidechain, esta sección será de especial interés y te mostrará lo fácil que será interactuar con el módulo Token en tus aplicaciones de blockchain. Por último, concluimos presentando el tema de la publicación del blog del próximo mes.
Definición de token fungible
Los tokens fungibles (que se denominarán "tokens" en esta publicación de blog) son muy comunes en el espacio blockchain. Son una clase de activos digitales que abarca todas las criptomonedas como Bitcoin, Ethereum o LSK. La característica principal de los tokens fungibles es que varios tokens del mismo tipo son indistinguibles, esto los hace intercambiables, de ahí el nombre fungible . Por ejemplo, cualquier 1 LSK se trata de la misma manera que cualquier otra 1 LSK en la cadena de bloques. Esta característica es similar al comportamiento fiduciario en el que cualquier moneda de 1 EUR se puede reemplazar por otra moneda de 1 EUR sin consecuencias.
Esta analogía debería dejar en claro que el uso principal de los tokens es en situaciones en las que solo son relevantes las cantidades de tokens. Por ejemplo, en un servicio de pago, todas las LSK se aceptan de manera similar, o para votar, todas las LSK tienen el mismo peso a la hora de contar los votos.
El módulo Token
En esta sección, proporcionamos una breve descripción general de las características del módulo Token presentado en LIP 0051 . La siguiente información no es exhaustiva y remitimos a los lectores al LIP para obtener detalles adicionales. Varias razones motivaron la introducción de un nuevo módulo Token. En primer lugar, la introducción de la raíz del estado en los encabezados de los bloques requiere que cada módulo especifique su estado como un almacén de valores clave, cuya raíz se calcula como un árbol Merkle disperso. En segundo lugar, dado que el ecosistema admite la interoperabilidad, se necesitan nuevas funciones para permitir transferencias de tokens entre cadenas y garantizar que permanezcan seguras. Por último, pero no menos importante, el nuevo módulo Token expone un conjunto de funciones que los desarrolladores de cadenas laterales pueden utilizar para interactuar con el módulo Token de una manera segura y sencilla.
Identificación de token
Una vez que se encuentran disponibles varios tipos de tokens, es necesario un método de identificación. En la cadena de bloques Ethereum, varios tokens ERC-20 se identifican por un valor de 32 bytes. Por el contrario, en el ecosistema Lisk, los tokens se identifican con dos números: el ID de la cadena donde se acuña el token y un ID local, que se elige cuando se acuña el token.
Por ejemplo, el token LSK es nativo de la cadena principal de Lisk que tiene el ID de cadena 1, también es el primer (y único) token de esta cadena y tiene el ID local 0. Esto implica que el ID del token LSK es {" chainID ": 1," localID ": 0} .
La elección del ID local de los tokens cuando se acuñan permite que la cadena nativa especifique y utilice varios tokens fungibles. Por ejemplo, una cadena podría especificar dos tokens, un token de gobernanza con el ID local 0 y un token de utilidad con el ID local 1. Tenga en cuenta que, en cualquier caso, la lógica específica para usar los tokens no la maneja el módulo Token, sino debe implementarse en módulos separados.
Tienda estatal
Toda la información relacionada con los tokens fungibles se almacena como pares clave-valor en la tienda del módulo Token. La tienda del módulo Token está separada en varias sub-tiendas que sirven para diferentes propósitos internos. La única substore que mencionaremos aquí es la substore de usuario que contiene los saldos de todos los tokens fungibles para cada dirección. La substore utiliza la dirección del usuario y el ID del token como clave de la tienda, y el saldo disponible correspondiente y los tokens bloqueados potenciales como el valor de la tienda.
Figura 1: El substore de usuario usa la dirección concatenada con el ID del token como clave y almacena los correspondientes tokens disponibles y bloqueados como el valor de la tienda.
La principal propiedad de los tokens bloqueados es que no se pueden enviar a otra cuenta. Todavía están asociados con la dirección del usuario, sin embargo, deben desbloquearse antes de usarse. Más adelante veremos que bloquear tokens puede ser muy útil y permite múltiples casos de uso.
Comandos
El módulo Token solo especifica los siguientes dos comandos:
- El comando de transferencia de tokens : se utiliza para transferir tokens del saldo disponible de una cuenta a otra cuenta en la misma cadena. Tiene la misma función que la transacción de transferencia LSK que se usa actualmente en la cadena principal de Lisk.
- El comando de transferencia de tokens entre cadenas : se utiliza para transferir tokens del saldo disponible de una cuenta a otra cuenta en una cadena diferente.
Estos dos comandos permiten a los usuarios enviar tokens a través del ecosistema sin tener que manejar mensajes o comprender el protocolo de interoperabilidad subyacente.
Figura 2: Un pequeño ecosistema potencial con algunas de las transferencias de tokens permitidas. Las transferencias de tokens en la misma cadena pueden enviar cualquier token en la tienda de módulos. Las transferencias de tokens entre cadenas deben realizarse con tokens nativos de la cadena de envío o recepción (consulte el siguiente párrafo para obtener más detalles).
Mantener el suministro total de tokens
Como se mencionó anteriormente, la primera parte del ID del token es el ID de cadena de la cadena nativa del token (donde se acuña el token). Una cadena es libre de acuñar tantos tokens como lo permita su protocolo con el ID de cadena correcto. Sin embargo, una cadena no debería poder acuñar tokens con el ID de cadena de otras cadenas e inundar la red con ellos. Por ejemplo, solo la cadena principal de Lisk acuñará tokens LSK como parte de la generación de bloques, pero una cadena lateral no puede acuñar tokens LSK y enviarlos a través de la red.
Una forma de lograr esta característica es hacer que cada cadena realice un seguimiento de cuántos de sus tokens nativos se encuentran en qué cadena del ecosistema Lisk. Esto se hace fácilmente guardando en custodia los tokens enviados a otra cadena. En esencia, la tienda de tokens tiene una cuenta para cada una de las otras cadenas a las que se han enviado los tokens y esas cuentas almacenan la cantidad de tokens que se han transferido a esa cadena. Para poder mantener la corrección de esas cuentas de depósito en garantía, la cadena nativa de un token debe ser consciente de que el token se mueve de una cadena a otra. Para permitir esto, el módulo Token solo permite que los tokens se envíen desde su cadena nativa a otra cadena, o desde otra cadena a la cadena nativa.
Figura 3: ilustrando la regla anterior con la transferencia de tokens de cadena cruzada desde la cadena A. Los tokens pueden enviarse hacia adelante y hacia atrás desde la cadena A a la cadena B (y también hacia adelante y hacia atrás a la cadena C), pero los tokens de la cadena A no pueden enviarse desde la cadena B a la cadena C cadena.
Funciones expuestas
Las funciones expuestas son las puertas de entrada al almacén del módulo Token y la forma en que otros módulos interactúan con el módulo Token.
Figura 4: Las funciones expuestas en el módulo Token son utilizadas por otros módulos para interactuar con la tienda del módulo Token.
Demos algunos ejemplos de las funciones expuestas, se pueden encontrar más en el LIP-0051 .
- initializeToken se usa para crear un nuevo tipo de token.
- mint se utiliza para emitir nuevos tokens de un tipo determinado.
- quemar se utiliza para destruir fichas de un tipo determinado.
- lock se utiliza para bloquear tokens, en esencia, moverlos del saldo disponible del usuario a la matriz de tokens bloqueados.
- desbloquear se utiliza para desbloquear tokens previamente bloqueados.
- La transferencia se utiliza para mover tokens de una entrada de tienda a otra.
Las funciones expuestas están diseñadas para mantener siempre un almacén de módulos Token válido, ya que definen las transiciones de estado permitidas que pueden ser inducidas por otros módulos. Simplifican aún más el uso del módulo Token por parte de otros módulos, al proporcionar interfaces simples que no requieren conocimiento del funcionamiento interno del módulo Token. La siguiente sección describe usos más elaborados y muestra las funciones expuestas en acción.
Uso de las funciones expuestas
Esta sección explorará algunas de las posibilidades que ofrece el módulo Token. Esbozaremos tres usos potenciales y describiremos cómo podrían crearse utilizando las funciones expuestas. Verás que las funciones expuestas permiten desarrollar una amplia gama de aplicaciones. Como regla general, es mejor no modificar el módulo Token, ya que modificar el módulo Token podría tener consecuencias no deseadas, como acuñar tokens nativos de otra cadena.
En los siguientes ejemplos, usaremos la notación token.functionName (argumentos) para denotar una llamada a la función con el nombre functionName en el módulo Token.
Ejemplo 1: votación y desbloqueo
El primer caso de uso está realmente presente en la cadena principal de Lisk y se utiliza a diario. La votación es una parte integral de una cadena de bloques DPoS y el manejo de los tokens votados debe realizarse con el módulo Token. Cuando se emite un voto, el comando bloquea los tokens votados y aumenta el número total de votos que recibió el delegado. El comando también debe desbloquear los tokens y disminuir el número total de votos para el delegado cuando se elimina el voto (para simplificar, aquí no hay un período de espera para el desbloqueo, a diferencia de la cadena principal de Lisk).
Las funciones expuestas están diseñadas para mantener siempre un almacén de módulos Token válido, ya que definen las transiciones de estado permitidas que pueden ser inducidas por otros módulos. Simplifican aún más el uso del módulo Token por parte de otros módulos, al proporcionar interfaces simples que no requieren conocimiento del funcionamiento interno del módulo Token. La siguiente sección describe usos más elaborados y muestra las funciones expuestas en acción.
Uso de las funciones expuestas
Esta sección explorará algunas de las posibilidades que ofrece el módulo Token. Esbozaremos tres usos potenciales y describiremos cómo podrían crearse utilizando las funciones expuestas. Verás que las funciones expuestas permiten desarrollar una amplia gama de aplicaciones. Como regla general, es mejor no modificar el módulo Token, ya que modificar el módulo Token podría tener consecuencias no deseadas, como acuñar tokens nativos de otra cadena.
En los siguientes ejemplos, usaremos la notación token.functionName (argumentos) para denotar una llamada a la función con el nombre functionName en el módulo Token.
Ejemplo 1: votación y desbloqueo
El primer caso de uso está realmente presente en la cadena principal de Lisk y se utiliza a diario. La votación es una parte integral de una cadena de bloques DPoS y el manejo de los tokens votados debe realizarse con el módulo Token. Cuando se emite un voto, el comando bloquea los tokens votados y aumenta el número total de votos que recibió el delegado. El comando también debe desbloquear los tokens y disminuir el número total de votos para el delegado cuando se elimina el voto (para simplificar, aquí no hay un período de espera para el desbloqueo, a diferencia de la cadena principal de Lisk).
Ejemplo 2: Módulo HTLC
El ejemplo anterior fue un módulo que se usó localmente en una cadena. Sin embargo, no hay ninguna razón para que este deba ser el caso. Un módulo HTLC es un ejemplo clásico de un módulo que se beneficia de ser compatible con diferentes cadenas para permitir intercambios de tokens seguros. El paradigma básico de un HTLC es permitir a los usuarios bloquear sus tokens y solo permitir su desbloqueo bajo una de las siguientes condiciones:
- La acción de desbloqueo ocurre antes de que el usuario objetivo realice la hora de salida establecida y al proporcionar el código secreto correcto.
- La acción de desbloqueo ocurre después del tiempo de salida establecido y la realiza el usuario que creó el HTLC.
Por lo tanto, un módulo HTLC solo requiere dos comandos: enterHTLC y ClaimHTLC . Ambos hacen uso del módulo de tokens para bloquear y desbloquear los tokens.
El primer comando enterHTLC bloqueará los tokens en la cuenta del remitente y creará un objeto de bloqueo en la tienda HTLC.
El segundo comando, ClaimHTLC , implementa la lógica necesaria para desbloquear los tokens y transferirlos a la cuenta correcta.
Uno de los usos principales de este módulo sería facilitar intercambios de tokens seguros entre usuarios en diferentes cadenas. El siguiente proceso ilustra cómo el módulo HTLC con estos dos comandos se puede utilizar para este propósito:
- Dos usuarios, Alice y Bob, acuerdan un intercambio, digamos 10 fichas A por 5 fichas B.
- Alice elige una S secreta y envía enterHTLC (user2, 10, A-token, hash (S), 100222) a la A-chain. Esto crea lock0bject1 en el almacén de estado HTLC en la cadena A.
- Bob envía enterHTLC (usuario1, 5, token B, hash (S), 100111) a la cadena B. Esto crea lock0bject2 en el almacén de estado HTLC en la cadena B.
- Alice revela S enviando ClaimHTLC (S, lockObject2) en la cadena B. Alice obtiene la ficha 5 B.
- Bob envía ClaimHTLC (S, lockObject1) en la cadena A. Bob obtiene la ficha 10 A.
Tenga en cuenta que para que el intercambio sea seguro (para garantizar que Alice no termine con 10 tokens A y 5 tokens B), Bob debe elegir un tiempo de salida suficientemente menor que el elegido por Alice.
Ejemplo 3: Puntos de fidelidad
Para este último ejemplo, queremos describir una cadena en la que cada usuario puede crear su propio token. Luego tienen la libertad de regalar estos tokens como les plazca para recompensar a otros usuarios. Por ejemplo, las empresas podrían utilizar una cadena de este tipo para otorgar puntos de fidelidad a los clientes. Para este ejemplo, supondremos que tenemos un módulo de fidelización que almacena a todos los usuarios registrados (los que pueden dar puntos), así como su ID de token asociado.
El primer comando que debemos definir es un comando de registro que verificará si el usuario ya está registrado, luego asignará el siguiente ID de token disponible a este usuario e inicializará este ID de token para que ahora se puedan acuñar nuevos tokens.
En segundo lugar, definimos un comando que se usa para regalar puntos. Cualquier dirección que se haya registrado como participante, puede entregar sus respectivos tokens de fidelidadEn tercer lugar, definimos un comando que se utiliza para canjear los tokens de fidelidad. Aquí se queman los tokens usados y se toma la acción correspondiente. La forma en que se usan los puntos podría definirse en otro comando del mismo módulo, o podrían usarse en otro módulo.
Las variaciones sobre este tema son numerosas y cubren una amplia gama de casos de uso, desde puntos de amistad hasta cupones de tiendas o incluso aplicaciones similares a DEX.
Conclusión y próximo tema
Esta publicación de blog ha presentado el módulo Token. El ecosistema Lisk contendrá dos módulos responsables de la gestión de tokens, el módulo Token responsable de los tokens fungibles y el módulo NFT que será responsable de los tokens no fungibles. El módulo NFT y sus usos potenciales se presentarán en la próxima publicación del blog de esta serie.
Si desea profundizar más en las especificaciones técnicas o hacer preguntas sobre el módulo Token, lo invitamos a visitar nuestro foro de investigación, en particular el hilo "Definir estado y transiciones de estado del módulo Token"
- Fuente: blog de Lisk