Uso de Pallet X-Tokens para enviar XC-20

Leo1925
Moonbeam Network | Español
11 min readApr 19, 2022

Introducción

Crear un mensaje XCM para transferencias de activos fungibles no es una tarea fácil. En consecuencia, hay funciones de contenedor/paletas que los desarrolladores pueden aprovechar para usar las características de XCM en Polkadot/Kusama.

Un ejemplo de estos envoltorios es la plataforma X-Tokens , que proporciona diferentes métodos para transferir activos fungibles a través de XCM.

Esta guía le mostrará cómo aprovechar la plataforma X-Tokens para enviar XC-20 desde una red basada en Moonbeam a otras cadenas en el ecosistema (cadena de retransmisión/paracadenas). Además, también aprenderá a usar la precompilación de X-Tokens para realizar las mismas acciones a través de la API de Ethereum.

Los desarrolladores deben comprender que el envío de mensajes XCM incorrectos puede provocar la pérdida de fondos. En consecuencia, es fundamental probar las funciones de XCM en una TestNet antes de pasar a un entorno de producción.

Definiciones generales de XCM

  • XCM : significa mensaje de consenso cruzado, es una forma general para que los sistemas de consenso se comuniquen entre sí.
  • VMP : significa paso de mensajes verticales, permite que las paracadenas intercambien mensajes con la cadena de retransmisión. UMP (paso de mensajes hacia arriba) permite que las paracadenas envíen mensajes a su cadena de retransmisión, mientras que DMP (paso de mensajes hacia abajo) permite que la cadena de retransmisión pase mensajes a una de sus paracadenas.
  • XCMP : significa paso de mensajes de consenso cruzado, permite que las paracadenas intercambien mensajes con otras paracadenas en la misma cadena de retransmisión.
  • HRMP : significa paso de mensajes enrutados por retransmisión horizontal, un protocolo provisional mientras se lanza una implementación completa de XCMP. La misma interfaz que XCMP, pero los mensajes se almacenan en la cadena de retransmisión
  • Multiubicación : una forma de especificar un punto en todo el ecosistema de la cadena de retransmisión/paracadena desde un origen determinado, ya sea relativo o absoluto. Por ejemplo, se puede usar para especificar una paracadena, un activo, una cuenta o incluso una plataforma específica dentro de una paracadena. En términos generales, una multiubicación se define con a parentsy an interior. Padres se refiere a cuántos "saltos" en una cadena de bloques principal necesita tomar desde un origen determinado. El interior, se refiere a cuántos campos necesita para definir el punto objetivo. Por ejemplo, para apuntar a una parachain con ID 1000de otra parachain, la multiubicación sería{ "parents": 1, "interior": { "X1": [{ "Parachain": 1000 }]}}

Interfaz de palets X-Tokens

La paleta X-Tokens proporciona los siguientes elementos extrínsecos (funciones):

  • transfer (currencyId, cantidad, dest, destWeight) : transfiere una moneda, definida como el token nativo (auto reservado) o con la ID del activo
  • transferMultiasset(asset, dest, destWeight) — transfiere un activo fungible, definido por su ubicación múltiple
  • transferMultiassetWithFee(asset, fee, dest, destWeight) : transfiere un activo fungible, pero permite que el remitente pague la tarifa con un activo diferente. Ambos se definen por su multiubicación.
  • transferMultiassets(assets, feeItem, dest, destWeight) : transfiere varios activos fungibles, especificando cuál se usa como tarifa. Cada activo se define por su multiubicación
  • transferMulticurrencies(currencies, feeItem, dest, destWeight) — transfiere diferentes divisas, especificando cuál se usa como tarifa. Cada moneda se define como el token nativo (auto-reservado) o con la identificación del activo
  • transferWithFee(currencyId,mount, fee, dest, destWeight) : transfiere una moneda, pero permite que el remitente pague la tarifa con un activo diferente. Ambos se definen por su multiubicación.

Donde los insumos que deben proporcionarse pueden definirse como:

  • currencyId/currencies — los ID/ID de la moneda/monedas que se envían a través de XCM. Diferentes tiempos de ejecución tienen diferentes formas de definir los ID. En el caso de las redes basadas en Moonbeam, SelfReservese refiere al token nativo y OtherReservese refiere al activo
  • cantidad : la cantidad de tokens que se enviarán a través de XCM
  • dest : una ubicación múltiple para definir la dirección de destino de los tokens que se envían a través de XCM. Admite diferentes formatos de direcciones, como direcciones de 20 o 32 bytes (Ethereum o Substrate)
  • destWeight : la cantidad máxima de tiempo de ejecución que desea proporcionar en la cadena de destino para ejecutar el mensaje XCM que se envía. Si no se proporciona suficiente ponderación, la ejecución del XCM fallará y los fondos podrían bloquearse en la cuenta soberana o en una paleta especial. Es importante configurar correctamente el peso de destino para evitar ejecuciones fallidas de XCM
  • activo/activos : una ubicación múltiple para definir el activo o los activos que se envían a través de XCM. Cada parachain tiene una forma diferente de hacer referencia a los activos. Por ejemplo, las redes basadas en Moonbeam hacen referencia a sus tokens nativos con el índice de saldos de palets.
  • tarifa : una ubicación múltiple para definir el activo utilizado para pagar la ejecución de XCM en la cadena de destino
  • feeItem : un índice para definir la posición de activos de una matriz de activos que se envían, que se utiliza para pagar la ejecución de XCM en la cadena de destino. Por ejemplo, si solo se envía un activo, el feeItemsería0

El único método de lectura que proporciona la plataforma es palletVersion, que proporciona la versión de la plataforma X-Tokens que se está utilizando.

Construyendo un XCM con el X-Tokens Pallet

Esta guía cubre el proceso de creación de un mensaje XCM utilizando la paleta X-Tokens, más específicamente, con las funciones transfery transferMultiasset. No obstante, estos dos casos son extrapolables al resto de funciones, especialmente una vez familiarizados con las multiubicaciones.

Nota

Cada paracaídas puede permitir/prohibir métodos específicos de un palé. En consecuencia, los desarrolladores deben asegurarse de utilizar métodos que estén permitidos. De lo contrario, la transacción fallará con un error similar a system.CallFiltered.

Comprobación de requisitos previos

Para poder enviar los extrínsecos en las aplicaciones de Polkadot.js, debe tener una cuenta con fondos .

Además, deberá tener algunos xcUNITtokens para este tutorial, que es la representación XC-20 del token de la cadena de retransmisión de Alphanet UNIT. Puede adquirir algunos canjeándolos por DEVtokens (el token nativo de Moonbase Alpha) en Moonbeam-Swap , un clon de demostración de Uniswap-V2 en Moonbase Alpha.

Para consultar tu xcUNITsaldo, puedes agregar el XC-20 a MetaMask con la siguiente dirección:

code" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; margin: 0px; padding: 0px; font-size: inherit; background: transparent; border: 0px; position: absolute; top: 0.5em; right: 0.5em; z-index: 1; width: 1.5em; height: 1.5em; color: var(--md-default-fg-color--lightest); border-radius: 0.1rem; cursor: pointer; transition: color 250ms ease 0s;">0xFfFFfFff1FcaCBd218EDc0EbA20Fc2308C778080

Puede consultar la página XC-20 para saber cómo calcular esta dirección.

Función de transferencia de tokens X

En este ejemplo, creará un mensaje XCM para transferir xcUNITdesde Moonbase Alpha a su cadena de retransmisión a través de la función de transferencia de la plataforma X-Tokens.

Si ha verificado los requisitos previos , diríjase a la página extrínseca de Polkadot JS Apps y configure las siguientes opciones:

  1. Seleccione la cuenta desde la que desea enviar el XCM
  2. Elija la paleta xTokens
  3. Elija la transferencia extrínseca
  4. Establezca el ID de moneda en OtherReserve . Esto se debe a que no está transfiriendo tokens DEV ( SelfReserve )
  5. Ingrese la identificación del activo. Para este ejemplo, xcUNITtiene una identificación de activo de 42259045809535163221576417993425387648. Puede verificar todos los ID de activos disponibles en la sección de dirección XC-20
  6. Establece el número de tokens a enviar. Para este ejemplo, está enviando 1 xcUNIT, pero debe tener en cuenta los 12 decimales de xcUNIT. Para saber cuántos decimales tiene un token XC-20, puedes consultar sus metadatos
  7. Para definir la multiubicación de destino de XCM, debe apuntar a una cuenta en la cadena de retransmisión de Moonbase Alpha como origen. Por lo tanto, establezca los siguientes parámetros:

8. Establezca el peso de destino en 1000000000. Tenga en cuenta que en Moonbase Alpha, cada instrucción XCM cuesta alrededor de 100000000unidades de peso. A transferconsta de 4 instrucciones XCM, por lo que un peso de destino de 400000000debería ser suficiente

9. Haga clic en el botón Enviar transacción y firme la transacción

Nota

Los datos de llamada codificados para el extrínseco configurado anteriormente son 0x1e00018080778c30c20fa2ebc0ed18d2cbca1f0010a5d4e800000000000000000000000101010100c4db7bcb733e117c0b34ac96354b10d47e84a006b9e7e66a229d174e8ff2a06300ca9a3b00000000. También incluye un destinatario específico que deberá cambiar.

Una vez que se procesa la transacción, TargetAccount debería haber recibido el monto transferido menos una pequeña tarifa que se deduce para ejecutar el XCM en la cadena de destino. En las aplicaciones de Polkadot.js, puede verificar los eventos y extrínsecos relevantes en Moonbase Alpha y la cadena de retransmisión .

Función multiactivo de transferencia de tokens X

En este ejemplo, creará un mensaje XCM para transferirlo xcUNITdesde Moonbase Alpha a su cadena de retransmisión mediante la transferMultiassetfunción de la paleta X-Tokens.

Si ha verificado los requisitos previos , diríjase a la página extrínseca de Polkadot JS Apps y configure las siguientes opciones:

  1. Seleccione la cuenta desde la que desea enviar el XCM
  2. Elija la paleta xTokens
  3. Elige la transferenciaMultiactivo extrínseco
  4. Para definir la multiubicación de activos XCM, debe apuntar UNITen la cadena de retransmisión desde Moonbase Alpha como origen. Cada cadena ve su propio activo de manera diferente. Por lo tanto, deberá establecer una multiubicación de activos diferente para cada destino. Para este ejemplo, el token de la cadena de retransmisión se puede definir como:

5. Establecer el tipo de activo como fungible

6. Establece el número de tokens a enviar. Para este ejemplo, está enviando 1 xcUNIT, pero debe tener en cuenta los 12 decimales

7. Para definir la multiubicación de destino de XCM, debe apuntar a una cuenta en la cadena de retransmisión de Moonbase Alpha como origen. Por lo tanto, establezca los siguientes parámetros:

8. Establezca el peso de destino en 1000000000. Tenga en cuenta que en Moonbase Alpha, cada instrucción XCM cuesta alrededor de 100000000unidades de peso. A transferMultiassetconsta de 4 instrucciones XCM, por lo que un peso de destino de 400000000debería ser suficiente

9. Haga clic en el botón Enviar transacción y firme la transacción

Nota

Los datos de llamada codificados para el extrínseco configurado anteriormente son 0x1e010100010000070010a5d4e80101010100c4db7bcb733e117c0b34ac96354b10d47e84a006b9e7e66a229d174e8ff2a06300ca9a3b00000000. También incluye un destinatario específico que deberá cambiar.

Una vez que se procesa la transacción, TargetAccount debería haber recibido el monto transferido menos una pequeña tarifa que se deduce para ejecutar el XCM en la cadena de destino. En las aplicaciones de Polkadot.js, puede verificar los eventos y extrínsecos relevantes en Moonbase Alpha y la cadena de retransmisión .

Precompilación de tokens X

El contrato de precompilación de X-Tokens permite a los desarrolladores acceder a las funciones de transferencia de tokens de XCM a través de la API de Ethereum de las redes basadas en Moonbeam. Al igual que con otros contratos de precompilación , la precompilación de X-Tokens se encuentra en las siguientes direcciones:

La interfaz de solidez de X-Tokens

Xtokens.sol es una interfaz a través de la cual los desarrolladores pueden interactuar con la plataforma X-Tokens utilizando la API de Ethereum.

La interfaz incluye las siguientes funciones:

  • transferencia ( dirección dirección_moneda , monto uint256 , destino de memoria de ubicación múltiple, peso uint64 ) : función que representa el método descrito en el ejemplo anterior. Sin embargo, en lugar de utilizar el ID de moneda, debe proporcionar la dirección XC-20 . La multilocalización se construye de una forma particular que se describe en el siguiente apartadotransfer
  • transfer_multiasset ( recurso de memoria multiubicación , monto uint256 , destino de memoria multiubicación , peso uint64 ): función que representa el método descrito en el ejemplo anterior. Ambos multilocales están construidos de una manera particular que se describe en la siguiente sección transferMultiasset

Creación de la multiubicación de precompilación

En la interfaz de precompilación de X-Tokens, la Multilocationestructura se define de la siguiente manera:

code" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; margin: 0px; padding: 0px; font-size: inherit; background: transparent; border: 0px; position: absolute; top: 0.5em; right: 0.5em; z-index: 1; width: 1.5em; height: 1.5em; color: var(--md-default-fg-color--lightest); border-radius: 0.1rem; cursor: pointer; transition: color 250ms ease 0s;"> struct Multilocation {
uint8 parents;
bytes [] interior;
}

Tenga en cuenta que cada ubicación múltiple tiene un parentselemento, definido en este caso por un uint8, y una matriz de bytes. Los padres se refieren a cuántos "saltos" en la dirección hacia arriba tienes que hacer si estás pasando por la cadena de relevos. Siendo un uint8, los valores normales que verías son:

La matriz de bytes ( bytes[]) define el interior y su contenido dentro de la multiubicación. El tamaño de la matriz define el interiorvalor de la siguiente manera:

Supongamos que la matriz de bytes contiene datos. El primer byte de cada elemento (2 números hexadecimales) corresponde al selector de ese XNcampo. Por ejemplo:

A continuación, según el selector y su tipo de datos, los siguientes bytes corresponden a los datos reales que se proporcionan. Tenga en cuenta que para AccountId32, AccountIndex64y AccountKey20, el networkcampo que se ve en el ejemplo de aplicaciones de Polkadot.js se agrega al final. Por ejemplo:

Nota

Por interiorlo general, los datos deben incluirse entre comillas. Por el contrario, es posible que obtenga un invalid tuple valueerror.

El siguiente fragmento de código repasa algunos ejemplos de Multilocationestructuras, ya que deberían introducirse en las funciones de precompilación de X-Tokens:

code" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; margin: 0px; padding: 0px; font-size: inherit; background: transparent; border: 0px; position: absolute; top: 0.5em; right: 0.5em; z-index: 1; width: 1.5em; height: 1.5em; color: var(--md-default-fg-color--light); border-radius: 0.1rem; cursor: pointer; transition: color 250ms ease 0s;">// Multilocation targeting the relay chain asset from a parachain
{
1, // parents = 1
[] // interior = here
}
// Multilocation targeting Moonbase Alpha DEV token from another parachain
{
1, // parents = 1
// Size of array is 2, meaning is an X2 interior
[
"0x00000003E8", // Selector Parachain, ID = 1000 (Moonbase Alpha)
"0x0403" // Pallet Instance = 3
]
}
// Multilocation targeting Alice's account on the Relay Chain from Moonbase Alpha
{
1, // parents = 0
// Size of array is 1, meaning is an X1 interior
[
"0x01c4db7bcb733e117c0b34ac96354b10d47e84a006b9e7e66a229d174e8ff2a06300"
// AccountKey32 Selector + Address in hex + Network = Any
]
}

--

--