You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: pt/16_0_Talking_to_Bitcoind.md
+5-6Lines changed: 5 additions & 6 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,5 +1,4 @@
1
-
2
-
# Capítulo 15: Conversando com Bitcoind usando C
1
+
# Capítulo 16: Conversando com Bitcoind com C
3
2
4
3
Enquanto trabalhamos com Bitcoin Scripts, atingimos os limites do que era possível com o `bitcoin-cli`: Atualmente, ele não pode ser usado para gerar transações contendo scripts incomuns. Os scripts shell também não são bons para algumas coisas, como criar programas de escuta que estão constantemente em polling. Felizmente, existem outras maneiras de acessar a rede Bitcoin: Através de APIs programáveis.
5
4
@@ -19,9 +18,9 @@ Os objetivos secundários do capítulo incluem a capacidade de:
19
18
* Compreender as capacidades do ZMQ;
20
19
* Entender como usar uma biblioteca ZMQ.
21
20
22
-
## Tabela de conteúdo
21
+
## Tabela de Conteúdo
23
22
24
-
*[Seção 1: Acessando o Bitcoind usando C com Bibliotecas RPC](15_1_Accessing_Bitcoind_with_C.md)
25
-
*[Seção 2: Programando o Bitcoind usando C com Bibliotecas RPC](15_2_Programming_Bitcoind_with_C.md)
26
-
*[Seção 3: Recebendo notificações usando C com bibliotecas ZMQ](15_3_Receiving_Bitcoind_Notifications_with_C.md)
23
+
*[Seção 1: Acessando o Bitcoind em C com Bibliotecas RPC](16_1_Accessing_Bitcoind_with_C.md)
24
+
*[Seção 2: Programando o Bitcoind em C com Bibliotecas RPC](16_2_Programming_Bitcoind_with_C.md)
25
+
*[Seção 3: Recebendo Notificações em C com Bibliotecas ZMQ](16_3_Receiving_Bitcoind_Notifications_with_C.md)
Copy file name to clipboardExpand all lines: pt/16_1_Accessing_Bitcoind_with_C.md
+14-15Lines changed: 14 additions & 15 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,5 +1,4 @@
1
-
2
-
# 15.1: Acessando o Bitcoind usando C com bibliotecas RPC
1
+
# 16.1: Acessando o Bitcoind em C com Bibliotecas RPC
3
2
4
3
> :information_source:**NOTA:** Esta seção foi adicionada recentemente ao curso e é um esboço que ainda pode estar aguardando revisão. Portanto, leitor, tenha cuidado.
> :warning:**ATENÇÃO** Uma alteração no RPC "signrawtransaction" causou uma assinatura com ``libbitcoinrpc`` para o segfault no Bitcoin 0.17 ou superior. O [Pull Request foi submetido](https://github.com/gitmarek/libbitcoinrpc/pull/1/commits) para resolver o problema, mas se ainda não tiver sido feito o merge, podemos simplesmente fazer uma simples mudança no código-fonte para ``src/bitcoinrpc_method.c`` antes de compilarmos.
31
30
32
-
### Compilando o libbitcoinrpc.
31
+
### Compilando o libbitcoinrpc
33
32
34
33
Antes de compilarmos e instalarmos o pacote, provavelmente precisaremos ajustar nosso ``$PATH``, para que possamos acessar o ``/sbin/ldconfig``:
``libbitcoinrpc`` tem métodos simples e bem estruturados para conectar-se ao nosso `bitcoind`, executando chamadas RPC e decodificando a resposta.
97
96
@@ -107,7 +106,7 @@ Precisaremos também vincular as bibliotecas apropriadas sempre que possamos com
107
106
$ cc yourcode.c -lbitcoinrpc -ljansson -o yourcode
108
107
```
109
108
110
-
## Construindo a conexão
109
+
## Construindo a Conexão
111
110
112
111
Para construir a conexão com o servidor ``bitcoind`` é necessário alguns simples passos.
113
112
@@ -154,7 +153,7 @@ Mais tarde, quando tivermos feito com a conexão de ``bitcoind``, poderemos fech
154
153
bitcoinrpc_global_cleanup();
155
154
```
156
155
157
-
### Testando o código de teste
156
+
### Testando o Código de Teste
158
157
159
158
O código de teste pode ser encontrado [no diretório src com o nome 15_1_testbitcoin.c](src/15_1_testbitcoin.c). Vamos fazer o download para a nossa máquina TestNet e depois inserir a senha correta do RPC (e alterar o usuário RPC se não tivermos criado o servidor com StandUp).
160
159
@@ -167,7 +166,7 @@ Successfully connected to server!
167
166
168
167
> :warning:**ATENÇÃO:** Se esquecermos de inserir a senha RPC nesta ou em qualquer outro código que possuem dependências do RPC, receberemos um misterioso ``ERROR CODE 5``.
169
168
170
-
## Fazendo uma chamada ao RPC
169
+
## Fazendo uma Chamada ao RPC
171
170
172
171
Para usarmos um método RPC usando ``libbitcoinrpc``, devemos inicializar uma variável do tipo ``bitcoinrpc_method_t``. Podemos fazer com o valor apropriado para o método que desejamos utilizar, que estão todos listados na [Referências do BitcoinRPC](https://github.com/gitmarek/libbitcoinrpc/blob/master/doc/reference.md).
173
172
```c
@@ -188,7 +187,7 @@ Vamos usar a variável ``rpc_client`` que aprendemos no teste anterior e vamos a
Com certeza iremos querer saber o que a RPC retornou. Para fazermos isso, vamos recuperar a saída da nossa chamada como sendo um objeto JSON com ``bitcoinrpc_resp_get`` e vamos salvá-la em um objeto padrão ``jansson``, do tipo ``json_t``:
> :warning: **ATENÇÃO:** É extremamente fácil ocasionar erros de segmentação no código C quando estivermos trabalhando com os objetos ``jansson`` caso fiquemos confusos com que tipo de objeto estamos recuperando. Por isso, precisamos fazer isso com cuidado usando o ``bitcoin-cli help`` para saber o que devemos esperar, e se tivermos uma falha de segmentação, primeiro precisamos analisar se nossas funções de recuperação JSON estão corretas.
224
223
225
-
### Testando o código de informação
224
+
### Testando o Código de Informação
226
225
227
226
Vamos recuperar o código de teste que está no [diretório src](15_1_GetMiningInfo.c).
228
227
```
@@ -253,11 +252,11 @@ Just the Result: {
253
252
Block Count: 1804406
254
253
```
255
254
256
-
## Fazendo uma chamada RPC usando argumentos
255
+
## Fazendo uma Chamada RPC Usando Argumentos
257
256
258
257
Mas e se a sua chamada RPC tiver argumentos?
259
258
260
-
### Criando uma matriz JSON
259
+
### Criando uma Matriz JSON
261
260
262
261
Para enviar parâmetros para a nossa chamada RPC usando ``libbitcoinrpc`` teremos que envolvê-los em uma matriz json. Como uma matriz é apenas uma simples listagem de valores, tudo o que precisamos fazer é codificar os parâmetros como elementos ordenados na matriz.
263
262
@@ -275,20 +274,20 @@ Observe que existem duas variantes para o comando de anexação: ``json_array_ap
275
274
276
275
Esta metodologia simples ``json_array_apend_new`` servirá para a maioria dos comandos RPC com parâmetros, mas alguns dos comandos RPC exigem entradas mais complexas. Nesses casos, precisaremos criar objetos JSON ou arrays em JSON, que anexaremos ao parâmetros de array como de costume. A próxima seção contém um exemplo de como fazer isso usando o ``CrayAwTransaction``, que contém uma matriz JSON de objetos JSON para as entradas, um objeto JSON para as saídas e o parâmetro ``locktime``.
277
276
278
-
### Atribuindo os parâmetros
277
+
### Atribuindo os Parâmetros
279
278
280
279
Quando criamos o parâmetro array no JSON, simplesmente o atribuímos depois de inicializar o método RPC, da seguinte maneira:
281
280
``` c
282
281
bitcoinrpc_method_set_params(rpc_method, params)
283
282
```
284
283
Esta seção não inclui uma amostra abrangente dessa metodologia mais complexa, mas vamos vê-la em ação várias vezes no nosso primeiro programa C mais abrangente usando o RPC, na próxima seção.
285
284
286
-
## Resumo do capítulo Acessando o Bitcoind usando C com bibliotecas RPC
285
+
## Resumo: Acessando o Bitcoind em C com Bibliotecas RPC
287
286
288
287
Ao vincular às bibliotecas ``BitcoinRPC`` do RPC e as bibliotecas ``jansson`` do JSON, podemos acessar facilmente o ``bitcoind`` usando chamadas RPC de uma biblioteca C. Para fazer isso, criamos uma conexão RPC, que faz as chamadas individuais de RPC, algumas delas passando alguns parâmetros. O ``jansson`` permite decodificar as respostas no formato JSON. A próxima seção demonstrará como isso pode ser usado para um programa de uso do mundo real.
289
288
290
-
*:fire:***Qual é o poder de C?*** O C permite que façamos o próximo passo muito além do script shell, permitindo a criação de programas mais complexos e robustos.
289
+
*:fire:***Qual é o poder do C?*** O C permite que façamos o próximo passo muito além do script shell, permitindo a criação de programas mais complexos e robustos.
291
290
292
291
## O Que Vem Depois?
293
292
294
-
Vamos falar mais um pouco no "Conversando com o Bitcoind usando C" no capítulo [15.2: Programando o Bitcoind usando C com bibliotecas RPC](15_2_Programming_bitcoind_with_c.md).
293
+
Vamos falar mais um pouco no "Conversando com o Bitcoind com C" no capítulo [16.2: Programando o Bitcoind em C com Bibliotecas RPC](16_2_Programming_bitcoind_with_c.md).
Copy file name to clipboardExpand all lines: pt/16_2_Programming_Bitcoind_with_C.md
+20-21Lines changed: 20 additions & 21 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,11 +1,10 @@
1
-
2
-
# 15.2: Programando o Bitcoind usando C com bibliotecas RPC
1
+
# 16.2: Programando o Bitcoind usando C com bibliotecas RPC
3
2
4
3
> :information_source:**NOTA:** Esta seção foi adicionada recentemente ao curso e é um rascunho que pode estar aguardando revisão. Portanto, leitor, tenha cuidado.
5
4
6
-
A sessão[§15.1](15_1_Accessing_Bitcoind_with_C.md) apresentou a metodologia para a criação de programas C usando bibliotecas RPC e JSON. Agora vamos mostrar o potencial dessas bibliotecas C fazendo algumas coisas um pouco mais avançadas usando o programa real do Bitcoin.
5
+
A seção[§16.1](16_1_Accessing_Bitcoind_with_C.md) apresentou a metodologia para a criação de programas C usando bibliotecas RPC e JSON. Agora vamos mostrar o potencial dessas bibliotecas C fazendo algumas coisas um pouco mais avançadas usando o programa real do Bitcoin.
7
6
8
-
## Planejando o código
7
+
## Planejando o Código
9
8
10
9
Esta seção irá criar uma versão simples do ``sendtoaddress``, permitindo ao usuário enviar as moedas para um endereço, desde que tenha um UTXO grande o suficiente para isso. Aqui está o que precisamos fazer:
11
10
@@ -18,7 +17,7 @@ Esta seção irá criar uma versão simples do ``sendtoaddress``, permitindo ao
18
17
7. Assinar a transação;
19
18
8. Enviar a transação.
20
19
21
-
### Planejando para o futuro
20
+
### Planejando para o Futuro
22
21
23
22
Como este é o nosso primeiro programa C funcional, vamos mantê-lo simples (ou seja, vamos usar a filosofia, _Keep it Simple_ ou também conhecida como KISS). Se estivéssemos produzindo um programa para estar em produção, desejaríamos pelo menos os seguintes passos:
24
23
@@ -31,11 +30,11 @@ Como este é o nosso primeiro programa C funcional, vamos mantê-lo simples (ou
31
30
32
31
Se deseja continuar a expandir este exemplo, seria ótimo começar a lidar com as inadequações do programa.
33
32
34
-
## Escrevendo o sistema de transação
33
+
## Escrevendo o Sistema de Transação
35
34
36
35
Agora estamos prontos para realizar o passo a passo do nosso plano
37
36
38
-
### Etapa 1: Solicitando um endereço e uma quantia
37
+
### Etapa 1: Solicitando um Endereço e uma Quantia
39
38
40
39
Inserir as informações é bem simples se usarmos os argumentos na linha de comando:
41
40
```c
@@ -54,7 +53,7 @@ printf("Sending %4.8f BTC to %s\n",tx_amount,tx_recipient);
54
53
55
54
> :aviso: **ATENÇÃO:** Um programa real precisaria de uma higienização muito melhor dessas variáveis.
56
55
57
-
### Etapa 2: Definindo uma taxa arbitrária
56
+
### Etapa 2: Definindo uma Taxa Arbitrária
58
57
59
58
Este exemplo colocamos uma taxa arbitrária de 0.0005 BTC para garantir que as transações do teste sejam processadas rapidamente:
> :warning:**ATENÇÃO:** Um programa real calcularia uma taxa que minimizasse o custo, garantindo que a velocidade fosse aquela que o remetente estivesse disposto a utilizar.
67
66
68
-
### Etapa 3: Preparando nosso RPC
67
+
### Etapa 3: Preparando Nosso RPC
69
68
70
-
Obviamente, precisaremos preparar todas as nossas variáveis novamente, conforme discutido na sessão[§15.1: Acessando o Bitcoind usando C](15_1_Accessing_Bitcoind_with_C.md). Também precisaremos inicializar a nossa biblioteca, conectar o cliente RPC e preparar nosso objeto de resposta:
69
+
Obviamente, precisaremos preparar todas as nossas variáveis novamente, conforme discutido na seção[§16.1: Acessando o Bitcoind com C](16_1_Accessing_Bitcoind_with_C.md). Também precisaremos inicializar a nossa biblioteca, conectar o cliente RPC e preparar nosso objeto de resposta:
> **ATENÇÃO** Um programa em produção usaria sub-rotinas para este tipo de pesquisa, de forma que pudéssemos chamar vários RPCs de uma biblioteca de funções C. Vamos apenas colocar tudo em um `main` como parte da nossa filosofia KISS.
159
158
160
-
### Etapa 5: Criando um endereço de troco
159
+
### Etapa 5: Criando um Endereço de Troco
161
160
162
161
Repita a metodologia padrão de pesquisa RPC para obter um endereço de troco:
163
162
```c
@@ -188,7 +187,7 @@ A única diferença é quais informações específicas são extraídas do objet
188
187
189
188
> :warning: **ATENÇÃO:** Aqui temos uma sub-rotina que seria bem legal: Abstrair toda a inicialização e chamada do método RPC.
190
189
191
-
### Etapa 6: Criando uma transação bruta
190
+
### Etapa 6: Criando uma Transação Bruta
192
191
193
192
Criar a transação bruta real é outra parte complicada da programação da substituição do ``sendtoaddress``. Isso porque requer a criação de um objeto JSON complexo como parâmetro.
Para relembrar, as entradas serão uma matriz JSON contendo um objeto JSON para cada UTXO. Então, as saídas estarão todas em um objeto JSON. É mais fácil criar esses elementos JSON de dentro para fora, usando os comandos ``jansson``.
202
201
203
-
#### Etapa 6.1: Criando os parâmetros de entrada
202
+
#### Etapa 6.1: Criando os Parâmetros de Entrada
204
203
205
204
Para criar o objeto de entrada para nosso UTXO, vamos usar o ``json_object`` e preencher com os valores-chave usando ``json_object_set_new`` (para referências recém-criadas) ou ``json_object_set`` (para referências já existentes):
206
205
``` c
@@ -220,7 +219,7 @@ inputparams = json_array();
220
219
json_array_append(inputparams,inputtxid);
221
220
```
222
221
223
-
#### Etapa 6.2: Criando os parâmetros de saída
222
+
#### Etapa 6.2: Criando os Parâmetros de Saída
224
223
225
224
Para criar a matriz de saída para a transação, vamos seguir o mesmo processo, criando um objeto JSON com ``json_object`` e, em seguida, vamos preenchê-lo com o ``json_object_set``:
É muito mais fácil atribuir um parâmetro simples a uma função. Basta criar uma matriz JSON e, em seguida, atribuir o parâmetro à matriz:
277
276
``` c
@@ -301,7 +300,7 @@ json_decref(lu_signature);
301
300
```
302
301
> :warning:***ATENÇÃO:*** Um programa em produção obviamente iria testar cuidadosamente a resposta de cada comando RPC para se certificar de que não teria erros. Isso é ainda mais verdadeiro para a função ``signrawtransaction``, porque podemos acabar com uma transação parcialmente assinada. Ou ainda pior, se não verificarmos os erros no objeto JSON, veremos apenas o ``hex`` e não iremos saber que ele não está assinado ou se está parcialmente assinado.
303
302
304
-
### Etapa 8. Enviando a transação
303
+
### Etapa 8. Enviando a Transação
305
304
306
305
Agora podemos enviar a transação, usando todas as técnicas aprendidas anteriormente:
Você pode ver as informações sobre esta transação que enviamos clicando [aqui](https://mempool.space/pt/testnet/tx/b93b19396f8baa37f5f701c7ca59d3128144c943af5294aeb48e3eb4c30fa9d2/).
347
346
348
-
## Resumo do Programando o Bitcoind usando C com bibliotecas RPC
347
+
## Resumo: Programando o Bitcoind em C com Bibliotecas RPC
349
348
350
349
Com acesso a uma biblioteca C, podemos criar programas com muito mais recursos quando comparados aos scripts no shell. Mas isso pode dar muito trabalho! Mesmo com 316 linhas de código, o ``sendtoaddress.c`` não cobre todos os detalhes necessários para transacionar bitcoins de forma segura e inteligente.
351
350
352
351
## O Que Vem Depois?
353
352
354
-
Aprenda mais sobre "Programando o Bitcoind usando C" na próxima sessão [15.3: Recebendo notificações usando C com a biblioteca ZMQ](15_3_Receiving_Bitcoind_Notifications_with_C.md).
353
+
Aprenda mais sobre "Programando o Bitcoind com C" na próxima seção [16.3: Recebendo notificações usando C com a biblioteca ZMQ](16_3_Receiving_Bitcoind_Notifications_with_C.md).
0 commit comments