PSBT
O formato para passar transações para assinatura
- BIP 174: Partially Signed Bitcoin Transaction Format
- BIP 370: PSBT Version 2
Uma PSBT (Partially Signed Bitcoin Transaction — Transação de Bitcoin Parcialmente Assinada) é um formato de dados para passar transações para assinatura.
Esse formato contém os dados de uma transação não assinada, junto com os dados extras necessários para assinar as entradas.
Então, se você exporta uma transação não assinada da sua carteira, ela provavelmente estará no formato PSBT. A maioria das carteiras modernas suporta exportar e assinar PSBTs (Electrum, Sparrow, Trezor, Coldcard).
Propósito
Por que precisamos de PSBTs?
Para assinar uma transação de bitcoin, você precisa de algumas informações adicionais que não estão na transação não assinada em si. Por exemplo, para criar uma assinatura que destrava uma entrada P2WPKH, você precisa do ScriptPubKey e do valor da saída que está sendo gasta. Essas informações estão na transação anterior que criou a saída (UTXO), mas não na transação atual.
Isso não é problema com uma carteira conectada à Internet (carteira "quente"), pois essas informações podem ser obtidas da blockchain. Porém, se você usa uma carteira offline para assinar (ex.: um dispositivo de hardware ou carteira "fria"), ela não tem uma cópia atualizada da blockchain — então, mesmo tendo a chave privada, não tem acesso à informação extra necessária para criar a assinatura. Portanto, o formato PSBT permite passar todos os dados necessários para assinar a transação em uma carteira/dispositivo separado.
Benefícios
Por que o formato PSBT foi criado?
Uma PSBT fornece um formato padrão para passar transações para assinatura. Antes das PSBTs, cada carteira implementava o próprio formato, o que significava que ele provavelmente não era compatível com outras carteiras. Com as PSBTs, uma transação não assinada pode ser exportada e assinada por carteiras e dispositivos diferentes.
Por exemplo, você poderia construir uma transação que gasta uma saída multisig (ex.: P2MS) exigindo assinaturas de 3 pessoas diferentes. Usando o formato PSBT, você envia a cada signatário os dados da transação não assinada, e cada um usa a carteira/dispositivo que preferir. As PSBTs separadas podem então ser combinadas para criar a transação final assinada.
Estrutura
Como é uma PSBT?
O formato PSBT é uma série de pares chave-valor contidos em mapas separados.
Cabeçalho
Uma PSBT sempre começa com bytes de cabeçalho para identificar os dados como uma PSBT: os magic bytes 70736274 ('psbt' em ASCII) seguidos de um separador ff de 1 byte.
ASCII
Mapas
Após o cabeçalho, a PSBT contém três tipos de mapa (nesta ordem):
- Mapa Global — Informações gerais sobre a transação não assinada (tipicamente os dados da transação não assinada). Há apenas um mapa global.
- Mapa(s) de Entrada — Dados relacionados a cada entrada (tipicamente os dados extras necessários para criar as assinaturas). Há um para cada entrada.
- Mapa(s) de Saída — Dados relacionados a cada saída (ex.: para identificar saídas de troco). Há um para cada saída.
O fim de cada mapa é indicado por um separador 00 de 1 byte.
Chave-Valor
Dentro de cada mapa há uma série de pares chave-valor. Cada par tem: uma Chave (tamanho + tipo + dados, todos compact size/bytes) e um Valor (tamanho + dados). Esses pares se repetem até o fim do mapa.
Uso
Como uma PSBT é usada?
O ciclo de vida de uma PSBT (versão 0) envolve diferentes papéis: o Criador (cria a transação não assinada), o Atualizador (adiciona os dados extras necessários para assinar), o Signatário (adiciona assinaturas), o Combinador (junta PSBTs de vários signatários), o Finalizador (monta os scripts de destravamento finais) e o Extrator (extrai a transação final assinada, pronta para transmitir à rede).