P2WSH

Pay To Witness Script Hash

BIP 141: Segregated Witness

Diagrama mostrando a estrutura de um P2WSH.

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)

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

Ícone Ferramenta Script

Script

Decodifique e codifique um script.

0 bytes

Execução

Diagrama mostrando a execução do código de travamento e destravamento do P2WSH.

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":

  1. O Witness Script recebe o hash via SHA-256 para verificar se corresponde ao Script Hash.
  2. Os itens antes do Witness Script são empilhados na pilha.
  3. 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)>

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

    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_0 no 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
    Ícone Ferramenta Script

    Script

    Decodifique e codifique um script.

    0 bytes

    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)

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

    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)

    Ícone Ferramenta Script

    Script

    Decodifique e codifique um script.

    0 bytes

    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:

    Ícone Ferramenta Script

    Script

    Decodifique e codifique um script.

    0 bytes

    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.

    Ícone Ferramenta HASH256

    HASH256

    SHA-256 dupla. Usada para fazer o hash de cabeçalhos de bloco, dados de transação e de praticamente qualquer coisa que precise ser hasheada no Bitcoin.

    0 bytes
    SHA-256
    SHA-256

    SHA-256(SHA-256(dados))

    0 bytes

    É 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?

    Diagrama mostrando os limites de um script de travamento P2WSH padrão.

    Há alguns limites impostos a travas P2WSH padrão:

    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:

    1. 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.
    2. 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.

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

    Recursos