mirror of
				https://github.com/ChristopherA/Learning-Bitcoin-from-the-Command-Line.git
				synced 2025-10-31 02:17:24 +00:00 
			
		
		
		
	Review 10_2
This commit is contained in:
		
							parent
							
								
									161ad35fb5
								
							
						
					
					
						commit
						528a272d18
					
				| @ -1,4 +1,4 @@ | |||||||
| # 10.2: Construindo a Estrutura de P2SH | # 10.2: Construindo a Estrutura do P2SH | ||||||
| 
 | 
 | ||||||
| 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. | 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. | ||||||
| 
 | 
 | ||||||
| @ -6,17 +6,17 @@ Na seção anterior, apresentamos uma visão geral da teoria de como criar as tr | |||||||
| 
 | 
 | ||||||
| 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. | 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. | ||||||
| 
 | 
 | ||||||
| > :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. | > :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. | ||||||
| 
 | 
 | ||||||
| ## Serializando um script de bloqueio da maneira mais difícil | ## Serializando um Script de Bloqueio da Maneira Difícil | ||||||
| 
 | 
 | ||||||
| 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. | 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. | ||||||
| 
 | 
 | ||||||
| ### Criando o código hexadecimal | ### Criando o Código Hexadecimal | ||||||
| 
 | 
 | ||||||
| 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. | 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. | ||||||
| 
 | 
 | ||||||
| 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): | 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): | ||||||
| 
 | 
 | ||||||
| * Os operadores são traduzidos para o byte correspondente para esse opcode; | * Os operadores são traduzidos para o byte correspondente para esse opcode; | ||||||
| * As constantes 1-16 são convertidas para opcodes 0x51 a 0x61 (OP_1 a OP_16); | * As constantes 1-16 são convertidas para opcodes 0x51 a 0x61 (OP_1 a OP_16); | ||||||
| @ -24,7 +24,7 @@ Podemos criar um hexcode percorrendo nosso script de bloqueio e transformando ca | |||||||
| * Outras constantes são precedidas por opcodes 0x01 a 0x4e (OP_PUSHDATA, com o número especificando de quantos bytes adicionar); | * Outras constantes são precedidas por opcodes 0x01 a 0x4e (OP_PUSHDATA, com o número especificando de quantos bytes adicionar); | ||||||
|    * Os inteiros são traduzidos em hexadecimal usando a notação de magnitude com sinal _little-endian_. |    * Os inteiros são traduzidos em hexadecimal usando a notação de magnitude com sinal _little-endian_. | ||||||
| 
 | 
 | ||||||
| ### Traduzindo os tipos inteiros | ### Traduzindo os Números Inteiros | ||||||
| 
 | 
 | ||||||
| Os inteiros são a parte mais problemática de uma tradução de script de bloqueio. | Os inteiros são a parte mais problemática de uma tradução de script de bloqueio. | ||||||
| 
 | 
 | ||||||
| @ -48,7 +48,7 @@ $ lehex=$(echo $hex | tac -rs .. | echo "$(tr -d '\n')") | |||||||
| $ echo $lehex | $ echo $lehex | ||||||
| 9f7b2a5c | 9f7b2a5c | ||||||
| ``` | ``` | ||||||
| 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: | 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: | ||||||
| ``` | ``` | ||||||
| $ echo -n $lehex | wc -c | awk '{print $1/2}' | $ echo -n $lehex | wc -c | awk '{print $1/2}' | ||||||
| 4 | 4 | ||||||
| @ -66,7 +66,7 @@ $ echo $neglehex | |||||||
| 
 | 
 | ||||||
| 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... | 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... | ||||||
| 
 | 
 | ||||||
| ## Executando o script de conversão de tipos inteiros | ## Executando o Script de Conversão de Inteiros | ||||||
| 
 | 
 | ||||||
| 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```. | 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```. | ||||||
| 
 | 
 | ||||||
| @ -91,19 +91,19 @@ Length: 4 bytes | |||||||
| Hexcode: 049f7b2adc | Hexcode: 049f7b2adc | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| ## Analisando um P2SH Multisig | ## Analisando um Multisig P2SH | ||||||
| 
 | 
 | ||||||
| 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: | 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: | ||||||
| ``` | ``` | ||||||
| 522102da2f10746e9778dd57bd0276a4f84101c4e0a711f9cfd9f09cde55acbdd2d1912102bfde48be4aa8f4bf76c570e98a8d287f9be5638412ab38dede8e78df82f33fa352ae | 522102da2f10746e9778dd57bd0276a4f84101c4e0a711f9cfd9f09cde55acbdd2d1912102bfde48be4aa8f4bf76c570e98a8d287f9be5638412ab38dede8e78df82f33fa352ae | ||||||
| ``` | ``` | ||||||
| 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). | 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). | ||||||
| 
 | 
 | ||||||
| Todo o Script será dividido da seguinte forma: | Todo o Script será dividido da seguinte forma: | ||||||
| ``` | ``` | ||||||
| 52 / 21 / 02da2f10746e9778dd57bd0276a4f84101c4e0a711f9cfd9f09cde55acbdd2d191 / 21 / 02bfde48be4aa8f4bf76c570e98a8d287f9be5638412ab38dede8e78df82f33fa3 / 52 / ae | 52 / 21 / 02da2f10746e9778dd57bd0276a4f84101c4e0a711f9cfd9f09cde55acbdd2d191 / 21 / 02bfde48be4aa8f4bf76c570e98a8d287f9be5638412ab38dede8e78df82f33fa3 / 52 / ae | ||||||
| ``` | ``` | ||||||
| Aqui está o que as partes individuais significam: | Aqui está o que cada parte individual significa: | ||||||
| 
 | 
 | ||||||
| * 0x52 = OP_2 | * 0x52 = OP_2 | ||||||
| * 0x21 = OP_PUSHDATA 33 bytes (hex: 0x21) | * 0x21 = OP_PUSHDATA 33 bytes (hex: 0x21) | ||||||
| @ -113,7 +113,7 @@ Aqui está o que as partes individuais significam: | |||||||
| * 0x52 = OP_2 | * 0x52 = OP_2 | ||||||
| * 0xae = OP_CHECKMULTISIG | * 0xae = OP_CHECKMULTISIG | ||||||
| 
 | 
 | ||||||
| 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. | 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. | ||||||
| 
 | 
 | ||||||
| Se gostarmos de fazer o trabalho manual com esse tipo de tradução no futuro, podemos usar o ```decodescript bitcoin-cli```: | Se gostarmos de fazer o trabalho manual com esse tipo de tradução no futuro, podemos usar o ```decodescript bitcoin-cli```: | ||||||
| ``` | ``` | ||||||
| @ -141,7 +141,7 @@ $ bitcoin-cli -named decodescript hexstring=522102da2f10746e9778dd57bd0276a4f841 | |||||||
| ``` | ``` | ||||||
| É especialmente útil para verificar nosso trabalho durante a serialização. | É especialmente útil para verificar nosso trabalho durante a serialização. | ||||||
| 
 | 
 | ||||||
| ## Serializando um script de bloqueio da maneira mais fácil | ## Serializando um Script de Bloqueio da Maneira Fácil | ||||||
| 
 | 
 | ||||||
| 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: | 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: | ||||||
| ``` | ``` | ||||||
| @ -154,7 +154,7 @@ Isso é muito mais fácil do que fazer tudo na mão! | |||||||
| 
 | 
 | ||||||
| Considere também o compilador em Python, [Transaction Script Compiler](https://github.com/Kefkius/txsc), que traduz de trás pra frente também. | Considere também o compilador em Python, [Transaction Script Compiler](https://github.com/Kefkius/txsc), que traduz de trás pra frente também. | ||||||
| 
 | 
 | ||||||
| ## Fazendo o hash de um script serializado | ## Fazendo o Hash de um Script Serializado | ||||||
| 
 | 
 | ||||||
| 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. | 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. | ||||||
| 
 | 
 | ||||||
| @ -165,7 +165,7 @@ $ echo -n $redeemScript | xxd -r -p | openssl dgst -sha256 -binary | openssl dgs | |||||||
| (stdin)= a5d106eb8ee51b23cf60d8bd98bc285695f233f3 | (stdin)= a5d106eb8ee51b23cf60d8bd98bc285695f233f3 | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| ## Criando uma transação P2SH | ## Criando uma Transação P2SH | ||||||
| 
 | 
 | ||||||
| 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```. | 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```. | ||||||
| 
 | 
 | ||||||
| @ -175,8 +175,8 @@ Podemos observar que o ```hex scriptPubKey``` para a transação P2SH Script ir | |||||||
| 
 | 
 | ||||||
| ## Resumo: Construindo a Estrutura de P2SH | ## Resumo: Construindo a Estrutura de P2SH | ||||||
| 
 | 
 | ||||||
| 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. | 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. | ||||||
| 
 | 
 | ||||||
| ## O que vem depois? | ## O Que Vem Depois? | ||||||
| 
 | 
 | ||||||
| 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). | 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). | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user