ScriptSig

O código de destravamento de uma saída anterior

Diagrama mostrando o ScriptSig de uma entrada destravando o ScriptPubKey da saída de uma transação anterior.

Um ScriptSig fornece o código de destravamento de uma saída anterior.

Cada saída de uma transação tem um código de travamento (ScriptPubKey). Então, quando você seleciona uma saída como entrada em uma transação futura, precisa fornecer um código de destravamento (ScriptSig) para que ela possa ser gasta. Esse código de travamento/destravamento usa uma mini linguagem de programação chamada Script.

O campo ScriptSig é usado para destravar scripts legados como P2PK, P2PKH, P2MS, P2SH (e outros scripts de travamento personalizados). Scripts segwit mais novos, como P2WPKH e P2WSH, são destravados pelo campo de testemunha.

Exemplos

Como é um ScriptSig?

Aqui estão alguns exemplos de como são os ScriptSigs típicos.

Os ScriptSigs são quase sempre únicos, mas têm uma estrutura semelhante dependendo do tipo de script de travamento que você está destravando.

Estes são todos exemplos reais, então você vai precisar substituir a chave pública e as assinaturas se for usá-los como modelos nas suas próprias transações.

P2PK (ScriptSig)

ASM

OP_PUSHBYTES_71
30440220576497b7e6f9b553c0aba0d8929432550e092db9c130aae37b84b545e7f4a36c022066cb982ed80608372c139d7bb9af335423d5280350fe3e06bd510e695480914f01

Hex

4730440220576497b7e6f9b553c0aba0d8929432550e092db9c130aae37b84b545e7f4a36c022066cb982ed80608372c139d7bb9af335423d5280350fe3e06bd510e695480914f01

Transação: ea44e97271691990157559d0bdd9959e02790c34db6c006d779e82fa5aee708e (Entrada 0)

Para destravar um script de travamento P2PK, você só precisa fornecer uma única assinatura.

Este é um dos scripts de destravamento mais simples. Porém, são bastante incomuns hoje em dia e são encontrados principalmente ao destravar transações coinbase antigas.

P2PKH (ScriptSig)

ASM

OP_PUSHBYTES_72
3045022100c233c3a8a510e03ad18b0a24694ef00c78101bfd5ac075b8c1037952ce26e91e02205aa5f8f88f29bb4ad5808ebc12abfd26bd791256f367b04c6d955f01f28a772401
OP_PUSHBYTES_33
03f0609c81a45f8cab67fc2d050c21b1acd3d37c7acfd54041be6601ab4cef4f31

Hex

483045022100c233c3a8a510e03ad18b0a24694ef00c78101bfd5ac075b8c1037952ce26e91e02205aa5f8f88f29bb4ad5808ebc12abfd26bd791256f367b04c6d955f01f28a7724012103f0609c81a45f8cab67fc2d050c21b1acd3d37c7acfd54041be6601ab4cef4f31

Transação: 40e331b67c0fe7750bb3b1943b378bf702dce86124dc12fa5980f975db7ec930 (Entrada 0)

ASM

OP_PUSHBYTES_71
304402206dfb058ecbca366b72f61508c22f65c00c06dd7606ea5b3f38a512c0ef4d8819022055060ebaeb89c34c62e918d9c1e13d2dac577b21dd6abe514309d557e7eab79a01
OP_PUSHBYTES_65
04147c9684f526d6061e5bbf815e49adf1f3ad625a88f8103e9a2b7c49965e2d7ffae8345f424f7fa73ed85203611da2bfdfc3a7203ca8abb2534773fcb2c0454e

Hex

47304402206dfb058ecbca366b72f61508c22f65c00c06dd7606ea5b3f38a512c0ef4d8819022055060ebaeb89c34c62e918d9c1e13d2dac577b21dd6abe514309d557e7eab79a014104147c9684f526d6061e5bbf815e49adf1f3ad625a88f8103e9a2b7c49965e2d7ffae8345f424f7fa73ed85203611da2bfdfc3a7203ca8abb2534773fcb2c0454e

Transação: bb420523868848e1b60ffe28a2f5a657e7db424e11aaacca19c992eb67805349 (Entrada 0)

Para destravar um script P2PKH, você precisa fornecer uma única assinatura junto com uma chave pública. A chave pública pode ser comprimida (33 bytes) ou não comprimida (65 bytes).

Foi um dos scripts de travamento mais comuns na blockchain até 2016. Desde então, os scripts P2WPKH se tornaram mais comuns; eles funcionam da mesma forma, mas usam o campo de testemunha para o código de destravamento em vez do ScriptSig.

Um ScriptPubKey P2PKH contém um hash da chave pública, então a chave pública de fato é revelada no ScriptSig.

P2MS (ScriptSig)

ASM

OP_0
OP_PUSHBYTES_72
304502204aa764d2b30f572cc4ef17c8ed8536c46f595a08ba41a611b14f32c60282c150022100ede45011be565dc225cc9be292638cf7270b129934fe8758634716b8f7a34c0701

Hex

0048304502204aa764d2b30f572cc4ef17c8ed8536c46f595a08ba41a611b14f32c60282c150022100ede45011be565dc225cc9be292638cf7270b129934fe8758634716b8f7a34c0701

Transação: 78b28d3c2324da8c2f01840021addbcabb68f7ce1d4da870cabe5e9df6afe63d (Entrada 0)

ASM

OP_0
OP_PUSHBYTES_72
3045022100af204ef91b8dba5884df50f87219ccef22014c21dd05aa44470d4ed800b7f6e40220428fe058684db1bb2bfb6061bff67048592c574effc217f0d150daedcf36787601
OP_PUSHBYTES_72
3045022100e8547aa2c2a2761a5a28806d3ae0d1bbf0aeff782f9081dfea67b86cacb321340220771a166929469c34959daf726a2ac0c253f9aff391e58a3c7cb46d8b7e0fdc4801

Hex

00483045022100af204ef91b8dba5884df50f87219ccef22014c21dd05aa44470d4ed800b7f6e40220428fe058684db1bb2bfb6061bff67048592c574effc217f0d150daedcf36787601483045022100e8547aa2c2a2761a5a28806d3ae0d1bbf0aeff782f9081dfea67b86cacb321340220771a166929469c34959daf726a2ac0c253f9aff391e58a3c7cb46d8b7e0fdc4801

Transação: 949591ad468cef5c41656c0a502d9500671ee421fadb590fbc6373000039b693 (Entrada 0)

Para destravar um script de travamento P2MS, você precisa fornecer múltiplas assinaturas para atender aos requisitos do script de travamento original. Esses ScriptSigs normalmente contêm entre 1 e 3 assinaturas, embora tecnicamente um ScriptSig P2MS pudesse conter até 20 assinaturas.

Porém, ScriptSigs P2MS crus são bem raros, pois a maioria dos scripts de travamento P2MS é embrulhada dentro de um P2SH.

Os scripts P2MS têm um bug em que o opcode OP_CHECKMULTISIG retira um elemento a mais da pilha do que deveria, e é por isso que todos os ScriptSigs P2MS começam com um OP_0 redundante (ou algo similar) no início, para neutralizar isso.

P2SH (ScriptSig)

ASM

OP_0
OP_PUSHBYTES_71
3044022100d0ed946330182916da16a6149cd313a4b1a7b41591ee52fb3e79d64e36139d66021f6ccf173040ef24cb45c4db3e9c771c938a1ba2cf8d2404416f70886e360af401
OP_PUSHBYTES_71  (Redeem Script — P2MS)
5121022afc20bf379bc96a2f4e9e63ffceb8652b2b6a097f63fbee6ecec2a49a48010e2103a767c7221e9f15f870f1ad9311f5ab937d79fcaeee15bb2c722bca515581b4c052ae

Hex

00473044022100d0ed946330182916da16a6149cd313a4b1a7b41591ee52fb3e79d64e36139d66021f6ccf173040ef24cb45c4db3e9c771c938a1ba2cf8d2404416f70886e360af401475121022afc20bf379bc96a2f4e9e63ffceb8652b2b6a097f63fbee6ecec2a49a48010e2103a767c7221e9f15f870f1ad9311f5ab937d79fcaeee15bb2c722bca515581b4c052ae

Transação: 30c239f3ae062c5f1151476005fd0057adfa6922de1b38d0f11eb657a8157b30 (Entrada 11)

Os scripts de travamento P2SH são um pouco mais complexos do que os scripts padrão.

O ScriptSig de um P2SH contém tanto o script de destravamento quanto o script de travamento:

Então, no exemplo acima, o segundo empilhamento de dados é o Redeem Script contendo um script de travamento P2MS típico, e o empilhamento de dados anterior a ele é a única assinatura necessária para satisfazer esse Redeem Script.

O P2SH pode ser usado para embrulhar vários tipos de scripts de travamento personalizados, então não há um modelo fixo de como o ScriptSig deve se parecer (a não ser pelo Redeem Script ser o último empilhamento de dados). Porém, na maioria das vezes o P2SH é usado para embrulhar scripts de travamento P2MS, então a maioria dos ScriptSigs P2SH vai se parecer com o exemplo acima.

Aqui está um script não padrão encontrado dentro de um script P2SH:

ASM

OP_PUSHDATA2
4001
255044462d312e330a25e2e3cfd30a0a0a312030206f626a0a3c3c2f57696474682032203020522f4865696768742033203020522f547970652034203020522f537562747970652035203020522f46696c7465722036203020522f436f6c6f7253706163652037203020522f4c656e6774682038203020522f42697473506572436f6d706f6e656e7420383e3e0a73747265616d0affd8fffe00245348412d3120697320646561642121212121852fec092339759c39b1a1c63c4c97e1fffe017f46dc93a6b67e013b029aaa1db2560b45ca67d688c7f84b8c4c791fe02b3df614f86db1690901c56b45c1530afedfb76038e972722fe7ad728f0e4904e046c230570fe9d41398abe12ef5bc942be33542a4802d98b5d70f2a332ec37fac3514e74ddc0f2cc1a874cd0c78305a21566461309789606bd0bf3f98cda8044629a1
OP_PUSHDATA2
4001
255044462d312e330a25e2e3cfd30a0a0a312030206f626a0a3c3c2f57696474682032203020522f4865696768742033203020522f547970652034203020522f537562747970652035203020522f46696c7465722036203020522f436f6c6f7253706163652037203020522f4c656e6774682038203020522f42697473506572436f6d706f6e656e7420383e3e0a73747265616d0affd8fffe00245348412d3120697320646561642121212121852fec092339759c39b1a1c63c4c97e1fffe017346dc9166b67e118f029ab621b2560ff9ca67cca8c7f85ba84c79030c2b3de218f86db3a90901d5df45c14f26fedfb3dc38e96ac22fe7bd728f0e45bce046d23c570feb141398bb552ef5a0a82be331fea48037b8b5d71f0e332edf93ac3500eb4ddc0decc1a864790c782c76215660dd309791d06bd0af3f98cda4bc4629b1
OP_PUSHBYTES_8  (Redeem Script)
6e879169a77ca787

Hex

4d4001255044462d312e330a25e2e3cfd30a0a0a312030206f626a0a3c3c2f57696474682032203020522f4865696768742033203020522f547970652034203020522f537562747970652035203020522f46696c7465722036203020522f436f6c6f7253706163652037203020522f4c656e6774682038203020522f42697473506572436f6d706f6e656e7420383e3e0a73747265616d0affd8fffe00245348412d3120697320646561642121212121852fec092339759c39b1a1c63c4c97e1fffe017f46dc93a6b67e013b029aaa1db2560b45ca67d688c7f84b8c4c791fe02b3df614f86db1690901c56b45c1530afedfb76038e972722fe7ad728f0e4904e046c230570fe9d41398abe12ef5bc942be33542a4802d98b5d70f2a332ec37fac3514e74ddc0f2cc1a874cd0c78305a21566461309789606bd0bf3f98cda8044629a14d4001255044462d312e330a25e2e3cfd30a0a0a312030206f626a0a3c3c2f57696474682032203020522f4865696768742033203020522f547970652034203020522f537562747970652035203020522f46696c7465722036203020522f436f6c6f7253706163652037203020522f4c656e6774682038203020522f42697473506572436f6d706f6e656e7420383e3e0a73747265616d0affd8fffe00245348412d3120697320646561642121212121852fec092339759c39b1a1c63c4c97e1fffe017346dc9166b67e118f029ab621b2560ff9ca67cca8c7f85ba84c79030c2b3de218f86db3a90901d5df45c14f26fedfb3dc38e96ac22fe7bd728f0e45bce046d23c570feb141398bb552ef5a0a82be331fea48037b8b5d71f0e332edf93ac3500eb4ddc0decc1a864790c782c76215660dd309791d06bd0af3f98cda4bc4629b1086e879169a77ca787

Transação: 8d31992805518fd62daa3bdd2a5c4fd2cd3054c9b3dca1d78055e9528cff6adc (Entrada 4)

O último empilhamento de dados deste ScriptSig é um script de travamento que exige dois pedaços de dados distintos que tenham o mesmo resultado de hash SHA-1 (OP_2DUP OP_EQUAL OP_NOT OP_VERIFY OP_SHA1 OP_SWAP OP_SHA1 OP_EQUAL). Então os dois empilhamentos de dados no início fornecem esses dois pedaços de dados distintos que satisfazem o script de travamento.

Você pode inspecionar o script de travamento dentro de um ScriptSig P2SH decodificando o empilhamento de dados final. Por exemplo, tente decodificar 6e879169a77ca787 usando a ferramenta abaixo:

Script

Decodifique e codifique um script.

0 bytes

Assim como o P2PKH, o script de travamento P2SH agora foi substituído pelo P2WSH, que funciona exatamente da mesma forma que o P2SH, mas usa o campo de testemunha para o código de destravamento em vez do ScriptSig.

Um ScriptPubKey P2SH contém o Hash do Script, então o ScriptSig é onde o Redeem Script completo é revelado.

Custom (ScriptSig)

ASM

OP_5
OP_3

Hex

5553

Transação: 7afdcb9067f6549a569116a79cb1256920a0c566ff36cf4dce88718d57402f4f (Entrada 0)

Às vezes você encontra ScriptSigs destravando scripts personalizados.

No exemplo acima, o script de travamento original era 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 (OP_2DUP OP_ADD OP_8 OP_EQUALVERIFY OP_SUB OP_2 OP_EQUAL).

Esse tipo de script personalizado é bem raro, pois a maioria dos scripts de travamento personalizados é embrulhada em um P2SH, em vez de ser colocada diretamente no ScriptPubKey de uma saída (esses scripts de travamento são considerados não padrão e não são retransmitidos pelos nós, mas são válidos e ainda podem ser minerados na blockchain).

Terminologia

Por que se chama ScriptSig?

O ScriptSig contém Script, e geralmente contém uma assinatura, por isso é chamado de "ScriptSig", para abreviar.

Um ScriptSig não precisa conter uma assinatura, mas ainda o chamamos de ScriptSig porque esse foi o nome de variável que o Satoshi usou na versão original do bitcoin, já que as saídas são primariamente destinadas a serem travadas à chave pública de outra pessoa e então destravadas com a assinatura digital correspondente.

Mas, sim, faz mais sentido pensar no "ScriptSig" simplesmente como o campo de "código de destravamento" dentro de uma transação bruta.

"ScriptSig", "scriptSig" e "scriptsig" 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 ("scriptSig") seja como o Satoshi escrevia e pareça ser a mais comum.

Coinbase

A entrada de uma transação coinbase não referencia, de fato, nenhuma saída anterior que precise ser destravada, então o ScriptSig é basicamente um campo "reservado" que os mineradores podem usar para colocar qualquer dado que quiserem. A única restrição é que ele precisa ter entre 2 e 100 bytes de tamanho.

Os mineradores frequentemente usam o ScriptSig das suas transações coinbase para adicionar mensagens personalizadas ou algum texto que identifique quem minerou o bloco. Veja o bloco gênese, por exemplo:

ASM

OP_PUSHBYTES_4
ffff001d
OP_PUSHBYTES_1
04
OP_PUSHBYTES_69
5468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73

Hex

04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73

Transação: 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b (Entrada 0)

Se você converter aquele último empilhamento de dados de bytes hex para ASCII, obtém: The Times 03/Jan/2009 Chancellor on brink of second bailout for banks

Í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.

Aqui estão mais alguns exemplos de mensagens encontradas dentro do ScriptSig de transações coinbase:

Confira o bitcoinstrings.com para mais exemplos.

BIP 34: Desde a altura de bloco 227.836, os mineradores são obrigados a colocar a altura do bloco atual no início do ScriptSig das transações coinbase.

O fato de os mineradores poderem colocar qualquer dado que quiserem no ScriptSig significa que ele também pode ser usado como um ExtraNonce.

Interpretador de Script

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