Skip to content

Commit 1baf063

Browse files
authored
Merge pull request #302 from KoreaComK/chapter-09
Chapter 09 Translated by @KoreaComK reviewed by @namcios
2 parents ee82235 + 26a6fb1 commit 1baf063

6 files changed

+1011
-0
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# Capítulo 9: Apresentando Scripts no Bitcoin
2+
3+
Até o momento, temos interagido com o Bitcoin em um nível relativamente alto de abstração. O programa ```bitcoin-cli``` oferece acesso a uma variedade de comandos RPC que suportam a criação e controle de transações brutas de Bitcoin que incluem saldos, dados, timelocks e multisigs.
4+
5+
No entanto, o Bitcoin oferece muito mais complexidade do que isso. O software oferece uma linguagem de script simples que pode ser usada para criar condições de resgate ainda mais complexas. Se os multisigs e os timelocks fornecerem as bases para os contratos inteligentes, o script do Bitcoin constrói os alicerces. É o próximo passo para capacitar o Bitcoin.
6+
7+
## Objetivos deste capítulo
8+
9+
Depois de trabalhar neste capítulo, um desenvolvedor será capaz de:
10+
11+
* Projetar um script no Bitcoin;
12+
* Aplicar um script no Bitcoin.
13+
14+
Os objetivos secundários do capítulo incluem a capacidade de:
15+
16+
* Compreender o propósito dos scripts no Bitcoin;
17+
* Entender os script P2PKH;
18+
* Entender como o P2WPKH funciona com os scripts;
19+
* Compreender as necessidades dos testes dos scripts do bitcoin.
20+
21+
## Tabela de Conteúdo
22+
23+
* [Seção Um: Compreendendo o Alicerce das Transações](09_1_PriveStanding_the_foundation_of_transactions.md)
24+
* [Seção Dois: Executando um Script no Bitcoin](09_2_running_a_bitcoin_script.md)
25+
* [Seção Três: Testando um Script no Bitcoin](09_3_testing_a_bitcoin_script.md)
26+
* [Seção Quatro: Programando um P2PKH](09_4_scripting_a_p2pkh.md)
27+
* [Seção Cinco: Programando um P2WPKH](09_5_scripting_a_p2wpkh.md)
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
# 9.1: Compreendendo a Base de Transações
2+
3+
A base do Bitcoin é a capacidade de proteger transações, algo que é feito com uma linguagem de programação simples.
4+
5+
## Conhecendo as Partes do Quebra-Cabeça Criptográfico
6+
7+
Conforme descrito no [Capítulo 1](01_0_INTRODUCING_BITCOIN.MD), os saldos em cada transação Bitcoin estão travados com um quebra-cabeça criptográfico. Para sermos mais precisos, dizemos que o Bitcoin é composto de "uma sequência de transações atômicas". Observamos que: "Cada transação é autenticada por um remetente com a solução para um quebra-cabeça criptográfico anterior que foi armazenado como um script. A nova transação é bloqueada para o destinatário com um novo quebra-cabeça criptográfico que também é armazenado como um script". Esses scripts, que bloqueiam e desbloqueiam as transações, são escritos usando o Bitcoin Script.
8+
9+
> :book: ***O que é o Bitcoin Script?*** O Bitcoin Script é uma linguagem baseada em pilhas (ou _stacks_), similar à linguagem de programação Forth que propositadamente evita loops, o que significa que ela não é Turing-completa. É composta de opcodes individuais. Cada transação no Bitcoin é bloqueada com um script do Bitcoin. Quando a transação de bloqueio para um UTXO é executada com as entradas corretas, esse UTXO pode então ser gasto.
10+
11+
O fato de que as transações estão bloqueadas com scripts significa que podem ser bloqueadas de várias maneiras diferentes, exigindo uma variedade de chaves diferentes. Na verdade, encontramos vários mecanismos de travamento diferentes até o momento, cada um dos quais usa diferentes opcodes:
12+
13+
* OP_CHECKSIG, que verifica uma chave pública contra uma assinatura, é a base do endereço P2PKH clássico, como será totalmente detalhado na seção [§9.4: Programando um P2PKH](09_4_Scripting_a_P2PKH.md);
14+
* OP_CHECKMULTISIG, faz a mesma coisa com os multisigs, como será totalmente detalhado na seção [§10.4: Programando um Multisig](10_4_Scripting_a_Multisig.md);
15+
* OP_CHECKLOCKTIMEVERIFY e OP_SEQUENCEVERIFY formam a base dos timelocks mais complexos, como será totalmente detalhado nas seções [§11.2: Usando CLTV em Scripts](11_2_Using_CLTV_in_Scripts) e [§11.3: Usando CSV em Scripts](11_3_Using_CSV_in_Scripts.md).
16+
* OP_RETURN é a marca de uma transação não gasta, e é por isso que é usado para transportar dados, como falamos na seção [§8.2: Enviando uma Transação com Dados](08_2_sending_a_transaction_with_data.md).
17+
18+
## Accessando Scripts em Nossas Transações
19+
20+
Podemos não perceber, mas já vimos esses scripts de bloqueio e desbloqueio como parte das transações brutas que fizemos. A melhor maneira de analisar esses scripts com mais profundidade é, portanto, criar uma transação bruta e examiná-la.
21+
22+
### Criando uma Transação de Teste
23+
24+
Para examinar scripts reais de desbloqueio e bloqueio, vamos criar uma transação bruta rapidamente, pegando um UTXO legado não gasto e reenviando-o a um endereço de troco legado, deixando uma parte para as taxas de transação:
25+
```
26+
$ utxo_txid=$(bitcoin-cli listunspent | jq -r '.[1] | .txid')
27+
$ utxo_vout=$(bitcoin-cli listunspent | jq -r '.[1] | .vout')
28+
$ recipient=$(bitcoin-cli -named getrawchangeaddress address_type=legacy)
29+
$ rawtxhex=$(bitcoin-cli -named createrawtransaction inputs='''[ { "txid": "'$utxo_txid'", "vout": '$utxo_vout' } ]''' outputs='''{ "'$recipient'": 0.0009 }''')
30+
$ signedtx=$(bitcoin-cli -named signrawtransactionwithwallet hexstring=$rawtxhex | jq -r '.hex')
31+
```
32+
Não precisamos enviá-la. O objetivo é simplesmente produzir uma transação para que possamos examiná-la.
33+
34+
>**NOTA:** Por que usar endereços legados? Porque seus scripts são mais significativos. No entanto, também ofereceremos um exemplo de um endereço nativo Segwit P2WPKH na seção [§9.5](09_5_Scripting_a_P2WPKH.md).
35+
36+
### Examinando Nossa Transação de Teste
37+
38+
Agora podemos examinar nossa transação profundamente usando ```decoderawtransaction``` no ```$signedtx```:
39+
```
40+
$ bitcoin-cli -named decoderawtransaction hexstring=$signedtx
41+
{
42+
"txid": "34151dac704d94a269cd33f80be34c122152edc9bfbb9323852966bf0ce937ed",
43+
"hash": "34151dac704d94a269cd33f80be34c122152edc9bfbb9323852966bf0ce937ed",
44+
"version": 2,
45+
"size": 191,
46+
"vsize": 191,
47+
"weight": 764,
48+
"locktime": 0,
49+
"vin": [
50+
{
51+
"txid": "bb4362dec15e67d366088f5493c789f22fb4a604e767dae1f6a631687e2784aa",
52+
"vout": 0,
53+
"scriptSig": {
54+
"asm": "304402201cc39005b076cb06534cd084fcc522e7bf937c4c9654c1c9dfba68b92cbab7d1022066f273178febc7a37568e2e9f4dec980a2e9a95441abe838c7ef64c39d85849c[ALL] 0315a0aeb37634a71ede72d903acae4c6efa77f3423dcbcd6de3e13d9fd989438b",
55+
"hex": "47304402201cc39005b076cb06534cd084fcc522e7bf937c4c9654c1c9dfba68b92cbab7d1022066f273178febc7a37568e2e9f4dec980a2e9a95441abe838c7ef64c39d85849c01210315a0aeb37634a71ede72d903acae4c6efa77f3423dcbcd6de3e13d9fd989438b"
56+
},
57+
"sequence": 4294967295
58+
}
59+
],
60+
"vout": [
61+
{
62+
"value": 0.00090000,
63+
"n": 0,
64+
"scriptPubKey": {
65+
"asm": "OP_DUP OP_HASH160 06b5c6ba5330cdf738a2ce91152bfd0e71f9ec39 OP_EQUALVERIFY OP_CHECKSIG",
66+
"hex": "76a91406b5c6ba5330cdf738a2ce91152bfd0e71f9ec3988ac",
67+
"reqSigs": 1,
68+
"type": "pubkeyhash",
69+
"addresses": [
70+
"mg8S7F1gY3ivV9M9GrWwe6ziWvK2MFquCf"
71+
]
72+
}
73+
}
74+
]
75+
}
76+
77+
```
78+
Os dois scripts são encontrados nas duas partes diferentes da transação.
79+
80+
O ```scriptSig``` está localizado no ```vin```. Este é o script de _desbloqueio_. É o que é executado para acessar o UTXO que está sendo usado para financiar esta transação. Haverá um ```scriptSig``` por UTXO em cada transação.
81+
82+
O ```scriptpubkey``` está localizado no ```vout```. Este é o script de _bloqueio_. É o que bloqueia a nova saída da transação. Haverá um ```scriptPubKey``` por cada saída em cada transação.
83+
84+
> :book: ***Como o scriptSig e o scriptPubKey interagem?*** O ```scriptSig``` de uma transação desbloqueia o UTXO anterior. A saída desta nova transação será bloqueada com um ```scriptPubKey```, que pode, por sua vez, ser desbloqueado pelo ```scriptSig``` da transação que reutiliza aquele UTXO.
85+
86+
### Lendo os Scripts na Transação
87+
88+
Se olharmos para os dois scripts veremos que cada um possui duas representações diferentes: o ```hex``` é o que realmente é armazenado, mas a linguagem assembly (```asm```) mais legível pode meio que mostrar o que está acontecendo.
89+
90+
Vamos dar uma olhada na ```asm``` do script de desbloqueio para podermos ver em primeira mão como é programar no Bitcoin:
91+
```
92+
04402201cc39005b076cb06534cd084fcc522e7bf937c4c9654c1c9dfba68b92cbab7d1022066f273178febc7a37568e2e9f4dec980a2e9a95441abe838c7ef64c39d85849c[ALL] 0315a0aeb37634a71ede72d903acae4c6efa77f3423dcbcd6de3e13d9fd989438b
93+
```
94+
Como acontece, essa bagunça de números é uma assinatura de chave privada, seguida pela chave pública associada. Ou pelo menos isso é o esperado, porque é isso que é necessário para desbloquear o UTXO P2PKH que esta transação está usando.
95+
96+
Lendo o script de bloqueio vemos que é algo muito mais óbvio:
97+
```
98+
OP_DUP OP_HASH160 06b5c6ba5330cdf738a2ce91152bfd0e71f9ec39 OP_EQUALVERIFY OP_CHECKSIG
99+
```
100+
Esse é o método padrão em Bitcoin Script para bloquear uma transação P2PKH.
101+
102+
A seção [§9.4](09_4_Scripting_a_P2PKH.md) explicará como esses dois scripts andam juntos, mas primeiro precisamos saber como os scripts são avaliados no Bitcoin.
103+
104+
## Examinando um Tipo Diferente de Transação
105+
106+
Antes de deixarmos esta base para trás, vamos olhar para um tipo diferente de script de bloqueio. Aqui está o ```scriptPubKey``` da transação multisig que criamos na seção [§6.1: Enviando uma Transação com Multisig](06_1_sending_a_transaction_to_a_multisig.md).
107+
```
108+
"scriptPubKey": {
109+
"asm": "OP_HASH160 a5d106eb8ee51b23cf60d8bd98bc285695f233f3 OP_EQUAL",
110+
"hex": "a914a5d106eb8ee51b23cf60d8bd98bc285695f233f387",
111+
"reqSigs": 1,
112+
"type": "scripthash",
113+
"addresses": [
114+
"2N8MytPW2ih27LctLjn6LfLFZZb1PFSsqBr"
115+
]
116+
}
117+
```
118+
119+
Vamos comparar isso com o ```ScriptPubkey``` da nossa nova transação P2PKH:
120+
```
121+
"scriptPubKey": {
122+
"asm": "OP_DUP OP_HASH160 06b5c6ba5330cdf738a2ce91152bfd0e71f9ec39 OP_EQUALVERIFY OP_CHECKSIG",
123+
"hex": "76a91406b5c6ba5330cdf738a2ce91152bfd0e71f9ec3988ac",
124+
"reqSigs": 1,
125+
"type": "pubkeyhash",
126+
"addresses": [
127+
"mg8S7F1gY3ivV9M9GrWwe6ziWvK2MFquCf"
128+
]
129+
}
130+
```
131+
132+
Essas duas transações são _definitivamente_ trancadas de maneiras diferentes. O Bitcoin reconhece a primeira como sendo ```scripthash``` (P2SH) e a segunda como sendo ```pubkeyhash``` (P2PKH), mas também devemos ser capazes de ver a diferença nos diferentes códigos ```asm```: ```OP_HASH160 a5d106eb8ee51b23cf60d8bd98bc285695f233f3 OP_EQUAL``` versus ```OP_DUP OP_HASH160 06b5c6ba5330cdf738a2ce91152bfd0e71f9ec39 Op_equalverify op_checksig```. Este é o poder da programação: conseguimos, de maneira bem simples, produzir alguns dos tipos drasticamente diferentes de transações que aprendemos nos capítulos anteriores.
133+
134+
## Resumo: Compreendendo a Base de Transações
135+
136+
Cada transação do bitcoin inclui pelo menos um script de desbloqueio (```scriptSig```), que resolve um quebra-cabeça criptográfico anterior, e pelo menos um script de bloqueio (```scriptPubKey```), que cria um novo quebra-cabeça criptográfico. Há um ```scriptSig``` para cada entrada e um ```scriptPubKey``` para cada saída. Cada um desses scripts é escrito usando o Bitcoin Script, uma linguagem semelhante à linguagem de programação Forth que fortalece ainda mais o Bitcoin.
137+
138+
> :fire: ***Qual é o poder dos scripts?*** Os scripts desbloqueiam todo o poder dos contratos inteligentes. Com os opcodes apropriados, podemos tomar decisões muito precisas sobre quem pode resgatar os fundos, quando podem ser resgatados e como eles podem resgatá-los. Regras mais complexas para saldos corporativos, endereços de parceria, gastos com proxy e outras metodologias também podem ser codificados dentro de um script. Os scripts também conseguem capacitar serviços mais complexos no Bitcoin, como a Lightning e sidechains.
139+
140+
## O Que Vem Depois?
141+
142+
Vamos continuar "Apresentando os Scripts no Bitcoin" na seção [§9.2: Executando um Script no Bitcoin](09_2_Running_a_Bitcoin_Script.md).
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
# 9.2: Executando um Script no Bitcoin
2+
3+
Os scripts de Bitcoin podem não parecer tão intuitivos no começo, mas sua execução é bastante simples usando a notação polonesa reversa e uma pilha (_stack_).
4+
5+
## Compreendendo a Linguagem de Programação
6+
7+
Um script Bitcoin possui três partes: uma linha de entrada; uma pilha para o armazenamento; e comandos específicos para execução.
8+
9+
### Compreendendo a Ordem
10+
11+
Os scripts do Bitcoin são executados da esquerda para a direita. Para nós é fácil, porque é a mesma ordem na qual lemos. No entanto, pode na verdade ser o elemento menos intuitivo do Bitcoin Script, porque significa que as funções não têm a aparência que esperaríamos. Ao invés disso, _os operandos vêm antes do operador._
12+
13+
Por exemplo, se estivéssemos somando "1" e "2", nosso script do Bitcoin ficaria ```1 2 OP_ADD```, e _não_"1 + 2". Como sabemos que o operador OP_ADD recebe duas entradas, sabemos que as duas entradas anteriores são os operandos.
14+
15+
> :warning: **ATENÇÃO:** Tecnicamente, tudo em Bitcoin Script é um opcode, portanto, seria mais apropriado registrar o exemplo acima como ```OP_1 OP_2 OP_ADD```. Em nossos exemplos, não nos preocupamos sobre como as constantes serão avaliadas, pois esse é um tópico de tradução, como é explicado em [§10.2: Construindo a Estrutura do P2SH](10_2_Building_the_Structure_of_P2SH.md). Alguns escritores preferem também retirar o prefixo "OP" de todos os operadores, mas nós optamos por não fazê-lo.
16+
17+
### Compreendendo a Pilha
18+
19+
Na verdade, não é correto dizer que um operador se aplica às entradas anteriores. Na verdade, um operador se aplica às entradas principais na pilha do Bitcoin.
20+
21+
> :book: ***O que é uma pilha?*** Uma pilha é uma estrutura de dados LIFO (last in, first out, ou no português, primeiro a entrar, último a sair). Possui duas funções de acesso: push e pop. Empurrar (push) coloca um novo objeto no topo da pilha, empurrando para baixo tudo que está abaixo dele. Retirar (pop) remove o objeto superior da pilha.
22+
23+
Sempre que o script do Bitcoin encontrar uma constante, ele a coloca na pilha. Portanto, o exemplo acima de ```1 2 OP_ADD``` seria realmente parecido com o que foi processado:
24+
```
25+
Script: 1 2 OP_ADD
26+
Stack: [ ]
27+
28+
Script: 2 OP_ADD
29+
Stack: [ 1 ]
30+
31+
Script: OP_ADD
32+
Stack: [ 1 2 ]
33+
```
34+
_Observe que, neste e nos exemplos seguintes, o topo da pilha está à direita e a parte inferior à esquerda._
35+
36+
### Compreendendo os Opcodes
37+
38+
Quando um script do Bitcoin encontra um operador, ele o avalia. Cada operador retira zero ou mais elementos da pilha como entradas, geralmente um ou dois. Em seguida, ele os processa de uma maneira específica antes de colocar zero ou mais elementos de volta na pilha, geralmente um ou dois.
39+
40+
> :book: ***O que é um Opcode?*** O Opcode significa "código de operação" (no inglês, "_operation code_"). É normalmente associado a código de linguagem de máquina e é uma função simples (ou "operador").
41+
42+
OP_ADD retira dois itens da pilha (no nosso caso: 2 depois 1), adiciona-os e coloca o resultado de volta na pilha (no exemplo: 3).
43+
```
44+
Script:
45+
Running: 1 2 OP_ADD
46+
Stack: [ 3 ]
47+
```
48+
49+
## Construindo Complexidade
50+
51+
Scripts mais complexos são criados executando mais comandos em ordem. Eles precisam ser avaliados cuidadosamente da esquerda para a direita, para que possamos entender o estado da pilha conforme cada novo comando é executado. Ele mudará constantemente, como resultado de operadores anteriores:
52+
```
53+
Script: 3 2 OP_ADD 4 OP_SUB
54+
Stack: [ ]
55+
56+
Script: 2 OP_ADD 4 OP_SUB
57+
Stack: [ 3 ]
58+
59+
Script: OP_ADD 4 OP_SUB
60+
Stack: [ 3 2 ]
61+
62+
Script: 4 OP_SUB
63+
Running: 3 2 OP_ADD
64+
Stack: [ 5 ]
65+
66+
Script: OP_SUB
67+
Stack: [ 5 4 ]
68+
69+
Script:
70+
Running: 5 4 OP_SUB
71+
Stack: [ 1 ]
72+
```
73+
74+
## Compreendendo o Uso do Bitcoin Script
75+
76+
É basicamente programar no Bitcoin ... além de algumas complexidades de como essa linguagem de programação interage com o próprio Bitcoin.
77+
78+
### Compreendendo scriptSig e scriptPubKey
79+
80+
Como vimos anteriormente, cada entrada de uma transação no Bitcoin contém um ```scriptSig``` que é usado para desbloquear o ```scriptPubKey``` para o UTXO associado. Eles são _efetivamente_ concatenados, o que significa que o ```scriptSig``` e o ```scriptPubKey``` são executados juntos, nessa ordem.
81+
82+
Então, presuma que um UTXO foi bloqueado com um ```scriptPubKey``` que leia ```OP_ADD 99 OP_EQUAL```, exigindo como entrada dois números que somam noventa e nove, e presuma que o ```scriptSig``` de ```1 98``` foi executado para desbloqueá-lo. Os dois scripts seriam efetivamente executados em ordem como ```1 98 OP_ADD 99 OP_EQUAL```.
83+
84+
Avaliando o resultado:
85+
```
86+
Script: 1 98 OP_ADD 99 OP_EQUAL
87+
Stack: []
88+
89+
Script: 98 OP_ADD 99 OP_EQUAL
90+
Stack: [ 1 ]
91+
92+
Script: OP_ADD 99 OP_EQUAL
93+
Stack: [ 1 98 ]
94+
95+
Script: 99 OP_EQUAL
96+
Running: 1 98 OP_ADD
97+
Stack: [ 99 ]
98+
99+
Script: OP_EQUAL
100+
Stack: [ 99 99 ]
101+
102+
Script:
103+
Running: 99 99 OP_EQUAL
104+
Stack: [ True ]
105+
```
106+
Esta abstração não é muito precisa: por razões de segurança, o ```scriptSig``` é executado, então o conteúdo da pilha é transferido para o ```scriptPubKey``` para ser executado, mas é precisa o suficiente para entender como a chave do ```scriptSig``` se encaixa no cadeado de ```scriptPubKey```.
107+
108+
> :warning: **AVISO:** O exemplo acima é um tipo de transação não-padrão. Na verdade, não seria aceito por nós que executamos o Bitcoin Core com as configurações padrões. Na seção [§10.1: Compreendendo a Base do P2SH](10_1_Understanding_the_Foundation_of_P2SH.md) iremos discutir como realmente _poderíamos_ executar um Script Bitcoin como este, usando o poder do P2SH.
109+
110+
### Obtendo os Resultados
111+
112+
O Bitcoin irá verificar uma transação e permitir que o UTXO possa ser gasto novamente se dois critérios forem atendidos ao executar o ```scriptSig``` e o ```scriptPubKey```:
113+
114+
1. A execução não foi marcada como inválida em nenhum ponto, por exemplo, com um OP_VERIFY com falha ou com o uso de um opcode desativado;
115+
2. O item no topo da pilha no final da execução é verdadeiro (diferente de zero).
116+
117+
No exemplo acima, a transação seria bem-sucedida porque a pilha tem um ```True``` no final. Mas, seria igualmente permitido terminar com uma pilha completa e o número ```42``` no topo (os leitores do Guia do Mochileiro das Galáxias pegaram a referência).
118+
119+
## Resumo: Executando um Script no Bitcoin
120+
121+
Para processar um script no Bitcoin, um ```scriptSig``` é executado seguido pelo ```scriptPubKey``` que ele está desbloqueando. Esses comandos são executados em ordem, da esquerda para a direita, com constantes sendo colocadas em uma pilha e os operadores retirando elementos dessa pilha e, em seguida, enviando os resultados de volta para ela. Se o script não parar no meio e se o item no topo da pilha no final for diferente de zero, então o UTXO será desbloqueado.
122+
123+
## O Que Vem Depois?
124+
125+
Vamos continuar "Apresentando Scripts no Bitcoin" na seção [§9.3: Testando um Script no Bitcoin](09_3_Testing_a_Bitcoin_Script.md).

0 commit comments

Comments
 (0)