Aviso
Esta caixa foi arquivada. O desenvolvimento foi movido para o repositório zksync-crypto. Por favor, use-o.
zkSync Era é um rollup de camada 2 que usa provas de conhecimento zero para escalar o Ethereum sem comprometer a segurança ou a descentralização. Por ser compatível com EVM (Solidity/Vyper), 99% dos projetos Ethereum podem ser reimplantados sem refatorar ou reauditar uma única linha de código. zkSync Era também usa um compilador baseado em LLVM que eventualmente permitirá aos desenvolvedores escrever contratos inteligentes em C++, Rust e outras linguagens populares.
O objetivo desta biblioteca é trabalhar com uma aritmetização muito específica com suposições adicionais sobre o tamanho do campo. Grosso modo, esperamos ter um campo F
com |F| ~ 64 bits (o tamanho de uma palavra de máquina) (a suposição sobre o tamanho do campo não é importante para a estratégia de aritmetização e posicionamento de portas, mas é afirmada em implementações de gadgets para funções específicas que dependem de um tamanho de campo específico).
O sistema possui uma hierarquia de funções lógicas (gadgets) - portas (entidades que podem se inscrever no traço) - e avaliadores (relações entre polinômios). Os avaliadores são escritos na forma de uma característica que nos permite posteriormente compor automaticamente funções para verificar a satisfatibilidade e calcular provas, bem como sintetizar verificadores simples e recursivos. As portas possuem ferramentas adicionais anexadas a elas que permitem que as próprias portas rastreiem a lógica de onde devem ser colocadas no rastreamento. Observe que contamos com as restrições de cópia do Plonk e trabalhamos nas entidades lógicas copiáveis de "variáveis" para compor uma declaração final demonstrável. O sistema não se destina à aritmetização do AIR e não permite expressar restrições que abrangem diversas linhas do rastreamento.
Em geral, o traço contém poucas variedades de colunas. A principal separação é entre:
Além disso, o rastreamento permite adicionar um argumento de pesquisa, que também pode usar colunas especializadas para abrigar as entradas das tabelas de pesquisa ou apenas usar colunas de uso geral. As tabelas são codificadas como apenas um conjunto de polinômios por enquanto, portanto o comprimento total do rastreamento deve ser maior que o número total de entradas nas tabelas.
Observe que cada "portão" (como um tipo Rust) é único e, portanto, um portão só pode ser colocado em colunas especializadas ou de uso geral, mas não em ambas. Se alguém precisar dessa funcionalidade, é possível criar um wrapper newtype.
Funções lógicas de nível superior (como decomposições booleanas, verificações de intervalo, verificações de zero, etc.) são usadas para fazer um circuito se inscrever internamente de diferentes maneiras, dependendo se algumas portas são permitidas ou não na instância específica do CS. Instâncias do CS com diferentes conjuntos de portas são consideradas um tipo diferente da perspectiva do Rust, e contamos com algum trabalho de inlining/prop constante/compilador para reduzir a ramificação em saltos estáticos.
|F|
e por isso temos que repetir argumentos), mas isso será alterado para que passemos para o campo de extensão como o mais rápido possível depois de se comprometer com a testemunha para evitar uma chance muito "grande" de obter zeros no denominador. O efeito sobre as despesas computacionais na prova é bastante insignificante Usamos um argumento de pesquisa aplicado por meio das relações sum_i selector(x_i) / (witness(x_i) + beta) == sum_i multiplicity(x_i) / (table(x_i) + beta)
onde uma pesquisa sobre selector(x_i)
é apenas uma identidade. Também não codificamos as tabelas como polinômios de menor grau para eliminar verificações extras de limite de grau e, em vez disso, as preenchemos com zeros. Observe que as entradas da tabela nunca contêm um elemento de (0,0,...,0)
, pois usamos colunas de ID separadas para tipos de tabela no caso de múltiplas tabelas (mesmo no caso de apenas uma tabela ser usada) e um ID assim começa com 1.
Uma característica interessante de um argumento de pesquisa como esse é que, devido à sua natureza aditiva, se fizermos pesquisas sobre vários polinômios witness
na mesma tabela, em vez de repetir o argumento para cada (tupla de) polinômio(s) (o que exigiria uma coluna de multiplicidade separada, bem como alguns polinômios intermediários posteriormente), podemos "somar" multiplicidades e transformar o argumento em algo como sum_i selector_0(x_i) / (witness_0(x_i) + beta) + sum_i selector_1(x_i) / (witness_1(x_i) + beta) == sum_i total_multiplicity(x_i) / (table(x_i) + beta)
, de modo que o custo total de uma pesquisa é apenas 1 coluna de multiplicidades e 2 polinômios intermediários (relacionados à testemunha) + 1 (relacionado à tabela) para codificar o relações lhs e rhs nas raízes da unidade.
A correção deste argumento é clara. Para fins de solidez, usamos o argumento original como no artigo "Quocientes armazenados em cache para pesquisas rápidas", Lema 2.4. Precisamos mostrar que é suficiente comprometer-se com total_multiplicity
em vez de com as multiplicidades de witness_0
e witness_1
separadamente.
Suponha que a equação sum_i selector_0(x_i) / (witness_0(x_i) + X) + sum_i selector_1(x_i) / (witness_1(x_i) + X) == sum_i total_multiplicity(x_i) / (table(x_i) + X)
mantém. Precisamos mostrar que witness_0
e witness_1
estão contidos na tabela t
. Seja f = (witness_0 | witness_1)
, uma concatenação dos valores. A equação acima implica sum_i selector_i / (f_i + X) == sum_i total_multiplicity_i / (t_i + X)
(observe que a duração do intervalo de i
no LHS é o dobro do acima). Pelo Lema 2.4 obtemos f subset t
: "subset" no sentido de que toda coordenada do vetor f
é uma coordenada de t
. Em particular, witness_0, witness_1 subset f subset t
.
Observe que o argumento também vale para vários witness_i
. O resto do argumento de solidez, para um beta
escolhido, segue diretamente como no trabalho acima.
2^-40
de obter 0
nos denominadores Existem benchmarks para 8kB de SHA256 usando o que consideramos uma configuração ideal de portas + tabelas para o circuito SHA256. Observe que mesmo que o provador seja rápido, não otimizamos adequadamente a FFT e ainda usamos Poseidon (não Poseidon2) para configurações onde esperamos que a prova seja usada para recursão. Dois scripts sha256_bench_recursive.sh
e sha256_bench_non_recursive.sh
permitem que você execute os testes correspondentes (se a prova deve ser usada em recursão ou não), e você deve procurar uma linha Proving is done, taken ...
para ver o tempo de prova , porque o verificador executado depois dele é bastante detalhado. Esses benchmarks usam um fator LDE de 8, embora todas as nossas restrições sejam de grau 4 ou menos - no entanto, é um parâmetro usado em alguns outros benchmarks públicos. Também não usamos PoW nessas provas porque PoW para 20 bits é insignificante (30 ms) e ainda não oferecemos suporte a PoW sobre hashes algébricos (no entanto, eles são apenas ~ 2x mais lentos, portanto também insignificantes). O nível de segurança é de aproximadamente 100
bits, mas a solidez do FRI pode ser aumentada aumentando o número de consultas, e um aumento no número de consultas não aumenta o tempo de prova (não deve ser confundido com a alteração da taxa FRI). O comprimento do rastreamento é 2^16
e usa 60 colunas de uso geral e 8 argumentos de pesquisa de largura 4.
Nota: os benchmarks apenas tentam compilar para o arco nativo e apenas o arco AArch64 (leia-se Apple M1) é normalmente testado de ponta a ponta por enquanto. Implementações aritméticas x86-64 foram testadas quanto à validade, mas não de ponta a ponta em provas completas. Observe que o desempenho máximo x86-64 requer sinalizadores de recursos extras do compilador além de cpu = native
(o conjunto AVX512 não é usado pelo compilador Rust, mesmo em CPUs nativas)
O provador Boojum é distribuído sob os termos de
a sua opção.
O zkSync Era passou por muitos testes e auditorias. Embora esteja ativo, ainda está em estado alfa e passará por mais auditorias e programas de recompensas de bugs. Adoraríamos ouvir as opiniões e sugestões da nossa comunidade sobre isso! É importante afirmar que a bifurcação agora pode levar à perda de atualizações de segurança importantes, recursos críticos e melhorias de desempenho.
Este software inclui componentes de terceiros. Para obter uma lista completa desses componentes e suas licenças, consulte o arquivo AVISOS DE TERCEIROS.