ScriptPubKey

O código de travamento de uma saída

Diagrama mostrando o ScriptPubKey como a trava de uma saída em uma transação de bitcoin.

O ScriptPubKey é o código de travamento de uma saída.

Ele é feito de Script, uma mini linguagem de programação que permite colocar diferentes tipos de travas nas suas saídas.

A maioria dos ScriptPubKeys usa um conjunto padrão de travas, mais comumente travando a saída a uma chave pública (ex.: P2PKH ou P2WPKH).

Os ScriptPubKeys normalmente são codificados em endereços para facilitar o compartilhamento.

  • Scripts legados como P2PK, P2PKH, P2MS e P2SH são destravados pelo campo ScriptSig.
  • Scripts mais novos como P2WPKH, P2WSH e P2TR são destravados na seção de testemunha.

Exemplos

Como é um ScriptPubKey?

Aqui estão alguns exemplos de ScriptPubKeys que você encontra nas saídas da blockchain.

P2PK (Legado)

ASM

OP_PUSHBYTES_65
0411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3
OP_CHECKSIG

Hex

410411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3ac

Transação: 0437cd7f8525ceed2324359c2d0ba26006d92d856a9c20fa0241106ee5a597c9 (Saída 0)

Este é um dos scripts de travamento mais simples que você encontra na blockchain. Ele é usado para travar uma saída a uma única chave pública.

Ele contém uma chave pública (33 bytes comprimida ou 65 bytes não comprimida) e o opcode OP_CHECKSIG. Isso significa que só uma assinatura para aquela chave pública é necessária para destravá-lo. Em outras palavras, a saída fica travada à chave pública da pessoa para quem você quer "enviar" os bitcoins.

Embora simples, esses tipos de script de travamento são encontrados principalmente nas saídas de transações coinbase antigas (ex.: a transação do bloco gênese). Isso porque travar uma saída a uma chave pública é mais comumente feito por meio do P2PKH…

P2PKH (Legado)

ASM

OP_DUP
OP_HASH160
OP_PUSHBYTES_20
55ae51684c43435da751ac8d2173b2652eb64105
OP_EQUALVERIFY
OP_CHECKSIG

Hex

76a91455ae51684c43435da751ac8d2173b2652eb6410588ac

Transação: 0b6461de422c46a221db99608fcbe0326e4f2325ebf2a47c9faf660ed61ee6a4 (Saída 1)

Também trava a saída a uma única chave pública, mas, em vez de colocar a chave pública bruta no script, coloca o hash da chave pública (o HASH160 da chave).

Í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

Então, quando você for destravar esta saída, precisa fornecer uma assinatura e a chave pública original. Agora o script de destravamento P2PKH primeiro verifica se a chave pública original bate com o hash da chave pública e, em seguida, verifica a assinatura contra a chave pública, como de costume.

A razão pela qual o P2PKH é preferido em vez do P2PK é que o Satoshi achou que encurtaria o script de travamento ao colocar o hash de uma chave pública nele (20 bytes), em vez da chave pública não comprimida completa (65 bytes). O script P2PKH então ganhou o seu próprio formato de endereço e, por isso, tornou-se o método mais fácil e mais prevalente de transferir a propriedade de moedas.

P2MS (Legado)

ASM

OP_2
OP_PUSHBYTES_65
04d81fd577272bbe73308c93009eec5dc9fc319fc1ee2e7066e17220a5d47a18314578be2faea34b9f1f8ca078f8621acd4bc22897b03daa422b9bf56646b342a2
OP_PUSHBYTES_65
04ec3afff0b2b66e8152e9018fe3be3fc92b30bf886b3487a525997d00fd9da2d012dce5d5275854adc3106572a5d1e12d4211b228429f5a7b2f7ba92eb0475bb1
OP_PUSHBYTES_65
04b49b496684b02855bc32f5daefa2e2e406db4418f3b86bca5195600951c7d918cdbe5e6d3736ec2abf2dd7610995c3086976b2c0c7b4e459d10b34a316d5a5e7
OP_3
OP_CHECKMULTISIG

Hex

524104d81fd577272bbe73308c93009eec5dc9fc319fc1ee2e7066e17220a5d47a18314578be2faea34b9f1f8ca078f8621acd4bc22897b03daa422b9bf56646b342a24104ec3afff0b2b66e8152e9018fe3be3fc92b30bf886b3487a525997d00fd9da2d012dce5d5275854adc3106572a5d1e12d4211b228429f5a7b2f7ba92eb0475bb14104b49b496684b02855bc32f5daefa2e2e406db4418f3b86bca5195600951c7d918cdbe5e6d3736ec2abf2dd7610995c3086976b2c0c7b4e459d10b34a316d5a5e753ae

Transação: 581d30e2a73a2db683ac2f15d53590bd0cd72de52555c2722d9d6a78e9fea510 (Saída 0)

Este script de travamento permite travar uma saída a várias chaves públicas.

Para destravar um P2MS, você precisa fornecer o número exigido de assinaturas. O primeiro opcode (ex.: OP_2) indica quantas assinaturas são necessárias, e o penúltimo opcode (ex.: OP_3) indica quantas chaves públicas há no script de travamento. Então, neste exemplo, você precisa fornecer uma assinatura para quaisquer 2 das 3 chaves públicas.

Porém, esses scripts P2MS "crus" são bem raros, pois esse tipo de script grande e complexo normalmente é embrulhado no P2SH, mais eficiente…

P2SH (Legado)

ASM

OP_HASH160
OP_PUSHBYTES_20
748284390f9e263a4b766a75d0633c50426eb875
OP_EQUAL

Hex

a914748284390f9e263a4b766a75d0633c50426eb87587

Transação: 450c309b70fb3f71b63b10ce60af17499bd21b1db39aa47b19bf22166ee67144 (Saída 1)

Este é um tipo especial de script que foi introduzido em 2012 (BIP 16). Ele permite travar uma saída usando um script de travamento personalizado.

Assim como um P2PKH, um P2SH contém um hash, mas, em vez de um hash de chave pública, ele contém um hash de script (o HASH160 de um script).

Por exemplo, no caso acima, o 748284390f9e263a4b766a75d0633c50426eb875 é o hash do seguinte script P2MS:

Redeem Script

ASM

OP_1
OP_PUSHBYTES_33
022afc20bf379bc96a2f4e9e63ffceb8652b2b6a097f63fbee6ecec2a49a48010e
OP_PUSHBYTES_33
03a767c7221e9f15f870f1ad9311f5ab937d79fcaeee15bb2c722bca515581b4c0
OP_2
OP_CHECKMULTISIG

Hex

5121022afc20bf379bc96a2f4e9e63ffceb8652b2b6a097f63fbee6ecec2a49a48010e2103a767c7221e9f15f870f1ad9311f5ab937d79fcaeee15bb2c722bca515581b4c052ae
Ícone Ferramenta Script

Script

Decodifique e codifique um script.

0 bytes

Í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

Então, quando você for destravar um P2SH, precisa fornecer o script de travamento original (Redeem Script) junto com o código de destravamento. Em outras palavras, o ScriptPubKey contém o hash de um script de travamento, e o ScriptSig contém o script de travamento e de destravamento completo.

  • O benefício de um P2SH é que ele permite embrulhar scripts de travamento grandes e complexos em um ScriptPubKey menor. Então, em vez de colocar um script de travamento P2MS grande diretamente no ScriptPubKey, você pode colocar apenas o hash dele. Assim, embora o script de travamento completo precise ser fornecido eventualmente, o P2SH torna mais barato para o remetente pagar a quem quer usar um script de travamento mais complexo na sua saída (ex.: P2MS).
  • Portanto, o P2SH evita a situação em que o remetente ficaria relutante em usar qualquer coisa além do P2PKH, pelo fato de que qualquer outra opção seria maior e mais cara de usar para o remetente.

OP_RETURN (Dados)

ASM

OP_RETURN
OP_PUSHBYTES_11
68656c6c6f20776f726c64

Hex

6a0b68656c6c6f20776f726c64

Transação: 6dfb16dd580698242bcfd8e433d557ed8c642272a368894de27292a8844a4e75 (Saída 2)

Este ScriptPubKey é não gastável, mas permite armazenar pequenas quantidades de dados.

Tudo o que você precisa fazer é usar o opcode OP_RETURN, seguido de um empilhamento de dados de até 80 bytes de qualquer dado de sua escolha.

É mais comumente usado para armazenar strings ASCII na forma de bytes hex. No exemplo acima, os bytes 68656c6c6f20776f726c64 contêm a string codificada em ASCII "hello world".

Ícone Ferramenta ASCII

ASCII

Converta entre bytes (em hexadecimal) e caracteres ASCII.

0 bytes
Bytes
0 caracteres
  • Os bytes hex entre 0x20 e 0x7f contêm os caracteres imprimíveis.
  • Qualquer valor 0x1f ou abaixo é um caractere de controle (não será exibido, ou exibirá um caractere estranho).
  • Qualquer valor 0x80 ou acima não exibirá nada.

Veja o padrão de codificação ISO 646 para detalhes.

P2WPKH (SegWit)

ASM

OP_0
OP_PUSHBYTES_20
853ec3166860371ee67b7754ff85e13d7a0d6698

Hex

0014853ec3166860371ee67b7754ff85e13d7a0d6698

Transação: 39cc1562b197182429bc1ea312c9e30f1257be6d5159fcd7b375139d3c3fe63c (Saída 0)

Este script de travamento é usado para travar uma saída a uma única chave pública.

Ele funciona da mesma forma que um P2PKH. Porém, enquanto um P2PKH é destravado pelo campo ScriptSig, um P2WPKH só pode ser destravado pela testemunha.

Então, assim como um P2PKH, o script de travamento P2WPKH apenas contém um hash de 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

O benefício de usar P2WPKH em vez de P2PKH é que o P2WPKH usa a testemunha para destravar, o que dá um desconto no tamanho do código de destravamento em termos de peso. Isso reduz o tamanho da taxa de transação que você precisa usar ao gastar um P2WPKH em comparação com um P2PKH.

Você notará que um P2WPKH não usa opcodes tradicionais de Script. Em vez disso, ele usa um padrão fixo, em que qualquer ScriptPubKey que comece com OP_0 seguido do empilhamento de um hash de chave pública de 20 bytes é interpretado como um script de travamento P2WPKH.

P2WSH (SegWit)

ASM

OP_0
OP_PUSHBYTES_32
65f91a53cb7120057db3d378bd0f7d944167d43a7dcbff15d6afc4823f1d3ed3

Hex

002065f91a53cb7120057db3d378bd0f7d944167d43a7dcbff15d6afc4823f1d3ed3

Transação: 46ebe264b0115a439732554b2b390b11b332b5b5692958b1754aa0ee57b64265 (Saída 1)

Este script de travamento permite travar uma saída usando um script de travamento personalizado.

Ele funciona da mesma forma que um P2SH padrão. Porém, enquanto um P2SH é destravado pelo campo ScriptSig, um P2WSH só pode ser destravado pela testemunha.

E, assim como um P2SH, o P2WSH apenas contém um hash de script (o hash de um "Witness Script"). Porém, em vez de ser o HASH160 de um script, como no P2SH, um P2WSH contém o SHA-256 simples de um script.

No exemplo acima, o 65f91a53cb7120057db3d378bd0f7d944167d43a7dcbff15d6afc4823f1d3ed3 é o hash SHA-256 do seguinte script P2MS:

Witness Script

ASM

OP_2
OP_PUSHBYTES_33
03848e308569b644372a5eb26665f1a8c34ca393c130b376db2fae75c43500013c
OP_PUSHBYTES_33
03cec1ee615c17e06d4f4b0a08617dffb8e568936bdff18fb057832a58ad4d1b75
OP_PUSHBYTES_33
03eed7ae80c34d70f5ba93f93965f69f3c691da0f4607f242f4fd6c7a48789233e
OP_3
OP_CHECKMULTISIG

Hex

522103848e308569b644372a5eb26665f1a8c34ca393c130b376db2fae75c43500013c2103cec1ee615c17e06d4f4b0a08617dffb8e568936bdff18fb057832a58ad4d1b752103eed7ae80c34d70f5ba93f93965f69f3c691da0f4607f242f4fd6c7a48789233e53ae
Ícone Ferramenta Script

Script

Decodifique e codifique um script.

0 bytes

Ícone Ferramenta SHA-256

SHA-256

SHA-256 simples. Faz o hash dos bytes de dados usando a função de hash SHA-256.

0 bytes
SHA-256
0 bytes

O benefício de usar P2WSH em vez de P2SH é que o P2WSH usa a testemunha para destravar, o que dá um desconto no tamanho do código de destravamento em termos de peso.

Mais uma vez, um P2WSH não usa nenhum opcode tradicional de Script. Qualquer ScriptPubKey que comece com OP_0 seguido do empilhamento de um hash de script de 32 bytes é interpretado como um script de travamento P2WSH.

P2TR (Taproot)

ASM

OP_1
OP_PUSHBYTES_32
f3778defe5173a9bf7169575116224f961c03c725c0e98b8da8f15df29194b80

Hex

5120f3778defe5173a9bf7169575116224f961c03c725c0e98b8da8f15df29194b80

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

Este script de travamento se comporta como um híbrido dos scripts de travamento P2WPKH e P2WSH.

Ele trava uma saída a uma chave pública ajustada (tweaked). Essa chave pública ajustada é criada a partir de uma chave pública normal, mas também inclui um comprometimento (commitment) a múltiplos scripts personalizados opcionais.

Você é então capaz de destravar a saída pela chave pública original ou usando um dos scripts personalizados opcionais.

Os scripts de travamento P2TR são destravados pelo campo de testemunha.

A chave pública ajustada tem 32 bytes (em vez de 33 bytes, como uma chave pública comprimida). Isso porque as chaves públicas em scripts de travamento P2TR não incluem um byte inicial para indicar a paridade da coordenada y.

Custom

ASM

OP_2DUP
OP_ADD
OP_8
OP_EQUALVERIFY
OP_SUB
OP_2
OP_EQUAL

Hex

6e935888945287

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

Este é um script de travamento personalizado que usa opcodes para criar um simples problema de matemática que pede dois números que somem 8, sendo o segundo número 2 a menos que o primeiro. Esse script personalizado foi destravado fornecendo os números OP_5 e OP_3.

Como você pode ver, o ScriptPubKey não está restrito a simplesmente travar para chaves públicas; ele pode ser usado para criar muitos tipos diferentes de travas. Porém, é bem raro ver esses scripts de travamento personalizados aparecendo diretamente no ScriptPubKey assim, pois eles normalmente são embrulhados em um P2SH ou P2WSH.

Esses tipos de scripts de travamento personalizados são considerados não padrão. Então, embora seja possível que eles sejam minerados na blockchain, eles não são retransmitidos pelos nós. Então, se você quiser usar um script de travamento personalizado como este, precisaria minerá-lo você mesmo ou embrulhá-lo em um P2SH ou P2WSH.

Interpretador de Script

Execute um script passo a passo e veja a pilha mudar a cada opcode. O ScriptSig roda primeiro, depois o ScriptPubKey.

    Terminologia

    Por que se chama ScriptPubKey?

    Chama-se ScriptPubKey porque contém Script e geralmente trava uma saída à chave pública (public key) de alguém.

    Mas "ScriptPubKey" é um nome um pouco impróprio, porque você não está limitado a travar uma saída apenas a uma chave pública. Ainda assim, travar à chave pública de outra pessoa é a forma mais comum de travar bitcoins, e foi o nome que o Satoshi escolheu para este campo no código original — então é o termo que ainda usamos hoje.

    Mas é mais fácil pensar no ScriptPubKey simplesmente como o "código de travamento" de uma saída.

    "ScriptPubKey", "scriptPubKey" e "scriptpubkey" são apenas formas diferentes de escrever a mesma coisa. Não há uma forma oficial de escrever, embora a variante em camel case com a primeira letra minúscula ("scriptPubKey") seja como o Satoshi escrevia e pareça ser a mais comum.