Recibe las actualizaciones de Efinity
Inscríbase para mantenerse informado de los avances en el desarrollo de Efinity.
Recibe las actualizaciones de Efinity
Inscríbase para mantenerse informado de los avances en el desarrollo de Efinity.
¡Gracias! Por favor, compruebe su correo electrónico.
Error

Optimización de la acuñación de monedas y transacciones por lotes en Efinity

El diseño de transacciones seguras y asequibles en Efinity creará libros de contabilidad más rápidos e impulsará la democratización de tecnologías disruptivas como las NFT.

Uno de los mayores quebraderos de cabeza de un desarrollador de blockchain es cómo mantener las tarifas lo más bajas posible, sin sacrificar la seguridad o la velocidad.

En Enjin, vemos estos obstáculos como una oportunidad para innovar, superar los límites y adaptar nuestras soluciones a las necesidades cambiantes de nuestros usuarios.

En este artículo, describiré una de las principales optimizaciones que hemos aplicado a Efinity, que mejorará enormemente la experiencia de nuestros usuarios y adoptantes del juego:

  • Acuñar una cantidad masiva de fichas no fungibles (NFT)
  • Transferencias por lotes de una cantidad masiva de NFTs

No te pierdas los puntos de referencia finales al final del artículo.

Optimización de las transacciones NFT

El problema: Rendimiento de E/S

Efinity se desarrolla utilizando Substrate, y se desplegará como parachain (en Polkadot). En este ecosistema, el acceso al almacenamiento (leer o escribir el estado de la blockchain) es crítico cuando se hace un benchmark de la transacción (extrínseco) de su tiempo de ejecución.

El objetivo aquí es reducir al máximo el número de operaciones de E/S en el almacenamiento, lo que supondrá una reducción inmediata de las tarifas para el usuario.

Para almacenar el saldo de NFT en una cuenta, podríamos utilizar la siguiente estructura:

De este modo, podemos almacenar/consultar el saldo del token dado que pertenece al activo especificado para la cuenta de destino. En Substrate, también podríamos iterar sobre el almacenamiento y enumerar los tokens que posee una cuenta con o sin fijar el activo.

Sin embargo, el gran problema de esta representación es el número de operaciones de E/S necesarias para la acuñación masiva y las transferencias por lotes. Por ejemplo, si queremos crear 1.000.000 de fichas para un nuevo juego, se necesitarán al menos 1.000.000 de escrituras en el almacenamiento.

De la misma manera, las transferencias por lotes no estarían optimizadas y tomarían una lectura más dos escrituras (una en la cuenta de origen y otra en la de destino) por cada transferencia.

La solución: Trozos de fichas

Una forma de reducir la E/S en el almacenamiento es agrupando cosas. En este caso, vamos a poner un grupo de tokens en una sola estructura: el chunk.

Un chunk es un grupo de fichas secuenciales que comparten un índice.

Por ejemplo, supongamos que definimos el tamaño del chunk a 512 elementos, y el índice del chunk es el resultado de la división del ID del token por 512 (el tamaño del chunk).

Si seguimos el ejemplo anterior, hemos reducido la E/S de 1.000.000 a 1.954.

Un paso más allá: Gamas

Ahora que hemos reducido el número de E/S, vamos a intentar reducir las tasas y el espacio dedicado a almacenar nuestros token IDs. Vamos a tomar el avance de los token IDs secuenciales para hacer una compresión de chunks.

Un rango es un intervalo abierto de IDs de tokens, por ejemplo, [0,512) que representa un chunk de tokens 0,1,2,...,511. En lugar de escribir todos los IDs de los tokens dentro del chunk, escribiremos sólo los rangos.

El mejor caso es cuando el chunk está lleno, donde sólo necesitamos dos IDs para definirlo. Por ejemplo, un chunk con los 10 primeros tokens como [0,1,2,3,4,5,6,7,8,9] se comprimirá en un rango [0,10). La versión "sin comprimir" del chunk utiliza 10 enteros, mientras que la versión comprimida sólo requiere 2 enteros.

El peor caso es cuando un chunk contiene sólo IDs de tokens pares o impares, en el que necesitaremos 512 IDs para representar rangos para 256 tokens. Por ejemplo, si un chunk contiene elementos no secuenciales como [0, 2, 4, 6], entonces su representación comprimida de rangos requerirá más espacio, como { [0,1), [2,3), [4,5), [6,7) }.

El uso de rangos aumentará la complejidad de algunas operaciones como la resta y la suma (que se utilizan para las transferencias entre cuentas), pero esa nueva complejidad será un orden de magnitud menor que las operaciones de E/S.

Rendimiento: Suena bien, pero déjame ver las cifras.

La regla más importante: cualquier mejora DEBE estar respaldada por las cifras de un punto de referencia.

La siguiente tabla muestra las operaciones afectadas por esta optimización. El resto de las extrínsecas de la paleta se han omitido por no verse afectadas en términos de rendimiento:

Algunas cosas importantes a destacar:

  • La acuñación de NFTs experimenta una impresionante mejora del 99,8%. En ese primer borrador, pude acuñar 120.000.000 de NFT en un solo bloque.
  • En las transferencias de NFT por lotes sólo se vio x2, pero la desviación del error estándar muestra que podríamos obtener mejores cifras en casos de uso específicos.
  • Una nueva transferencia optimizada de NFT en trozos. Cualquier monedero inteligente podrá aprovechar la optimización subyacente a través de las nuevas funciones de la API. Transferir hasta 512 tokens en el mismo chunk costará lo mismo que una sola transferencia.
  • La degradación en las transferencias simples es de alrededor del 8% en el proyecto inicial. Todavía tenemos que añadir algunas operaciones adicionales dentro de eso, por lo que este número disminuirá en futuras versiones.

El código fuente se abrirá pronto.

Conclusiones

Efinity democratizará las NFT mediante microfichas, y supondrá un cambio de juego para los desarrolladores y las empresas que requieran un mayor rendimiento en operaciones masivas.

Este tipo de optimización puede utilizarse en otros ámbitos, y esas cifras siguen estando en la L1, donde la seguridad y la liquidez se mantienen en niveles elevados.

Recibe las actualizaciones de Efinity

Inscríbase para mantenerse informado de los avances en el desarrollo de Efinity.

Inscríbase

Recibe las actualizaciones de Efinity

Inscríbase para mantenerse informado de los avances en el desarrollo de Efinity.

¡Gracias! Por favor, compruebe su correo electrónico.
Error

También podrías disfrutar