On‑Ramp sem Atrito com zkLogin
Como eliminar o atrito da carteira, manter os usuários fluindo e prever o potencial de crescimento
E se seu aplicativo Web3 tivesse o mesmo fluxo de cadastro perfeito de um serviço Web2 moderno? Essa é a promessa central do zkLogin na blockchain Sui. Ele funciona como 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 então vincula de forma segura essa identidade Web2 a um endereço Sui on‑chain — sem pop‑ups de carteira, sem frases‑semente, sem churn de usuários.
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 um desanimador 17 % para um saudável 42 % após remover as barreiras tradicionais de carteira. Vamos detalhar como funciona e o que pode fazer pelo seu projeto.
Por que as Carteiras Matam a Conversão na Primeira Visita
Você construiu um dApp inovador, mas seu funil de aquisição de usuários está vazando. O culpado quase sempre é o mesmo: o botão “Conectar Carteira”. O onboarding padrão Web3 é um labirinto de instalações de extensões, avisos de frase‑semente e quizzes de jargões cripto.
É uma barreira enorme para iniciantes. Pesquisadores de UX observaram um abandono impressionante de 87 % no momento em que o prompt de carteira aparece. Em um experimento revelador, simplesmente redirecionar esse prompt para uma fase posterior do checkout elevou 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 Português Simples)
zkLogin contorna elegantemente o problema da carteira usando tecnologias que todo usuário de internet já confia. A mágica acontece nos bastidores em alguns passos rápidos:
- Par de Chaves Efêmero: Quando o usuário quer fazer login, um par de chaves temporário, de sessão única, é gerado localmente no navegador. Pense nisso como uma chave‑passe temporária, válida apenas para esta sessão.
- Dança OAuth: O usuário faz login com sua conta Google, Apple ou outra rede social. Seu app insere de forma inteligente um valor único (nonce) nessa solicitação de login.
- Serviço ZKP: Após o login bem‑sucedido, um serviço de ZKP (Zero‑Knowledge Proof) gera uma prova criptográfica. Essa prova confirma, “Este token OAuth autoriza o proprietário da chave‑passe temporária,” sem jamais revelar a identidade pessoal do usuário on‑chain.
- Derivar Endereço: O JWT (JSON Web Token) do provedor OAuth é combinado com um salt único para gerar determinísticamente o endereço Sui permanente do usuário. O salt permanece privado, seja no cliente ou em um backend seguro.
- Submeter Transação: Seu app assina transações com a chave temporária e anexa a prova ZK. Os validadores 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? Aqui está um guia rápido usando o SDK TypeScript. Os princípios são idênticos para Rust ou Python.
1. Instalar SDK
O pacote @mysten/sui
inclui todos os helpers zklogin
que você precisará.
pnpm add @mysten/sui
2. Gerar Chaves & Nonce
Primeiro, crie um par de chaves efêmero e um nonce ligado ao 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 OAuth
Construa a URL de login OAuth apropriada para o provedor que você está usando (por exemplo, Google, Facebook, Apple) e redirecione o usuário.
4. Decodificar JWT & Buscar Salt do Usuário
Depois que o usuário fizer login e for redirecionado de volta, capture o id_token
da URL. Use‑o para buscar o salt específico do usuário no seu backend e, então, derive o endereço Sui.
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 provedor e obtenha a prova ZK. Para desenvolvimento, você pode usar o provedor público da Mysten. Em produção, hospede seu próprio provedor ou use um serviço como Enoki.
const proof = await fetch('/api/prove', {
method:'POST',
body: JSON.stringify({ jwt, ... })
}).then(r => r.json());
6. Assinar & 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 automaticamente os zkLoginInputs
(a prova). ✨
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 ainda mais fluida, criptografe e armazene o par de chaves e o salt no IndexedDB ou local storage. Lembre‑se de rotacioná‑los a cada alguns epochs para melhorar a segurança.
Modelo de Projeção de KPIs
A diferença que o zkLogin traz não é apenas qualitativa; é quantificável. Compare um funil de onboarding típico com um alimentado por zkLogin:
Etapa do Funil | Típico com Prompt de Carteira | Com zkLogin | Delta |
---|---|---|---|
Landing → Sign‑in | 100 % | 100 % | – |
Sign‑in → Carteira Pronta | 15 % (instalação, frase‑semente) | 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 gera 10 000 visitantes únicos, isso equivale a 300 ações on‑chain no primeiro dia versus mais de 2 500.
Boas Práticas & Armadilhas
Para criar uma experiência ainda mais fluida, tenha estas dicas em mente:
- Use Transações Patrocinadas: Pague as taxas das primeiras transações dos seus usuários. Isso elimina todo o atrito e entrega um momento “aha” incrível.
- Manuseie os Salts com Cuidado: Alterar o salt de um usuário gera um novo endereço. Só faça isso se você controlar um caminho de recuperação confiável.
- Exponha o Endereço Sui: Após o cadastro, mostre aos usuários seu endereço on‑chain. Isso capacita usuários avançados a importá‑lo para uma carteira tradicional, se desejarem.
- Previna Loops de Atualização: Cache o JWT e o par de chaves efêmero até que expirem, evitando solicitar login repetidamente.
- Monitore a Latência do Provedor: Fique de olho no tempo de ida‑e‑volta da geração da prova. Se ultrapassar 2 segundos, considere hospedar um provedor regional para manter a experiência ágil.
Onde a BlockEden.xyz Agrega Valor
Enquanto o zkLogin aperfeiçoa o fluxo voltado ao usuário, escalar isso traz novos desafios de backend. É aí que a BlockEden.xyz entra.
- Camada API: Nossos nós RPC de alta taxa de transferência, roteados geograficamente, garantem que suas transações zkLogin sejam processadas com latência mínima, independentemente da localização do usuário.
- Observabilidade: Dashboards prontos para uso que monitoram métricas chave como latência de prova, razões de sucesso/falha e a saúde do seu funil de conversão.
- Conformidade: Para apps que fazem ponte para fiat, nosso módulo opcional de KYC oferece um on‑ramp compliance direto a partir da identidade verificada do usuário.
Pronto para Lançar?
A era dos fluxos de carteira engessados e intimidador acabou. Crie um sandbox zkLogin, conecte‑se ao endpoint de full‑node da BlockEden e veja seu gráfico de cadastros subir — enquanto seus usuários nunca precisam ouvir a palavra “carteira”. 😉