Saltar al contenido

Cómo crear una Dapp sin gas

Este blog explora cómo crear una dapp sin gas usando Permissionless.js y un contrato inteligente paymaster personalizado ERC-4337.

6 min de lectura
Cómo crear una Dapp sin gas

Cuando realizamos transacciones en una blockchain, ocurren muchos procesos en segundo plano. Cada uno de estos procesos tiene un costo, al que nos referimos como "Gas Cost". Pero, ¿qué es el Gas?

El Gas es una unidad que mide el trabajo computacional necesario para realizar transacciones o ejecutar smart contracts en una red blockchain, como Ethereum. El Gas es fundamental porque regula y prioriza las transacciones dentro de la red. Dado que las redes blockchain tienen una capacidad de procesamiento limitada, las gas fees cumplen dos propósitos clave:

  • Incentivar a los Validators o Miners: Las gas fees recompensan a los validators o miners por procesar y confirmar transacciones, garantizando que la red permanezca segura y operativa.

  • Prevenir el abuso del sistema: Al imponer un costo en cada operación, se desincentivan los ataques de spam y el uso malicioso de los recursos computacionales, protegiendo la red de posibles abusos.

Teniendo en cuenta que el gas es el "combustible" necesario para que una blockchain funcione, la idea de una dapp sin gas podría parecer contradictoria, como intentar conducir un coche sin combustible. Entonces, ¿cómo puede operar una blockchain sin gas?

En realidad, el gas no desaparece. En cambio, la responsabilidad de pagar las gas fees se traslada del usuario a otra parte, ya sea el proveedor de servicios o la propia dapp. Este enfoque permite a los usuarios interactuar con la dapp sin incurrir directamente en costos de gas, mejorando la experiencia del usuario y la accesibilidad.

Implementación de transacciones sin gas con ERC-4337 y el smart contract Paymasters

Normalmente, los usuarios son responsables de pagar las gas fees, que pueden incrementar el costo de sus transacciones en función del precio del gas. Sin embargo, en una dapp sin gas, la gas fee es cubierta por un tercero, quien firma y paga la transacción en nombre del usuario. Este tercero suele ser un relayer, aunque en algunos casos se utilizan mecanismos de account abstraction en su lugar.

Existen dos tipos de estándares utilizados para hacer posible una dapp sin gas: ERC-4337 y ERC-2771. Veámoslos más de cerca:

  • ERC-4337: Este estándar introduce la account abstraction, permitiendo que las cuentas de Ethereum se comporten como smart contracts. Ofrece mayor flexibilidad en la forma en que se inician y autorizan las transacciones, en particular al desacoplar el inicio de transacciones de las tradicionales Externally Owned Accounts (EOAs). Esto permite flujos de transacciones más complejos, como agrupar múltiples acciones en una sola transacción o habilitar wallets programables.

  • ERC-2771: Este estándar introduce un framework de meta-transacciones, que permite a los usuarios interactuar con dapps sin necesidad de tener ETH para pagar las gas fees directamente. Un forwarder de confianza gestiona la transacción en nombre del usuario, y la dapp reembolsa al forwarder por los costos de gas. Esto simplifica la incorporación de nuevos usuarios que no tienen ETH en sus wallets pero aun así desean interactuar con dapps.

En este caso, utilizaremos permissionless.js y ERC-4337 para crear un paymaster personalizado con cuentas que cubran la creación de clientes (clientes públicos y de Pimlico paymaster), la configuración de una smart account y la definición de lógica personalizada para el paymaster. Pero primero, entendamos qué es un paymaster.

Un paymaster es un smart contract especializado en el sistema de account abstraction de Ethereum (como ERC-4337). Actúa como patrocinador de las gas fees de las transacciones, permitiendo a los usuarios pagar con tokens distintos al ETH o incluso tener las fees cubiertas por completo. El paymaster decide si patrocinar el costo del gas basándose en lógica personalizada, proporcionando mayor flexibilidad para las dapps, donde el costo de la transacción puede ser gestionado por un tercero, facilitando el proceso para los usuarios sin que necesiten tener ETH.

  1. Primero, creemos un archivo utils/index.ts donde almacenaremos nuestro código.

  2. Crear el cliente público (opcional): este es el cliente de Pimlico paymaster que se utilizará para interactuar con el SimpleSmartAccount:

import { createPublicClient, http } from "viem";
import { createPimlicoClient } from "permissionless/clients/pimlico";
import { lineaSepolia } from "viem/chains";

export const publicClient = createPublicClient({
	chain: lineaSepolia,
	transport: http("<https://rpc.ankr.com/eth_sepolia>"),
})

const pimlicoUrl = <https://api.pimlico.io/v2/sepolia/rpc?apikey=${apiKey}>

export const pimlicoClient = createPimlicoClient({
	transport: http(pimlicoUrl),
	entryPoint: {
		address: entryPoint07Address,
		version: "0.7",
	},
})
Copiar
  1. Crear una cuenta: Puede ser cualquiera de las cuentas compatibles con permissionless.js o cuentas personalizadas que se ajusten a la interfaz. Para este ejemplo, utilizaremos una SimpleSmartAccount.

import { toSimpleSmartAccount } from "permissionless/accounts";
import { privateKeyToAccount } from "viem/accounts";

const simpleAccount = await toSimpleSmartAccount({
	client: publicClient,
	owner: privateKeyToAccount("YOUR_PRIVATE_KEY"),
	entryPoint: {
		address: entryPoint07Address,
		version: "0.7",
	}
})
Copiar
  1. Crear el cliente de Smart Account con lógica de paymaster personalizada: Al crear el smartAccountClient, podemos pasar una función sponsorUserOperation que se llamará antes de que una operación de usuario sea firmada y enviada. Esta función debe devolver los campos paymasterAndData, preVerificationGas, verificationGasLimit y callGasLimit.

import { createSmartAccountClient } from "permissionless";
import { lineaSepolia } from "viem/chains";

const smartAccountClient = createSmartAccountClient({
	account,
	chain: lineaSepolia,
	bundlerTransport: http(pimlicoUrl),
	paymaster: pimlicoClient,
	userOperation: {
		estimateFeesPerGas: async () => {
			return (await pimlicoClient.getUserOperationGasPrice()).fast
		},
	}
})
Copiar
  1. Enviar una transacción: Ahora puedes enviar transacciones de forma normal. La función sponsorUserOperation se llamará antes de que cada transacción sea firmada y enviada, aplicando la lógica de paymaster personalizada que hayas configurado.

const txHash = await smartAccountClient.sendTransaction({
	to: "YOUR_CONTRACT_ADDRESS",
	value: parseEther("0.1")
});
Copiar

Hemos configurado una smart account integrada con lógica de paymaster personalizada utilizando permissionless.js y el cliente de Pimlico. Esta configuración permite una interacción fluida con la blockchain mientras automatiza las gas fees y la gestión de transacciones a través del paymaster. Ahora es tu turno de probarlo.

Consideraciones de seguridad para dapps sin gas

1. Relayers y paymasters de confianza: Dado que las dapps sin gas dependen de relayers o paymasters de terceros para gestionar las transacciones en nombre de los usuarios, es fundamental asegurarse de que estas entidades sean de confianza y seguras. Un relayer malicioso o comprometido podría alterar o bloquear transacciones. Utiliza servicios de reputación reconocida e implementa mecanismos de respaldo en caso de que el relayer falle.

2. Integridad de las transacciones: Al utilizar un relayer, la transacción podría ser firmada por el relayer en nombre del usuario. Asegúrate de que el relayer no altere la transacción de ninguna manera maliciosa antes de enviarla a la blockchain. Verifica que el smart contract o la lógica confirme que los detalles de la transacción (por ejemplo, dirección de destino, valor) coincidan con lo que el usuario pretendía.

3. Seguridad de la lógica del paymaster: Dado que el paymaster determina si patrocinar las gas fees basándose en lógica personalizada, asegúrate de que esta lógica sea segura y no permita que partes no autorizadas exploten el paymaster para ejecutar transacciones gratuitas. Implementa reglas y controles sólidos para evitar abusos o patrocinios no deseados de transacciones.

4. Auditorías de smart contracts: Las dapps sin gas suelen involucrar smart contracts complejos para la account abstraction o las meta-transacciones. Audita regularmente los smart contracts en busca de vulnerabilidades de seguridad, ya que estos contratos gestionan el flujo de transacciones y las fees. Las vulnerabilidades en los contratos podrían dar lugar a posibles exploits donde los atacantes manipulen los flujos de transacciones.

5. Manipulación del precio del gas: En una dapp sin gas, donde un paymaster cubre las gas fees, los atacantes podrían intentar manipular los precios del gas para aumentar los costos que asume el paymaster. Incluye salvaguardas en la lógica del paymaster para limitar las gas fees y rechazar operaciones excesivamente costosas.

6. Almacenamiento seguro de claves privadas: Al utilizar soluciones como permissionless.js o Pimlico, asegúrate de que las claves privadas utilizadas para firmar transacciones se almacenen de forma segura. Nunca codifiques claves privadas directamente en tu aplicación y considera el uso de entornos seguros como hardware wallets o enclaves seguros para la gestión de claves.

Descubriendo el potencial de las dapps sin gas

Las dapps sin gas son una forma innovadora de mejorar la experiencia del usuario en las dapps al trasladar las gas fees a un tercero. Mediante el uso de estándares como ERC-4337, los desarrolladores pueden crear aplicaciones más flexibles y fáciles de usar que reducen las barreras de entrada para los nuevos usuarios.

Los fragmentos de código proporcionados demuestran cómo implementar transacciones sin gas utilizando permissionless.js, clientes de Pimlico y lógica de paymaster personalizada. Siguiendo estos pasos, puedes crear dapps que simplifiquen la interacción con la blockchain, haciéndola más accesible para un público más amplio. ¡Ahora es tu turno de construir y explorar el potencial de las dapps sin gas!

Traducido por IA. Puede contener errores. Por favor, verifique siempre la información.

Califica la traducción

Este artículo fue escrito por: