CSV abrevia OP_CHECKSEQUENCEVERIFY em Bitcoin Script. Com BIP 68, permite um bloqueio relativo: um caminho de gasto só fica disponível quando a saída confirmada tem idade suficiente. Uma saída é uma quantia recebida com condições de gasto. Esperar não substitui a assinatura nem envia dinheiro.
Anna e Pedro podem gastar de comum acordo as moedas que guardam juntos. Também querem um caminho de recuperação que Anna use sozinha, mas apenas após um intervalo contado desde a confirmação da saída correspondente. CSV ajuda a impor essa condição. Ao contrário de CLTV, que aponta para uma altura ou um horário fixo, seu limite não é um ponto predeterminado de todo o histórico. Depende de moedas específicas. Criar uma carteira, preparar uma assinatura ou deixar uma transação sem confirmação esperando não substitui esse início. Uma carteira é um aplicativo ou dispositivo para receber e enviar bitcoins. [1] [2] [8]
Um bloco reúne transações em um lote acrescentado ao histórico compartilhado. A altura de um bloco indica sua posição na cadeia. Imagine uma saída confirmada na altura 900000 e um intervalo obrigatório de 10 blocos. Para esse bloqueio, o primeiro bloco possível para gastá-la é 900010. Um intervalo de apenas 9 blocos não basta. Isso não promete uma quantidade exata de minutos: os blocos não chegam em intervalos regulares. Ter idade suficiente também não equivale à confirmação do pagamento. A transação precisa ser válida nos demais aspectos e um minerador deve realmente incluí-la em um bloco. [2] [4] [9]
O intervalo também pode ser codificado em passos de 512 segundos. O código 2 representa então 1024 segundos. Mas não se comparam dois relógios de computador. O início é o Median Time Past do bloco anterior ao que confirmou a saída; a outra ponta é o Median Time Past do bloco anterior ao candidato. Trata-se do horário central dos últimos até 11 blocos depois de ordenados. A diferença entre essas medianas precisa atingir o intervalo exigido. Não é um alarme exato pelo horário local. [2] [4] [7]
Uma carteira pode combinar várias quantias recebidas antes para fazer um pagamento. Cada entrada da transação aponta para uma saída recebida anteriormente, cuja idade é contada desde a confirmação na cadeia. O campo nSequence pertence à própria entrada. Esse campo contém a informação usada para a espera relativa. Não basta que só parte do dinheiro tenha idade suficiente: todos os bloqueios aplicáveis à transação devem ser satisfeitos. Uma reorganização da cadeia também pode mudar o ponto de confirmação. Por isso, ter sido possível gastar antes não é uma propriedade irreversível da moeda. Em uma reorganização, a rede adota outro ramo válido da cadeia, substituindo parte do histórico anterior de blocos. [2] [4] [9]
Um Full Node verifica as regras por conta própria, com checagens relacionadas. CSV, conforme BIP 112, compara o argumento do script com nSequence da entrada que gasta a saída. Ele não calcula a idade sozinho; BIP 68 faz isso na validação da transação. Para um argumento comum sem o sinalizador de desativação, a versão da transação deve ser pelo menos 2 e o bit 31 de nSequence deve estar desligado. Um bit é um pequeno interruptor dentro de um campo numérico. Um argumento negativo, uma versão anterior ou um nSequence incompatível fazem a checagem falhar. [1] [2] [3]
O bit 22 determina como interpretar o intervalo. Desligado, indica blocos; ligado, indica passos de 512 segundos. O argumento do script e nSequence precisam usar o mesmo tipo. Pense em comparar medidas: um número maior não basta se um lado conta quilômetros e o outro horas. Aqui, a incompatibilidade é entre uma quantidade de blocos e um intervalo de tempo. [1] [2] [3]
Os 16 bits inferiores carregam a duração. A máscara 0x0000ffff seleciona essa parte do campo numérico. CSV compara essa parte junto com o tipo de intervalo; não considera qualquer nSequence grande como uma espera maior. Depois de selecionar os bits relevantes, a exigência do script não pode superar o valor da entrada. É um limite técnico importante para quem desenvolve carteiras. O usuário comum não deve configurá-lo manualmente sem entender o procedimento completo. [1] [2] [3]
Um intervalo zero não acrescenta espera, mas as outras checagens do CSV comum continuam valendo. Outro caso ocorre quando o próprio argumento não negativo do script tem o bit 31 ligado. CSV se comporta então como NOP, uma instrução sem efeito sobre o bloqueio relativo. Esse argumento não impõe espera. É preciso distingui-lo do mesmo sinalizador em nSequence da entrada: com um argumento comum, o sinalizador da entrada deve estar desligado. [1] [3]
Se o caminho de recuperação de Anna exige sua assinatura, ela precisa fornecê-la mesmo após o intervalo. A chave privada é um valor numérico secreto usado para criar essa assinatura. Uma chave privada perdida não reaparece, e outro ramo ainda pode permitir gastar antes. Ao executar o script, CSV deixa seu argumento na pilha, um espaço de trabalho com dados empilhados; por isso OP_DROP costuma vir depois para removê-lo. Remover esse dado não autoriza ninguém a pegar o dinheiro. As assinaturas e as demais condições do caminho escolhido é que determinam isso. [1] [3] [5]
BIP 112 introduziu CSV no lugar de OP_NOP3, junto com BIP 68 e BIP 113. É uma função ativa, não apenas um plano. Seus usos incluem canais de pagamento da Lightning Network, nos quais um intervalo pode dar à outra parte tempo para reagir; ele não providencia a reação. Depois da espera, a transação ainda precisa ser transmitida e confirmada. Taxas, dados disponíveis e o estado da cadeia continuam importando. Bitcoin Core v29.0 e as especificações indicadas documentam as verificações. [1] [2] [6]
Para ter uma visão mais completa, leia este verbete junto com CLTV, Opcode, Timelock, Bitcoin Script, Bitcoin, Full Node. Também há referências a este verbete em Confirmação, Timelock, HTLC, Opcode.