Uso de Pallet X-Tokens para enviar XC-20
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
parents
y aninterior
. 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 ID1000
de 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,
SelfReserve
se refiere al token nativo yOtherReserve
se 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
feeItem
serí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 transfer
y 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 xcUNIT
tokens 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 DEV
tokens (el token nativo de Moonbase Alpha) en Moonbeam-Swap , un clon de demostración de Uniswap-V2 en Moonbase Alpha.
Para consultar tu xcUNIT
saldo, 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 xcUNIT
desde 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:
- Seleccione la cuenta desde la que desea enviar el XCM
- Elija la paleta xTokens
- Elija la transferencia extrínseca
- Establezca el ID de moneda en OtherReserve . Esto se debe a que no está transfiriendo tokens DEV ( SelfReserve )
- Ingrese la identificación del activo. Para este ejemplo,
xcUNIT
tiene una identificación de activo de42259045809535163221576417993425387648
. Puede verificar todos los ID de activos disponibles en la sección de dirección XC-20 - Establece el número de tokens a enviar. Para este ejemplo, está enviando 1
xcUNIT
, pero debe tener en cuenta los 12 decimales dexcUNIT
. Para saber cuántos decimales tiene un token XC-20, puedes consultar sus metadatos - 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 100000000
unidades de peso. A transfer
consta de 4 instrucciones XCM, por lo que un peso de destino de 400000000
deberí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 xcUNIT
desde Moonbase Alpha a su cadena de retransmisión mediante la transferMultiasset
funció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:
- Seleccione la cuenta desde la que desea enviar el XCM
- Elija la paleta xTokens
- Elige la transferenciaMultiactivo extrínseco
- Para definir la multiubicación de activos XCM, debe apuntar
UNIT
en 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 100000000
unidades de peso. A transferMultiasset
consta de 4 instrucciones XCM, por lo que un peso de destino de 400000000
deberí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 apartado
transfer
- 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 Multilocation
estructura 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 parents
elemento, 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 interior
valor 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 XN
campo. 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
, AccountIndex64
y AccountKey20
, el network
campo que se ve en el ejemplo de aplicaciones de Polkadot.js se agrega al final. Por ejemplo:
Nota
Por
interior
lo general, los datos deben incluirse entre comillas. Por el contrario, es posible que obtenga uninvalid tuple value
error.
El siguiente fragmento de código repasa algunos ejemplos de Multilocation
estructuras, 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
]
}