Skip to content

Commit ed99ab1

Browse files
authored
Merge pull request #375 from KoreaComK/chapter10
Chapter 10 Translated by @KoreaComK need review
2 parents 1baf063 + 11fb617 commit ed99ab1

7 files changed

Lines changed: 726 additions & 0 deletions
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# Capítulo 10: Incorporando Scripts em Transações P2SH no Bitcoin
2+
3+
O Bitcoin Script desce vários níveis de abstração, permitindo que controlemos minuciosamente as condições de resgate dos fundos. Mas, como realmente incorporamos esses scripts do Bitcoin nas transações que construímos até agora? A resposta é um novo tipo de transação de Bitcoin, o P2SH.
4+
5+
## Objetivos deste Capítulo
6+
7+
Depois de trabalhar neste capítulo, um desenvolvedor será capaz de:
8+
9+
* Projetar uma transação P2SH;
10+
* Aplicar um script P2SH Bitcoin.
11+
12+
Os objetivos secundários do capítulo incluem a capacidade de:
13+
14+
* Compreender o script P2SH;
15+
* Compreender o script Multisig;
16+
* Compreender as várias variações dos scripts Segwit;
17+
* Entender como gastar fundos enviados a um P2SH.
18+
19+
## Tabela de conteúdo
20+
21+
* [Seção 1: Compreendendo a Base do P2SH](10_1_Understanding_the_Foundation_of_P2SH.md)
22+
* [Seção 2: Construindo a Estrutura do P2SH](10_2_Building_the_Structure_of_P2SH.md)
23+
* [Seção 3: Executando um Script Bitcoin com P2SH](10_3_Running_a_Bitcoin_Script_with_P2SH.md)
24+
* [Seção 4: Programando um Multisig](10_4_Scripting_a_Multisig.md)
25+
* [Seção 5: Programando um Script Segwit](10_5_Scripting_a_Segwit_Script.md)
26+
* [Seção 6: Gastando uma Transação P2SH](10_6_Spending_a_P2SH_Transaction.md)
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
# 10.1: Compreendendo a Fundação do P2SH
2+
3+
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.
4+
5+
## Conhecendo os Padrões do Bitcoin
6+
7+
Aqui está a pegadinha sobre como usar scripts do Bitcoin: Por razões de segurança, a maioria dos nodes do Bitcoin aceitará apenas seis tipos de transações de Bitcoin, ditas como "padrão".
8+
9+
* __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.
10+
* __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.
11+
* __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](09_5_Scripting_a_P2WPKH.md).
12+
* __Multisig__ - Uma transação para um grupo de chaves, conforme explicado mais detalhadamente na seção [§8.4](08_4_Scripting_a_Multisig.md).
13+
* __Null Data__ - Uma transação que não pode ser gasta (`OP_RETURN Data`).
14+
* __Pay to Script Hash (P2SH)__ - Uma transação que paga a um script específico, conforme explicado mais detalhadamente neste capítulo.
15+
16+
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.
17+
18+
> :warning: **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.
19+
20+
## Compreendendo o Script P2SH
21+
22+
Você já viu uma transação P2SH quando criou um multisig na seção [§6.1: Enviando uma Transação com Multisig](06_1_Sending_a_Transaction_to_a_Multisig.md). 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: Programando um Multisig](10_4_Scripting_a_Multisig.md).
23+
24+
Então, vamos olhar mais uma vez para o ```scriptPubKey``` daquela transação multisig P2SH:
25+
```
26+
"scriptPubKey": {
27+
"asm": "OP_HASH160 a5d106eb8ee51b23cf60d8bd98bc285695f233f3 OP_EQUAL",
28+
"hex": "a914a5d106eb8ee51b23cf60d8bd98bc285695f233f387",
29+
"reqSigs": 1,
30+
"type": "scripthash",
31+
"addresses": [
32+
"2N8MytPW2ih27LctLjn6LfLFZZb1PFSsqBr"
33+
]
34+
}
35+
```
36+
37+
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```.
38+
39+
> :book: ***O que é um redeemScript?*** 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 do ```scriptSig```. O Bitcoin garantirá que o ```redeemScript``` corresponda ao hash. Então, ele realmente executa o ```redeemScript``` para ver se os fundos podem ser gastos (ou não).
40+
41+
Um dos elementos interessantes das transações P2SH é que nem o remetente nem o Blockchain sabem realmente o que é o ```redeemScript```! 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.
42+
43+
> :link: **TESTNET vs MAINNET:** Na testnet, o prefixo para endereços P2SH é ```2```, enquanto na mainnet, é ```3```.
44+
45+
## Compreendendo Como Construir um Script P2SH
46+
47+
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.
48+
49+
> :book: ***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.
50+
51+
No geral, quatro etapas são necessárias:
52+
53+
1. Criar um script de bloqueio arbitrário com Bitcoin Script;
54+
2. Criar uma versão serializada desse script de bloqueio;
55+
3. Executar um hash SHA-256 nesses bytes serializados;
56+
4. Executar um hash RIPEMD-160 nos resultados desse hash SHA-256.
57+
58+
Cada uma dessas etapas exige algum trabalho e algumas delas podem ser bastante complexas. A boa notícia é que realmente não precisamos nos preocupar com elas, porque são complexas o suficiente para que tenhamos uma API que faz o serviço para nós, normalmente.
59+
60+
Por enquanto, forneceremos apenas uma visão geral, para que entendamos o contexto da metodologia. Na seção [§10.2: Construindo a Estrutura do P2SH](10_2_Building_the_Structure_of_P2SH.md), forneceremos uma visão mais aprofundada da criação do script, caso queiramos entender a essência desse processo.
61+
62+
## Compreendendo Como Enviar uma Transação P2SH
63+
64+
Então, como enviamos nossa transação P2SH? Novamente, a teoria é muito simples:
65+
66+
1. Incorporamos o hash em um script ```OP_HASH160 <redeemScriptHash> OP_EQUAL```;
67+
2. Traduzimos isso para um código hexadecimal;
68+
3. Usamos esse hex como nosso ```scriptPubKey```;
69+
4. Criamos o resto da transação.
70+
71+
Infelizmente, este é outro momento em que precisaremos usar 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.
72+
73+
## Compreendendo Como Desbloquear uma Transação P2SH
74+
75+
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.
76+
77+
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](https://github.com/bitcoin/bips/blob/master/bip-0016.mediawiki) os chama de assinaturas, mas isso não é um requisito real.
78+
79+
> :warning: **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 Quebra-Cabeças](13_1_Writing_Puzzle_Scripts.md).
80+
81+
Quando um UTXO é resgatado, ele é executado em duas rodadas de verificação:
82+
83+
1. Primeiro, o ```redeemScript``` no ```scriptSig``` está em hash e é comparado ao hash do script no ```scriptPubKey```;
84+
2. Se eles corresponderem, uma segunda rodada de verificação será iniciada;
85+
3. Em segundo lugar, o ```redeemScript``` é executado usando os dados anteriores que foram colocados na pilha;
86+
4. Se a segunda rodada de verificação _também_ for bem-sucedida, o UTXO é desbloqueado.
87+
88+
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 Multisig](06_2_Spending_a_Transaction_to_a_Multisig.md). O processo exato é descrito na seção [§10.6: Gastando uma Transação P2SH](10_6_Spending_a_P2SH_Transaction.md), após terminarmos com todas as complexidades da criação de uma transação P2SH.
89+
90+
> :warning: **AVISO:** Podemos criar uma transação perfeitamente válida com um redeemScript com o hash correto, mas se o redeemScript 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](09_3_Testing_a_Bitcoin_Script.md).
91+
92+
## Resumo: Compreendendo a Fundação do P2SH
93+
94+
Scripts arbitrários não são o padrão no Bitcoin. 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.
95+
96+
> :fire: ***Qual é o poder do P2SH?*** Já sabemos o poder do Bitcoin Script, 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.
97+
98+
## O Que Vem Depois?
99+
100+
Vamos continuar "Incorporando Scripts em Transações P2SH no Bitcoin" na seção [§10.2: Construindo a Estrutura do P2SH](10_2_Building_the_Structure_of_P2SH.md).

0 commit comments

Comments
 (0)