Skip to content

Commit 528a272

Browse files
committed
Review 10_2
1 parent 161ad35 commit 528a272

1 file changed

Lines changed: 19 additions & 19 deletions

File tree

pt/10_2_Building_the_Structure_of_P2SH.md

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,30 @@
1-
# 10.2: Construindo a Estrutura de P2SH
1+
# 10.2: Construindo a Estrutura do P2SH
22

33
Na seção anterior, apresentamos uma visão geral da teoria de como criar as transações P2SH para armazenar os scripts de Bitcoin. Na prática, fazer isso é _muito mais difícil_, mas por uma questão de integridade, vamos examinar minuciosamente todos os pontos. Provavelmente, isso não é algo que faríamos sem uma API, então, se ficar muito complicado, esteja ciente de que retornaremos aos scripts originais de alto nível mais pra frente.
44

55
## Criando um Script de Bloqueio
66

77
Qualquer transação P2SH começa com um script de bloqueio. Esse é o assunto dos capítulos 9, 11 e 12. Podemos usar qualquer um dos métodos de script do Bitcoin descritos nestes capítulos para criar qualquer tipo de script de bloqueio, desde que o ```redeemScript``` serializado resultante tenha 520 bytes ou menos.
88

9-
> :book: ***Por que os scripts P2SH são limitados a 520 bytes?*** Como muitas coisas no Bitcoin, a resposta é a compatibilidade com as versões anteriores: Novas funcionalidades devem ser constantemente criadas dentro das antigas restrições do sistema. Nesse caso, 520 bytes é o máximo que pode ser colocado na pilha de uma vez. Como todo o redemScript é colocado na pilha como parte do processo de resgate, ele está limitado a essa quantidade.
9+
> :book: ***Por que os scripts P2SH são limitados a 520 bytes?*** Como muitas coisas no Bitcoin, a resposta é a compatibilidade com as versões anteriores: novas funcionalidades devem ser constantemente criadas dentro das antigas restrições do sistema. Nesse caso, 520 bytes é o máximo que pode ser colocado na pilha de uma vez. Como todo o redeemScript é colocado na pilha como parte do processo de resgate, ele está limitado à essa quantidade.
1010
11-
## Serializando um script de bloqueio da maneira mais difícil
11+
## Serializando um Script de Bloqueio da Maneira Difícil
1212

13-
Depois de criar um script de bloqueio, precisamos serializá-lo antes que possamos ser inseridos no Bitcoin. Este é um processo de duas partes. Primeiro, devemos transformá-lo em um hexcode, para então transformar esse hex em binário.
13+
Depois de criar um script de bloqueio, precisamos serializá-lo antes que possam ser inseridos no Bitcoin. Este é um processo de duas partes. Primeiro, devemos transformá-lo em um hexcode, para então transformar esse hex em binário.
1414

15-
### Criando o código hexadecimal
15+
### Criando o Código Hexadecimal
1616

1717
Criar o hexcode necessário para serializar um script é uma simples tradução, mas ao mesmo tempo, algo complexo o suficiente para ir além de qualquer script shell que provavelmente escreveremos. Esta etapa é um dos principais motivos pelos quais precisamos de uma API para criar as transações P2SH.
1818

19-
Podemos criar um hexcode percorrendo nosso script de bloqueio e transformando cada elemento em um comando hexadecimal de um byte, possivelmente seguido por dados adicionais. De acordo com o guia da [página Bitcoin Wiki Script](https://en.bitcoin.it/wiki/ Roteiro):
19+
Podemos criar um hexcode percorrendo nosso script de bloqueio e transformando cada elemento em um comando hexadecimal de um byte, possivelmente seguido por dados adicionais. De acordo com o guia da [página Wiki do Bitcoin Script](https://en.bitcoin.it/wiki/Script):
2020

2121
* Os operadores são traduzidos para o byte correspondente para esse opcode;
2222
* As constantes 1-16 são convertidas para opcodes 0x51 a 0x61 (OP_1 a OP_16);
2323
* A constante -1 é traduzida para opcode 0x4f (OP_1NEGATE);
2424
* Outras constantes são precedidas por opcodes 0x01 a 0x4e (OP_PUSHDATA, com o número especificando de quantos bytes adicionar);
2525
* Os inteiros são traduzidos em hexadecimal usando a notação de magnitude com sinal _little-endian_.
2626

27-
### Traduzindo os tipos inteiros
27+
### Traduzindo os Números Inteiros
2828

2929
Os inteiros são a parte mais problemática de uma tradução de script de bloqueio.
3030

@@ -48,7 +48,7 @@ $ lehex=$(echo $hex | tac -rs .. | echo "$(tr -d '\n')")
4848
$ echo $lehex
4949
9f7b2a5c
5050
```
51-
Além disso, sempre precisaremos saber o tamanho dos dados que colocamos na pilha, para que possa precedê-los com o opcode adequado. Podemos apenas lembrar que cada dois caracteres hexadecimais é um byte. Ou podemos usar o comando ```echo -n``` com o pipe para ```wc -c``` e dividi-lo ao meio:
51+
Além disso, sempre precisaremos saber o tamanho dos dados que colocamos na pilha, para que possamos precedê-los com o opcode adequado. Podemos apenas lembrar que cada dois caracteres hexadecimais é um byte. Ou podemos usar o comando ```echo -n``` com o pipe para ```wc -c``` e dividi-lo ao meio:
5252
```
5353
$ echo -n $lehex | wc -c | awk '{print $1/2}'
5454
4
@@ -66,7 +66,7 @@ $ echo $neglehex
6666

6767
Para completar nossa serialização, traduzimos o código hexadecimal em binário. Na linha de comando, isso requer apenas uma invocação simples do ```xxd -r -p```. No entanto, provavelmente desejamos fazer isso tudo junto, para também fazer o hash do script...
6868

69-
## Executando o script de conversão de tipos inteiros
69+
## Executando o Script de Conversão de Inteiros
7070

7171
Um script completo para alterar um número inteiro entre -2147483647 e 2147483647 para uma representação de magnitude assinada do tipo _little-endian_ em hexadecimal pode ser encontrado no [diretório de código src](src/10_2_integer2lehex.sh). Podemos baixar o ```integeer2lehex.sh```.
7272

@@ -91,19 +91,19 @@ Length: 4 bytes
9191
Hexcode: 049f7b2adc
9292
```
9393

94-
## Analisando um P2SH Multisig
94+
## Analisando um Multisig P2SH
9595

9696
Para entender melhor o processo, faremos a engenharia reversa do multisig P2SH que criamos na seção [§6.1: Enviando uma Transação com Multisig](06_1_Sending_a_Transaction_to_a_Multisig.md). Dê uma olhada no ```redeemScript``` que usamos, que agora sabemos que é a versão hexadecimal do script de bloqueio:
9797
```
9898
522102da2f10746e9778dd57bd0276a4f84101c4e0a711f9cfd9f09cde55acbdd2d1912102bfde48be4aa8f4bf76c570e98a8d287f9be5638412ab38dede8e78df82f33fa352ae
9999
```
100-
Podemos traduzir isso de volta para o script manualmente usando a [página do Bitcoin Wiki Script](https://en.bitcoin.it/wiki/Script) como uma referência. Basta olhar para um byte (dois caracteres hexadecimais) de dados por vez, a menos que nos seja dito para olhar pra mais bytes usando OP_PUSHDATA (um opcode no intervalo de 0x01 a 0x4e).
100+
Podemos traduzir isso de volta para o script manualmente usando a [página Wiki do Bitcoin Script](https://en.bitcoin.it/wiki/Script) como uma referência. Basta olhar para um byte (dois caracteres hexadecimais) de dados por vez, a menos que nos seja dito para olhar pra mais bytes usando OP_PUSHDATA (um opcode no intervalo de 0x01 a 0x4e).
101101

102102
Todo o Script será dividido da seguinte forma:
103103
```
104104
52 / 21 / 02da2f10746e9778dd57bd0276a4f84101c4e0a711f9cfd9f09cde55acbdd2d191 / 21 / 02bfde48be4aa8f4bf76c570e98a8d287f9be5638412ab38dede8e78df82f33fa3 / 52 / ae
105105
```
106-
Aqui está o que as partes individuais significam:
106+
Aqui está o que cada parte individual significa:
107107

108108
* 0x52 = OP_2
109109
* 0x21 = OP_PUSHDATA 33 bytes (hex: 0x21)
@@ -113,7 +113,7 @@ Aqui está o que as partes individuais significam:
113113
* 0x52 = OP_2
114114
* 0xae = OP_CHECKMULTISIG
115115

116-
Em outras palavras, esse ```redeemScript``` era uma tradução de ```2 02da2f10746e9778dd57bd0276a4f84101c4e0a711f9cfd9f09cde55acbdd2d191 02bfde48be4aa8f4bf76c570e98a8d287f9be5638412ab38dede8e78df82f33fa3 2 OP_CHECKMULTISIG``` Voltaremos a este script na seção [§10.4: Criando scripts multisig](10_4_Scripting_a_Multisig.md) quando detalharmos exatamente como os multisigs funcionam dentro do paradigma P2SH.
116+
Em outras palavras, esse ```redeemScript``` era uma tradução de ```2 02da2f10746e9778dd57bd0276a4f84101c4e0a711f9cfd9f09cde55acbdd2d191 02bfde48be4aa8f4bf76c570e98a8d287f9be5638412ab38dede8e78df82f33fa3 2 OP_CHECKMULTISIG```. Voltaremos a este script na seção [§10.4: Programando um Multisig](10_4_Scripting_a_Multisig.md) quando detalharmos exatamente como os multisigs funcionam dentro do paradigma P2SH.
117117

118118
Se gostarmos de fazer o trabalho manual com esse tipo de tradução no futuro, podemos usar o ```decodescript bitcoin-cli```:
119119
```
@@ -141,7 +141,7 @@ $ bitcoin-cli -named decodescript hexstring=522102da2f10746e9778dd57bd0276a4f841
141141
```
142142
É especialmente útil para verificar nosso trabalho durante a serialização.
143143

144-
## Serializando um script de bloqueio da maneira mais fácil
144+
## Serializando um Script de Bloqueio da Maneira Fácil
145145

146146
Quando instalamos o ```btcdeb``` na seção [§9.3](09_3_Testing_a_Bitcoin_Script.md) também instalamos o ```btcc``` que pode ser usado para serializar scripts do Bitcoin:
147147
```
@@ -154,7 +154,7 @@ Isso é muito mais fácil do que fazer tudo na mão!
154154

155155
Considere também o compilador em Python, [Transaction Script Compiler](https://github.com/Kefkius/txsc), que traduz de trás pra frente também.
156156

157-
## Fazendo o hash de um script serializado
157+
## Fazendo o Hash de um Script Serializado
158158

159159
Depois de criar um script de bloqueio e serializá-lo, a terceira etapa na criação de uma transação P2SH é fazer o hash do script de bloqueio. Conforme observado anteriormente, um hash OP_HASH160 de 20 bytes é criado por meio de uma combinação de um hash SHA-256 e um hash RIPEMD-160. O hash de um script serializado, portanto, requer dois comandos: ```openssl dgst -sha256 -binary``` que faz o hash SHA-256 e produz um binário a ser enviado no pipe, então o ```openssl dgst -rmd160``` pega o fluxo do binário, faz um RIPEMD- 160 hash e, finalmente, gera um código hexadecimal legível.
160160

@@ -165,7 +165,7 @@ $ echo -n $redeemScript | xxd -r -p | openssl dgst -sha256 -binary | openssl dgs
165165
(stdin)= a5d106eb8ee51b23cf60d8bd98bc285695f233f3
166166
```
167167

168-
## Criando uma transação P2SH
168+
## Criando uma Transação P2SH
169169

170170
Criar o hash de 20 bytes apenas fornece o hash no centro de um script de bloqueio P2SH. Ainda precisamos colocá-lo junto com os outros opcodes que criam uma transação P2SH padrão: ```OP_HASH160 a5d106eb8ee51b23cf60d8bd98bc285695f233f3 OP_EQUAL```.
171171

@@ -175,8 +175,8 @@ Podemos observar que o ```hex scriptPubKey``` para a transação P2SH Script ir
175175

176176
## Resumo: Construindo a Estrutura de P2SH
177177

178-
Na verdade, a criação do script de bloqueio P2SH entra ainda mais nas entranhas do Bitcoin. Embora seja útil saber como tudo isso funciona em um nível muito baixo, é mais provável que tenhamos uma API cuidando de todo o trabalho pesado para nós. Nossa tarefa será simplesmente criar o Script Bitcoin para fazer o bloqueio... Que é o tópico principal dos capítulos 9, 11 e 12.
178+
Na verdade, a criação do script de bloqueio P2SH entra ainda mais nas entranhas do Bitcoin. Embora seja útil saber como tudo isso funciona em um nível muito baixo, é mais provável que tenhamos uma API cuidando de todo o trabalho pesado para nós. Nossa tarefa será simplesmente criar o Script Bitcoin para fazer o bloqueio... que é o tópico principal dos capítulos 9, 11 e 12.
179179

180-
## O que vem depois?
180+
## O Que Vem Depois?
181181

182-
Vamos continuar "Incorporando Scripts em Transações P2SH no Bitcoin" na seção [§10.3: Executando um script Bitcoin com P2SH](10_3_Running_a_Bitcoin_Script_with_P2SH.md).
182+
Vamos continuar "Incorporando Scripts em Transações P2SH no Bitcoin" na seção [§10.3: Executando um Script no Bitcoin com P2SH](10_3_Running_a_Bitcoin_Script_with_P2SH.md).

0 commit comments

Comments
 (0)