P2WPKH

Pay To Witness Public Key Hash — o P2PKH moderno, destravado pela testemunha

BIP 141: Segregated Witness

Diagrama mostrando a estrutura de um P2WPKH.

O P2WPKH (Pay To Witness Public Key Hash) é um padrão de script que trava uma saída a um hash de chave pública.

Ele funciona da mesma forma que um P2PKH legado, mas é destravado pelo campo de Testemunha em vez do ScriptSig.

O benefício de usar P2WPKH em vez de P2PKH é que os dados do campo de testemunha têm menos peso do que os dados do campo ScriptSig, então, quando você for destravar um P2WPKH, vai pagar um pouco menos em taxas de transação.

O P2WPKH foi introduzido como parte da atualização Segregated Witness como um substituto para o P2PKH.

Uso

Como o P2WPKH funciona?

O P2WPKH não usa a linguagem Script tradicional.

Em vez disso, o ScriptPubKey e a Testemunha são estruturas de dados fixas.

ScriptPubKey (trava)

Para criar uma trava P2WPKH, você só precisa colocar um OP_0 seguido de um empilhamento de dados de um hash de chave pública de 20 bytes no ScriptPubKey.

ASM

OP_0
OP_PUSHBYTES_20
841b80d2cc75f5345c482af96294d04fdd66b2b7

Hex

0014841b80d2cc75f5345c482af96294d04fdd66b2b7

Transação: c178d8dacdfb989f9d4fa45828ed188cd54a0414d625c3e61e75c5e3ac15a83a (Saída 0)

O OP_0 é chamado de version byte (byte de versão), e indica que esse ScriptPubKey será ou um P2WPKH ou um P2WSH.

Um ScriptPubKey que começa com um OP_0 seguido de um empilhamento de dados de 20 bytes é sempre interpretado como um script de travamento P2WPKH especial.

ScriptSig (destrava)

O ScriptSig deve estar vazio.

Campo de Testemunha

Para destravar um P2WPKH, você precisa fornecer uma assinatura válida seguida da chave pública original no campo de testemunha da entrada da transação.

ASM

3045022100c7fb3bd38bdceb315a28a0793d85f31e4e1d9983122b4a5de741d6ddca5caf8202207b2821abd7a1a2157a9d5e69d2fdba3502b0a96be809c34981f8445555bdafdb01
03f465315805ed271eb972e43d84d2a9e19494d10151d9f6adb32b8534bfd764ab

Dividido

{
  "stackitems": "02",
  "0": {
    "size": "48",
    "item": "3045022100c7fb3bd38bdceb315a28a0793d85f31e4e1d9983122b4a5de741d6ddca5caf8202207b2821abd7a1a2157a9d5e69d2fdba3502b0a96be809c34981f8445555bdafdb01"
  },
  "1": {
    "size": "21",
    "item": "03f465315805ed271eb972e43d84d2a9e19494d10151d9f6adb32b8534bfd764ab"
  }
}

Hex

02483045022100c7fb3bd38bdceb315a28a0793d85f31e4e1d9983122b4a5de741d6ddca5caf8202207b2821abd7a1a2157a9d5e69d2fdba3502b0a96be809c34981f8445555bdafdb012103f465315805ed271eb972e43d84d2a9e19494d10151d9f6adb32b8534bfd764ab

Transação: 1674761a2b5cb6c7ea39ef58483433e8735e732f5d5815c9ef90523a91ed34a6 (Entrada 0)

O campo de testemunha não é Script. Ele usa campos Compact Size para indicar o número de itens e o tamanho da assinatura e da chave pública. Isso em vez de usar opcodes de empilhamento de dados (por exemplo, OP_PUSHBYTES_33), como você faria ao destravar um P2PKH.

Apenas chaves públicas comprimidas são aceitas no P2WPKH. Então, quando você criar o hash de chave pública para o ScriptPubKey, certifique-se de que seja o hash de uma chave pública comprimida, e não de uma chave pública não comprimida, caso contrário ele será considerado não padrão e não será retransmitido pelos nós (embora ainda seja tecnicamente válido e possa ser minerado na blockchain se você conseguir enviá-lo diretamente a um minerador). Isso é diferente do P2PKH, onde chaves públicas não comprimidas são permitidas.

Execução

Um P2WPKH não é executado como um Script normal. Quando o programa do Bitcoin encontra um ScriptPubKey com a estrutura de P2WPKH, uma lógica especial de validação de testemunha é usada:

  1. A assinatura e a chave pública são primeiro extraídas do campo de testemunha e colocadas na pilha.
  2. O hash de chave pública é então extraído do ScriptPubKey e convertido em um script de travamento P2PKH.
Diagrama mostrando a execução do código de travamento e destravamento do P2WPKH.

A partir daqui, o conjunto todo é executado como um script P2PKH típico.

Animação mostrando a execução de um script P2PKH completo.

É assim que o Bitcoin Core faz. Mas, em última análise, desde que a chave pública gere o mesmo hash de chave pública, e a assinatura seja validada contra a chave pública, então todo o script P2WPKH é válido.

Endereço

Como você cria um endereço para um script P2WPKH?

O endereço de um script de travamento P2WPKH é a codificação Bech32 do ScriptPubKey.

O ScriptPubKey de um P2WPKH tem a seguinte estrutura: 0014<hash160 de 20 bytes (chave pública)>

Ícone Ferramenta Chave Pública

Chave Pública

Calcule a chave pública a partir de uma chave privada.

0 bytes

Chave Pública

Coordenadas
0d
0d

Uma chave pública é apenas um ponto em uma curva elíptica. A chave pública final são essas coordenadas em hexadecimal.

Compressão

A curva é simétrica no eixo x, então a chave comprimida guarda só a coordenada x e se o y é par ou ímpar. A x-only é usada em saídas Taproot.

0 bytes

Nunca digite sua chave privada em um site, nem use uma chave privada gerada por um site. Sites podem facilmente salvar a chave privada e usá-la para roubar seus bitcoins.

Ícone Ferramenta HASH160

HASH160

SHA-256 + RIPEMD-160. Usado para encurtar uma chave pública ou script antes de converter em um endereço.

Uma chave pública ou script, por exemplo

0 bytes
SHA-256
RIPEMD-160

RIPEMD-160(SHA-256(dados))

0 bytes

Por exemplo, a codificação em hex do ScriptPubKey acima é:

0014841b80d2cc75f5345c482af96294d04fdd66b2b7

E, se você codificar isso em Bech32, obtém o seguinte endereço:

bc1qssdcp5kvwh6nghzg9tuk99xsflwkdv4hgvq58q

Ícone Ferramenta Endereço (Bech32)

Endereço (Bech32)

Codifique um script de travamento P2WPKH, P2WSH ou P2TR em um endereço.

ScriptPubKey
Versão
0 bytes
0 bytes Tipo:
Rede

Codificação Bech32 do ScriptPubKey

0 caracteres
    • O endereço sempre começa com bc1q por causa do version byte OP_0 no início.
    • O endereço sempre tem 42 caracteres, pois o ScriptPubKey tem 22 bytes de comprimento (0014 + hash de chave pública de 20 bytes).

    Exemplos

    Como é um script P2WPKH?

    Os scripts de travamento e destravamento P2WPKH sempre seguem a mesma estrutura, então não há exemplos incomuns ou interessantes para examinar.

    Depois que você entende como o código de travamento e destravamento funciona para um P2WPKH, você entende todos eles.

    Exemplo 1

    Esta foi a primeira transação P2WPKH de todas. Foi minerada no bloco 481.824, que foi o primeiro bloco em que o Segregated Witness foi ativado.

    Exemplo 2

    Este script de travamento P2WPKH contém o hash de uma chave pública não comprimida:

    042cbc4850b7fdcd938f681240f7a6a4c27860572f7a189068b403acb83b90ff5fb6744659ad92aa2ca4b0cf3295de48339e298c38d1eff3a8b12575740bfa33ad
    Ícone Ferramenta HASH160

    HASH160

    SHA-256 + RIPEMD-160. Usado para encurtar uma chave pública ou script antes de converter em um endereço.

    Uma chave pública ou script, por exemplo

    0 bytes
    SHA-256
    RIPEMD-160

    RIPEMD-160(SHA-256(dados))

    0 bytes

    Eu mesmo a criei para ver se o P2WPKH funcionaria com chaves públicas não comprimidas, mas acontece que elas são consideradas não padrão, então não consegui gastá-la.

    Então é isso: não use chaves públicas não comprimidas para P2WPKH (não que você tivesse qualquer razão para isso, de qualquer forma).

    Não foi sinalizado como não padrão quando criei o ScriptPubKey, pois não há como saber se o hash da chave pública veio de uma chave pública comprimida ou não; ele tem 20 bytes de qualquer forma. Foi só quando tentei gastá-la que a chave pública não comprimida foi revelada (e, portanto, rejeitada).

    História

    Por que temos o P2WPKH?

    O mecanismo de script de travamento P2WPKH foi introduzido na atualização Segregated Witness em 2016.

    Em resumo, a atualização adicionou uma nova seção às transações chamada Testemunha, que é usada para destravar as entradas de uma transação (no lugar do antigo campo ScriptSig). A razão foi para que os TXIDs não fossem mais influenciados pelas assinaturas dentro dos dados da transação, pois essas assinaturas podiam ser ajustadas antes de a transação ser minerada, o que, por sua vez, mudaria o TXID (o que é irritante).

    O P2WPKH foi, portanto, introduzido para fazer uso dessa nova seção Testemunha para destravar entradas, mantendo a mesma funcionalidade do script de travamento P2PKH original.

    Então, como eu disse, P2PKH e P2WPKH usam exatamente o mesmo mecanismo de travamento. A principal diferença é que um P2PKH é destravado pelo ScriptSig (e custa mais em taxas de transação), enquanto um P2WPKH é destravado pelo campo de testemunha (e custa menos em taxas de transação).

    Tanto o P2PKH quanto o P2WPKH são opções válidas para travar uma saída a um hash de chave pública, mas o P2WPKH deve ser a sua escolha preferida entre os dois.

    Recursos