Principais conclusões
Em novembro de 2022, a Binance lançou seu sistema de Prova de Reservas utilizando criptografia de árvore Merkle para permitir que os usuários verificassem seus ativos.
A Binance agora melhorou sua solução implementando zk-SNARKs, uma forma de prova de conhecimento zero.
Os usuários agora podem verificar se o saldo líquido total de cada conta não é negativo e se todos os ativos do usuário fazem parte do saldo líquido total reivindicado de ativos do usuário da Binance – de maneira privada e segura.
Dê uma olhada nos bastidores da nova solução de prova de reservas da Binance. Combinando informações de zk-SNARKs e árvores Merkle, oferece aos usuários uma maneira nova e aprimorada de verificar o estado das reservas da Binance.
Nos últimos meses, a equipe de desenvolvimento da Binance tem trabalhado arduamente para construir soluções avançadas de prova de solvência. Essas ferramentas se tornaram críticas para as exchanges de criptomoedas centralizadas em meio à crise de confiança que tomou conta da indústria após o colapso da FTX. Os fundos de usuários armazenados na Binance são lastreados em uma proporção de 1:1, mais reservas, e encontrar uma maneira de provar isso ao público perfeitamente se tornou uma parte importante do plano da Binance para restaurar a confiança da indústria.
Em novembro de 2022, lançamos nosso sistema de prova de reservas utilizando uma técnica criptográfica de árvore Merkle para permitir que os usuários verifiquem seus ativos na Binance. Embora seja um avanço no impulso de transparência de fundos do usuário da Binance, o design inicial desta solução tinha duas deficiências:
Para proteger a privacidade do usuário, os nós folha na prova de Merkle representavam o hash das participações dos usuários – portanto, a raiz de Merkle não poderia refletir a soma das informações de saldo de seus nós folha.
A entidade cujas reservas estavam sendo verificadas poderia potencialmente adicionar um saldo negativo sob uma conta falsa em algum lugar da árvore para fazer com que o total de reservas necessárias parecesse menor. O diagrama a seguir do blog de Vitalik Buterin mostra um exemplo de uma árvore Merkle maliciosa (embora, neste caso, a raiz reflita a soma dos saldos de todos os nós folha, o que pode introduzir problemas de privacidade).
Agora temos uma solução que pode remediar essas deficiências e, assim, fortalecer o sistema de prova de reservas da Binance. Confiando em protocolos de prova de conhecimento zero, zk-SNARKs, podemos provar que:
Todos os nós folha da árvore Merkle contribuíram para o saldo total de usuários de cada ativo reivindicado pela Binance.
Não há nenhum usuário com saldo líquido total negativo (um valor total em dólares de todos os ativos que o usuário possui) incluído na árvore Merkle.
Uma palavra sobre saldos negativos e desempenho
Como a Binance oferece margem, empréstimos cripto e produtos de negociação de futuros, o saldo de cada usuário de cada criptoativo pode ser composto de ativos e passivos. O saldo de um usuário de um criptoativo específico pode ser negativo, mas seu saldo líquido total em todos os criptoativos não deve ser negativo (já que todos os empréstimos são totalmente garantidos).
Neste cenário hipotético, digamos que Alice depositou 10.000 BUSD na Binance, então usou 4.000 BUSD como garantia para tomar emprestado 2 BNB (a uma taxa de 1 BNB = 1.000 BUSD, assumindo que a Binance está sempre supercolateralizando). A tabela a seguir mostra o balanço patrimonial de Alice.
Se Alice então negociar 1 BNB por 1.000 BUSD com Bob (que também depositou 10.000 BUSD), seu balanço patrimonial ficaria assim após a negociação ser correspondida:
Neste caso, o saldo BNB de Alice será de -1, o que não é um nó válido em uma árvore Merkle e que cobre apenas um ativo: BNB. No entanto, se estivermos olhando para os saldos líquidos totais, Alice ainda está em 10.000.
Outro desafio vem da enorme escala da base de usuários da Binance. Uma solução viável tem que gerar prova de usuário e prova zk-SNARK para dezenas de milhões de usuários, alguns dos quais podem ter mais de 300 criptoativos em nossa plataforma.
Em suma, queremos fornecer provas dos seguintes fatos dentro de um prazo razoável:
Os ativos de cada usuário da Binance são parte do nosso saldo total de usuários reivindicado mostrado no snapshot. Os usuários podem verificar nosso saldo total de usuários reivindicado em relação aos ativos mantidos em endereços controlados pela Binance usando um explorador de blockchain (como Etherscan para carteiras Ethereum ou BscScan para carteiras BNB Chain).
O saldo líquido total de cada usuário não é negativo, o que significa que a Binance não criou contas fictícias com saldo negativo para reduzir artificialmente o tamanho de nossas reservas verificadas.
O que são zk-SNARKs?
Antes de mergulharmos nos detalhes da nossa solução, uma breve visão geral do mecanismo de prova de conhecimento zero é necessária. Protocolos de conhecimento zero como zk-SNARK permitem que uma parte, o provador, demonstre a outra parte, o verificador, que o provador executou certos cálculos com precisão com certas entradas sob certas restrições, tudo sem revelar as entradas. O cálculo pode ser demorado, mas o mecanismo matemático subjacente pode ajudar o verificador a avaliar a prova de forma rápida e segura.
O provador (Binance) começa definindo um conjunto de restrições da computação que ele quer provar. As restrições são definidas em circuitos que podem ser expressos em uma linguagem de programação de nível mais alto (no nosso caso, uma versão bifurcada do gnark.)
O provador então executa a computação pesada, fazendo hash de todos os IDs e balanços dos usuários, e gera prova da computação atendendo às restrições definidas anteriormente. Para fazer isso, ele usa o rastreamento de computação (testemunha) e entradas públicas ou privadas.
O verificador (usuário) obtém a prova e a verifica com a entrada pública do circuito para se certificar de que a computação foi executada com precisão com todas as restrições atendidas. A computação de verificação leva um tempo extremamente curto em comparação ao tempo de prova. Se o provador não gerar a prova nos circuitos predefinidos, ele não poderá produzir uma prova válida para passar na verificação.
Para dar uma olhada mais profunda nos bastidores do zk-SNARKs, você pode consultar esta série de artigos.
Nossa Solução
O bloco de construção fundamental da solução de prova de reservas atualizada ainda é uma árvore Merkle. Para o exemplo acima, ficaria assim:
Além da árvore Merkle, também mantemos um estado global que representa uma lista dos saldos líquidos totais de cada ativo que cada cliente da Binance possui.
Para provar nossas reservas, geraremos uma prova zk-SNARK para a construção da árvore Merkle. Para cada conjunto de equilíbrio do usuário – um nó folha da árvore Merkle – nosso circuito garantiria que:
O saldo de cada ativo deste usuário está incluído na lista de estados globais mencionada acima.
O saldo líquido total do usuário não é negativo.
A alteração da raiz da árvore Merkle é válida após a atualização das informações deste usuário para o hash do nó folha.
Consulte esta especificação técnica e nosso código-fonte para o circuito (restrições) para obter detalhes de implementação.
Em cada instância de comprovação de nossas reservas, publicaremos:
1. A prova de Merkle: os hashes para cada usuário (para Alice, representados pelos nós azuis na imagem acima).
2. Provas zk-SNARK e entrada pública (um hash da lista de saldos líquidos totais de cada ativo e a raiz de Merkle) do circuito para todos os usuários.
Ao verificar a prova de Merkle, os usuários podem ter certeza de que seu balanço patrimonial está incluído na raiz da árvore de Merkle. Ao verificar a prova de zk-SNARK, os usuários podem ter certeza de que a construção da árvore de Merkle atende às restrições definidas no circuito.
A segurança desta solução depende muito da configuração da chave de comprovação e da chave de verificação. Estamos trabalhando em uma configuração descentralizada das chaves. Quando se trata de cerimônias de configuração confiável descentralizadas existentes, a cerimônia Ethereum oferece um bom exemplo. Estamos muito perto de ter uma solução MPC para tornar a configuração confiável.
Desempenho
Dado o número de usuários da Binance cujos saldos devem ser incluídos, não há como obter uma única prova da construção da árvore Merkle que cobriria todos os usuários de uma vez. Uma solução para isso é dividir os usuários em lotes de 864 cada, de modo a ter um circuito de menor escala e procedimentos de prova paralelos.
Para um lote que contém 864 usuários, onde cada usuário possui 350 ativos diferentes, suponha que cada saldo de ativo esteja no intervalo [0, 2^64-1]. Com um servidor de 32 núcleos e 128 GB, o tempo de geração de prova zk é de cerca de 110 segundos, e o tempo de verificação de prova é menor que 1 milissegundo.
A Binance iniciará 1000 provadores ao mesmo tempo para gerar provas para todas as contas em 2 horas. O custo deste servidor provador por uma hora é de cerca de 0,56 USD, então o custo total de gerar todas as provas zk cobrindo todos os usuários seria de cerca de 1000 USD.
Conclusão
Forneceremos a primeira iteração de prova para usuários gerada por esta nova solução em um anúncio subsequente de prova de reservas. Além disso, tornamos nosso processador de dados de usuário, provador, circuito e verificador de código aberto, para que cada troca centralizada que depende do mesmo modelo que nós possa gerar prova para seus usuários e ativos facilmente.
Esperamos que isso seja fundamental para levar a transparência da indústria de ativos digitais a um novo nível. Também estamos trabalhando na implementação da solução mencionada no blog de Vitalik para obter melhor desempenho, o que nos permitirá fornecer a prova com mais frequência e a um custo menor.
Como esta é a primeira versão do nosso zk-SNARK, estamos ansiosos para receber o feedback da comunidade para que possamos continuar a melhorar o sistema.
Código e leituras adicionais
Nosso código fonte
Prova de reservas da Binance: O que é uma árvore Merkle
Binance Academy - Melhorando a transparência das criptomoedas com prova de conhecimento zero
Blog de Vitalik: Ter um CEX seguro: prova de solvência e mais além



