mirror of
https://github.com/ChristopherA/Learning-Bitcoin-from-the-Command-Line.git
synced 2025-06-07 16:06:26 +00:00
Review 18_5
This commit is contained in:
parent
73e1a65e35
commit
cb8b8deadb
@ -1,4 +1,4 @@
|
||||
# 17.5: Acessando o Bitcoind com Rust
|
||||
# 18.5: Acessando o Bitcoind com Rust
|
||||
|
||||
> :information_source: **NOTA:** Esta seção foi adicionada recentemente ao curso e é um rascunho inicial que ainda pode estar aguardando revisão.
|
||||
|
||||
@ -23,9 +23,9 @@ $ source $HOME/.cargo/env
|
||||
|
||||
### Configurando o `bitcoincore-rpc`
|
||||
|
||||
Para a maioria das linguagens de programação, precisamos instalar uma biblioteca Bitcoin RPC antes de criar nosso primeiro projeto, mas aqui iremos fazer como parte da criação do nosso projeto.
|
||||
Para a maioria das linguagens de programação, precisamos instalar uma biblioteca Bitcoin RPC antes de criar nosso primeiro projeto, mas aqui iremos fazê-lo como parte da criação do nosso projeto.
|
||||
|
||||
### Criando um projeto `bitcoincore-rpc`
|
||||
### Criando um Projeto `bitcoincore-rpc`
|
||||
|
||||
Podemos criar um novo projeto usando `cargo new btc_test`:
|
||||
|
||||
@ -49,7 +49,7 @@ Hello, world!
|
||||
> :information_source: **NOTA:** se encontrarmos o erro `linker‘ cc ’not found`, teremos que instalar um
|
||||
Compilador C. Se estivermos no Linux, podemos instalar com as [ferramentas de desenvolvimento](https://www.ostechnix.com/install-development-tools-linux/).
|
||||
|
||||
Para acessar o crate (biblioteca) `bitcoincore-rpc`, devemos adicioná-la ao nosso arquivo `Cargo.toml` na seção `dependencies`:
|
||||
Para acessar o crate (biblioteca) `bitcoincore-rpc`, devemos adicioná-lo ao nosso arquivo `Cargo.toml` na seção `dependencies`:
|
||||
|
||||
```rust
|
||||
[dependencies]
|
||||
@ -70,12 +70,12 @@ $ cargo run
|
||||
Hello, world!
|
||||
```
|
||||
|
||||
Quando estiver usando o `bitcoin-rpc`, normalmente precisaremos incluir o seguinte:
|
||||
Quando estivermos usando o `bitcoin-rpc`, normalmente precisaremos incluir o seguinte:
|
||||
```
|
||||
use bitcoincore_rpc::{Auth, Client, RpcApi};
|
||||
```
|
||||
|
||||
## Construindo nossa conexão
|
||||
## Construindo Nossa Conexão
|
||||
|
||||
Para criarmos um `RPC client` do Bitcoin, vamos modificar o `src/main.rs`:
|
||||
|
||||
@ -94,16 +94,16 @@ fn main() {
|
||||
|
||||
Como de costume, vamos nos certificar de inserir nosso nome de usuário e senha corretos no `~/.bitcoin/bitcoin.conf`. Aqui, eles serão usados como argumentos para `Auth :: UserPass`.
|
||||
|
||||
> :link: **TESTNET vs MAINNET:** E, como de costume, vamos usar a porta 8332 para a Mainnet.
|
||||
> :link: **TESTNET vs MAINNET:** E, como de costume, use a porta 8332 para a Mainnet.
|
||||
|
||||
Quando terminar, também deve fechar nossa conexão:
|
||||
Quando terminarmos, também devemos fechar nossa conexão:
|
||||
```rust
|
||||
let _ = rpc.stop().unwrap();
|
||||
```
|
||||
|
||||
O `cargo run` deve compilar e executar o exemplo com sucesso com um aviso `warning: unused variable: rpc`
|
||||
|
||||
### Fazendo uma chamada RPC
|
||||
### Fazendo uma Chamada RPC
|
||||
|
||||
As chamadas RPC são feitas usando o `rpc Client` que criamos:
|
||||
|
||||
@ -113,7 +113,7 @@ println!("{:#?}", mining_info);
|
||||
```
|
||||
Geralmente, as palavras na chamada RPC são separadas por `_`s. Uma lista completa está disponível na [documentação do crate](https://crates.io/crates/bitcoincore-rpc).
|
||||
|
||||
### Fazendo uma chamada RPC com argumentos
|
||||
### Fazendo uma Chamada RPC com Argumentos
|
||||
|
||||
O envio de uma chamada RPC com argumentos usando Rust requer apenas o conhecimento de como a função é apresentada. Por exemplo, a função `get_block` é definida da seguinte forma na [documentação](https://docs.rs/bitcoincore-rpc/0.11.0/bitcoincore_rpc/trait.RpcApi.html#method.get_block):
|
||||
|
||||
@ -130,11 +130,11 @@ Aqui está o código completo para recuperar um hash de bloco, transformando-o e
|
||||
println!("{:?}", block);
|
||||
```
|
||||
|
||||
> **NOTA:** Outra chamada possível que consideramos para esta seção é a `get_address_info`, mas, infelizmente, no momento em que este livro foi escrito, a função `bitcoincore-rpc` não funciona com versões recentes do Bitcoin Core devido ao crate não abordar as mais recentes mudanças de API no Bitcoin Core. Esperamos que isso seja resolvido no próximo lançamento do crate, mas enquanto isso, damos essa atenção ao programador.
|
||||
> **NOTA:** Outra chamada possível que consideramos para esta seção é a `get_address_info`, mas, infelizmente, no momento de escrita, a função `bitcoincore-rpc` não funciona com versões recentes do Bitcoin Core devido ao crate não abordar as mais recentes mudanças de API no Bitcoin Core. Esperamos que isso seja resolvido no próximo lançamento do crate, mas, enquanto isso programador, _cuidado_.
|
||||
|
||||
### Executando nosso código
|
||||
### Executando Nosso Código
|
||||
|
||||
Podemos acessar o [código src](src/17_5_main-getinfo.rs) e executá-lo. Infelizmente, a informação do "Block" sairá um pouco feia porque este exemplo não inclui uma biblioteca para embelezá-la.
|
||||
Podemos acessar o [código src](src/18_5_main-getinfo.rs) e executá-lo. Infelizmente, a informação do "Block" sairá um pouco feia porque este exemplo não inclui uma biblioteca para embelezá-la.
|
||||
|
||||
```
|
||||
$ cargo run
|
||||
@ -154,7 +154,7 @@ GetMiningInfoResult {
|
||||
Block { header: BlockHeader { version: 541065216, prev_blockhash: 000000000000027715981d5a3047daf6819ea3b8390b73832587594a2074cbf5, merkle_root: 4b2e2c2754b6ed9cf5c857a66ed4c8642b6f6b33b42a4859423e4c3dca462d0c, time: 1599602277, bits: 436469756, nonce: 218614401 }, txdata: [Transaction { version: 1, lock_time: 0, input: [TxIn { previous_output: OutPoint { txid: 0000000000000000000000000000000000000000000000000000000000000000, vout: 4294967295 }, script_sig: Script(OP_PUSHBYTES_3 8ff51b OP_PUSHBYTES_22 315448617368263538434f494e1d00010320a48db852 OP_PUSHBYTES_32 <push past end>), sequence: 4294967295, witness: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] }], output: [TxOut { value: 19721777, script_pubkey: Script(OP_HASH160 OP_PUSHBYTES_20 011beb6fb8499e075a57027fb0a58384f2d3f784 OP_EQUAL) }, TxOut { value: 0, script_pubkey: Script(OP_RETURN OP_PUSHBYTES_36 aa21a9ed63363f3620ab5e38b8860a50c84050e5ec31af3636bbd73f01ba9f14103100ee) }] }, Transaction { version: 2, lock_time: 1832282, input: [TxIn { previous_output: OutPoint { txid: cbf880f73d421baf0aa4f0d28e63ba00e5bc6bd934b91eb0641354ce5ca42f7e, vout: 0 }, script_sig: Script(OP_PUSHBYTES_22 00146b8dbd32e5deb90d22934e1513bae6e70156cd50), sequence: 4294967294, witness: [[48, 68, 2, 32, 13, 89, 205, 30, 67, 24, 196, 83, 65, 224, 44, 138, 98, 58, 81, 135, 132, 209, 23, 166, 23, 44, 3, 228, 95, 102, 166, 214, 62, 38, 155, 147, 2, 32, 119, 2, 34, 246, 148, 255, 166, 10, 90, 52, 242, 32, 74, 241, 123, 148, 89, 199, 197, 3, 152, 134, 242, 215, 109, 61, 241, 241, 13, 70, 86, 207, 1], [2, 192, 145, 170, 206, 55, 4, 36, 138, 145, 217, 50, 19, 73, 130, 136, 245, 131, 184, 142, 239, 75, 13, 67, 17, 177, 57, 86, 151, 139, 89, 35, 109]] }], output: [TxOut { value: 1667908, script_pubkey: Script(OP_HASH160 OP_PUSHBYTES_20 908ca2b8b49ccf53efa2226afa85f6cc58dfd7e7 OP_EQUAL) }, TxOut { value: 9093, script_pubkey: Script(OP_DUP OP_HASH160 OP_PUSHBYTES_20 42ee67664ce16edefc68ad0e4c5b7ce2fc2ccc18 OP_EQUALVERIFY OP_CHECKSIG) }] }, ...] }
|
||||
```
|
||||
|
||||
## Pesquisando os fundos
|
||||
## Procurando por Fundos
|
||||
|
||||
Podemos procurar fundos sem argumentos opcionais usando a função `get_balance`:
|
||||
|
||||
@ -167,12 +167,12 @@ Conforme mostrado, a função `as_btc()` ajuda a gerar o saldo em um formato leg
|
||||
Balance: 3433.71692741 BTC
|
||||
```
|
||||
|
||||
## Criando um endereço
|
||||
## Criando um Endereço
|
||||
|
||||
A criação de um endereço demonstra como fazer uma chamada RPC com vários argumentos opcionais especificados (por exemplo, um rótulo e um tipo de endereço).
|
||||
|
||||
```rust
|
||||
// Generate a new address
|
||||
// Gerar um novo endereço
|
||||
let myaddress = rpc
|
||||
.get_new_address(Option::Some("BlockchainCommons"), Option::Some(json::AddressType::Bech32))
|
||||
.unwrap();
|
||||
@ -183,7 +183,7 @@ Isso também exigirá que tragamos a definição `json` para o escopo:
|
||||
use bitcoincore_rpc::{json, Auth, Client, RpcApi};
|
||||
```
|
||||
|
||||
## Enviando uma transação
|
||||
## Enviando uma Transação
|
||||
|
||||
Agora temos tudo de que precisamos para criar uma transação, o que será feito em cinco partes:
|
||||
|
||||
@ -193,9 +193,9 @@ Agora temos tudo de que precisamos para criar uma transação, o que será feito
|
||||
4. Assinar transação;
|
||||
5. Enviar transação.
|
||||
|
||||
### 1. Listando o UTXOs
|
||||
### 1. Listando os UTXOs
|
||||
|
||||
Para iniciar a criação de uma transação, primeiro encontramos um UTXO para usar. O seguinte leva o primeiro UTXO com pelo menos 0,01 BTC:
|
||||
Para iniciar a criação de uma transação, primeiro encontramos um UTXO para usar. O seguinte pega o primeiro UTXO com pelo menos 0,01 BTC:
|
||||
|
||||
|
||||
```rust
|
||||
@ -218,7 +218,7 @@ let selected_tx = &unspent[0];
|
||||
|
||||
println!("selected unspent transaction: {:#?}", selected_tx);
|
||||
```
|
||||
Isso exigirá trazer mais estruturas para o escopo:
|
||||
Isso nos exigirá trazer mais estruturas para o escopo:
|
||||
|
||||
```rust
|
||||
use bitcoincore_rpc::bitcoin::{Address, Amount};
|
||||
@ -226,7 +226,7 @@ use bitcoincore_rpc::bitcoin::{Address, Amount};
|
||||
|
||||
Podemos observar que estamos passando cinco variáveis ao comando `list_unspent`. Os primeiros quatro (`minconf`,` maxconf`, `address` e `include_unsafe`) não são usados aqui. O quinto é o `query_options`, que não usamos antes, mas temos algumas opções de filtragem poderosas, incluindo a capacidade de olhar apenas para os UTXOs com um certo valor, mínimo ou máximo.
|
||||
|
||||
### 2. Preenchendo as variáveis
|
||||
### 2. Preenchendo as Variáveis
|
||||
|
||||
Para começar a preencher as variáveis que precisaremos para criar uma nova transação, criamos a entrada do `txid` e do `vout` ao UTXO que selecionamos:
|
||||
```rust
|
||||
@ -237,35 +237,35 @@ let selected_utxos = json::CreateRawTransactionInput {
|
||||
};
|
||||
```
|
||||
Em seguida, podemos calcular a quantia que vamos gastar subtraindo uma taxa de mineração dos fundos no UTXO:
|
||||
```
|
||||
// send all bitcoin in the UTXO except a minor value which will be paid to miners
|
||||
```rust
|
||||
// enviar todo o bitcoin no UTXO exceto um valor pequeno que será pago aos mineradores
|
||||
let unspent_amount = selected_tx.amount;
|
||||
let amount = unspent_amount - Amount::from_btc(0.00001).unwrap();
|
||||
```
|
||||
Por fim, podemos criar um mapa do hash do endereço e da quantidade para formar a saída:
|
||||
```
|
||||
```rust
|
||||
let mut output = HashMap::new();
|
||||
output.insert(
|
||||
myaddress.to_string(),
|
||||
amount,
|
||||
);
|
||||
```
|
||||
Outra característica é necessária para a variável de saída: O `HashMap`. Ele permite que armazenemos
|
||||
Outra característica é necessária para a variável de saída: o `HashMap`. Ele nos permite armazenar
|
||||
valores por chave, que iremos precisar para representar a informação `{address: amount}`.
|
||||
|
||||
```rust
|
||||
use std::collections::HashMap;
|
||||
```
|
||||
|
||||
### 3. Criando a transação bruta
|
||||
### 3. Criando a Transação Bruta
|
||||
|
||||
Agora, estamos prontos para criar uma transação bruta:
|
||||
Agora estamos prontos para criar uma transação bruta:
|
||||
```rust
|
||||
let unsigned_tx = rpc
|
||||
.create_raw_transaction(&[selected_utxos], &output, None, None)
|
||||
.unwrap();
|
||||
```
|
||||
### 4. Assinando a transação
|
||||
### 4. Assinando a Transação
|
||||
|
||||
A assinatura da transação pode ser feita com um simples uso do `sign_raw_transaction_with_wallet`:
|
||||
```rust
|
||||
@ -276,7 +276,7 @@ let signed_tx = rpc
|
||||
println!("signed tx {:?}", signed_tx.transaction().unwrap());
|
||||
```
|
||||
|
||||
### 5. Enviando a transação
|
||||
### 5. Enviando a Transação
|
||||
|
||||
Finalmente, podemos transmitir a transação:
|
||||
```rust
|
||||
@ -287,9 +287,9 @@ let txid_sent = rpc
|
||||
println!("{:?}", txid_sent);
|
||||
```
|
||||
|
||||
### Executando nosso código
|
||||
### Executando Nosso Código
|
||||
|
||||
Agora podemos executar o código completo do [src](src/17_5_main-sendtx.rs).
|
||||
Agora podemos executar o código completo do [src](src/18_5_main-sendtx.rs).
|
||||
|
||||
|
||||
```
|
||||
@ -355,8 +355,8 @@ b0eda3517e6fac69e58ae315d7fe7a1981e3a858996cc1e3135618cac9b79d1a
|
||||
|
||||
## Resumo: Acessando o Bitcoind com Rust
|
||||
|
||||
O `bitcoincore-rpc` é um crate simples e robusto que permitirá que possamos interagir com o Bitcoin RPC usando Rust. No entanto, no momento em que este livro foi escrito, ele ficou para trás no Bitcoin Core, o que pode causar alguns problemas de uso.
|
||||
O `bitcoincore-rpc` é um crate simples e robusto que nos permitirá interagir com o Bitcoin RPC usando Rust. No entanto, no momento em que este livro foi escrito, ele ficou para trás no Bitcoin Core, o que pode causar alguns problemas de uso.
|
||||
|
||||
## O Que Vem Depois?
|
||||
|
||||
Vamos aprender mais sobre "Conversando com o Bitcoind com Outras Linguagens" na seção [§17.6: Acessando o Bitcoind com Swift](17_6_Accessing_Bitcoind_with_Swift.md).
|
||||
Vamos aprender mais sobre "Conversando com o Bitcoind com Outras Linguagens" na seção [§18.6: Acessando o Bitcoind com Swift](18_6_Accessing_Bitcoind_with_Swift.md).
|
Loading…
x
Reference in New Issue
Block a user