Saltar para o conteúdo principal

On-Ramp Sem Fricção com zkLogin

· 7 min de leitura
Dora Noda
Software Engineer

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:

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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 FunilTípico com Popup de CarteiraCom zkLoginDelta
Landing → Login100 %100 %
Login → Carteira Pronta15 % (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”. 😉