# Zerocash

Zerocash é um protocolo de criptomoeda proposto por pesquisadores do MIT, Universidade Johns Hopkins, Universidade de Tel Aviv e Technion. Ele é uma melhoria de um protocolo anterior, o Zerocoin, também desenvolvido por alguns dos mesmos autores. Segundo os autores, o Zerocash apresenta melhorias tanto em funcionalidade (Zerocoin apenas torna anônimo a origem do pagamento, mas não o destino ou quantia da transação) quanto em eficiência (no Zerocash, transações possuem menos de 1KB e levam menos de 6ms para serem verificadas). O protocolo Zerocash pode ser utilizada para estender o protocolo do Bitcoin, adicionando novos tipos de transações que utilizam uma moeda capaz de preservar a privacidade dos usuários. Nas transações do Zerocash, a origem, o destino e a quantia do pagamento são anonimizados. Apesar de ter sido inicialmente proposto para a rede Bitcoin, o protocolo pode ser integrado em qualquer criptomoeda.

## Motivação

As transações realizadas na rede do Bitcoin são armazenadas, por design, em umlivro-razão, chamado de block chain, que é aberto e acessível por qualquer pessoa. Essas transações provêm privacidade através de um pseudoanonimato. Nela, cada transação está associada aos endereços públicos do remetente e do destinatário, e os nomes dos donos desses endereços não são sabidos pela rede do Bitcoin. Para aumentar a privacidade, cada usuário pode criar e possuir quantos endereços públicos quiser, dificultando o processo de identificação de transações realizadas para uma mesma pessoa. Se privacidade adicional fosse requerida, seria possível lavar bitcoins através da utilização de uma instituição financeira, em que moedas de um usuário são misturadas a um conjunto de outras moedas e outras são recebidas em um novo endereço.
Apesar das precauções, alguns estudos já conseguiram, através da mineração de dados do Block Chain, identificar que um conjunto de endereços públicos pertence a um indivíduo específico. Por exemplo, tal identificação pode ser feita através da análise de hábitos de gasto, ou pelos endereços utilizados na transação. Além disso, a utilização de informação externa ao block chain, como endereços públicos do Bitcoin colocados em algum website, ou os endereços postais associados a uma compra com bitcoins, aumentam a possibilidade de que uma transação possa ser associada a um indivíduo.
Com essa motivação, o protocolo Zerocash busca garantir a privacidade de um usuário através de suas transações que não revelam a origem do pagamento, destino ou quantia utilizada. Cada transação é armazenada em um livro-razão, como uma cadeia de caracteres aparentemente aleatória, que é de conhecimento-zero: esta cadeia de caracteres não revela nenhuma informação além do fato de que uma transação válida ocorreu. Os criadores do protocolo não planejam que o Zerocash seja integrado à tecnologia atual do Bitcoin, mas que seja utilizada em altcoins.

## Transações Zerocash

O protocolo Zerocash estende o protocolo do Bitcoin adicionando novos tipos de transações que permitem a utilização de uma moeda que torna anônima as informações da transação. O protocolo se utiliza de uma moeda anônima separada (chamada de Zerocoins), que existe em conjunto com uma moeda não anônima (chamada de Basecoin). O Basecoin pode ser qualquer cripto-moeda, como o Bitcoin. Cada usuário pode então converter Basecoins em Zerocoins. Em seguida, Zerocoins podem ser enviados para outros usuários, divididos ou unidos com outro Zerocoins de qualquer maneira que preserve seu valor total. Usuários também podem, então, converter Zerocoins em Basecoins, embora, em princípio, tal conversão não seja necessária: qualquer pagamento pode ser feito diretamente utilizando Zerocoins.
A funcionalidade do Zerocash é realizada utilizando dois tipos de transação, chamadas de Transações Mint e Transações Pour. Da mesma forma que as transações em Bitcoin, as transações Zerocash também são transmitidas à rede e registradas em um livro-razão descentralizado.

### Transações Mint

Uma transação mint é uma transação responsável pela cunhagem de uma moeda. Esse tipo de transação permite que um usuário converta um número específico de basecoins (de um endereço Bitcoin, por exemplo) no mesmo número de zerocoins pertencendo a um endereço Zerocash específico. A transação mint consiste de um compromisso criptográfico para uma nova moeda, que especifica o valor da moeda, o endereço de seu dono, e um número identificador único. O compromisso é baseado na função hash SHA-256, e esconde tanto o valor da moeda quanto seu dono.
Os nós individuais do Zerocash manteem uma árvore de Merkle que possuem as informações de todos os compromissos realizados até a data presente. Qualquer usuário pode, então, demonstrar que é dono do compromisso de uma moeda, através das informações presentes na árvore de Merkle. Porém, a utilização de apenas essa informação como forma de "prova de posse" não é privada. Para atingir a privacidade proposta, o protocolo se utiliza do segundo tipo de transações (Transações Pour), que permitem que um usuário prove, utilizando conhecimento-zero, que sabe tal informação.

### Transações Pour

Uma transação pour é transação responsável por permitir que um usuário realize um pagamento privado, consumindo um quantidade de moedas de um usuário para gerar novas moedas. No geral, uma transação pour, para até duas moedas de entrada e duas de saída, envolve provar, através do conhecimento-zero, que:
* o usuário realmente possui as duas moedas de entrada;
* cada uma das moedas de entrada pode ser rastreada até uma transação mint anterior, ou rastreada como uma moeda de saída de uma transação pour anterior ; e
* o valor total das moedas de entrada é igual ao valor total das moedas de saída.
A transação pour consome as moedas de entrada revelando o número identificador único de cada uma, mas não revela nenhuma outra informação, como endereços utilizados na transação ou seus valores. Opcionalmente, as transações pour também podem gerar basecoins (as moedas não-anônimas). Essa última funcionalidade pode ser utilizada para converter zerocoins de volta para moedas não-anônimas, como bitcoins, ou para o pagamento de taxas de transação.

## Corretude

Para uma transação mint, o compromisso criptográfico é construído de forma que qualquer um possa verificar que a moeda possui o devido valor.
Para uma transação pour, qualquer um pode verificar que a sua prova de conhecimento-zero é válida (e que seus valores permanecem inalterados). Por razões de eficiência, porém, o Zerocash não utiliza "qualquer" prova de conhecimento-zero. No protocolo, utiliza-se sistemas zero-knowledge Succinct Non-interactive ARguments of Knowledge (zk-SNARK), que são provas de conhecimento-zero particularmente curtas e fáceis de serem verificadas. Especificamente, Zerocash utiliza zk-SNARKs construídos pelo SCIPR Lab, e descrito em BCTV14; essas provas possuem menos de 300 bytes e podem ser verificadas em poucos milissegundos.

## Prestação de contas e privacidade

As extensões do protocolo Zerocash podem se adequar a diversas escolhas de forma a encontrar o equilíbrio entre prestação de contas e privacidade.
Por exemplo, existem técnicas promissoras para a prevenção de lavagem de dinheiro sem a violação da privacidade de seus usuários (como demonstrado por CHL06). De modo superficial, a ideia é o desenvolvimento de um protocolo criptográfico que tornem públicas as informações das transações caso o total pago entre dois usuários (ao longo de qualquer quantidade de transações) exceda algum limiar pré-definido. Apesar da possibilidade de incorporar tais técnicas, a versão inicial do Zerocash não as utiliza.
De forma geral, o sistema de prova criptográfica zk-SNARK utilizada consegue ser flexível o suficiente para fazer cumprir um vasto leque de normas. Por exemplo, é possível que usuários provem que pagaram os impostos de todas as suas transações, sem revelar as transações, suas quantidades, ou até mesmo a quantidade de impostos pagos. Desde que a norma possa ser especificada por uma forma eficiente de computação não-determinística, ela pode (em princípio) ser utilizada através do zk-SNARK e adicionada ao protocolo Zerocash. Isso permite que regras de regulamentação e conformidade possam ser facilmente verificadas e impostas, de uma forma que não quebre os princípios de privacidade. Além disso, quando codificadas, essas normas poderão ser impostas mesmo na presença de agentes corruptos entre as autoridades.
Isso abre espaço para uma grande quantidade de perguntas de pesquisa, normas e engenharia, relativa à que normas são desejadas e podem ser realizadas.

## Preocupações

A utilização do protocolo Zerocash requer a confiança em uma entidade para a realização de uma instalação (one-time setup) dos parâmetros do sistema. Esse fato por si só vai contra a ideia de algumas criptomoedas, como o Bitcoin, de que tudo deve ser descentralizado. Durante esse procedimento, bits aleatórios e secretos são calculados e usados para definir os parâmetros públicos; esses bits são, então destruídos e os parâmetros são divulgados na rede. Se realizado corretamente, então nenhum segredo ou backdoors permanecerão existindo.
Porém, caso o processo de instalação esteja corrompido, o sistema continuará a prover as garantias de anonimidade e privacidade, mas seria possível "forjar" moedas. Contanto que esse procedimento de setup seja conduzido honestamente, não é possível corromper os parâmetros públicos do sistema.
Uma questão diferente é a possibilidade de bugs no código do protocolo. Assim como qualquer outro projeto de software, tais bugs precisam ser encontrados e resolvidos através de revisões e testes. De forma a aumentar a qualidade do código, os autores pretendem lançar o projeto para a comunidade open-source.