A primeira vez que eu li o próprio exemplo de trabalho de um protocolo para consenso por mediana, parecia uma nota de rodapé. Três operadores, três números, uma mediana, pronto. Foi preciso uma segunda passada, honestamente, para notar o que essa nota de rodapé estava admitindo de fato.

O protocolo é Newton, e o mecanismo é simples o suficiente para explicar em uma frase. Naquilo que Newton chama de fase de Prepare, o Gateway envia newt_fetchPolicyData para um conjunto de operadores independentes, e cada um é solicitado a buscar o mesmo valor externo — um preço, um saldo, o que quer que a política precise — e reportar de volta sem assinatura.

Os próprios docs da Newton mostram isso com três operadores puxando um feed de preço: 100,0; 102,0; 101,0. Diferença pequena o bastante para concordar, mas diferente o bastante para provar que ninguém copiou o dever de ninguém. O Gateway calcula uma mediana de 101,0, verifica que cada valor fica dentro de uma faixa de tolerância de 10%, e só então move a rodada para a fase Commit, onde newt_evaluateAndSign faz os operadores assinarem um resultado de política construído a partir desse mesmo número compartilhado.

Nenhum desses três operadores assina aquilo que realmente viu.

Eu volto sempre a essa linha, porque é uma escolha de design tão específica depois que você senta com ela. O Operador 1 nunca assina 100,0. O que é assinado com BLS na fase Commit é uma computação do Gateway, uma mediana, não a observação bruta de nenhum operador. Isso não é desleixo, é forçado pela matemática: a agregação de assinaturas só continua barata on-chain se cada signatário assinar uma mensagem idêntica, e três buscas verdadeiramente independentes quase nunca produzirão uma só, por conta própria. Newton fabrica a mensagem idêntica descartando as diferenças antes de qualquer um assinar. Os valores brutos não desaparecem totalmente; eles sobrevivem no que os docs chamam de Full Digest, mantido para verificação em desafios. Mas o objeto que realmente carrega o peso da assinatura, o Consensus Digest, tem as atestações individuais zeradas.

O registro construído para disputas acaba guardando mais verdade do que o registro construído para consenso. Engraçado como isso funciona.

Há um segundo custo embutido nessa mesma exigência de uniformidade, e só aparece quando algo dá errado. A Newton não consegue, silenciosamente, descartar um outlier e continuar com os operadores que concordam, sem quebrar a regra de mensagem idêntica na qual o BLS depende. O que deixa exatamente dois resultados: todo mundo cai dentro da faixa de tolerância, ou a rodada inteira falha com ToleranceExceeded. Não existe um cenário em que dois bons operadores simplesmente sobrevoem um ruim.

Um único feed velho. Um endpoint mal configurado. Um número deliberadamente errado. Nenhum deles é sobrepujado. Qualquer um deles para a rodada para todo mundo.

Vire o zoom para fora por um segundo da mecânica e veja o que isso implica sobre incentivos. Newton define seu limite de quorum em 67% da participação dos operadores. A própria rede de operadores roda como um EigenLayer AVS, então essa participação é segurança recolocada emprestada da Ethereum, não um conjunto de validadores que o protocolo construiu do zero. A matemática do quorum é explicitamente construída para tolerar uma minoria significativa dessa participação discordando e ainda assim chegar ao consenso, desde que a discordância aconteça na fase de assinatura. A checagem de tolerância por mediana fica a montante de tudo isso. Um operador fora da faixa nunca chega a um ponto em que o quorum sequer se aplique; a rodada simplesmente nunca chega lá.

Aqui está a parte que eu ainda não resolvi completamente. Newton documenta duas condições de falha, avaliação incorreta e equivocações, e ambas descrevem o que acontece depois que um operador assina alguma coisa. O ToleranceExceeded dispara antes disso, antes de qualquer assinatura existir para ser julgada contra uma política. Enviar um número fora de banda, repetidamente, custa alguma coisa a um operador além da aposta que ele manteria mesmo assim? Os documentos não dizem. Se não custa, a forma mais barata de interromper uma rodada não é forjar uma assinatura ou quebrar a agregação BLS, que colocam em risco capital real recolocado se forem descobertos. É apenas rodar um feed lento e deixar a verificação de tolerância fazer o resto.

Nada disso torna o design errado, e vale dizer isso de forma direta. Remover silenciosamente o operador que discorda e prosseguir com uma mediana limpa do resto resolveria o problema de travamento e criaria um pior: esconderia a discordância completamente. Uma rodada que falha alto diz a todas as partes assistindo que uma entrada específica discordou das outras, o que é mais honesto do que uma mediana arrumada que exclui silenciosamente uma fonte e reporta como se nada tivesse acontecido. Manter os valores brutos no Full Digest, mesmo enquanto os remove do que é assinado, significa que a discordância não é apagada, apenas realocada para onde os desafios vivem, em vez de onde o consenso vive.

Então falhar a rodada inteira por causa de um único ToleranceExceeded é uma salvaguarda contra dados ruins, ou apenas uma maneira mais lenta e silenciosa de um operador mal configurado manter a assinatura de todos como refém? Depende, provavelmente, se você é o que está esperando por isso, ou o que teve o feed cair fora da faixa hoje.

@NewtonProtocol $NEWT #Newt $THE $ARPA