Glossário / Protocolo e atualizações
Speedy Trial
- O que é Speedy Trial?
- Speedy Trial é a configuração de ativação usada para o Taproot: uma janela curta de sinalização dos mineradores com um limiar reduzido de 90% e a aplicação das regras adiada para uma altura de bloco fixa posterior.
Especificação no BIP-341.
Speedy Trial é um deployment de bits de versão do BIP-9 modificado, escrito no próprio BIP-341 e não em um BIP próprio. Os mineradores tiveram 109 dias, de 24 de abril a 11 de agosto de 2021, para definir o bit 2 em 1.815 de 2.016 blocos, com a aplicação das regras fixada no bloco 709.632. Essa altura de aplicação foi fixada antes da abertura da sinalização, então os detentores sabiam o bloco exato em que as regras mudariam.
Como funciona
Speedy Trial mantém o método de contagem do BIP-9, muda dois de seus números e acrescenta um parâmetro que o BIP-9 nunca teve.
O BIP-9 conta os blocos de sinalização ao longo de cada período de reajuste de dificuldade de 2.016 blocos e move um deployment de STARTED para LOCKED_IN assim que um período contém blocos suficientes. Seu limiar é de 1.916 blocos, 95% de um período, e sua própria diretriz para a janela é de um ano, 31.536.000 segundos após o horário de início. Tanto o início quanto o timeout (prazo de expiração) são lidos do tempo passado mediano, a mediana dos carimbos de data e hora de um bloco e seus dez predecessores, então o relógio pertence à cadeia e não ao relógio de ninguém.
O deployment do Taproot reduziu o limiar para 1.815 blocos, 90%, e deu à janela 9.417.600 segundos, do carimbo de data e hora de época 1619222400 até 1628640000. A adição foi min_activation_height. Com o BIP-9 puro, um deployment travado passa a ACTIVE na próxima fronteira de reajuste, então o travamento fixa a altura de aplicação apenas aos 2.016 blocos que o seguem. Com o Speedy Trial, o estado LOCKED_IN fica em loop até que a cadeia alcance a altura declarada, e só então passa a ACTIVE. A altura da mainnet foi 709.632, que é exatamente 352 períodos de reajuste e, portanto, uma fronteira de período. O deployment de fato se ativou ali.
A separação é o ponto central. A sinalização responde rápido a uma pergunta, e o longo intervalo que se segue é tempo para que todos os demais se atualizem, não tempo gasto discutindo.
Onde você o vê
Os parâmetros do Speedy Trial são legíveis no campo de versão de cada bloco minerado durante a janela de sinalização de 2021.
Um bloco de sinalização carrega os bits superiores 001 mais o bit próprio do deployment, então um sinal do Taproot no bit 2 é lido como a versão 0x20000004. Os mineradores que solicitam trabalho encontram o mesmo deployment por meio do getblocktemplate, cuja chave "rules" nomeia os soft forks já ativos e cuja chave "vbavailable" associa cada um dos pendentes ao seu bit. O nome que o BIP-341 dá a este deployment, e portanto a string que um minerador lê, é simplesmente "taproot".
A execução do mesmo deployment na testnet3 mostra para que servia o atraso. Ela usou carimbos de data e hora de início e de timeout idênticos, um limiar de 1.512 blocos a 75%, e min_activation_height 0, então nada foi adiado além do intervalo de um período do próprio BIP-9, e ele se ativou na altura 2.011.968. A mainnet teve a espera extra; a rede de testes não tinha economia alguma a proteger. Na signet as regras estiveram sempre ativas, então ali não houve ensaio algum.
Speedy Trial vs UASF
Um soft fork ativado por usuários força o resultado pelo lado dos nós, e o Speedy Trial recusou deliberadamente esse poder.
O mecanismo de força está escrito no BIP-8 como lockinontimeout. Defina-o como true e o deployment recebe um período MUST_SIGNAL antes do timeout, no qual os blocos que não sinalizam se tornam inválidos assim que se esgota a cota de blocos sem sinalização do período, garantindo o travamento quer os mineradores cooperem ou não. O BIP-8 recomenda o sinalizador para qualquer soft fork que se espere enfrentar oposição política de uma parcela não desprezível dos mineradores e, no mesmo documento, adverte que os nós que o usam podem seguir uma cadeia com menos trabalho acumulado por um período prolongado e podem precisar se conectar preferencialmente entre si.
O Speedy Trial não carregava sinalizador algum desse tipo. Não alcançar o limiar antes do timeout colocava o deployment em FAILED e não fazia mais nada, e foi essa a troca que ele fez: nenhuma garantia de ativação, nenhum risco de divisão da cadeia e uma resposta barata em qualquer caso.