Como os zk-Snarks melhoram o sistema de comprovativo de reservas da Binance
Principais conclusões
Em novembro de 2022, a Binance lançou o seu sistema de comprovativo de reservas, que utiliza a criptografia da árvore de Merkle para permitir que os utilizadores verifiquem as suas participações.
A Binance agora melhorou a sua solução implementando zk-Snarks, uma forma de provas de conhecimento zero.
Os utilizadores podem agora verificar se o saldo líquido total de cada conta não é negativo e se todos os ativos dos utilizadores fazem parte do saldo líquido total declarado pela Binance – de forma privada e segura.
Fica a conhecer a nova solução de comprovativo de reservas da Binance. Ao combinar os zk-Snarks e as informações da árvore de Merkle, proporciona aos utilizadores uma nova e melhorada forma de verificar o estado das reservas da Binance.
Nos últimos meses, a equipa de desenvolvimento da Binance tem trabalhado arduamente na construção de soluções avançadas de comprovativo de solvência. Tais ferramentas tornaram-se essenciais para as exchanges de activos virtuais centralizadas perante a crise de confiança que abalou a indústria na sequência do colapso da FTX. Os fundos dos utilizadores armazenados na Binance são indexados numa proporção de 1:1, além das reservas, e encontrar uma maneira de provar isto ao público tornou-se uma parte importante do plano da Binance para restaurar a confiança no setor.
Em novembro de 2022, lançámos o nosso sistema de comprovativo de reservas utilizando uma técnica criptográfica de árvore de Merkle para permitir que os utilizadores verifiquem as suas participações na Binance. Apesar de ser um avanço nos esforços de transparência em relação aos fundos dos utilizadores da Binance, o design inicial desta solução apresentava duas falhas:
Para proteger a privacidade dos utilizadores, os nodes folha na prova de Merkle representavam o hash das participações dos utilizadores. Assim, a raíz de Merkle não conseguia refletir a soma das informações de balanço dos seus nodes folha.
A entidade cujas reservas estavam a ser verificadas poderia potencialmente adicionar um saldo negativo numa conta falsa algures na árvore para fazer com que o total de reservas necessárias pareça menor. O diagrama a seguir extraído do blog de Vitalik Buterin mostra um exemplo de uma árvore de Merkle mal-intencionada (embora, neste caso, a raiz reflita a soma dos saldos de todos os nodes folha, o que pode causar problemas de privacidade).
Dispomos agora de uma solução que pode colmatar estas deficiências e, assim, reforçar o sistema de comprovativo de reservas da Binance. Ao utilizar os protocolos de provas de conhecimento zero, zk-Snarks, podemos provar que:
Todos os nodes folha da árvore de Merkle contribuíram para o saldo total de cada ativo dos utilizadores declarado pela Binance.
Não há nenhum utilizador com saldo líquido total negativo (um valor global em USD de todos os ativos que o utilizador detém) incluído na árvore de Merkle.
Alguns comentários sobre saldos negativos e desempenho
Como a Binance oferece produtos de margem, empréstimos de activos virtuais e trading de futuros, o saldo de cada ativo de um utilizador pode ser composto por ativos e passivos. O saldo de um utilizador de um determinado activo virtual pode ser negativo, mas o seu saldo líquido total de todos os respetivos activo virtual não deve ser negativo (uma vez que todos os empréstimos são totalmente garantidos).
Neste cenário hipotético, digamos que a Alice tinha depositado 10 000 BUSD na Binance, depois usou 4000 BUSD como garantia para emprestar 2 BNB (a uma taxa de 1 BN= 1000 BUSD, assumindo que a garantia da Binance é sempre em excesso). O quadro seguinte apresenta o balanço da Alice.
Se a Alice transacionar 1 BNB por 1000 BUSD com o João (que também tinha depositado 10 000 BUSD), o seu saldo seria o seguinte depois da transação ser correspondida:
Neste caso, o saldo BNB da Alice ascenderá a -1, que não é um node válido numa árvore de Merkle e que apenas abrange um ativo: BNB. No entanto, se olharmos para os saldos líquidos totais, a Alice ainda está nos 10 000 BUSD.
Outro desafio prende-se com a grande escala de utilizadores da Binance. Uma solução viável tem de gerar comprovativos de utilizadores e comprovativos zk-SNARK para dezenas de milhões de utilizadores, alguns dos quais poderão deter mais de 300 activos virtuais na nossa plataforma.
Em suma, queremos apresentar o comprovativo dos seguintes factos num prazo razoável:
Os ativos de cada utilizador Binance fazem parte do nosso saldo total de utilizadores declarado mostrado no instantâneo. Os utilizadores podem verificar o saldo total de utilizadores declarado em relação aos ativos detidos em endereços controlados pela Binance usando um explorador de blockchain (como Etherscan para carteiras Ethereum ou BSCScan para carteiras da BNB Chain).
O saldo líquido total de cada utilizador não é negativo, o que significa que a Binance não criou contas fictícias com saldo negativo para reduzir artificialmente a dimensão das nossas reservas verificadas.
O que são zk-Snarks?
Antes de avançarmos com os detalhes da nossa solução, é necessária uma breve visão geral do mecanismo de provas de conhecimento zero. Os protocolos de conhecimento zero, como os zk-SNARK, permitem que uma parte, o comprovador, demonstre a outra parte, o verificador, que executou determinados cálculos com precisão com determinadas entradas sob determinadas restrições, tudo sem divulgar as entradas. A computação pode ser demorada, mas o mecanismo matemático subjacente pode ajudar o verificador a avaliar a prova de forma rápida e segura.
O comprovador (Binance) começa com a definição de um conjunto de restrições do cálculo que quer provar. As restrições são definidas em circuitos que podem ser expressos numa linguagem de programação de nível superior (no nosso caso, uma versão bifurcada de gnark).
Em seguida, o comprovador executa a computação pesada, fazendo hashing de todos os utilizadores e saldos e gera uma prova de que o cálculo atende às restrições estabelecidas anteriormente. Para isso, usa o traço computacional (testemunha) e entradas públicas ou privadas.
O verificador (utilizador) obtém a prova e verifica-a em relação à entrada pública do circuito para se certificar de que o cálculo foi executado com precisão, com todas as restrições cumpridas. A computação de verificação demora um tempo extremamente curto em comparação com o tempo de prova. Se o comprovador não gerar a prova nos circuitos pré-definidos, não poderá produzir uma prova válida para passar na verificação.
Para saberes mais sobre os zk-Snarks, podes consultar esta série de artigos.
A nossa solução
O elemento fundamental da solução de comprovativo de reservas melhorada continua a ser uma árvore de Merkle. Para o exemplo acima, seria algo deste género:
Além da árvore de Merkle, mantemos também um estado global que representa uma lista dos saldos líquidos totais de cada ativo que cada cliente da Binance detém.
Para comprovar as nossas reservas, vamos gerar o comprovativo zk-SNARK para a construção da árvore de Merkle. Para o conjunto de saldo de cada utilizador – um node folha da árvore de Merkle – o nosso circuito garantiria que:
O saldo de cada ativo deste utilizador é incluído na lista global de estados acima mencionada.
O saldo líquido total do utilizador não é negativo.
A alteração da raiz da árvore de Merkle é válida após atualizar as informações deste utilizador para o hash do node folha.
Consulta esta especificação técnica e o nosso código fonte do circuito (restrições) para obteres detalhes sobre a implementação.
Em cada caso de comprovação das nossas reservas, publicaremos:
1. O comprovativo Merkle: os hashes para cada utilizador (para a Alice, representado por nodes azuis na figura acima).
2. Comprovativos zk-SNARK e entrada pública (um hash da lista dos saldos líquidos totais de cada ativo e a raiz de Merkle) do circuito para todos os utilizadores.
Ao verificar o comprovativo de Merkle, os utilizadores podem certificar-se de que o seu saldo está incluído na raiz da árvore de Merkle. Ao verificar o comprovativo zk-SNARK, os utilizadores podem certificar-se de que a construção da árvore de Merkle atende às restrições definidas no circuito.
A segurança desta solução depende fortemente da configuração da chave de comprovativo e da chave de verificação. Estamos a trabalhar numa configuração descentralizada das chaves. Quando se trata de cerimónias de configuração de confiança descentralizada existentes, a da Ethereum é um bom exemplo. Estamos muito perto de ter uma solução de MPC para tornar a configuração descentralizada.
Desempenho
Dado o número de utilizadores da Binance cujos saldos devem ser incluídos, não há forma de obter um único comprovativo da construção da árvore de Merkle que abranja todos os utilizadores de uma só vez. Uma solução para isso é dividir os utilizadores em lotes de 864 cada, de modo a ter um circuito de menor escala e procedimentos de comprovação paralelos.
Para um lote que contém 864 utilizadores em que cada utilizador possui 350 ativos diferentes, suponhamos que cada saldo de ativos esteja no intervalo [0, 2^64-1]. Com um servidor 32-core de 128 GB, o tempo de geração do comprovativo de zk é de cerca de 110 segundos e o tempo de verificação do comprovativo é inferior a 1 milissegundo.
A Binance vai iniciar 1000 comprovadores ao mesmo tempo de modo a gerar comprovativos para todas as contas em 2 horas. O custo deste servidor por uma hora é de cerca de 0,56 USD, portanto, o custo total de gerar todos os comprovativos zk abrangendo todos os utilizadores seria de cerca de 1000 USD.
Conclusão
Forneceremos a primeira iteração de comprovativo para os utilizadores gerados por esta nova solução num anúncio subsequente de comprovativo de reservas. Além disso, temos acesso aberto ao nosso processador de dados do utilizador, comprovador, circuito e verificador, para que todas as exchanges centralizadas, com base no mesmo modelo, possam gerar comprovativos para os seus utilizadores e ativos facilmente.
Esperamos que isso seja fundamental para elevar a transparência da indústria de ativos digitais para um novo patamar. Estamos também a trabalhar na implementação da solução mencionada no artigo de Vitalik para conseguir um melhor desempenho, o que nos permitirá fornecer o comprovativo com maior frequência a um custo mais baixo.
Como esta é a primeira versão do nosso zk-SNARK, estamos ansiosos por receber feedback da comunidade para que possamos continuar a melhorar o sistema.
Código e Leitura adicional
Comprovativo de reservas da Binance: O que é uma árvore de Merkle
Binance Academy - Melhorar a transparência das criptomoedas com provas de conhecimento zero
Artigo de Vitalik: "Having a safe CEX: proof of solvency and beyond"
Aviso de Isenção de Responsabilidade: os preços dos activos virtuais estão sujeitos a elevado risco de mercado e volatilidade de preços. Só deves investir em produtos com os quais estejas familiarizado e onde compreendas os riscos associados. Deves considerar cuidadosamente a tua experiência de investimento, situação financeira, objetivos de investimento e tolerância ao risco e contactar um consultor financeiro independente antes de fazeres qualquer investimento. Este material não deve ser interpretado como aconselhamento financeiro. O desempenho passado não é um indicador fiável do desempenho futuro. O valor do teu investimento pode descer, bem como subir, e podes não conseguir recuperar o valor que investiste. És o único responsável pelas tuas decisões de investimento. A Binance não é responsável por quaisquer perdas em que possas incorrer. Para mais informações, consulta os nossos Termos de utilização e Aviso de risco.