Glossário / Carteiras e custódia
PSBT versão 2
Outros nomes: PSBTv2.
- O que é PSBT versão 2?
- PSBT versão 2 é o formato de transação parcialmente assinada que dispensa a transação não assinada fixa, de modo que um participante ainda pode adicionar entradas e saídas depois que o arquivo foi criado.
Especificação no BIP-370.
A versão 0 fixa o conjunto de entradas e saídas no momento da criação; a versão 2 transfere cada detalhe para mapas por entrada e por saída. O BIP-370 foi atribuído em 14 de janeiro de 2021 e pula o número 1, já que o formato do BIP-174 é a versão 0 e era chamado coloquialmente de versão 1. Para quem detém bitcoins, a versão 2 importa apenas em uma sessão de assinatura na qual outro participante adiciona criptomoedas a uma transação que você já iniciou.
Como funciona
A PSBT versão 2 mantém o contêiner externo do BIP-174 e reorganiza o que está dentro dele. Duas regras definem a mudança: PSBT_GLOBAL_UNSIGNED_TX deve estar ausente, e PSBT_GLOBAL_VERSION deve estar presente e definido como 2.
O que a transação removida costumava carregar é redistribuído em doze novos campos. Cinco são globais: versão da transação (0x02), locktime de reserva (0x03), contagem de entradas (0x04), contagem de saídas (0x05) e um byte de sinalizadores modificáveis (0x06). Cinco ficam em cada entrada: o txid anterior de 32 bytes (0x0e), o índice da saída gasta (0x0f), o número de sequência (0x10), e dois locktimes obrigatórios, um baseado em carimbo de data e hora igual ou superior a 500000000 (0x11), outro baseado em altura abaixo desse valor e acima de zero (0x12). As saídas ganham dois, o valor em satoshis como um inteiro de 64 bits com sinal em little endian (0x03) e o script (0x04).
O byte de sinalizadores modificáveis faz o trabalho de verdade. O bit 0 indica que entradas ainda podem ser adicionadas ou removidas, o bit 1 indica o mesmo para as saídas, e o bit 2 registra que alguma assinatura já se comprometeu com SIGHASH_SINGLE, então seu pareamento de entrada e saída precisa ser preservado. Um assinante deve restringir esses bits conforme avança: uma assinatura que não usa SIGHASH_ANYONECANPAY limpa o bit 0, e uma que não usa SIGHASH_NONE limpa o bit 1. A permissão para continuar editando expira sozinha conforme as assinaturas chegam, em vez de depender da boa vontade do próximo detentor.
O BIP-370 resolve as duas questões que a transação ausente deixou em aberto. O locktime passa a ser o maior valor em que as entradas concordam, recorrendo ao campo global, ou a 0 quando este está ausente, e um requisito baseado em altura vence qualquer empate. A identidade passa a ser o txid obtido ao montar os campos com todo número de sequência forçado a 0, já que a sequência ainda pode ser editada depois.
Onde você vê isso
A PSBT versão 2 introduz um papel para o qual o BIP-174 não tem equivalente, o Constructor. Um Creator abre o arquivo com 0 entradas e 0 saídas e o repassa; o Constructor as adiciona, depois de verificar os sinalizadores modificáveis. Um Creator que espera contribuições também deve definir a versão da transação como pelo menos 2, para que recursos condicionados a ela, como OP_CHECKSEQUENCEVERIFY, continuem disponíveis.
A versão 2 reutiliza a serialização do BIP-174, então um arquivo parece igual por fora, e a separação é deliberada: dos 24 vetores de teste inválidos do BIP, 13 são arquivos comuns de versão 0 rejeitados por um campo fora de lugar ou por um número de versão. A conversão é mais simples em um sentido, já que um arquivo de versão 2 pode ser reconstruído como um de versão 0 a partir de seus próprios campos. A implementação de referência é o pull request 21283 do Bitcoin Core, e o cabeçalho do BIP registra o status como Deployed.
Das 41 análises de carteiras neste site, duas mencionam PSBTs, Sparrow (avaliada com 4,7) e BlueWallet (4,2), e nenhuma indica uma versão. Presuma a versão 0 a menos que o software diga o contrário, e teste uma ferramenta desconhecida com um valor pequeno antes que ela lide com o restante.
PSBT versão 2 vs o número de versão da transação
A PSBT versão 2 numera o formato do arquivo, enquanto o número de versão da transação numera a transação que está sendo montada dentro dele. Ambos ficam no mesmo mapa global, e o BIP-370 diz claramente que não são o mesmo campo. PSBT_GLOBAL_VERSION é 2 em todo arquivo de versão 2; PSBT_GLOBAL_TX_VERSION é um inteiro com sinal de 32 bits para a transação que está sendo construída, e o BIP-370 exige que ele seja pelo menos 2 quando o Creator espera contribuições, e é por isso que os dois se confundem. Mude o primeiro e analisadores mais antigos recusam o arquivo. Mude o segundo e você muda por quais regras de consenso o gasto é julgado.