O ponto principal

  • Em novembro de 2022, a Binance lançou um sistema de Prova de Reservas que usa criptografia de árvore Merkle para permitir que os usuários verifiquem seus acervos.

  • A Binance agora aprimorou sua solução implementando zk-SNARK, 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 dos ativos do usuário reivindicados pela Binance – de forma privada e segura.

Dê uma olhada em como funciona a nova solução de prova de reserva da Binance. Ao combinar as informações da árvore zk-SNARK e Merkle, os usuários têm uma maneira nova e melhor de verificar o status das reservas da Binance.

Nos últimos meses, a equipe de desenvolvimento da Binance tem trabalhado arduamente para construir uma prova de solvência de última geração. A ferramenta se tornou uma ferramenta crucial para trocas centralizadas de criptografia em meio à crise de confiança que atingiu a indústria após o colapso da FTX. Os fundos dos usuários mantidos na Binance são garantidos na proporção de 1:1, mais reservas, e encontrar uma maneira de provar isso ao público sem problemas tem sido uma parte importante do plano da Binance para restaurar a confiança da indústria.

Em novembro de 2022, lançamos um sistema de prova de reserva usando a técnica de criptografia Merkle Tree para permitir que os usuários verificassem seus ativos na Binance. Embora isso seja um progresso na promoção da transparência dos fundos dos usuários da Binance, o design inicial desta solução tinha duas falhas:

  1. Para proteger a privacidade do usuário, os nós folha na prova Merkle representam o hash de propriedade do usuário – assim, a raiz Merkle não pode refletir a quantidade de informações de saldo de seus nós folha.

  1. As entidades cujas reservas estão em processo de verificação poderiam potencialmente adicionar um saldo negativo a uma conta falsa em algum lugar da árvore para fazer com que o total de reservas exigidas parecesse menor. O diagrama a seguir do blog de Vitalik Buterin mostra um exemplo de uma árvore Merkle maliciosa (embora neste caso as raízes reflitam a soma dos saldos de todos os nós folha, o que poderia levantar problemas de privacidade).

Agora temos uma solução que pode corrigir esta falha e, assim, fortalecer o sistema de prova de reservas da Binance. Contando com o protocolo de prova de conhecimento zero, zk-SNARK, podemos provar que:

  1. Todos os nós folha da árvore Merkle contribuíram para o saldo total do usuário que a Binance reivindica para cada ativo.

  2. Nenhum usuário com saldo líquido total negativo (o valor total em dólares americanos de todos os ativos de propriedade do usuário) é incluído na árvore Merkle.

Uma palavra sobre saldos negativos e desempenho

Como a Binance oferece produtos de margem, empréstimos criptográficos e negociação de futuros, o saldo de cada ativo criptográfico de cada usuário pode consistir em ativos e passivos. O saldo de um usuário de um ativo criptográfico específico pode ser negativo, mas seu saldo líquido total em todos os ativos criptográficos não pode 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 e depois usou 4.000 BUSD como garantia para emprestar 2 BNB (a uma taxa de 1 BNB = 1.000 BUSD, assumindo que a Binance sempre oferece garantias excessivas). A tabela a seguir mostra o balanço patrimonial de Alice.

BNB (preço: 1000 BUSD)

BUSD (preço: 1 BUSD)

Saldo Líquido Total (BUSD)

Ativos

Obrigação

Ativos

Obrigação

ALICE

2

2

10.000

0

10.000

Se Alice negociar 1 BNB por 1.000 BUSD com Bob (que também depositou 10.000 BUSD), o balanço deles ficaria assim depois que as negociações fossem correspondidas:

BNB (preço: 1000 BUSD)

BUSD (preço: 1 BUSD)

Saldo Líquido Total (BUSD)

Ativos

Obrigação

Ativos

Obrigação

ALICE

1

2

11.000

0

10.000

Prumo

1

0

9.000

0

10.000

Nesse caso, o saldo do BNB de Alice totalizaria -1, que não é um nó válido na árvore Merkle e inclui apenas um ativo: o BNB. Porém, se olharmos o saldo líquido total, Alice ainda está em 10.000 BUSD.

Outro desafio vem da escala da base de usuários da Binance. Uma solução viável deve gerar provas de usuário e provas zk-SNARK para dezenas de milhões de usuários, alguns dos quais podem possuir mais de 300 ativos criptográficos em nossa plataforma.

No geral, gostaríamos de fornecer provas dos seguintes fatos dentro de um prazo razoável:

  1. Os ativos de cada usuário da Binance fazem parte do saldo total do usuário reivindicado mostrado no instantâneo. Os usuários podem verificar nosso saldo total reivindicado com base em ativos mantidos em endereços controlados pela Binance usando um explorador de blockchain (como Etherscan para carteiras Ethereum ou BscScan para carteiras BNB Chain).

  2. O saldo líquido total de cada usuário não é negativo. Isto significa que a Binance não cria contas fictícias com saldos negativos para reduzir artificialmente o tamanho das nossas reservas verificadas.

O que é zk-SNARK?

Antes de mergulharmos nos detalhes de nossa solução, é necessária uma breve visão geral do mecanismo de prova de conhecimento zero. Protocolos de conhecimento zero, como zk-SNARK, permitem que uma parte, nomeadamente o provador, demonstre a outra parte, nomeadamente o verificador, que o provador executou um determinado cálculo com precisão com certas entradas sob certas restrições, tudo sem divulgar a entrada. A computação pode ser demorada, mas os mecanismos matemáticos subjacentes podem ajudar os verificadores a avaliar as evidências de forma rápida e segura.

O provador (Binance) começa definindo o conjunto de restrições computacionais que deseja provar. As restrições são definidas em circuitos que podem ser expressos em uma linguagem de programação de alto nível (no nosso caso, uma versão bifurcada do gnark).

O provador então executa cálculos pesados, faz hash dos ids e balanços de todos os usuários e produz uma prova computacional que satisfaz as restrições predefinidas. Para isso, utiliza rastros computacionais (testemunhas) e entradas públicas ou privadas.

O verificador (usuário) obtém uma prova e a verifica com entrada pública do circuito para se certificar de que o cálculo foi executado com precisão com todas as restrições atendidas. O cálculo da verificação leva um tempo muito curto em comparação com o tempo de prova. Se o provador não produzir uma prova em um circuito predefinido, o provador não poderá produzir uma prova válida para passar na verificação.

Para uma visão mais aprofundada de como o zk-SNARK funciona, você pode conferir esta série de artigos.

Nossa solução

O alicerce fundamental de uma solução melhorada de prova de reservas ainda é a árvore Merkle. Para o exemplo acima, ficaria assim:

Além da árvore Merkle, também mantemos um estado global que representa uma lista do saldo líquido total de cada ativo pertencente a cada cliente da Binance.

Para provar nossa contingência, construiremos uma prova zk-SNARK para a construção da árvore Merkle. Para cada conjunto de saldos de usuários – os nós folhas da árvore Merkle – nosso circuito garantirá que:

  1. O saldo de cada ativo deste usuário está incluído na lista global de estados mencionada acima.

  2. O saldo líquido total do usuário não é negativo.

  3. As alterações na raiz da árvore Merkle entram em vigor após a atualização dessas informações do usuário para os hashes do nó folha.

Consulte esta especificação técnica e nosso código-fonte do circuito (limitações) para obter detalhes de implementação.

Em cada exemplo de prova de sugestão, publicaremos:

1. Merkle Proof: hash para cada usuário (para Alice, representado pelo nó azul na imagem acima).

2. Prova de zk-SNARK e entrada pública (hash da lista de saldos líquidos totais de cada ativo e raiz Merkle) do circuito para todos os usuários.

Ao verificar a prova Merkle, os usuários podem garantir que seu balanço esteja incluído na raiz da árvore Merkle. Ao verificar a prova zk-SNARK, os usuários podem garantir que a construção da árvore Merkle satisfaz as restrições especificadas no circuito.

A segurança desta solução depende muito da configuração de chaves de prova e chaves de verificação. Estamos trabalhando na configuração de chaves descentralizadas. Falando sobre as cerimônias de configuração descentralizadas baseadas em confiança existentes, as cerimônias Ethereum oferecem um bom exemplo. Em breve teremos uma solução MPC para 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 inclua todos os usuários de uma vez. A solução para isso é dividir os usuários em lotes de 864 cada, de modo a ter circuitos de menor escala e procedimentos de prova paralelos.

Para um lote de 864 usuários em que cada usuário possui 350 ativos diferentes, suponha que o saldo de cada ativo esteja no intervalo [0, 2 ^ 64-1]. Com um servidor de 32 núcleos e 128 GB, o tempo de geração da prova zk é de cerca de 110 segundos e o tempo de verificação da prova é inferior a 1 milissegundo.

A Binance iniciará 1.000 provas ao mesmo tempo para gerar provas para todas as contas em 2 horas. O custo do servidor desta prova por uma hora é de cerca de 0,56 USD, portanto o custo total para gerar todas as provas zk cobrindo todos os usuários é de cerca de 1.000 USD.

Conclusão

Forneceremos as primeiras iterações de prova do usuário geradas por esta nova solução em nosso próximo anúncio de prova de reserva. Além disso, abrimos o código-fonte de nossos processadores, provadores, circuitos e verificadores de dados de usuários, para que qualquer exchange centralizada que dependa do mesmo modelo que nós possa gerar provas para seus usuários e ativos com facilidade.

Esperamos que isto desempenhe um papel importante para levar a transparência da indústria de ativos digitais a um novo nível. Também estamos trabalhando para implementar as soluções mencionadas no blog de Vitalik para obter melhor desempenho, o que nos permitirá fornecer evidências com mais frequência e custos mais baixos.

Como esta é a primeira versão do nosso zk-SNARK, esperamos receber feedback da comunidade para que possamos continuar a melhorar o sistema.

Código e leitura adicional

  • Nosso código fonte

  • Prova de reservas 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 muito mais