P2SH-P2WPKH

Nested P2WPKH — um P2WPKH moderno embrulhado em um P2SH legado

BIP 141: Segregated Witness

Diagrama mostrando a estrutura do código de travamento e destravamento do P2SH-P2WPKH.

O P2SH-P2WPKH (também conhecido como Nested P2WPKH) é um tipo de script de travamento que embrulha um P2WPKH moderno dentro de um P2SH legado.

Ele permite enviar bitcoins para um endereço legado iniciado em 3 (P2SH), mas também aproveitar os custos de taxa de transação mais baratos que vêm de gastar uma saída P2WPKH moderna.

Portanto, o P2SH-P2WPKH fornece um trampolim até que carteiras e exchanges suportem o envio direto para endereços iniciados em bc1q.

Não há razão para usar P2SH-P2WPKH se você tem a opção de usar P2WPKH diretamente. O P2SH-P2WPKH só é útil se você não conseguir enviar para um endereço bc1q a partir da sua carteira ou exchange, mas conseguir enviar para um endereço iniciado em 3.

Propósito

Por que o P2SH-P2WPKH existe?

Diagrama mostrando o P2SH-P2WPKH sendo usado para enviar bitcoins de uma carteira/exchange que não suporta o envio para P2WPKH.

O novo script de travamento P2WPKH introduzido na atualização Segregated Witness é destravado pelo campo de testemunha de uma transação.

O campo de testemunha fornece um desconto em termos de quanto espaço ele ocupa em um bloco. Como resultado, custa menos em taxas gastar um P2WPKH em comparação com um P2PKH legado (que é destravado pelo campo ScriptSig e não fornece desconto).

Então você preferiria usar o P2WPKH em vez do P2PKH legado, se tivesse a escolha.

Porém, carteiras e exchanges podem não ter implementado a funcionalidade de enviar para P2WPKH (endereços bc1q) quando o Segregated Witness foi ativado pela primeira vez, em 2016. Portanto, o P2SH-P2WPKH fornece a opção de enviar para um P2SH (endereço iniciado em 3), ao mesmo tempo em que permite gastar a saída como se fosse um P2WPKH mais tarde.

Como resultado, o P2SH-P2WPKH permite aproveitar o desconto de testemunha fornecido pelo P2WPKH, mesmo que a carteira ou exchange que você está usando não permita enviar para endereços bc1q.

O Nested P2WPKH é só o P2WPKH normal embutido dentro de um P2SH, para torná-lo compatível com carteiras mais antigas que não reconhecem endereços de testemunha nativos (bech32).
meshcolider, bitcoin.stackexchange.com
  • Carteiras e exchanges precisam suportar o novo formato de endereço Bech32 para conseguir permitir que os usuários enviem para P2WPKH.
  • O uso do P2SH-P2WPKH diminuiu ao longo do tempo, à medida que carteiras e exchanges introduziram a funcionalidade de suportar P2WPKH.
  • Quase todas as carteiras e exchanges modernas agora suportam o envio para P2WPKH, então o P2SH-P2WPKH tornou-se mais uma relíquia do passado. Porém, ainda é um método de script de travamento padrão, então você ainda pode usá-lo se quiser.

Uso

Como o P2SH-P2WPKH funciona?

O P2SH-P2WPKH é um dos scripts mais complexos de entender.

O ScriptPubKey é um P2SH padrão, mas, para destravá-lo, você precisa usar tanto o campo ScriptSig quanto o de Testemunha de uma transação.

ScriptPubKey (trava)

Diagrama mostrando a estrutura do ScriptPubKey de um P2SH-P2WPKH.

O ScriptPubKey é um script de travamento P2SH padrão. Por exemplo:

ASM

OP_HASH160
OP_PUSHBYTES_20
6d3ed4cf55dc6752a12d3091d436ef8f0f982ff8
OP_EQUAL

Hex

a9146d3ed4cf55dc6752a12d3091d436ef8f0f982ff887

Transação: 021e23df3cdb8b504bec1a3f7a382a83be7518354bac2331076753b5b4755a4e (Saída 0)

O hash do script é o HASH160 de um ScriptPubKey P2WPKH. Por exemplo:

P2WPKH ScriptPubKey: 001402c8147af586cace7589672191bb1c790e9e9a72
HASH160:             6d3ed4cf55dc6752a12d3091d436ef8f0f982ff8

O ScriptPubKey P2WPKH original será revelado no ScriptSig que vem a seguir.

O fato de o P2SH-P2WPKH usar um ScriptPubKey P2SH padrão é o que o torna retrocompatível. A maioria das carteiras e exchanges deve suportar o envio para um P2SH (endereço iniciado em 3).

ScriptSig (destrava)

Diagrama mostrando a estrutura do ScriptSig de um P2SH-P2WPKH.

O ScriptSig contém um empilhamento de dados de 22 bytes de um ScriptPubKey P2WPKH.

ASM

OP_PUSHBYTES_22
001402c8147af586cace7589672191bb1c790e9e9a72

Hex

16001402c8147af586cace7589672191bb1c790e9e9a72

Transação: a55bd4d4ebd319ab2990c356e16cab1eeb52a93c414b869a606dc0add61d725a (Entrada 0)

Esse empilhamento de dados é um ScriptPubKey P2WPKH completo. Em outras palavras, é o ScriptPubKey que você teria usado se estivesse usando P2WPKH diretamente.

Para a execução desse tipo de script continuar com sucesso, o HASH160 desse empilhamento de dados precisa corresponder ao hash do script no ScriptPubKey.

Í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 fato de o ScriptSig conter um P2WPKH adicional dentro dele é o motivo pelo qual isso às vezes é chamado de "Nested P2WPKH" (P2WPKH aninhado).

Testemunha

Diagrama mostrando a estrutura do campo de testemunha de um P2SH-P2WPKH.

O campo de testemunha contém a assinatura e a chave pública necessárias para destravar o ScriptPubKey P2WPKH dentro do ScriptSig.

ASM

304402201f85ab44217563b4ce9d11e4c7b00dc59dd102099eb250634f4b6906276ba07702206147cc98f29c5fcbad925b5e40fe154f4d429f9569f292f9298f615c4940044501
022ae7dd28111380c100301f5e9797383e291234c341d7a242202a6def9069181c

Dividido

{
  "stackitems": "02",
  "0": {
    "size": "47",
    "item": "304402201f85ab44217563b4ce9d11e4c7b00dc59dd102099eb250634f4b6906276ba07702206147cc98f29c5fcbad925b5e40fe154f4d429f9569f292f9298f615c4940044501"
  },
  "1": {
    "size": "21",
    "item": "022ae7dd28111380c100301f5e9797383e291234c341d7a242202a6def9069181c"
  }
}

Hex

0247304402201f85ab44217563b4ce9d11e4c7b00dc59dd102099eb250634f4b6906276ba07702206147cc98f29c5fcbad925b5e40fe154f4d429f9569f292f9298f615c494004450121022ae7dd28111380c100301f5e9797383e291234c341d7a242202a6def9069181c

Transação: a55bd4d4ebd319ab2990c356e16cab1eeb52a93c414b869a606dc0add61d725a (Entrada 0)

Esses dados são executados contra o ScriptPubKey P2WPKH no ScriptSig, exatamente como seria para um P2WPKH direto.

A estrutura do campo de testemunha de um P2SH-P2WPKH é exatamente a mesma de um P2WPKH direto.

O P2SH-P2WPKH usa apenas chaves públicas comprimidas. Isso é diferente do P2PKH legado, em que tanto chaves públicas não comprimidas quanto comprimidas podem ser usadas.

Resumo

Um P2SH-P2WPKH é destravado em dois passos:

  1. O ScriptPubKey é destravado pelo ScriptSig. Isso é feito fornecendo um empilhamento de dados (um ScriptPubKey P2WPKH) que gera o hash igual ao hash do script no ScriptPubKey.
  2. O ScriptSig é destravado pela Testemunha. Isso é feito fornecendo a assinatura e a chave pública necessárias para destravar o ScriptPubKey P2WPKH no ScriptSig.

É um pouco confuso, eu sei. Acho que é o fato de o ScriptSig conter, na verdade, um ScriptPubKey dentro dele, e é isso que confunde a maioria das pessoas.

Mas não se desanime, porque, como eu disse, ele não é executado como um P2SH típico.

O P2SH-P2WPKH (e o P2SH-P2WSH) funcionam de forma diferente de outros scripts no Bitcoin. Eles são casos especiais que acionam regras adicionais em comparação com outros scripts.

Custos

Quão mais barato é usar P2SH-P2WPKH em vez do P2PKH legado?

A tabela a seguir mostra o número de bytes necessários para destravar um P2PKH legado, um P2SH-P2WPKH e um P2WPKH moderno:

Bytes para destravar cada tipo de script
Tipo de ScriptScriptSig (bytes)Testemunha (bytes)Total (bytes)
P2PKH1070107
P2SH-P2WPKH23107130
P2WPKH0107107

Nota: O tamanho das assinaturas pode variar ligeiramente, mas esses são os tamanhos mais típicos.

Como você pode ver, o P2SH-P2WPKH na verdade exige mais bytes para destravar do que um P2PKH legado ou um P2WPKH moderno.

Porém, o cálculo de tamanho de uma transação foi ajustado durante a atualização Segregated Witness para usar bytes virtuais. Essa nova medida de bytes virtuais dá um desconto aos bytes no campo de testemunha, em que cada byte na testemunha ocupa apenas 0,25 byte virtual de espaço.

A tabela a seguir mostra o número de bytes virtuais necessários para destravar os mesmos scripts:

Bytes virtuais para destravar cada tipo de script
Tipo de ScriptScriptSig (bytes virtuais)Testemunha (bytes virtuais)Total (bytes virtuais)
P2PKH1070107
P2SH-P2WPKH2326,7549,75
P2WPKH026,7526,75

Nota: O número de bytes na testemunha foi multiplicado por 0,25.

Então, embora o gasto de um P2SH-P2WPKH exija mais bytes no geral, o desconto dado aos bytes no campo de testemunha significa que um P2SH-P2WPKH usa menos bytes virtuais em comparação com um P2PKH legado.

E, como o valor que você paga em taxas de transação é calculado em sats por byte virtual, sai mais barato gastar um P2SH-P2WPKH do que um P2PKH legado.

Você obtém os benefícios do segwit (com uma pequena penalidade, o embrulho do P2SH tem um custo), mas consegue receber moedas de remetentes que não suportam endereços segwit nativos.
Pieter Wuille, bitcoin.stackexchange.com

O P2WPKH é o mais barato. Mas, se essa não for uma opção, o P2SH-P2WPKH é mais barato que o P2PKH legado.

Enviando

Não há muita diferença na quantidade de espaço usado ao enviar bitcoins para um P2PKH, P2SH-P2WPKH ou P2WPKH.

Esta é a quantidade de bytes necessária para travar uma saída (ou seja, "enviar") para cada um desses padrões de ScriptPubKey:

Bytes para travar (enviar) para cada tipo de script
Tipo de ScriptScriptPubKey (bytes)
P2PKH25
P2SH-P2WPKH23
P2WPKH22

E, como o campo ScriptPubKey não recebe desconto, eles ocupam a mesma quantidade de espaço em termos de bytes virtuais:

Bytes virtuais para travar (enviar) para cada tipo de script
Tipo de ScriptScriptPubKey (bytes virtuais)
P2PKH25
P2SH-P2WPKH23
P2WPKH22

Então, comparado a um P2PKH legado, a economia principal em termos de taxas de transação vem quando você gasta um P2SH-P2WPKH ou P2WPKH.

Endereço

Como você cria um endereço para um P2SH-P2WPKH?

Diagrama mostrando como codificar um P2SH-P2WPKH em um endereço.

Os scripts de travamento P2SH-P2WPKH têm um endereço iniciado em 3.

Isso porque ele usa o P2SH para o ScriptPubKey, então tem o mesmo formato de endereço que qualquer outro P2SH.

Para criar o endereço, você começa construindo o ScriptPubKey P2WPKH que quer usar. Você então faz o hash dele usando HASH160 para criar o hash de script de 20 bytes. Por fim, você codifica esse hash de script em Base58Check usando o prefixo 05 para significar um endereço P2SH (que é o que lhe dá um 3 no início do endereço).

Por exemplo, a codificação em hex do ScriptPubKey P2WPKH colocado no ScriptSig no exemplo acima é:

001402c8147af586cace7589672191bb1c790e9e9a72
Ícone Ferramenta Script

Script

Decodifique e codifique um script.

0 bytes

Se fizermos o hash disso usando HASH160, obtemos:

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

E, se convertermos isso para Base58Check usando o prefixo 05, obtemos:

3Beer3irc1vgs76ENA4coqsEQpGZeM5CTd

Ícone Ferramenta Base58Check

Base58Check

Cria um checksum para os dados e depois codifica em base58.

0 bytes
Esperado:
0 caracteres

Não é possível identificar um P2SH-P2WPKH apenas pelo endereço. A única forma de identificar que um endereço iniciado em 3 usa Nested P2WPKH é quando ele é gasto, pois é aí que ele revela o script de travamento P2WPKH embrulhado dentro do ScriptSig.

Resumo

Em poucas palavras

O P2SH-P2WPKH (Nested P2WPKH) foi criado para aproveitar os custos de gasto mais baratos do P2WPKH, mesmo que a carteira ou exchange que você está usando não permita enviar para P2WPKH diretamente (endereço bc1q).

Como um compromisso, você pode enviar bitcoins para um P2SH (endereço iniciado em 3) e, então, gastar a saída mais tarde como se fosse um P2WPKH. Isso significa que a saída é destravada pelo campo de testemunha, e o desconto fornecido por essa testemunha reduz os custos em termos de taxas de transação.

Mas, agora que o P2WPKH é amplamente adotado, não há mais muito uso para o antigo P2SH-P2WPKH.

Era útil em uma época anterior à maioria das carteiras suportar o segwit, pois até as que não suportavam geralmente suportavam P2SH.
Pieter Wuille, bitcoin.stackexchange.com

O aspecto mais irritante interessante do P2SH-P2WPKH (além do acrônimo comprido) é como ele usa tanto o campo ScriptSig quanto o de Testemunha para ser destravado. Isso o torna um processo de destravamento de múltiplos passos e é, naturalmente, mais complexo do que um P2PKH ou P2WPKH simples.

Isso é especialmente irritante se você está fazendo o parsing da blockchain ou trabalhando em um explorador de blockchain, pois adiciona mais um tipo de script de travamento para identificar e tratar. Ele acaba transformando o ScriptSig, que era apenas o campo de "código de destravamento", também em um campo de "código de travamento", o que é um pouco estranho.

Então não se preocupe se você achar esse tipo de script difícil de entender — eu também achei (e ainda acho).

Na verdade, adiei a escrita desta página por muito tempo (o Segwit foi lançado em 2016 e escrevi esta página em 2025), pois esperava que o P2SH-P2WPKH caísse na obsolescência ao longo dos anos, para que eu não tivesse que passar pelo trabalho de explicar como ele funciona. Mas o P2SH-P2WPKH vai viver na blockchain para sempre, então é melhor pegarmos o jeito dele em algum momento.

O ideal teria sido migrar diretamente do P2PKH para o P2WPKH sem ter o P2SH-P2WPKH jogado no meio como um trampolim retrocompatível, mas ele cumpriu o seu propósito enquanto carteiras e exchanges implementavam os novos recursos do Segregated Witness.

Foi tudo por uma experiência de usuário mais agradável. Nós só temos que lidar com a complexidade.

Na verdade, eu uso o P2SH-P2WPKH para o endereço de doação deste site.

A razão simples é que o antigo formato de endereço Base58 (que o P2SH usa) me permite criar um endereço vaidoso (vanity) com a palavra "Beer" no início. Mas não consigo fazer isso com o novo formato de endereço Bech32 (que o P2WPKH usa), porque ele não permite usar a letra "b" na parte principal do endereço.

Então, sim, estou usando P2SH-P2WPKH em vez de P2WPKH e pagando um pouco mais em taxas só porque quero ter a palavra "Beer" no meu endereço de doação.

De nada.

Recursos