Mover ganchos IBC
Descripción general
El gancho Move es un middleware IBC que se utiliza para permitir que las transferencias de tokens ICS-20 inicien llamadas de contrato. Esto permite llamadas de contratos entre cadenas, que implican movimiento de tokens. Esto es útil para una variedad de casos de uso. Uno de primordial importancia son los intercambios entre cadenas, que es una primitiva extremadamente poderosa.
El mecanismo que permite esto es un memo
campo en cada paquete de transferencia ICS20 e ICS721 a partir de IBC v3.4.0 . Move Hooks es un middleware IBC que analiza una transferencia ICS20 y, si el memo
campo tiene una forma particular, ejecuta una llamada de contrato Move. Ahora detallamos el memo
formato de las llamadas de contrato Move y las garantías de ejecución proporcionadas.
Mover formato de ejecución de contrato
Antes de explorar el formato de metadatos de IBC, es fundamental comprender el formato de datos de enlace. El movimiento MsgExecute
se define aquí y otros tipos se definen aquí como el siguiente tipo:
Así que detallamos de dónde queremos obtener cada uno de estos campos:
Sender
: No podemos confiar en el remitente de un paquete IBC, la cadena contraparte tiene plena capacidad de mentir al respecto. No podemos arriesgarnos a que este remitente sea confundido con un usuario o dirección de módulo en particular en Initia. Entonces reemplazamos el remitente con una cuenta para representar al remitente con el prefijo del canal y un prefijo del módulo Move. Esto se hace configurando el remitente enBech32(Hash(Hash("ibc-move-hook-intermediary") + channelID/sender))
, donde channelId es la identificación del canal en la cadena local.ModuleAddress
: Este campo debe obtenerse directamente de los metadatos del paquete ICS-20.ModuleName
: Este campo debe obtenerse directamente de los metadatos del paquete ICS-20.FunctionName
: Este campo debe obtenerse directamente de los metadatos del paquete ICS-20.TypeArgs
: Este campo debe obtenerse directamente de los metadatos del paquete ICS-20.Args
: Este campo debe obtenerse directamente de los metadatos del paquete ICS-20.
Entonces nuestro mensaje de movimiento construido que ejecutamos se verá así:
Estructura del paquete ICS20
Entonces, dados los detalles anteriores, propagamos la estructura de datos del paquete ICS20 implícita. ICS20 es JSON nativo, por lo que usamos JSON para el formato de nota.
Un paquete ICS20 tiene el formato correcto para los ganchos de movimiento si se cumple lo siguiente:
memo
no esta en blancomemo
es JSON válidomemo
tiene al menos una clave, con valor"move"
memo["move"]["message"]
tiene exactamente cinco entradas,"module_address"
,"module_name"
,"function_name"
y"type_args""args"
receiver
== "" ||receiver
== "dirección_del_módulo::nombre_del_módulo::nombre_de_la_función"
Consideramos que un paquete ICS20 está dirigido a movehooks si se cumple todo lo siguiente:
memo
no esta en blancomemo
es JSON válidomemo
tiene al menos una clave, con nombre"move"
Si un paquete ICS20 no está dirigido a movehooks, movehooks no hace nada. Si un paquete ICS20 se dirige hacia movehooks y tiene un formato incorrecto, movehooks devuelve un error.
Flujo de ejecución
Ganchos previos al movimiento:
Asegúrese de que el paquete IBC entrante sea criptográficamente válido
Asegúrese de que el paquete IBC entrante no haya agotado el tiempo de espera.
En ganchos de movimiento, ejecución previa del paquete:
Asegúrese de que el paquete esté formateado correctamente (como se define anteriormente)
Edite el receptor para que sea la cuenta del módulo IBC codificada
En los ganchos de movimiento, publique la ejecución del paquete:
Construir mensaje de movimiento como se definió antes
Ejecutar mensaje de movimiento
si el mensaje de movimiento tiene error, devuelve ErrAck
de lo contrario, continúe a través del middleware
Devolución de llamada asíncrona
Es posible que un contrato que envía una transferencia IBC necesite escuchar el ACK de ese paquete. Para permitir que los contratos escuchen el acuse de recibo de paquetes específicos, proporcionamos devoluciones de llamada de acuse de recibo. El contrato que desea recibir una devolución de llamada debe implementar dos funciones.
ibc_ack
ibc_timeout
Copiar
Además, cuando un contrato realiza una solicitud de transferencia de IBC, debe proporcionar datos de devolución de llamada asíncronos a través del campo de nota.
memo['move']['async_callback']['id']
: la identificación de devolución de llamada asíncrona se asigna desde el contrato. luego se pasará como argumento deibc_ack
yibc_timeout
.memo['move']['async_callback']['module_address']
: La dirección del módulo que define la función de devolución de llamada.memo['move']['async_callback']['module_name']
: El nombre del módulo que define la función de devolución de llamada.
Conclusión
El gancho Move representa un avance en la interoperabilidad, ya que permite funcionalidades fluidas entre cadenas y mejora la utilidad de las transferencias de tokens. Al aprovechar el gancho Move, los desarrolladores pueden iniciar interacciones contractuales complejas en diferentes cadenas, fomentando nuevos casos de uso y aplicaciones. Este desarrollo no solo simplifica las barreras técnicas previamente asociadas con las comunicaciones entre cadenas, sino que también allana el camino para ecosistemas blockchain más integrados y eficientes. A medida que esta tecnología madure, sin duda desbloqueará un mayor potencial para aplicaciones descentralizadas, contribuyendo a una adopción más amplia y a la eficacia operativa de las tecnologías blockchain.
Last updated