# Zcash

Zcash é uma criptomoeda voltada ao uso de criptografia para prover uma melhoria em privacidade quando comparada a outras criptomoedas como o Bitcoin. O protocolo Zerocoin foi melhorado e transformado no sistema Zerocash, e finalmente na criptomoeda Zcash em 2016. O desenvolvimento de melhorias no protocolo e a referência de implementação é liderada pelo Zerocoin Electric Coin Company, coloquialmente conhecida como Zcash Company. O fundador e CEO da Zcash Company é Zooko Wilcox-O'Hearn. A sua equipe de fundadores incluem o criptógrafo Matthew D. Green da Universidade Johns Hopkins. Roger Ver foi um dos investidores iniciais da Zcash Company.

## Detalhes

Pagamentos em Zcash são publicados em um blockchain público, mas os usuários são capazes de usar um recurso opcional de privacidade para ocultar o remetente, o destinatário e a quantia que está sendo transacionada. Como o Bitcoin, Zcash tem uma quantidade total fixa de 21 milhões de unidades. Nos primeiros quatro anos, 20% das moedas criadas nesse período são alocadas em uma "recompensa para fundadores" divididas entre investidores, desenvolvedores, e uma fundação sem fins lucrativos.
As transações podem ser "transparentes" e similares a transações bitcoin no caso em que são controlados por uma t-addr (endereço transparente), ou podem ser um tipo de prova de conhecimento nulo chamados zk-SNARKs; nesse caso as transações são ditas como "blindadas"e são controladas por um z-addr (endereço blindado). As moedas de Zcash estão ou em um conjunto transparente ou em um conjunto blindado; Em dezembro de 2017, apenas cerca de 4% das moedas Zcash estavam no conjunto blindado e nesse momento a maior parte dos programas de carteiras não dava suporte para os z-addrs e nenhuma carteira baseada na web oferecia suporte.
Zcash proporciona aqueles que optam por transações privadas a opção de "divulgação seletiva", permitindo a um usuário comprovar o pagamento para fins de auditoria. Um motivo para permitir isso é oferecer a escolha ao cumprimento de regras de impostos e contra lavagem de dinheiro. "As transações são auditáveis, mas a divulgação está sob o controle do participante." Wilcox foi palco de reuniões virtuais com agências de lei nos EUA para explicar esses princípios fundamentais e ficou registrado que eles dizem que "eles não desenvolveram a moeda para facilitar atividades ilegais".

## Transações

Pagamentos em Zcash são publicados em um blockchain público. Entretanto, os usuários podem escolher o grau de privacidade dos valores transferidos, que podem ser de dois tipos:
* Transação de valores transparentes são análogos a transação de valores de bitcoins, mantendo o valor transferido, remetente e destinatários públicos; são referenciados por t-addrs (endereços transparentes);
* Transação de valores blindadas são acompanhados por paying keys e armazenadas como tuplas denominadas notes; payment keys são chaves públicas associadas à chave pública do destinatário e exigem o conhecimento de spending keys para gastar o valor transferido; são referenciadas por z-addrs (endereços blindados).
Uma transação em si é representada por JoinSplits Descriptions, que descrevem um JoinSplit Transfer e um tipo de prova de conhecimento nulo (zk-SNARKs), que garante a privacidade do remetente, destinatário e valor transferido. Um JoinSplit Transfer, por sua vez, recebe como entrada um valor transparente e até dois blindados e produz saídas do mesmo tipo.
Zcash ainda proporciona àqueles que optam por transações privadas a opção de "divulgação seletiva", permitindo a um usuário comprovar um pagamento para fins de auditoria. Um motivo para essa permissão é oferecer a escolha ao cumprimento de regras de impostos e contra lavagem de dinheiro. "As transações são auditáveis, mas a divulgação está sob o controle do participante." Wilcox foi palco de reuniões virtuais com agências de lei nos EUA para explicar esses princípios fundamentais e ficou registrado que "eles não desenvolveram a moeda para facilitar atividades ilegais". Em dezembro de 2017, apenas cerca de 4% das moedas Zcash estavam no conjunto blindado e a maior parte dos programas de carteiras não dava suporte a z-addrs.

### Gasto de transações blindadas

Ao gerar o note de uma transação blindada em Zcash, um commitment é criado e seu hash é adicionado a uma lista contendo o hash de todos os outros commitments conhecidos (uma cópia desta lista é armazenada em cada nó da rede).
Quando um note é gasto, cria-se um valor que representa tal operação, denominado nullifier, e seu hash é adicionado a outra lista (também com cópia em todos os nós da rede). O conteúdo de um nullifier é derivado de um commitment a partir de seu spending key. O armazenamento como hash evita a possibilidade de se linkar commitments a nullifiers, garantindo a privacidade do output da transação.
Ao realizar uma transação blindada, deve-se então revelar o nullifier de cada valor blindado enviado e o commitment de cada valor blindado recebido. A transação só se completa se não houver colisão de hashes.

### zk-SNARK

A blindagem de uma transação no Zcash consiste na formulação de um zk-SNARK que permite verificar, com alta probabilidade, a validade das seguintes premissas:
* a soma dos valores de entrada condiz com a soma dos valores de saída;
* o commitment de cada note de entrada existe na lista de commitments;
* o spending key de cada note de entrada é conhecido pelo remetente;
* os nullifiers revelados condizem com os notes de entrada;
* os spending keys de cada note de entrada foram criptograficamente ligados a uma assinatura da transação de modo que esta não possam ser modificada por alguém que não os conheça;
* cada note de saída foi gerado de modo que seus nullifiers não colidam com os de outros notes.
A adição de zk-SNARKs à blindagem de transações facilita a validação mas retarda a construção do bloco, uma vez que a formulação dos parâmetros de uma prova é custosa (pode levar até 40 segundos) mas facilmente verificável (não toma mais que alguns milissegundos). A validação é modelada como equações algébricas cujas soluções equivalem ao conhecimento da chave privada, da seguinte maneira:
Computação→ Circuito Aritmético→ R1CS → QAP → zk-SNARK
* Um programa que verifica as premissas acima é convertido para um circuito aritmético: uma equação matemática que representa toda a computação feita em tal validação;
* As saídas de cada porta do circuito são modeladas como R1CS (Rank 1 Constraint System), i.e., uma equação de matrizes cujas linhas representam portas do circuito e colunas representam variáveis:$(A\cdot s)\times (B\cdot s)=C\cdot s$O vetor $s$ equivale à solução em cada porta do circuito;
* O R1CS é modelado como um QAP (Quadratic Arithmetic Program): conjunto de polinômios cuja solução do produto equivale à solução do R1CS;
* Um zk-SNARK verifica o conhecimento de uma solução para o produto de polinômios e valida a transação.

## Atualização da rede

A primeira atualização da rede de Zcash será feita através de um hard fork no número de bloco 347500 , que está previsto para ser no dia 25 de junho de 2018. Um novo recurso vai ser introduzido, que permitirá que os usuários configurem tempos de expiração para transações. Cinco pospostas para melhoria do Zcash, nominalmente as 143, 200, 201, 203 serão implementadas. Esta atualização também melhorou a verificação de assinatura, que ajuda a melhorar a velocidade das transações.