Cómo construir un servidor de retransmisión de transacciones
Aprenda cómo construir un servidor de retransmisión de transacciones con Sequence, permitiendo que su servidor envíe transacciones en nombre de los usuarios de manera fluida.
Con Sequence, puedes crear un smart contract wallet que tu servidor puede usar para enviar transacciones para tus usuarios sin tener que preocuparte por la velocidad de las transacciones, el rendimiento o los reorgs.
La única diferencia respecto al uso de un wallet Sequence típico al enviar transacciones a la blockchain, es que a nivel de smart contract el msg.sender
es una de las direcciones de wallet de Sequence Relayers. Para los contratos estándar de Sequence Builder, esto no es un problema cuando se combina con una solicitud a la Transactions API de relayed transactions.
Por defecto, las transacciones de Sequence se ejecutan de forma secuencial.
Los siguientes pasos te guiarán para crear tu servidor y mintear coleccionables a una dirección de wallet:
- Configuración del entorno con Express Server: Cree un servidor basado en NodeJs usando la librería Express para aceptar solicitudes HTTP
- Gestión de proyecto y clave de acceso: Solicite una clave de acceso pública para interactuar con el stack de Sequence
- Despliegue del contrato de coleccionables: Despliegue un contrato de coleccionables para poder enviar transacciones a la blockchain y mintear tokens a una dirección de wallet
- Construcción de un relayer patrocinado con la Transactions API: Cree una función para usar en una ruta de Express que llame a la Transactions API de Sequence desde un contrato patrocinado
Funciones adicionales:
- (Opcional) Retransmisión con moneda propia de la wallet: Crea una función para usar en una ruta de Express que llame a la Transactions API de Sequence y pague usando una moneda que posee la wallet
- (Opcional) Retransmisión de transacciones en paralelo: Realiza agrupación de transacciones para enviar una moneda
Configuración del entorno con Express Server
Asegúrate de tener instalado pnpm
(u otro gestor de paquetes de Node) con el siguiente comando:
Luego, clone el siguiente código de plantilla de express
Express es un framework minimalista y flexible para aplicaciones web en Node.js que ofrece un conjunto robusto de funciones para aplicaciones web y móviles, y será utilizado en esta guía.
Una vez que el código esté en su máquina local, ejecute su servidor y cliente con el siguiente comando:
Dentro del código hay una ruta llamada /mint
que puede llamarse desde la CLI para pruebas.
Pruebe con este ejemplo de solicitud curl:
Debería ver la siguiente salida:
Gestión de proyecto y clave de acceso
Primero, siga esta guía para aprender cómo registrarse en Sequence Builder y cómo crear un proyecto.
Luego, para usar la Transactions API, deberá actualizar su facturación a Developer
, lo cual puede hacer siguiendo esta guía.
Finalmente, se requiere una Public Access Key
para la Transactions API, que puede obtener siguiendo esta guía.
Por último, actualice el archivo .env.example
a .env
con lo siguiente:
Despliegue del contrato de coleccionables
Siga esta guía para desplegar un contrato de coleccionables.
Si está usando una red que no es testnet y necesita patrocinar su contrato, puede hacerlo siguiendo esta guía
Finalmente, actualice el archivo .env
con su contrato de coleccionables desplegado:
Construya un relayer patrocinado con la Transactions API
El código completo para esta sección se encuentra aquí
Primero, usando el código de plantilla proporcionado en el paso #1, necesitaremos agregar algunos paquetes
Luego, su servidor necesitará una wallet EOA que pueda firmar mensajes. Será la propietaria de su wallet Sequence del lado del servidor, la cual se usará para enviar transacciones.
Abrir una sesión puede desencadenar una migración de su wallet Sequence a una nueva versión, esto podría ser de v1
a v2
o de v2
a versiones futuras.
La migración es un proceso irreversible; una vez que su wallet es migrada, no puede volver a una versión anterior.
Para detectar cualquier migración no deseada, puede usar el callback onMigration
.
Para implementar la función callContract
, incluya el siguiente código que utiliza un único firmante para retransmitir transacciones:
Por último, actualice el archivo .env
con una clave privada para una wallet que puede generarse desde esta aplicación (solo para fines de demostración). Para producción, recomendamos generar claves privadas de forma segura y local en su computadora usando este script de ejemplo.
Luego, actualice la variable PKEY
con la clave:
Otorgar el rol MINTER_ROLE a la dirección de la wallet relayer
Debe actualizar el acceso por roles del contrato en el Builder para que solo reciba solicitudes desde la dirección de la wallet minter.
Puede hacer esto en Sequence Builder otorgando el minter permission
a su Sequence Wallet Transactions API Address
.
Para hacerlo, abra su proyecto, navegue a la página de Contracts
, seleccione sus Linked contracts
y, en la pestaña Write Contract
, expanda el método grantRole
.
Complete con los siguientes datos:
bytes32 role
: 0x9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6
address account
: <Generated Sequence Transactions API Wallet Address>
Donde el valor de role
ingresado es el resultado de keccak256("MINTER_ROLE")
en solidity o ethers.solidityPackedKeccak256(ethers.toUtf8Bytes("MINTER_ROLE"))
en javascript
Esto hace que solo su dirección específica pueda mintear desde el contrato; de lo contrario, dará error.
Complete la actualización del rol haciendo clic en write
y firme la transacción patrocinada.
Su aplicación ya está lista para que envíe una transacción de prueba desde el frontend del cliente iniciando sesión en su wallet y haciendo clic en mintear.
¡Pruébelo!
No olvide actualizar la clave de acceso en el cliente en la función initWallet
(Opcional) Relevo con moneda propia de la wallet
También puede forzar una forma específica de pagar las tarifas de gas:
(Opcional) Relevo de transacciones en paralelo
Si desea enviar múltiples transacciones independientes sin necesidad de agruparlas, también puede enviarlas en espacios de nonce distintos.
Usar espacios de nonce distintos para sus transacciones le indica a la Transactions API que no hay dependencia entre ellas y que pueden ejecutarse en la blockchain en cualquier orden.
Esto permite que las transacciones se envíen de inmediato, sin búfer, sin tener que esperar a un lote completo.
Aquí hay un ejemplo de cómo hacerlo: