On-Ramp Sem Fricção com zkLogin
Como eliminar o atrito da carteira, manter o fluxo de usuários e prever o potencial de crescimento
E se o seu aplicativo Web3 tivesse o mesmo fluxo de inscrição simplificado de um serviço Web2 moderno? Essa é a promessa central do zkLogin na blockchain Sui. Ele funciona como um OAuth para Sui, permitindo que os usuários façam login com contas familiares do Google, Apple, X e outras. Uma prova de conhecimento zero (zero-knowledge proof) vincula de forma segura essa identidade Web2 a um endereço Sui on-chain — sem pop-ups de carteira, sem frases de recuperação (seed phrases), sem rotatividade de usuários (churn).
O impacto é real e imediato. Com centenas de milhares de contas zkLogin já ativas, estudos de caso relatam ganhos massivos na conversão de usuários, saltando de meros 17 % para saudáveis 42 % após a remoção das barreiras tradicionais de carteira. Vamos detalhar como isso funciona e o que pode fazer pelo seu projeto.
Por que as Carteiras Matam a Conversão de Novos Usuários
Você construiu um dApp inovador, mas seu funil de aquisição de usuários está com vazamentos. O culpado é quase sempre o mesmo: o botão "Conectar Carteira" (Connect Wallet). O onboarding padrão da Web3 é um labirinto de instalações de extensões, avisos de frases de recuperação e questionários de jargão cripto.
É uma barreira massiva para os recém-chegados. Pesquisadores de UX observaram uma queda impressionante de 87 % no momento em que um aviso de carteira aparecia. Em um experimento revelador, simplesmente redirecionar esse aviso para um estágio posterior no processo de checkout aumentou a taxa de conclusão para 94 %. Mesmo para usuários curiosos sobre cripto, o medo principal é: "Posso perder meus fundos se clicar no botão errado." Remover esse único passo intimidador é a chave para desbloquear um crescimento exponencial.
Como o zkLogin Funciona (em Linguagem Simples)
O zkLogin contorna elegantemente o problema da carteira usando tecnologias em que todos os usuários da Internet já confiam. A mágica acontece nos bastidores em alguns passos rápidos:
- Par de Chaves Efêmeras: Quando um usuário deseja fazer login, um par de chaves temporário de sessão única é gerado localmente em seu navegador. Pense nisso como uma chave de acesso temporária, válida apenas para esta sessão.
- Dança do OAuth: O usuário faz login com sua conta do Google, Apple ou outra conta social. Seu aplicativo incorpora de forma inteligente um valor exclusivo (nonce) nesta solicitação de login.
- Serviço ZKP: Após um login bem-sucedido, um serviço ZKP (Zero-Knowledge Proof) gera uma prova criptográfica. Esta prova confirma: "Este token OAuth autoriza o proprietário da chave de acesso temporária", sem nunca revelar a identidade pessoal do usuário on-chain.
- Derivar Endereço: O JWT (JSON Web Token) do usuário, fornecido pelo provedor OAuth, é combinado com um salt exclusivo para gerar deterministicamente seu endereço Sui permanente. O salt é mantido privado, seja no lado do cliente ou em um backend seguro.
- Enviar Transação: Seu aplicativo assina transações with a chave temporária e anexa a prova ZK. Os validadores da Sui verificam a prova on-chain, confirmando a legitimidade da transação sem que o usuário precise de uma carteira tradicional.
Guia de Integração Passo a Passo
Pronto para implementar isso? Aqui está um guia rápido usando o SDK do TypeScript. Os princípios são idênticos para Rust ou Python.
1. Instalar o SDK
O pacote @mysten/sui inclui todos os utilitários de zklogin que você precisará.
pnpm add @mysten/sui
2. Gerar Chaves e Nonce
Primeiro, crie um par de chaves efêmero e um nonce vinculado à época (epoch) atual na rede Sui.
const keypair = new Ed25519Keypair();
const { epoch } = await suiClient.getLatestSuiSystemState();
const nonce = generateNonce(keypair.getPublicKey(), Number(epoch) + 2, generateRandomness());
3. Redirecionar para o OAuth
Construa a URL de login OAuth apropriada para o provedor que você está usando (ex: Google, Facebook, Apple) e redirecione o usuário.
4. Decodificar JWT e Buscar Salt do Usuário
Após o login e o redirecionamento de volta, obtenha o id_token da URL. Use-o para buscar o salt específico do usuário em seu backend e, em seguida, derive o endereço Sui dele.
const jwt = new URLSearchParams(window.location.search).get('id_token')!;
const salt = await fetch('/api/salt?jwt=' + jwt).then(r => r.text());
const address = jwtToAddress(jwt, salt);
5. Solicitar Prova ZK
Envie o JWT para um serviço de prova (prover service) para obter a prova ZK. Para desenvolvimento, você pode usar o provador público da Mysten. Em produção, você deve hospedar o seu próprio ou usar um serviço como o Enoki.
const proof = await fetch('/api/prove', {
method: 'POST',
body: JSON.stringify({ jwt, ... })
}).then(r => r.json());
6. Assinar e Enviar
Agora, construa sua transação, defina o remetente como o endereço zkLogin do usuário e execute-a. O SDK cuida de anexar os zkLoginInputs (a prova) automaticamente. ✨
const tx = new TransactionBlock();
tx.moveCall({ target: '0x2::example::touch_grass' }); // Qualquer chamada Move
tx.setSender(address);
tx.setGasBudget(5_000_000);
await suiClient.signAndExecuteTransactionBlock({
transactionBlock: tx,
zkLoginInputs: proof // A mágica acontece aqui
});
7. Persistir Sessão
Para uma experiência de usuário mais fluida, criptografe e armazene o par de chaves e o salt no IndexedDB ou no armazenamento local (local storage). Lembre-se de rotacioná-los a cada poucas épocas para maior segurança.
Modelo de Projeção de KPI
A diferença que o zkLogin faz não é apenas qualitativa; é quantificável. Compare um funil de integração típico com um potencializado pelo zkLogin:
| Estágio do Funil | Típico com Popup de Carteira | Com zkLogin | Delta |
|---|---|---|---|
| Landing → Login | 100 % | 100 % | – |
| Login → Carteira Pronta | 15 % (instalação, seed phrase) | 55 % (login social) | +40 pp |
| Carteira Pronta → Primeira Tx | ~23 % | ~90 % | +67 pp |
| Conversão Geral de Tx | ~3 % | ≈ 25‑40 % | ~8‑13× |
👉 O que isso significa: Para uma campanha que atrai 10.000 visitantes únicos, essa é a diferença entre 300 ações on-chain no primeiro dia e mais de 2.500.
Melhores Práticas e Pontos de Atenção
Para criar uma experiência ainda mais fluida, mantenha estas dicas profissionais em mente:
- Use Transações Patrocinadas: Pague pelas taxas das primeiras transações dos seus usuários. Isso remove todo o atrito e proporciona um momento "aha" incrível.
- Manipule os Salts com Cuidado: Alterar o salt de um usuário gerará um novo endereço. Só faça isso se você controlar um caminho de recuperação confiável para eles.
- Exponha o Endereço Sui: Após o cadastro, mostre aos usuários o endereço on-chain deles. Isso permite que usuários avançados o importem para uma carteira tradicional mais tarde, se desejarem.
- Evite Loops de Atualização: Armazene em cache o JWT e o par de chaves efêmeras até que expirem para evitar pedir ao usuário que faça login repetidamente.
- Monitore a Latência do Provador: Fique de olho no tempo de ida e volta da geração da prova. Se exceder 2 segundos, considere hospedar um provador regional para manter as coisas rápidas.
Onde o BlockEden.xyz Agrega Valor
Embora o zkLogin aperfeiçoe o fluxo voltado para o usuário, escalá-lo introduz novos desafios de backend. É aí que o BlockEden.xyz entra.
- Camada de API: Nossos nós RPC de alto rendimento e roteamento geográfico garantem que suas transações zkLogin sejam processadas com latência mínima, independentemente da localização do usuário.
- Observabilidade: Obtenha painéis prontos para uso para acompanhar métricas importantes como latência de prova, taxas de sucesso/falha e a integridade do seu funil de conversão.
- Conformidade: Para aplicativos que fazem a ponte para moedas fiduciárias, nosso módulo opcional de KYC fornece um on-ramp em conformidade diretamente da identidade verificada do usuário.
Pronto para Lançar?
A era dos fluxos de carteira desajeitados e intimidadores acabou. Ative um sandbox zkLogin, conecte o endpoint de full-node da BlockEden e veja seu gráfico de cadastros subir — enquanto seus usuários nem precisam ouvir a palavra “carteira”. 😉