P2WSH
Pay To Witness Script Hash
O P2WSH é um script de travamento que trava uma saída ao hash de um script de travamento personalizado.
Ele funciona da mesma forma que um P2SH legado, mas é destravado pelo campo de Testemunha em vez do ScriptSig.
O benefício de usar P2WSH em vez de P2SH é que o campo de Testemunha carrega menos peso, então você pagará menos em taxas de transação ao destravar um P2WSH (em comparação com o P2SH).
O P2WSH foi introduzido como parte da atualização Segregated Witness como um substituto para o P2SH.
Uso
Como o P2WSH funciona?
ScriptPubKey
Para criar um script de travamento P2WSH, você só precisa colocar um OP_0 seguido de um empilhamento de dados de 32 bytes no ScriptPubKey.
Esse empilhamento de dados é o Script Hash, e é o hash SHA-256 único de um script de travamento personalizado.
ASM
OP_0
OP_PUSHBYTES_32
65f91a53cb7120057db3d378bd0f7d944167d43a7dcbff15d6afc4823f1d3ed3 Hex
002065f91a53cb7120057db3d378bd0f7d944167d43a7dcbff15d6afc4823f1d3ed3 Transação: 46ebe264b0115a439732554b2b390b11b332b5b5692958b1754aa0ee57b64265 (Saída 1)
Script
SHA-256
O OP_0 é chamado de version byte (byte de versão), e indica que esse ScriptPubKey será ou um P2WPKH ou um P2WSH.
Um script de travamento que começa com um OP_0 seguido de um empilhamento de dados de 32 bytes é sempre interpretado como um script de travamento P2WSH especial.
ScriptSig
O ScriptSig deve estar vazio.
Campo de Testemunha
Para destravar um P2WSH, você precisa colocar o Witness Script (o script de travamento original que formou o Script Hash) como o último item do campo de Testemunha.
Todos os itens antes desse Witness Script são o que é necessário para destravá-lo.
ASM
00
30440220415899bbee08e42376d06e8f86c92b4987613c2816352fe09cd1479fd639f18c02200db57f508f69e266d76c23891708158bda18690c165a41b0aa88303b97609f7801
304402203973de2303e8787767090dd25c8a4dc97ce1aa7eb4c0962f13952ed4e856ff8e02203f1bb425def789eea8be46407d10b3c8730407176aef4dc2c29865eb5e5542bf01
522103848e308569b644372a5eb26665f1a8c34ca393c130b376db2fae75c43500013c2103cec1ee615c17e06d4f4b0a08617dffb8e568936bdff18fb057832a58ad4d1b752103eed7ae80c34d70f5ba93f93965f69f3c691da0f4607f242f4fd6c7a48789233e53ae Dividido
{
"stackitems": "04",
"0": {
"size": "00",
"item": ""
},
"1": {
"size": "47",
"item": "30440220415899bbee08e42376d06e8f86c92b4987613c2816352fe09cd1479fd639f18c02200db57f508f69e266d76c23891708158bda18690c165a41b0aa88303b97609f7801"
},
"2": {
"size": "47",
"item": "304402203973de2303e8787767090dd25c8a4dc97ce1aa7eb4c0962f13952ed4e856ff8e02203f1bb425def789eea8be46407d10b3c8730407176aef4dc2c29865eb5e5542bf01"
},
"3": {
"size": "69",
"item": "522103848e308569b644372a5eb26665f1a8c34ca393c130b376db2fae75c43500013c2103cec1ee615c17e06d4f4b0a08617dffb8e568936bdff18fb057832a58ad4d1b752103eed7ae80c34d70f5ba93f93965f69f3c691da0f4607f242f4fd6c7a48789233e53ae"
}
} Hex
04004730440220415899bbee08e42376d06e8f86c92b4987613c2816352fe09cd1479fd639f18c02200db57f508f69e266d76c23891708158bda18690c165a41b0aa88303b97609f780147304402203973de2303e8787767090dd25c8a4dc97ce1aa7eb4c0962f13952ed4e856ff8e02203f1bb425def789eea8be46407d10b3c8730407176aef4dc2c29865eb5e5542bf0169522103848e308569b644372a5eb26665f1a8c34ca393c130b376db2fae75c43500013c2103cec1ee615c17e06d4f4b0a08617dffb8e568936bdff18fb057832a58ad4d1b752103eed7ae80c34d70f5ba93f93965f69f3c691da0f4607f242f4fd6c7a48789233e53ae Transação: b38a88b073743bcc84170071cff4b68dec6fb5dc0bc8ffcb3d4ca632c2c78255 (Entrada 0)
No exemplo acima, o Witness Script é um script de travamento P2MS 2-de-3. Os dois itens antes dele são as assinaturas necessárias para destravá-lo.
O código de destravamento tem a mesma estrutura do ScriptSig de um P2SH, mas em um P2WSH ele é movido para a Testemunha.
Você pode confirmar que esse Witness Script é um P2MS decodificando o item final do campo de Testemunha:
Script
Execução
O P2WSH é um tipo especial de script de travamento e não é executado como um Script normal. Em vez disso, ele é executado usando uma "lógica especial de validação de testemunha":
- O Witness Script recebe o hash via SHA-256 para verificar se corresponde ao Script Hash.
- Os itens antes do Witness Script são empilhados na pilha.
- O Witness Script é desserializado e executado como um script normal (usando a pilha atual).
Se todos esses passos forem bem-sucedidos, a entrada é destravada.
Endereço
Como você cria um endereço para um script P2WSH?
O endereço de um script de travamento P2WSH é a codificação Bech32 do ScriptPubKey.
O ScriptPubKey de um P2WSH tem a seguinte estrutura: 0020<sha256 de 32 bytes (hex do script)>
Script
SHA-256
Endereço (Bech32)
Por exemplo, a codificação em hex do ScriptPubKey acima é:
002065f91a53cb7120057db3d378bd0f7d944167d43a7dcbff15d6afc4823f1d3ed3
E, se você codificar isso em Bech32, obtém o seguinte endereço:
bc1qvhu3557twysq2ldn6dut6rmaj3qk04p60h9l79wk4lzgy0ca8mfsnffz65
- O endereço sempre começa com bc1q por causa do version byte
OP_0no início. - O endereço sempre tem 62 caracteres, pois o ScriptPubKey tem 34 bytes de comprimento (
0020+ Script Hash de 32 bytes).
Witness Script
O script personalizado
O Witness Script é um script de travamento personalizado completo. Ele é o último item do campo de Testemunha em um P2WSH.
O exemplo de P2WSH acima tem a seguinte Testemunha:
ASM
00
30440220415899bbee08e42376d06e8f86c92b4987613c2816352fe09cd1479fd639f18c02200db57f508f69e266d76c23891708158bda18690c165a41b0aa88303b97609f7801
304402203973de2303e8787767090dd25c8a4dc97ce1aa7eb4c0962f13952ed4e856ff8e02203f1bb425def789eea8be46407d10b3c8730407176aef4dc2c29865eb5e5542bf01
522103848e308569b644372a5eb26665f1a8c34ca393c130b376db2fae75c43500013c2103cec1ee615c17e06d4f4b0a08617dffb8e568936bdff18fb057832a58ad4d1b752103eed7ae80c34d70f5ba93f93965f69f3c691da0f4607f242f4fd6c7a48789233e53ae Dividido
{
"stackitems": "04",
"0": {
"size": "00",
"item": ""
},
"1": {
"size": "47",
"item": "30440220415899bbee08e42376d06e8f86c92b4987613c2816352fe09cd1479fd639f18c02200db57f508f69e266d76c23891708158bda18690c165a41b0aa88303b97609f7801"
},
"2": {
"size": "47",
"item": "304402203973de2303e8787767090dd25c8a4dc97ce1aa7eb4c0962f13952ed4e856ff8e02203f1bb425def789eea8be46407d10b3c8730407176aef4dc2c29865eb5e5542bf01"
},
"3": {
"size": "69",
"item": "522103848e308569b644372a5eb26665f1a8c34ca393c130b376db2fae75c43500013c2103cec1ee615c17e06d4f4b0a08617dffb8e568936bdff18fb057832a58ad4d1b752103eed7ae80c34d70f5ba93f93965f69f3c691da0f4607f242f4fd6c7a48789233e53ae"
}
} Hex
04004730440220415899bbee08e42376d06e8f86c92b4987613c2816352fe09cd1479fd639f18c02200db57f508f69e266d76c23891708158bda18690c165a41b0aa88303b97609f780147304402203973de2303e8787767090dd25c8a4dc97ce1aa7eb4c0962f13952ed4e856ff8e02203f1bb425def789eea8be46407d10b3c8730407176aef4dc2c29865eb5e5542bf0169522103848e308569b644372a5eb26665f1a8c34ca393c130b376db2fae75c43500013c2103cec1ee615c17e06d4f4b0a08617dffb8e568936bdff18fb057832a58ad4d1b752103eed7ae80c34d70f5ba93f93965f69f3c691da0f4607f242f4fd6c7a48789233e53ae Transação: b38a88b073743bcc84170071cff4b68dec6fb5dc0bc8ffcb3d4ca632c2c78255 (Entrada 0)
Se você decodificar o Witness Script, verá que ele corresponde ao seguinte script de travamento P2MS:
ASM
OP_2 OP_PUSHBYTES_33 03848e308569b644372a5eb26665f1a8c34ca393c130b376db2fae75c43500013c OP_PUSHBYTES_33 03cec1ee615c17e06d4f4b0a08617dffb8e568936bdff18fb057832a58ad4d1b75 OP_PUSHBYTES_33 03eed7ae80c34d70f5ba93f93965f69f3c691da0f4607f242f4fd6c7a48789233e OP_3 OP_CHECKMULTISIG Hex
522103848e308569b644372a5eb26665f1a8c34ca393c130b376db2fae75c43500013c2103cec1ee615c17e06d4f4b0a08617dffb8e568936bdff18fb057832a58ad4d1b752103eed7ae80c34d70f5ba93f93965f69f3c691da0f4607f242f4fd6c7a48789233e53ae
Script
O opcode OP_CHECKMULTISIG tem um bug em que ele retira um elemento a mais da pilha do que precisa. É por isso que a Testemunha inclui um "valor fictício" (dummy value) extra (00) antes das assinaturas ao usar um P2MS como Witness Script.
- O Witness Script em um P2WSH é equivalente ao Redeem Script em um P2SH.
- O Witness Script pode ser qualquer tipo de script de travamento personalizado da sua escolha, embora o mais comum seja um P2MS.
Script Hash
O hash do script personalizado
O Script Hash é o empilhamento de dados de 32 bytes encontrado dentro do ScriptPubKey de um P2WSH. Ele é o hash SHA-256 único do Witness Script.
Por exemplo, o Witness Script é o último item no campo de Testemunha de uma entrada:
ASM
00
30440220415899bbee08e42376d06e8f86c92b4987613c2816352fe09cd1479fd639f18c02200db57f508f69e266d76c23891708158bda18690c165a41b0aa88303b97609f7801
304402203973de2303e8787767090dd25c8a4dc97ce1aa7eb4c0962f13952ed4e856ff8e02203f1bb425def789eea8be46407d10b3c8730407176aef4dc2c29865eb5e5542bf01
522103848e308569b644372a5eb26665f1a8c34ca393c130b376db2fae75c43500013c2103cec1ee615c17e06d4f4b0a08617dffb8e568936bdff18fb057832a58ad4d1b752103eed7ae80c34d70f5ba93f93965f69f3c691da0f4607f242f4fd6c7a48789233e53ae Dividido
{
"stackitems": "04",
"0": {
"size": "00",
"item": ""
},
"1": {
"size": "47",
"item": "30440220415899bbee08e42376d06e8f86c92b4987613c2816352fe09cd1479fd639f18c02200db57f508f69e266d76c23891708158bda18690c165a41b0aa88303b97609f7801"
},
"2": {
"size": "47",
"item": "304402203973de2303e8787767090dd25c8a4dc97ce1aa7eb4c0962f13952ed4e856ff8e02203f1bb425def789eea8be46407d10b3c8730407176aef4dc2c29865eb5e5542bf01"
},
"3": {
"size": "69",
"item": "522103848e308569b644372a5eb26665f1a8c34ca393c130b376db2fae75c43500013c2103cec1ee615c17e06d4f4b0a08617dffb8e568936bdff18fb057832a58ad4d1b752103eed7ae80c34d70f5ba93f93965f69f3c691da0f4607f242f4fd6c7a48789233e53ae"
}
} Hex
04004730440220415899bbee08e42376d06e8f86c92b4987613c2816352fe09cd1479fd639f18c02200db57f508f69e266d76c23891708158bda18690c165a41b0aa88303b97609f780147304402203973de2303e8787767090dd25c8a4dc97ce1aa7eb4c0962f13952ed4e856ff8e02203f1bb425def789eea8be46407d10b3c8730407176aef4dc2c29865eb5e5542bf0169522103848e308569b644372a5eb26665f1a8c34ca393c130b376db2fae75c43500013c2103cec1ee615c17e06d4f4b0a08617dffb8e568936bdff18fb057832a58ad4d1b752103eed7ae80c34d70f5ba93f93965f69f3c691da0f4607f242f4fd6c7a48789233e53ae Transação: b38a88b073743bcc84170071cff4b68dec6fb5dc0bc8ffcb3d4ca632c2c78255 (Entrada 0)
Se você fizer o SHA-256 desse Witness Script, ele corresponde ao Script Hash encontrado no ScriptPubKey na saída:
ASM
OP_0
OP_PUSHBYTES_32
65f91a53cb7120057db3d378bd0f7d944167d43a7dcbff15d6afc4823f1d3ed3 Hex
002065f91a53cb7120057db3d378bd0f7d944167d43a7dcbff15d6afc4823f1d3ed3 Transação: 46ebe264b0115a439732554b2b390b11b332b5b5692958b1754aa0ee57b64265 (Saída 1)
SHA-256
O hash do script dentro de um P2WSH é um único SHA-256. Ele não é um hash SHA-256 duplo (ou seja, HASH256), como é comumente usado em todos os outros lugares no Bitcoin, nem é o HASH160 de um script como no P2SH.
Exemplos
Como são os scripts P2WSH?
Exemplo 1
- ScriptPubKey: 0ca3ce42ca8037d955d04ed8fd89d10581793fc1ab451dec1116fb63a74c24f4 (Saída 1)
- Campo de Testemunha: 1b2a44f4f8b59d6d7075a3dbd72493a6a158218589e722d7525d1d99b7f287a5 (Entrada 0)
Este é apenas um exemplo típico de P2WSH. O Witness Script na transação de gasto contém um script de travamento P2MS 2-de-3:
ASM
00
304402201d080f90841ee83820c8ab3e07a978066a925554b4b961ac240ca572e65ed25802200956318f0afb6f8355cdae42b71b05349e8f2fcd604fbf1c93caed18f001005901
30440220213ab899cffc6781d569cc54d558c56ea1808ccb0cbd9b4b134c148f639e0df202207affd66499c6c1813a15f8bd5fb6238054f679d111927b77878746a80144fe8301
52210375e00eb72e29da82b89367947f29ef34afb75e8654f6ea368e0acdfd92976b7c2103a1b26313f430c4b15bb1fdce663207659d8cac749a0e53d70eff01874496feff2103c96d495bfdd5ba4145e3e046fee45e84a8a48ad05bd8dbb395c011a32cf9f88053ae Dividido
{
"stackitems": "04",
"0": {
"size": "00",
"item": ""
},
"1": {
"size": "47",
"item": "304402201d080f90841ee83820c8ab3e07a978066a925554b4b961ac240ca572e65ed25802200956318f0afb6f8355cdae42b71b05349e8f2fcd604fbf1c93caed18f001005901"
},
"2": {
"size": "47",
"item": "30440220213ab899cffc6781d569cc54d558c56ea1808ccb0cbd9b4b134c148f639e0df202207affd66499c6c1813a15f8bd5fb6238054f679d111927b77878746a80144fe8301"
},
"3": {
"size": "69",
"item": "52210375e00eb72e29da82b89367947f29ef34afb75e8654f6ea368e0acdfd92976b7c2103a1b26313f430c4b15bb1fdce663207659d8cac749a0e53d70eff01874496feff2103c96d495bfdd5ba4145e3e046fee45e84a8a48ad05bd8dbb395c011a32cf9f88053ae"
}
} Hex
040047304402201d080f90841ee83820c8ab3e07a978066a925554b4b961ac240ca572e65ed25802200956318f0afb6f8355cdae42b71b05349e8f2fcd604fbf1c93caed18f0010059014730440220213ab899cffc6781d569cc54d558c56ea1808ccb0cbd9b4b134c148f639e0df202207affd66499c6c1813a15f8bd5fb6238054f679d111927b77878746a80144fe83016952210375e00eb72e29da82b89367947f29ef34afb75e8654f6ea368e0acdfd92976b7c2103a1b26313f430c4b15bb1fdce663207659d8cac749a0e53d70eff01874496feff2103c96d495bfdd5ba4145e3e046fee45e84a8a48ad05bd8dbb395c011a32cf9f88053ae Transação: 1b2a44f4f8b59d6d7075a3dbd72493a6a158218589e722d7525d1d99b7f287a5 (Entrada 0)
Script
Exemplo 2
O exemplo a seguir usa um hash puzzle (quebra-cabeça de hash) personalizado.
O ScriptPubKey contém um padrão de script de travamento P2WSH padrão:
ASM
OP_0
OP_PUSHBYTES_32
ee4fd29ce2f9ca8411778f8e94687d5e75ec3e86cc530ca9ad1787e5208cc996 Hex
0020ee4fd29ce2f9ca8411778f8e94687d5e75ec3e86cc530ca9ad1787e5208cc996 Transação: c6cfbac310715dc35ae5a1edbeae78def5955a67cd891aa3457d8cd4cdb5398a (Saída 0)
A Testemunha na transação de gasto então contém o seguinte código de destravamento:
ASM
1234
aa20a23421f2ba909c885a3077bb6f8eb4312487797693bbcfe7e311f797e3c5b8fa87 Dividido
{
"stackitems": "02",
"0": {
"size": "02",
"item": "1234"
},
"1": {
"size": "23",
"item": "aa20a23421f2ba909c885a3077bb6f8eb4312487797693bbcfe7e311f797e3c5b8fa87"
}
} Hex
0202123423aa20a23421f2ba909c885a3077bb6f8eb4312487797693bbcfe7e311f797e3c5b8fa87 Transação: 64f427122f7951687aea608b5474509a30616d4e5773a83bc1ed8b8271ad1991 (Entrada 0)
Se você decodificar o Witness Script (o último item), verá que ele corresponde ao seguinte script de travamento:
Script
ASM
OP_HASH256 OP_PUSHBYTES_32 a23421f2ba909c885a3077bb6f8eb4312487797693bbcfe7e311f797e3c5b8fa OP_EQUAL Hex
aa20a23421f2ba909c885a3077bb6f8eb4312487797693bbcfe7e311f797e3c5b8fa87 Para destravar esse Witness Script, você precisa fornecer algum dado cujo resultado do HASH256 seja a23421f2ba909c885a3077bb6f8eb4312487797693bbcfe7e311f797e3c5b8fa.
E, se você olhar o primeiro item na Testemunha, verá que é simplesmente 1234, que de fato produz esse resultado.
HASH256
É bastante raro ver esse tipo de script de travamento personalizado dentro de um P2WSH, pois eles costumam ser usados para embrulhar scripts de travamento multisig (P2MS). Mas isso só mostra que você pode usá-los para scripts personalizados, se quiser.
Esse tipo de hash puzzle é um método inseguro de travar bitcoins. Um minerador que receber essa transação de gasto poderia simplesmente extrair o script de destravamento e criar uma nova transação enviando as moedas para outro lugar. Isso porque o código de destravamento não contém uma assinatura, então não há nada que impeça que ele seja usado em uma transação completamente diferente.
Limites
Qual é o tamanho máximo de um P2WSH?
Há alguns limites impostos a travas P2WSH padrão:
- O Witness Script pode ter no máximo 3.600 bytes. Isso é maior que o limite de 520 bytes do Redeem Script em um P2SH, então um P2WSH pode lidar com scripts de travamento personalizados muito maiores que o P2SH.
- O número máximo de itens na pilha é 100. Então certifique-se de que não mais que 100 itens precisem ser empilhados na pilha antes do Witness Script.
- O tamanho máximo de cada item da pilha é 80 bytes. Cada item empilhado na pilha antes do Witness Script pode ter no máximo 80 bytes de tamanho.
Se você exceder esses limites, o script será considerado não padrão e a transação não será retransmitida pelos nós.
Veja policy.h para detalhes.
História
Por que temos o P2WSH?
O P2WSH foi introduzido na atualização Segregated Witness de 2016 como um substituto para o P2SH.
Eles são funcionalmente iguais, mas o P2WSH tem dois benefícios principais sobre o P2SH:
- O P2WSH usa o campo de Testemunha para destravar, enquanto o P2SH usa o ScriptSig. Os dados no campo de Testemunha carregam menos peso do que os dados dentro do ScriptSig, então você pagará menos em taxas de transação ao destravar um P2WSH em comparação com um P2SH legado.
- O Witness Script em um P2WSH tem um tamanho máximo aumentado de 3.600 bytes, enquanto o Redeem Script em um P2SH é limitado a um máximo de 520 bytes. Isso significa que você pode usar scripts de travamento personalizados muito maiores dentro de um P2WSH em comparação com um P2SH.
Mas, em última análise, o P2WSH foi introduzido para aproveitar a nova área de Testemunha das transações para destravar entradas.
Você ainda pode usar o P2SH se quiser, mas o P2WSH é agora a escolha preferida para travar bitcoins a scripts de travamento personalizados no Bitcoin.
Resumo
O P2WSH é um dos scripts de travamento mais complexos de entender no início. Isso porque ele não é executado da mesma forma que os scripts tradicionais, e ainda tem o passo adicional de desserializar o Witness Script antes de a execução acontecer.
Então não se sinta mal se não fizer sentido de imediato. Levei um tempo para entender isso também.
No entanto, ele é funcionalmente igual ao P2SH. Então, se você conseguir pegar o jeito de como o P2SH funciona, o P2WSH é praticamente a mesma coisa, exceto que o código de destravamento é colocado dentro do campo de Testemunha da entrada em vez do ScriptSig.