Pular para o conteúdo

Como criar um Dapp sem gas

Este blog explora como criar um dapp sem gas usando Permissionless.js e contrato inteligente paymaster personalizado ERC-4337.

6 min de leitura
Como criar um Dapp sem gas

Quando realizamos transações em uma blockchain, muitos processos ocorrem nos bastidores. Cada um desses processos tem um custo, que chamamos de "Gas Cost". Mas o que é Gas?

Gas é uma unidade que mede o trabalho computacional necessário para realizar transações ou executar smart contracts em uma rede blockchain, como o Ethereum. O Gas é fundamental porque regula e prioriza as transações dentro da rede. Como as redes blockchain têm capacidade de processamento limitada, as taxas de gas cumprem dois objetivos principais:

  • Incentivar Validadores ou Mineradores: As taxas de gas recompensam validadores ou mineradores por processar e confirmar transações, garantindo que a rede permaneça segura e operacional.

  • Prevenir abusos do sistema: Ao impor um custo a cada operação, desestimula ataques de spam e o uso malicioso de recursos computacionais, protegendo a rede de possíveis abusos.

Considerando que o gas é o "combustível" necessário para o funcionamento de uma blockchain, a ideia de um dapp sem gas pode parecer contraditória — como tentar rodar um carro sem combustível. Então, como uma blockchain pode operar sem gas?

Na prática, o gas não desaparece. O que muda é a responsabilidade pelo pagamento das taxas de gas, que deixa de ser do usuário e passa para outra parte — seja o provedor de serviços ou o próprio dapp. Essa abordagem permite que os usuários interajam com o dapp sem arcar diretamente com os custos de gas, melhorando a experiência do usuário e a acessibilidade.

Implementando transações sem gas com ERC-4337 e o smart contract Paymaster

Normalmente, os usuários são responsáveis pelo pagamento das taxas de gas, que podem aumentar o custo de suas transações com base no preço do gas. Em um dapp sem gas, porém, a taxa de gas é coberta por um terceiro, que assina e paga pela transação em nome do usuário. Esse terceiro geralmente é um relayer, embora em alguns casos sejam utilizados mecanismos de account abstraction.

Existem dois tipos de padrões usados para viabilizar um dapp sem gas: ERC-4337 e ERC-2771. Vamos analisá-los mais de perto:

  • ERC-4337: Este padrão introduz a account abstraction, permitindo que contas Ethereum se comportem como smart contracts. Ele possibilita maior flexibilidade na forma como as transações são iniciadas e autorizadas, especialmente ao desacoplar o início das transações das tradicionais Externally Owned Accounts (EOAs). Isso permite fluxos de transação mais complexos, como agrupar múltiplas ações em uma única transação ou habilitar carteiras programáveis.

  • ERC-2771: Este padrão introduz um framework de meta-transações, permitindo que usuários interajam com dapps sem precisar de ETH para pagar as taxas de gas diretamente. Um forwarder confiável processa a transação em nome do usuário, e o dapp reembolsa o forwarder pelos custos de gas. Isso simplifica o onboarding de novos usuários que não possuem ETH em suas carteiras, mas ainda desejam interagir com dapps.

Neste caso, utilizaremos o permissionless.js e o ERC-4337 para criar um paymaster personalizado com contas que cobrem a criação de clientes (clientes públicos e clientes Pimlico paymaster), a configuração de uma smart account e a definição de lógica personalizada para o paymaster. Mas primeiro, vamos entender o que é um paymaster.

Um paymaster é um smart contract especializado no sistema de account abstraction do Ethereum (como o ERC-4337). Ele atua como patrocinador das taxas de gas de transações, permitindo que os usuários paguem com tokens diferentes de ETH ou até tenham as taxas totalmente cobertas. O paymaster decide se vai patrocinar o custo de gas com base em uma lógica personalizada, oferecendo mais flexibilidade para dapps, onde o custo da transação pode ser gerenciado por um terceiro, tornando o processo mais simples para os usuários sem que precisem manter ETH.

  1. Primeiro, vamos criar um arquivo utils/index.ts onde armazenaremos nosso código.

  2. Criar o cliente público (opcional): este é o cliente Pimlico paymaster que será usado para interagir com o 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. Criar uma conta: pode ser qualquer uma das contas suportadas pelo permissionless.js ou contas personalizadas que estejam em conformidade com a interface. Para este exemplo, usaremos uma 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. Criar o cliente de Smart Account com lógica de paymaster personalizada: ao criar o smartAccountClient, podemos passar uma função sponsorUserOperation que será chamada antes de uma operação do usuário ser assinada e enviada. Essa função deve retornar os campos paymasterAndData, preVerificationGas, verificationGasLimit e 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 uma transação: agora você pode enviar transações normalmente. A função sponsorUserOperation será chamada antes de cada transação ser assinada e enviada, aplicando a lógica de paymaster personalizada que você definiu.

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

Configuramos uma smart account integrada com lógica de paymaster personalizada usando permissionless.js e o cliente Pimlico. Essa configuração permite uma interação fluida com a blockchain, automatizando as taxas de gas e o gerenciamento de transações por meio do paymaster. Agora é hora de você experimentar.

Considerações de segurança para dapps sem gas

1. Relayers e paymasters confiáveis: Como os dapps sem gas dependem de relayers ou paymasters de terceiros para processar transações em nome dos usuários, é fundamental garantir que essas entidades sejam confiáveis e seguras. Um relayer malicioso ou comprometido poderia alterar ou bloquear transações. Utilize serviços de boa reputação e implemente mecanismos de fallback caso o relayer falhe.

2. Integridade das transações: Ao usar um relayer, a transação pode ser assinada por ele em nome do usuário. Certifique-se de que o relayer não altere a transação de forma maliciosa antes de enviá-la à blockchain. Garanta que o smart contract ou a lógica verifique se os detalhes da transação (por exemplo, endereço de destino, valor) correspondem ao que o usuário pretendia.

3. Segurança da lógica do paymaster: Como o paymaster determina se vai patrocinar as taxas de gas com base em uma lógica personalizada, certifique-se de que essa lógica seja segura e não permita que partes não autorizadas explorem o paymaster para executar transações gratuitas. Implemente regras e verificações robustas para evitar abusos ou patrocínio não intencional de transações.

4. Auditorias de smart contracts: Dapps sem gas frequentemente envolvem smart contracts complexos para account abstraction ou meta-transações. Realize auditorias regulares nos smart contracts em busca de vulnerabilidades de segurança, pois esses contratos gerenciam o fluxo de transações e as taxas. Vulnerabilidades nos contratos podem levar a possíveis exploits em que atacantes manipulam os fluxos de transação.

5. Manipulação do preço do gas: Em um dapp sem gas, onde um paymaster cobre as taxas de gas, atacantes podem tentar manipular os preços do gas para aumentar os custos suportados pelo paymaster. Inclua salvaguardas na lógica do paymaster para limitar as taxas de gas e rejeitar operações excessivamente custosas.

6. Armazenamento seguro de chaves privadas: Ao usar soluções como permissionless.js ou Pimlico, certifique-se de que as chaves privadas usadas para assinar transações sejam armazenadas com segurança. Nunca insira chaves privadas diretamente no código da sua aplicação e considere o uso de ambientes seguros, como hardware wallets ou enclaves seguros, para o gerenciamento de chaves.

Desbloqueando o potencial dos dapps sem gas

Os dapps sem gas são uma forma inovadora de aprimorar a experiência do usuário em dapps, transferindo as taxas de gas para um terceiro. Ao utilizar padrões como o ERC-4337, os desenvolvedores podem criar aplicações mais flexíveis e amigáveis que reduzem as barreiras de entrada para novos usuários.

Os trechos de código fornecidos demonstram como implementar transações sem gas usando permissionless.js, clientes Pimlico e lógica de paymaster personalizada. Seguindo esses passos, você pode criar dapps que simplificam a interação com a blockchain, tornando-a mais acessível a um público mais amplo. Agora é a sua vez de construir e explorar o potencial dos dapps sem gas!

Traduzido por IA. Pode conter erros. Por favor, verifique sempre as informações.

Avalie a tradução

Este artigo foi escrito por: