Futuros
Aceda a centenas de contratos perpétuos
TradFi
Ouro
Plataforma de ativos tradicionais globais
Opções
Hot
Negoceie Opções Vanilla ao estilo europeu
Conta Unificada
Maximize a eficiência do seu capital
Negociação de demonstração
Introdução à negociação de futuros
Prepare-se para a sua negociação de futuros
Eventos de futuros
Participe em eventos para recompensas
Negociação de demonstração
Utilize fundos virtuais para experimentar uma negociação sem riscos
Lançamento
CandyDrop
Recolher doces para ganhar airdrops
Launchpool
Faça staking rapidamente, ganhe potenciais novos tokens
HODLer Airdrop
Detenha GT e obtenha airdrops maciços de graça
Launchpad
Chegue cedo ao próximo grande projeto de tokens
Pontos Alpha
Negoceie ativos on-chain para airdrops
Pontos de futuros
Ganhe pontos de futuros e receba recompensas de airdrop
Investimento
Simple Earn
Ganhe juros com tokens inativos
Investimento automático
Invista automaticamente de forma regular.
Investimento Duplo
Aproveite a volatilidade do mercado
Soft Staking
Ganhe recompensas com staking flexível
Empréstimo de criptomoedas
0 Fees
Dê em garantia uma criptomoeda para pedir outra emprestada
Centro de empréstimos
Centro de empréstimos integrado
Centro de Património VIP
Aumento de património premium
Gestão de património privado
Alocação de ativos premium
Fundo Quant
Estratégias quant de topo
Staking
Faça staking de criptomoedas para ganhar em produtos PoS
Alavancagem inteligente
New
Alavancagem sem liquidação
Cunhagem de GUSD
Cunhe GUSD para retornos RWA
Série para iniciantes em Web3: Clicar no MetaMask acidentalmente aciona outra carteira? Situação atual da solução de conflitos de carteiras
Confusão ao despertar da carteira
Conectar uma carteira é um passo crucial para entrar no mundo do Web3, pois os usuários do Web3 frequentemente precisam conectar uma carteira em alguns sites de DApp. No entanto, mesmo essa ação simples pode causar sérios inconvenientes aos usuários.
Conectar Carteira
Imagine uma cena assim: um novo usuário da Web3 (por curiosidade, ele instalou muitas carteiras de plug-ins) visitou um site DApp e queria usar sua própria carteira de plug-in do navegador para se conectar a ela. No entanto, quando ele clica no botão “Conectar carteira” fornecido pelo site e escolhe uma carteira para usá-la para se conectar ao DApp, ele pode descobrir que a carteira que aparece não é a que escolheu. Isso provavelmente o deixará confuso e sufocado, pensando que seu computador está infectado, e por isso ele executou uma ação inesperada.
A carteira de blockchain é uma entrada importante para se conectar à blockchain, e para ocupar essa entrada, cada carteira usa todas as maneiras que podem imaginar. Entre eles, a alteração de variáveis globais pelas carteiras é o que mais incomoda os desenvolvedores e usuários de DApp.
Na lógica de implementação da carteira do navegador atual, é comum injetar uma variável global no navegador para expor as funcionalidades fornecidas pela carteira (por exemplo, a carteira da plataforma Ethereum injeta suas funcionalidades em “ethereum”), permitindo que os DApps chamem os métodos fornecidos pela carteira para interagir com ela.
No entanto, como muitas carteiras se injetam na mesma variável ethereum, as carteiras registradas posteriormente substituirão as registradas anteriormente, de modo que apenas a última registrada pode ser ativada desta forma.
Às vezes, os usuários do DApp têm que desativar temporariamente outros plugins de carteira ou instalar apenas uma carteira para poder usar a carteira que desejam. Isso vai contra a ideia inicial dos desenvolvedores de carteiras. Mesmo que uma nova carteira seja melhor, é difícil atrair usuários que já estão usando outras carteiras.
Alguns amigos podem estar se perguntando por que precisamos necessariamente injetar na mesma variável? Suponha que haja duas carteiras: A e B. Na verdade, desde que A injete a si mesma em ‘a’ e B injete a si mesma em ‘b’, para chamar a carteira desejada, basta chamar o método fornecido no objeto correspondente, evitando assim o problema de chamar B quando se deseja chamar A. Isso realmente resolve o problema da concorrência, mas o problema é que, se um DApp deve suportar a conexão de várias carteiras, todos os nomes das carteiras que os desenvolvedores desejam adaptar devem ser previamente definidos no código e, quando o usuário seleciona uma carteira, os métodos correspondentes a essa carteira são chamados, o que torna a manutenção do código relacionado bastante problemática. No entanto, injetar todas as carteiras em um único objeto pode evitar essa dificuldade.
Solução
Para sair do dilema acima mencionado, existem duas normas semelhantes na comunidade.
Solução do Ethereum: EIP-6963
A comunidade Ethereum propôs a EIP-6963 em maio de 2023.
A lógica básica aqui é simples: descartar variáveis globais e usar eventos convencionados para resolver o problema de registro e descoberta da carteira.
Especificamente, após o carregamento bem-sucedido da carteira de plug-in, o evento unificado ‘eip6963:announceProvider’ é acionado para notificar o DApp sobre a disponibilidade de uma nova carteira. O DApp, por sua vez, obtém informações sobre as carteiras disponíveis atualmente por meio da escuta desse evento.
Desta forma, evita-se os problemas causados pelo uso direto de variáveis globais, através de uma lógica de escuta de eventos abstrata, e consegue-se descobrir automaticamente as carteiras disponíveis no ambiente do usuário. Assim, o dilema resolve-se por si só.
Padrão de carteira da comunidade
EIP-6963 é um padrão na ecologia do Ethereum, mas não se limita ao Ethereum, outras plataformas de blockchain também podem enfrentar problemas semelhantes. Por exemplo, as carteiras da rede Solana geralmente injetam a si mesmas na variável ‘solana’, o que também pode causar situações de concorrência.
Então, seria possível que o ecossistema Solana também adotasse esse padrão? Embora o EIP-6963 tenha sido desenvolvido para resolver problemas de descoberta de carteiras no ecossistema Ethereum, as ideias nele contidas podem ser aplicadas a todas as plataformas de blockchain. Assim, poderíamos ir mais longe e fornecer um padrão comum para que todas as carteiras e DApps das plataformas de blockchain possam desfrutar da conveniência oferecida pelo EIP-6963, tanto os desenvolvedores quanto os usuários de todas as plataformas de blockchain. Teoricamente, isso não seria um problema, e alguns desenvolvedores já estão trabalhando nisso, ou seja, o Wallet Standard.
O trabalho central realizado pelo Wallet Standard é fornecer duas funções: ‘registerWallet’ e ‘getWallets’, a primeira para carteira e a segunda para DApp.
A carteira chama ‘registerWallet’, passando um objeto de carteira que encapsula as funcionalidades fornecidas pela carteira (como o método Connect, usado para conectar a carteira). Dentro da função, um evento RegisterWalletEvent é acionado primeiro, e na verdade, os parâmetros desse evento são uma função de retorno usada para que o DApp seja notificado quando o evento RegisterWalletEvent for acionado. Essa função de retorno, na verdade, passa o objeto da carteira, permitindo assim que o DApp obtenha uma referência ao objeto da carteira e, assim, interaja com a carteira.
Os desenvolvedores de DApp não precisam escrever o código para ouvir e receber objetos de carteira. Esta parte já foi integrada no ‘getWallets’ pelo Wallet Standard. No entanto, o ‘getWallets’ apenas ouve os eventos, e os desenvolvedores ainda precisam considerar como lidar com esses eventos. Por exemplo, onde colocar as carteiras obtidas? Algumas carteiras podem ser carregadas antes do DApp, enquanto outras podem ser carregadas posteriormente. Como manter o estado dessas carteiras? O Wallet Standard aborda esses detalhes e também fornece o pacote ‘@wallet-standard/react’, no qual os desenvolvedores podem usar diretamente os React Hooks fornecidos para obter os dados desejados, incluindo a lista de carteiras, a carteira conectada atualmente, os métodos fornecidos pela carteira, etc.
Recursos Padrão da Carteira
Além de obter o objeto Wallet básico, o Wallet Standard também define alguns formatos de recursos.
Na verdade, todas as carteiras têm algumas funcionalidades básicas, como ligar, ouvir eventos de carteira, etc. O Wallet Standard fornece recursos como ‘standard:connect’ e ‘standard:events’. Após os fornecedores de carteira implementarem esses recursos, o DApp pode determinar diretamente com base nesses valores se a carteira suporta determinadas operações.
A “standard:*” mentioned above is a built-in defined feature, in fact, their values are not particularly rigid, so they can be extended arbitrarily. Different chain platforms will also have their unique features, such as Solana, which can be directly agreed upon as “solana:*”. Common features on the Solana platform include “solana:signTransaction”, “solana:signMessage”, etc.
Estado atual do Wallet Standard
Atualmente, há realmente não muitos projetos que implementaram o padrão Wallet Standard, vale a pena mencionar Solana e Sui.
No adaptador Solana do Ant Design Web3, também é suportada a deteção automática de carteiras compatíveis com o Wallet Standard. Os desenvolvedores apenas precisam ativar o ‘autoAddRegisteredWallets’, sem a necessidade de configurar uma grande quantidade de metadados da carteira, melhorando significativamente a experiência de desenvolvimento e uso do usuário.
A lógica de conexão da carteira ZAN.TOP também encontrou os mesmos problemas no início, mas agora, graças à configuração fornecida pelo Ant Design Web3, foi facilmente adaptada ao padrão EIP-6963. Todos já devem ter experimentado isso ao vincular o endereço _wxdyh.
A realização do ecossistema blockchain em várias áreas
Atualmente, as diferentes plataformas de blockchain têm atitudes diferentes em relação ao padrão Wallet Standard (ou EIP-6963). Aqui estão alguns exemplos:
Bitcoin
Até agora, parece que o Bitcoin não tem um padrão semelhante. Há um projeto que implementou o padrão Wallet Standard, mas não recebeu muita atenção e não há contribuições de código recentes.
Atualmente, os desenvolvedores só podem manter manualmente o estado ou usar alguns pacotes de desenvolvimento para auxiliar no trabalho. Por exemplo, na implementação do adaptador Bitcoin em Ant Design Web3, para diferentes carteiras, ele será obtido de diferentes variáveis globais e armazenado em um estado unificado. Na verdade, isso significa que os desenvolvedores de bibliotecas assumiram a trabalhosa tarefa de manter o estado. Além disso, isso apenas resolve o problema de conflito de carteiras, mas ainda não consegue perceber automaticamente o problema das carteiras disponíveis.
Ethereum
A plataforma Ethereum já tem o padrão EIP-6963, e a maioria das bibliotecas e carteiras relacionadas já oferece suporte.
Solana
Como mencionado acima, a oficialidade forneceu a implementação:
Sui
Sui 目前已经对 Wallet Standard 提供了实现,在官方文档上可以找到使用方法:
Suporte da biblioteca de desenvolvimento DApps
wagmi
wagmi provides support for EIP-6963 through the mipd() library, and the specific method can be found in the wagmi documentation.
RainbowKit
O RainbowKit()a lógica interna é baseada em wagmi, portanto, já oferece suporte embutido ao EIP-6963.
Ant Design Web3
O adaptador Ethereum e Solana do Ant Design Web3 suporta muito bem esses dois padrões e é muito conveniente para os desenvolvedores ativarem.
Para os desenvolvedores de DApp Ethereum, basta adicionar a configuração eip6963, com atenção para as linhas 23-25 relacionadas com o EIP-6963.
E se você é um desenvolvedor de DApp no ecossistema Solana, o processo é semelhante. Ele fornece a propriedade autoAddRegisteredWallets:
Sumário
EIP-6963 e Wallet Standard podem melhorar muito a experiência do usuário ao conectar a carteira, reduzindo a barreira de entrada para novos fornecedores de carteiras. Esperamos que no futuro mais plataformas de blockchain, carteiras e desenvolvedores de DApp possam fornecer ou implementar padrões relacionados, o que é benéfico para o desenvolvimento do Web3 numa direção melhor.
Este artigo foi escrito por gin-lsl da equipe ZAN (conta oficial @zan_team).