FastPQ
FastPQ é Iroha O que é ? STARK Proof path para efeitos de execução selecionados. Não substitui a execução normal da transacção ou o consenso. As transacções continuam a ser executadas ISI, IVM, e Sumeragi Como de costume; FastPQ Consuma o testemunho de execução determinista e transforma os efeitos apoiados em lotes de prova.
A integração do anfitrião atual tem três principais caminhos:
- Transferências numéricas transparentes de ativos registadas durante a execução do bloco
- Relais de faixa Nexus verificados cujo envelope de prova AXT contém uma ligação FastPQ
- Auxiliares transparentes de prova de mensagem SCCP que envolvem uma prova FastPQ em um envelope aberto de verificação
Transferir o caminho da testemunha
Transferências numéricas transparentes criam uma transcrição de transferência estruturada quando a instrução muda os balanços.
- a conta de origem, a conta de destino, a definição do ativo e o montante
- Saldos do remetente e do destinatário antes e depois da transferência
- o hash do ponto de entrada da transação utilizado como hash do lote
- Digest de autoridade derivado da conta de apresentação
- uma digestão de Poseidon para transcrições em delta único
As transferências de lote utilizam uma transcrição com múltiplos deltas. Nesse caso, a digestão Poseidon de delta único está ausente.
Na finalização do bloco, Iroha agrupa essas transcrições por hash de ponto de entrada. A testemunha de execução então carrega tanto os pacotes de transcrição originais quanto os lotes de transição FastPQ preparados para o prover.
Cada delta de transferência torna-se em duas linhas de transição:
| Em fila . | Forma da chave | Pre-valor | Pós-valor |
|---|---|---|---|
| Emissor de débito | asset/<asset-definition>/<source-account> | balanço do remetente antes | saldo do remetente após |
| Crédito do destinatário | asset/<asset-definition>/<destination-account> | Balanço do destinatário antes | saldo do destinatário após |
Os valores numéricos são normalizados em unidades inteiras testemunhas. Um valor é rejeitado para lotes FastPQ se não puder ser representado como um u64 não negativo na escala decimal selecionada.
Contribuições públicas
Cada lote de transição FastPQ contém entradas públicas que vinculam a prova ao contexto do bloco e da execução:
| Introdução | Que significa ? |
|---|---|
dsid | Identificador de espaço de dados codificado como bytes de pequeno índice |
slot | Tempo de criação do bloco convertido em nanossegundos |
old_root | Raiz do estado dos pais derivada da testemunha de execução |
new_root | A raiz pós-estado derivada da testemunha de execução . |
perm_root | O compromisso de Poseidon com as autorizações para o papel ativo |
tx_set_hash | Hash sobre transacção ordenada e hashes de ponto de entrada do time-trigger |
O anfitrião utiliza fastpq-lane-balanced como o parâmetro canônico definido para esses lotes.
Modelo matemático
Esta seção descreve a aritmética implementada pelo provador e verificador Rust atual. Todas as operações de campo abaixo são sobre o campo prime Goldilocks:
FastPQ usa Poseidon2 em vez de F para compromissos de campo. A esponja tem largura t = 3, taxa r = 2 e capacidade 1. O hash absorve elementos de campo em blocos de taxa-2 e anexa um único elemento de campo 1 antes da permutação final:
As cordas de byte são empacotadas em membros pequenos endianos de 7 bytes para que cada membro seja estritamente inferior a p:
Os hashes de campo separados por domínio são representados como:
Para hashes que começam a partir de digestões em byte-domain, FastPQ mapeia os primeiros oito bytes do pequeno endian no campo:
Aqui Hash significa o iroha_crypto::Hash::new de Iroha, um digesto Blake2bVar de 32 bytes, a menos que uma fórmula nomee explícitamente Poseidon2 ou SHA-256.
Aritmética de campo
O código Rust representa os elementos de campo como valores canônicos u64 no [0,p).
A multiplicação calcula primeiro o produto de 128 bits:
A redução de Goldilocks utiliza então a identidade:
Se:
Em seguida, o redutor calcula:
A implementação adiciona ou subtrai condicionalmente p até que o resultado seja canônico. Os números inteiros assinados, tais como os deltas do balanço, são incorporados por:
Poseidon2 Permutação
O estado de permutação Poseidon2 é:
A sua caixa S é:
FastPQ utiliza quatro rodadas completas, cinquenta e sete rodadas parciais, em seguida, mais quatro rodadas. Uma rodada completa com constantes redondas c_r = (c_{r,0}, c_{r,1}, c_{r,2}):
Uma rodada parcial é:
Todas as adições e multiplicações são em F. A matriz canónica MDS é:
O hash do campo começa a partir do estado zero. Para cada bloco de taxa completa-2 (u,v):
O bloco final acrescenta o 1 Elemento de enchimento antes de uma última permutação. x_0.
A entrada pública é obrigatória
O host codifica uma identificação de espaço de dados escrevendo seu valor u64 nos primeiros oito bytes do campo de 16bytes:
O tempo de criação do bloco é convertido de milissegundos em nanosegundos:
O hash do conjunto de transações é um hash de domínio de byte sobre os hashes do ponto de entrada ordenados:
onde h_i são classificados hashes de transações e pontos de entrada do time-trigger. Na prova pública IO, se perm_root ou tx_set_hash for tudo zero, o prover preenche os valores de fallback:
Normalização numérica
Para cada delta de transferência, a escala decimal-alvo é a escala máxima cortada ao longo da quantidade e ambos os instantâneos de equilíbrio:
A. Numeric Valor com mantissa m e escala q só é aceita quando m >= 0 e q <= s. O seu FastPQ O valor do testemunho é:
O resultado normalizado deve corresponder a u64.
Ordenamento canônico
Antes da construção do rastro, o lote é classificado por chave de transição, grau de operação e índice de inserção original:
O compromisso de encomenda é um hash do campo Poseidon2 sobre o domínio fastpq:v1:ordering e a codificação Norito das transições ordenadas:
onde P é embalagem de 7 bytes, E é Norito codificação, D_o é fastpq:v1:ordering, e T* É a lista de transição ordenada.
Equações de transferência
Para um montante de transferência a, saldo do remetente f e saldo do destinatário t, FastPQ valida os valores normalizados dos testemunhos antes da construção do rastreamento:
As linhas de transição então codificam:
No interior do rastro, os deltas assinados são reduzidos para F:
A digestão opcional de transferência single-delta compromete a pré-imagem de transferência codificada:
Para transcrições de transferência multi-delta, o formato atual exige que este digestamento de nível superior esteja ausente.
A digestão da autoridade de acolhimento para transcrições de transferência é:
Linhas de rastreamento
Deixe a lista de transição ordenada conter n linhas reais. O comprimento do rastro é o próximo poder de dois:
As filas 0..n-1 são ativas; as fileiras n..N-1 são fileiras de enchimento. Cada linha real possui um conjunto de selectores de operação:
Todas as colunas de selector são booleanas:
As linhas de pesquisa de permissão são exatamente as linhas de atribuição e revogação de funções:
Para as linhas de operação numérica:
O construtor acompanha também os delta por ativo:
Só as filas de menta e queimadura atualizam o contador de abastecimento:
Metadados e colunas de rastreamento do espaço de dados são hashes de campo derivados antes da materialização de linha:
O hash de metadados, o hash do espaço de dados e o slot são estáveis em linhas adjacentes de traços:
Transferir colunas de Merkle
As linhas de transferência carregam um caminho Merkle escasso de 32 níveis. Se uma prova host estiver faltando, o prover sintetiza um caminho determinista a partir da chave de linha, pré-equilíbrio e se a linha é o lado do remetente ou do receptor.
Para os caminhos sintéticos, o sal de sabor é fastpq:smt:from para as linhas de remetente e fastpq:smt:to para as linhagens de receptor:
As folhas sintéticas e os nós internos são:
O rastreamento registra o pedaço b_l, irmãos s_l, nó de entrada x_l, e nó de saída x_{l+1} Em todos os níveis. Com a convenção do ramo do código:
Hashes de permissão
As linhas de atribuição e revogação da função hash o testemunho de permissão:
A tabela de permissão host classifica as entradas por bytes de papel, bytes de permissões e bytes de época, então constrói uma árvore de Poseidon2 Merkle:
Os níveis de largura ímpar duplicam o elemento final.
O compromisso de rastrear
Para cada coluna de traços c, FastPQ primeiro interpola os valores da coluna sobre o domínio de traços e hashes o vetor do coeficiente:
A raiz de rastreamento é uma raiz de Poseidon2 Merkle sobre compromissos de coluna:
O compromisso de rastreamento final é um hash em byte sobre o domínio, conjunto de parâmetros, forma do rastreamento, digestões de colunas e raiz do rastreador:
onde D_c é fastpq:v1:trace_commitment.
Composição AIR
O valor de composição V1 AIR é uma combinação linear de resíduos locais em filas. A transcrição mostra dois desafios:
Para cada par de linhas adjacentes (i,i+1), o provador calcula:
Os resíduos rho são, na ordem do código:
Para as linhas com colunas numéricas:
E para colunas de contexto de lote estável:
O verificador recalcula o A_i para as aberturas de filas recolhidas na amostra e verifica-o em relação ao valor da composição comprometido no âmbito da raiz Merkle da composição AIR.
Produto de pesquisa
O acumulador de pesquisa de permissões utiliza o desafio Fiat-Shamir gamma. Nas avaliações de extensão de baixo grau de s_perm e perm_hash, o produto em execução é:
Os registos de prova:
Extensão de baixo grau
Que omega_T seja o gerador de domínio de rastreamento, omega_E o gerador do domínio de avaliação e g a compensação dos cosetos configurados. Para uma coluna de rastreio com valores v_i, a interpolação produz coeficientes a_j tais que:
A extensão de baixo grau evalua o mesmo polinômio no coseto:
A implementação calcula isto multiplicando os coeficientes por poderes do coset compensado antes de FFT:
e, em seguida, a avaliação a' no domínio de avaliação.
A Comissão CPU FFT é uma transformação iterativa de radix-2 Cooley-Tukey sobre entradas invertidas em bits. L, Meio comprimento H=L/2, e raiz de estágio:
Cada borboleta calcula:
O inverso FFT realiza a mesma transformação com o omega^{-1} e escala pelo tamanho do domínio inverso:
As raízes do catálogo devem ser validadas antes da utilização:
Para domínios menores derivados da raiz do catálogo, o gerador é:
Haches de filas e folhas
Após LDE, FastPQ hashes de cada linha em todos LDE Colunas. para m Colunas:
Se os hashes de linha ainda estiverem no domínio trace, em vez do domínio de avaliação, o prover interpola e estende essa coluna de hash de linha única com o mesmo processo coset LDE.
Aberturas de Merkle
Os valores LDE são agrupados em pedaços de:
Cada pedaço de folha é:
Os pais de Merkle são:
Níveis ímpares duplicam o último nó. Os caminhos de consulta são verificados por hashing à esquerda ou à direita de acordo com a paridade do índice da folha de consulta em cada nível.
Para uma folha com índice i, o caminho (s_0,\ldots,s_{d-1}) é verificado contra a raiz R pela recorrência:
O cheque só é aprovado quando:
As folhas de linha AIR são:
As folhas de composição AIR são:
A abertura da consulta LDE também verifica se o valor aberto no índice de avaliação i está presente na sua peça autenticada:
FRI Pulsão
FRI compromete-se a AIR Avaliações da composição. l, As amostras de transcrição são um desafio beta_l. A camada é empolhada para um múltiplo da aridade repetindo o último valor. Cada grupo de tamanho da aridade se dobra para:
onde a é a aridade de FRI. O verificador verifica, para cada cadeia de consultas amostrada, que:
e autentica cada grupo FRI aberto contra a raiz de camada FRI correspondente.
Transcrição de Fiat-Shamir
O catálogo de parâmetros canônicos rotula o hash da transcrição como SHA3-256. A implementação atual do prover e verificador deriva bytes de desafio com iroha_crypto::Hash::new, que é um digesto Blake2bVar de 32 bytes, depois reduz os primeiros oito bytes de pequena endea para F:
As chamadas de desafio adicionam o texto completo ao estado da transcrição.
- público IO, versão de protocolo, versão de parâmetro e nome do parâmetre
- LDE raiz e raiz de rastro
gamma- Desafios de composição AIR
alpha_0,alpha_1 - Raiz de traço AIR e raiz de composição AIR
- lookup grande produto
- Roteiras de camadas FRI e desafios
beta_l - índices de consulta tomados em amostra
A amostragem de consulta continua a desenhar digestões de desafio de 32 bytes e a lê-las como pequenos fragmentos u64 até obter o número solicitado de índices únicos:
O conjunto de amostras é devolvido em ordem ordenada.
Reprodução do verificador
O verificador recalcula, em primeiro lugar, o compromisso do lote:
e requer:
Reconstrui também o público IO:
Cada campo deve corresponder ao público da prova IO byte-for-byte. O verificador reconstrui a mesma transcrição e obtém a mesma:
Para cada consulta tomada pela amostra q, verifica-se:
e:
A Comissão AIR A abertura da composição deve ser autenticada no R_air_composition. A Comissão FRI A cadeia começa a partir da mesma A_q e deve terminar num final autenticado FRI Folha debaixo do terminal FRI A raiz.
O que o Provérbio verifica
Antes de construir o rastreamento, o provador FastPQ canoniza a ordem do lote por chave de transição, grau de operação e ordem de inserção. As linhas de transferência também exigem metadados transcritos.
Para as transcrições de transferência, os controlos no lado do provedor incluem:
- O saldo do remetente não deve fluir para baixo
sender_afterdeve ser igual asender_before - amountreceiver_afterdeve ser igual areceiver_before + amount- A transcrição deve abranger todas as linhas de transferência do lote.
- uma digestão de Poseidon com um único delta, quando presente, deve corresponder à imagem prévia da transcrição
- desde que as provas de Merckle raras sejam decodificadas como versão 1; os caminhos faltantes são preenchidos com provas sintéticas deterministas.
O rastreamento contém colunas de selector para transferência, moeda, queima, atribuição de papéis, revogação de papéis , conjunto de metadados e linhas de pesquisa de permissões.
Provérbio Lane
irohad inicia a faixa de prover FastPQ na inicialização se o backend do prover pode ser iniciado. A faixa é uma tarefa de fundo com uma fila limitada. Depois que um bloco produz um testemunho de execução, o caminho de commit apresenta um trabalho de prover contendo o hash do bloco, altura, vista e testemunho.
Se a faixa não estiver em execução ou a fila estiver cheia, o trabalho é ignorado e o processamento normal do bloco continua. Isso significa que a faixa de verificação de fundo não é uma entrada de transação ou um portal de consenso. É um caminho de produção de prova sobre estado que já foi executado.
A faixa constrói um provedor com:
parameter = "fastpq-lane-balanced"
execution_mode = auto | cpu | gpu
poseidon_mode = auto | cpu | gpuauto Deixa o provador escolher o backend disponível. cpu Execução de pins para o CPU. gpu preferências GPU Execução, com CPU fallback em que o backend não pode utilizar os kernels solicitados.
Verificação
A verificação de prova FastPQ reconstitui o compromisso canônico do lote e repõe a transcrição pública. O verificador verifica a versão do protocolo, a versão definida por parâmetros, os limites de reprodução, o compromisso de rastreamento, as entradas públicas, as aberturas Merkle da amostra, as abertura AIR e a cadeia de consultas FRI.
Os limites de repetição por defeito incluem:
| Limite . | Default . |
|---|---|
| Linhas de transição | 256 |
| Tamanho da carga útil do lote | 256 KiB |
| FRI camadas | 16 |
| Questões abertas | 128 |
Nexus Relais verificados
Nexus AXT Os envelopes de prova podem incorporar um AxtFastpqBinding. Quando RegisterVerifiedLaneRelay Executa, Iroha:
- Verifica o envelope de relevo da faixa e o material de prova FastPQ
- verifica o espaço de dados e a raiz do manifesto
- Decodifica o envelope de prova AXT
- Requer um
fastpq_binding - Reconstrui o lote FastPQ a partir dessa ligação.
- Decodifica a prova embutida FastPQ
- liga ao verificador FastPQ sobre o lote e a prova reconstruídos
Se a verificação for bem-sucedida, Iroha armazena um VerifiedLaneRelayRecord contendo a referência do relevo, o envelope original, o hash da carga útil de prova, a altura da verificação, a raiz do manifesto e a ligação à FastPQ.
Os envelopes de relevo de faixa também carregam material de prova compacto FastPQ. O material é um digesto sobre o ID da faixa, id do espaço de dados, altura do bloco, altura de verificação, hash de cabeçalho de bloco, hash de liquidação e raiz do manifesto. Um relevo só é admissível quando contém um material de prova QC e válido FastPQ.
AXT Matemática vinculativa
Para os envelopes Nexus AXT, AxtFastpqBinding é canonizado antes da repetição de prova. Valores padrão do parâmetro vazio para fastpq-lane-balanced; id e versão padrão de verificador vazio parafastpq e v1; o tipo de reivindicação é recortado e reduzido.
As entradas públicas AXT FastPQ são hashes de byte deterministas:
As chaves de transição AXT são:
No pedido de authorization é inserida uma linha relativa à concessão de títulos:
A reivindicação compliance inserir duas linhas de metadados: uma para a política e outra para os espaços de dados alvo.
Para tx_predicate e value_conservation, é utilizado um valor de efeito explícito quando a ligação contém uma quantidade fonte ou destino positiva. Caso contrário, o código deriva um valor determinístico limitado:
Em seguida, usam-se as mesmas equações de transferência:
Os IDs de conta do remetente e do destinatário sintéticos são gerados a partir de sementes-chave:
O hash do lote de transferência é:
O manifesto de lote AXT é digestado por SHA-256 sobre a codificação Norito da ligação canônica:
SCCP Prova de mensagem transparente
A caixa auxiliar SCCP também usa FastPQ para provas transparentes de mensagens transversais. Este caminho é separado da faixa de provedor de fundo irohad. Ele constrói um lote FastPQ diretamente a partir de um pacote e manifesto de prova de mensagem SCCP, em seguida, enrola a prova resultante para verificação aberta.
O lote SCCP utiliza o fastpq-lane-balanced e três transições de metadados:
| A chave . | Operação |
|---|---|
sccp:transparent:v1:statement | MetaSet |
sccp:transparent:v1:context | MetaSet |
sccp:transparent:v1:payload | MetaSet |
As suas entradas públicas são derivadas da prova interna transparente SCCP:
| Introdução FastPQ | SCCP fonte |
|---|---|
dsid | Os primeiros 16 bytes de uma digestão Blake2b sobre a declaração hash |
slot | Altura da finalidade |
old_root | Hash de carga útil |
new_root | Raiz de compromisso |
perm_root | O bloqueio de finalidade hash |
tx_set_hash | Hash de declaração |
Os codificadores canônicos SCCP escrevem números inteiros pequenos e codificam matrizes de bytes de comprimento variável como:
A cadeia de byte de entrada pública transparente é:
Os bytes de declaração transparentes são a concatenação da versão, família de cadeias, domínios locais e contrapartes, modelo de segurança, governança de âncora, codec de conta, modelo de finalidade, alvo do verificador, família de backend do verificador; campos de cadeia/backend/manifesto prefixados em comprimento; hash vinculativo de destino; A chave de codec da conta, tipo de carga útil, bytes de entrada pública e hash da carga útil.
O id do espaço de dados FastPQ para este caminho de prova é os primeiros dezesseis bytes de outro digestão Blake2b pré-fixado:
O lote de SCCP FastPQ é exatamente:
em seguida, ordenado pela mesma regra de encomenda FastPQ.
O compromisso com o verificador OpenVerify é SHA-256 em relação ao nome do backend da mensagem SCCP e ao descritivo canônico do verificador FastPQ:
O crudo FastPQ A prova é Norito- codificado em um StarkFriOpenProofV1, em seguida, embrulhado em um OpenVerifyEnvelope com backend Stark. SCCP A verificação reconstrói a mesma FastPQ a colheita do pacote e do manifesto, verifica os metadados do envelope de verificação aberto e chama o FastPQ Verificador e prova do lote reconstruído.
Setos de parâmetros
O catálogo dos parâmetros canônicos expõe dois conjuntos de parâmetres. fastpq-lane-balanced.
| Parâmetro | Propósito | Campo | Hashes | FRI |
|---|---|---|---|---|
fastpq-lane-balanced | transmissão de provedor equilibrada | Goldilocks extensão quadrática | Compromissos de Poseidon2, catálogo SHA3 etiqueta | Arity 8, blowup 8, 46 consultas |
fastpq-lane-latency | rotas sensíveis à latência | Goldilocks extensão quadrática | Compromissos de Poseidon2, catálogo SHA3 etiqueta | Arity 16, explosão 16, 34 consultas |
Ambos visam segurança de 128-bit e usam um tamanho de domínio rastreado de 2^16. O código de repetição da transcrição Rust V1 atualmente deriva bytes de desafio Fiat-Shamir com iroha_crypto::Hash::new em vez de invocar diretamente SHA3-256.
As constantes exatas do catálogo utilizadas pelo provador Rust são:
| Constantemente . | fastpq-lane-balanced | fastpq-lane-latency |
|---|---|---|
target_security | 128 | 128 |
grinding_bits | 23 | 21 |
trace_log_size | 16 | 16 |
trace_root | 0x002a247f81c6f850 | 0x6a9f4eb38fb9b892 |
lde_log_size | 19 | 20 |
lde_root | 0x60263388dbbf9b2a | 0x9c9c3a571b6f89ac |
permutation_size | 65,536 | 65,536 |
lookup_log_size | 19 | 20 |
omega_coset | 0x6af325e825ad5c18 | 0x3a5fd4171e3c3a4d |
fri_arity | 8 | 16 |
fri_blowup | 8 | 16 |
fri_max_reductions | 8 | 6 |
fri_queries | 46 | 34 |
Configuração
A configuração FastPQ está inserida em zk.fastpq.
[zk.fastpq]
execution_mode = "auto"
poseidon_mode = "auto"
# Optional telemetry labels.
device_class = "apple-m4"
chip_family = "m4"
gpu_kind = "integrated"
# Optional Metal backend tuning.
metal_queue_fanout = 3
metal_queue_column_threshold = 24
metal_max_in_flight = 5
metal_threadgroup_width = 128
metal_trace = false
metal_debug_enum = false
metal_debug_fused = falseOs mesmos rótulos de execução e telemetria podem ser substituídos a partir do irohad:
irohad --fastpq-execution-mode auto
irohad --fastpq-poseidon-mode cpu
irohad --fastpq-device-class apple-m4
irohad --fastpq-chip-family m4
irohad --fastpq-gpu-kind integratedAs variáveis ambientais são também suportadas para os campos de configuração. FastPQ- as variáveis específicas incluem:
FASTPQ_EXECUTION_MODEFASTPQ_POSEIDON_MODEFASTPQ_DEVICE_CLASSFASTPQ_CHIP_FAMILYFASTPQ_GPU_KINDFASTPQ_METAL_QUEUE_FANOUTFASTPQ_METAL_COLUMN_THRESHOLDFASTPQ_METAL_MAX_IN_FLIGHTFASTPQ_METAL_THREADGROUPFASTPQ_METAL_TRACEFASTPQ_DEBUG_METAL_ENUMFASTPQ_DEBUG_FUSED
Métricas
Quando a telemetria está habilitada, FastPQ exporta métricas para seleção de backend e comportamento de execução do Metal:
| Metrica . | Que significa ? |
|---|---|
fastpq_execution_mode_total | Modo de execução solicitado e resolvido por backend e rótulos do dispositivo |
fastpq_poseidon_pipeline_total | Pedido e resolvido caminho do oleoduto de Poseidon |
fastpq_metal_queue_depth | Limite de fila de metal, contagem máxima no voo, número de expedição e janela de amostragem |
fastpq_metal_queue_ratio | As filas de metais ocupadas e as proporções de sobreposição |
fastpq_zero_fill_duration_ms | Durada de enchimento zero para corridas de Metal |
fastpq_zero_fill_bandwidth_gbps | Largura de banda derivada zero-fill |
Para triagem geral de desempenho, utilize-as com os sinais de consenso e filas listados em Performance and Metrics .
Referência relacionada
- Esquema de modelo de dados para os detalhes do tipo gerados
FastpqTransitionBatchFastpqPublicInputsTransferTranscriptAxtFastpqBindingLaneFastpqProofMaterial- Opções
irohadFastPQ