9.2 KiB
10.1: Entendendo a Fundação do P2SH
Sabemos que os scripts do Bitcoin podem ser usados para controlar o resgate dos UTXOs. A próxima etapa é criar os nossos próprios scripts... Mas isso requer uma técnica muito específica.
Conhecendo os Padrões do Bitcoin
Aqui está a pegadinha sobre como usar scripts do Bitcoin: Por razões de segurança, a maioria dos nós do Bitcoin aceitará apenas seis tipos de transações de Bitcoin, ditas como "padrão".
- Pay to Public Key (P2PK) - O tipo de transação mais antiga e obsoleta (
<pubKey> OP_CHECKSIG
) que foi substituída por uma mais segura, a P2PKH. - Pay to Public Key Hash (P2PKH) - Uma transação padrão (
OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
) que paga para o hash de uma chave pública. - Pay to Witness Public Key Hash (P2WPKH) - O tipo mais novo de transação de chave pública. Usa apenas (
OP_0 <pubKeyHash>
) porque depende do consenso do minerador para funcionar, conforme descrito na seção §9.5. - Multisig - Uma transação para um grupo de chaves, conforme explicado mais detalhadamente na seção §8.4.
- Null Data - Uma transação que não pode ser gasta (
OP_RETURN Data
). - Pay to Script Hash (P2SH) - Uma transação que paga a um script específico, conforme explicado mais detalhadamente neste capítulo.
Então, como podemos descrever um script mais complexo do Bitcoin? A resposta está nesse último tipo de transação padrão, o P2SH. Podemos colocar qualquer tipo de script mais longo e complexo em uma transação P2SH e, contanto que sigamos as regras padrões para incorporar nosso script e resgatar os fundos, obteremos todos os benefícios do Script do Bitcoin.
⚠️ AVISO DE VERSÃO: Os Scripts P2SH somente se tornaram padrão à partir do Bitcoin Core 0.10.0. Antes disso, apenas os scripts do tipo P2SH Multisigs eram permitidos.
Compreendendo o script P2SH
Você já viu uma transação P2SH quando criou uma multisig na seção §6.1: Enviando uma Transação com Multisig. Embora o multisig seja um dos tipos de transação padrão, o bitcoin-cli
simplifica o uso dos multisigs, incorporando-os às transações P2SH, conforme descrito mais detalhadamente na seção §10.4: Scripting a Multisig.
Então, vamos olhar mais uma vez para o scriptPubKey
daquela transação multisig P2SH:
"scriptPubKey": {
"asm": "OP_HASH160 a5d106eb8ee51b23cf60d8bd98bc285695f233f3 OP_EQUAL",
"hex": "a914a5d106eb8ee51b23cf60d8bd98bc285695f233f387",
"reqSigs": 1,
"type": "scripthash",
"addresses": [
"2N8MytPW2ih27LctLjn6LfLFZZb1PFSsqBr"
]
}
O script de bloqueio tem uma aparência bastante simples: OP_HASH160 a5d106eb8ee51b23cf60d8bd98bc285695f233f3 OP_EQUAL
. Como de costume, há um grande bloco de dados no meio. Este é um hash de outro script de bloqueio que está oculto (redeemScript
) que só será revelado quando os fundos forem resgatados. Em outras palavras, o script de bloqueio padrão para um endereço P2SH é: OP_HASH160 <redeemScriptHash> OP_EQUAL
.
📖 *** O que é um redemScript? *** Cada transação P2SH carrega a impressão digital de um script de bloqueio que fica oculto como um hash de 20 bytes. Quando uma transação P2SH é resgatada, o
redeemScript
completo (sem o hash) é incluído como parte doscriptSig
. O Bitcoin garantirá que oredeemScript
corresponda ao hash. Então, ele realmente executa oredeemScript
para ver se os fundos podem ser gastos (ou não).
Um dos elementos interessantes das transações P2SH é que nem o remetente nem o Blockchain sabem realmente o que é o redemScript
! Um remetente simplesmente envia para um endereço P2SH padronizado que é marcado com um prefixo "2" e, não se preocupa com a forma como o destinatário irá recuperar os fundos.
🔗 TESTNET vs MAINNET: Na testnet, o prefixo para endereços P2SH é
2
, enquanto na mainnet, é3
.
Entendendo como construir um script P2SH
Como o script de bloqueio está visível para uma transação P2SH e é bem simples, criar uma transação desse tipo também é um tanto quanto fácil. Em teoria. Tudo o que precisamos fazer é criar uma transação cujo script de bloqueio inclua um hash de 20 bytes do redeemScript
. Esse hash é feito com o padrão OP_HASH160
do Bitcoin.
📖 O que é OP_HASH160? Uma operação padrão do hash para o Bitcoin executar um hash SHA-256 e, em seguida, um hash RIPEMD-160.
No geral, quatro etapas são necessárias:
- Criar um script de bloqueio arbitrário com o script do Bitcoin;
- Criar uma versão serializada desse script de bloqueio;
- Executar um hash SHA-256 nesses bytes serializados;
- Executar um hash RIPEMD-160 nos resultados desse hash SHA-256.
Cada uma dessas etapas exige algum trabalho e, algumas delas podem ser bastante complexas. A boa notícia é que realmente não precisamos se preocupar com elas, porque são complexas o suficiente para que tenhamos uma API que faz o serviço para nós, normalmente.
Por enquanto, forneceremos apenas uma visão geral, para que entendamos o contexto da metodologia. Na seção §10.2: Construindo a Estrutura de P2SH, forneceremos uma visão mais aprofundada da criação do script, caso queiramos entender a essência desse processo.
Entendendo como enviar uma transação do tipo P2SH
Então, como enviamos nossa transação P2SH? Novamente, a teoria é muito simples:
- Incorporamos o hash em um script
OP_HASH160 <redeemScriptHash> OP_EQUAL
; - Traduzimos isso para um código hexadecimal;
- Usamos esse hex como nosso
scriptPubKey
; - Criamos o resto da transação.
Infelizmente, este é lugar momento em que precisaremos usar às APIs, em grande parte porque o bitcoin-cli
não fornece nenhum suporte para a criação de transações P2SH. Mas, podemos resgatá-las sem problema.
Entendendo como desbloquear uma transação do tipo P2SH
O truque para resgatar uma transação P2SH é que o destinatário deve ter salvo o script secreto de bloqueio serializado que foi codificado para criar o endereço P2SH. Isso se chama redeemScript
porque é o que o destinatário precisa para resgatar os fundos.
Um scriptSig
de desbloqueio para uma transação P2SH tem o seguinte formato: ... dados ... <redeemScript>
. Os dados
devem ser somente dados que são colocados na pilha, não operadores. O BIP 16 os chama de assinaturas, mas isso não é um requisito real.
⚠️ AVISO: Embora assinaturas não sejam um requisito, um script P2SH na verdade não é muito seguro se não exigir pelo menos uma assinatura nas entradas. As razões para isso estão descritas na seção §13.1: Escrevendo scripts de quebra-cabeças.
Quando um UTXO é resgatado, ele é executado em duas rodadas de verificação:
- Primeiro, o
redeemScript
noscriptSig
está em hash e é comparado ao hash do script noscriptPubKey
; - Se eles corresponderem, uma segunda rodada de verificação será iniciada;
- Em segundo lugar, o
redeemScript
é executado usando os dados anteriores que foram colocados na pilha; - Se a segunda rodada de verificação também for bem-sucedida, o UTXO é desbloqueado.
Considerando que não podemos criar facilmente uma transação P2SH sem uma API, devemos ser capazes de resgatar facilmente uma transação P2SH com o bitcoin-cli
. Na verdade, já fizemos isso na seção [§6.2: Gastando uma Transação com Multsig] (06_2_Spending_a_Transaction_to_a_Multisig.md). O processo exato é descrito na seção §10.6: Gastando uma transação P2SH, após terminarmos com todas as complexidades da criação de uma transação P2SH.
⚠️ AVISO: Podemos criar uma transação perfeitamente válida com um redemScript com o hash correto, mas se o redemScript não funcionar, ou não funcionar corretamente, os fundos serão perdidos para sempre. É por isso que é importantíssimo testar os Scripts, conforme discutido na seção §9.3: Testando um Script no Bitcoin.
Resumo: Entendendo a Fundação do P2SH
Os scripts arbitrários do Bitcoin não são o padrão neste sistema. No entanto, podemos incorporá-los em transações padrão usando o tipo de endereço P2SH. Precisamos apenas fazer um hash do nosso script como parte do script de bloqueio, então o revelamos e executamos como parte do script de desbloqueio. Contanto que também possamos satisfazer o redeemScript
, o UTXO poderá ser gasto.
🔥 Qual é o poder do P2SH? Já sabemos o poder do script do Bitcoin, que nos permite criar Contratos Inteligentes mais complexos de todos os tipos. O P2SH é o que realmente libera esse poder, nos permitindo que incluamos o Script arbitrário do Bitcoin em transações padrão.
O que vem depois?
Vamos continuar "Incorporando Scripts em Transações P2SH no Bitcoin" na seção §10.2: Construindo a Estrutura de P2SH.