mirror of
https://github.com/ChristopherA/Learning-Bitcoin-from-the-Command-Line.git
synced 2025-06-07 07:56:31 +00:00
Chapter19 translation concluded
This commit is contained in:
parent
bb6dd6cfde
commit
e537667287
@ -23,3 +23,30 @@ Supporting objectives include the ability to:
|
||||
* [Section Two: Paying an Invoice](19_2_Paying_a_Invoice.md)
|
||||
* [Section Three: Closing a Lightning Channel](19_3_Closing_a_Channel.md)
|
||||
* [Section Four: Expanding the Lightning Network](19_4_Lightning_Network_Review.md)
|
||||
|
||||
|
||||
# Capítulo dezenove: usando um raio
|
||||
|
||||
>: Informação_Source: ** Nota: ** Este é um rascunho em andamento, para que eu possa obter algum feedback dos iniciantes. Ainda não está pronto para aprender.
|
||||
|
||||
Neste capítulo, você continuará trabalhando com a interface de linha de comando "Lightning-Cli` Você criará faturas, executará pagamentos e canais fechados - todas as principais atividades para usar o Lightning.
|
||||
|
||||
## Objetivos para este capítulo
|
||||
|
||||
Depois de trabalhar através deste capítulo, um desenvolvedor será capaz de:
|
||||
|
||||
* Execute pagamentos na rede relâmpago.
|
||||
* Aplique o fechamento para um canal de relâmpago.
|
||||
|
||||
Objetivos de apoio incluem a capacidade de:
|
||||
|
||||
* Compreender o formato das faturas.
|
||||
* Entenda o ciclo de vida dos pagamentos de rede de raios.
|
||||
* Saber como expandir a rede relâmpago.
|
||||
|
||||
## Índice
|
||||
|
||||
* [Seção One: Gerando uma solicitação de pagamento] (19_1_Generate_A_Payment_Request.md)
|
||||
* [Seção dois: pagando uma fatura] (19_2_Paying_a_invoice.md)
|
||||
* [Seção três: fechando um canal de raio] (19_3_closing_a_channel.md)
|
||||
* [Seção Quatro: Expandindo a rede Lightning] (19_4_lightning_network_review.md)
|
25
pt/19_0_Using_Lightning.md
Normal file
25
pt/19_0_Using_Lightning.md
Normal file
@ -0,0 +1,25 @@
|
||||
# Capítulo 19: Usando a Lightning
|
||||
|
||||
> :information_source: **NOTA:** Este é um rascunho que está em andamento, para que possa obter alguns comentários dos revisores iniciais. Ainda não está pronto.
|
||||
|
||||
Neste capítulo, continuaremos trabalhando com a interface de linha de comando `lightning-cli`. Criaremos invoices, realizaremos pagamentos e fecharemos canais, todas as principais atividades para se usar a Lightning.
|
||||
|
||||
## Objetivos deste capítulo
|
||||
|
||||
Depois de trabalhar neste capítulo, um desenvolvedor será capaz de:
|
||||
|
||||
* Efetuar pagamentos na Lightning Network;
|
||||
* Aplicar o fechamento a um canal Lightning.
|
||||
|
||||
Os objetivos secundários do capítulo incluem a capacidade de:
|
||||
|
||||
* Compreender o formato dos invoices;
|
||||
* Entender o ciclo de vida dos pagamentos da Lightning Network;
|
||||
* Saber como expandir a Lightning Network.
|
||||
|
||||
## Tabela de Conteúdo
|
||||
|
||||
* [Seção 1: Gerando um Invoice](19_1_Generate_a_Payment_Request.md)
|
||||
* [Seção 2: Pagando um Invoice](19_2_Paying_a_Invoice.md)
|
||||
* [Seção 3: Fechando um canal na Lightning](19_3_Closing_a_Channel.md)
|
||||
* [Seção 4: Expandindo a Lightning Network](19_4_Lightning_Network_Review.md)
|
184
pt/19_1_Generate_a_Payment_Request.md
Normal file
184
pt/19_1_Generate_a_Payment_Request.md
Normal file
@ -0,0 +1,184 @@
|
||||
# 19.1: Gerando um Invoice
|
||||
|
||||
> :information_source: **NOTA:** Esta seção foi adicionada recentemente ao curso e é um rascunho inicial que ainda pode estar aguardando revisão.
|
||||
|
||||
Esta seção descreve como os pagamentos funcionam na Lightning Network, como criar uma solicitação de pagamento (ou _invoice_) e, finalmente, como entendê-la. A emissão de invoices depende de termos um segundo node Lightning, conforme descrito na seção [Acessando um segundo node Lightning](18_2__Interlude_Accessing_a_Second_Lightning_Node.md). Esses exemplos usarão um node LND como nosso node secundário, para demonstrar ainda mais as possibilidades da Lightning Network. Para diferenciar entre os nodes nestes exemplos, os prompts serão mostrados como `c $` para o node c-lightning e `lnd $` para o node LND. Se quisermos reproduzir essas etapas, devemos [instalar nosso próprio node LND secundário](18_2__Interlude_Accessing_a_Second_Lightning_Node.md#Creating-a-new-lnd-node).
|
||||
|
||||
> :book: ***O que é um invoice?*** Quase todos os pagamentos feitos na Lightning Network exigem um invoice, que nada mais é do que um **pedido de pagamento** feito pelo destinatário do dinheiro e enviado por qualquer meio para o usuário que irá pagar. Todos os invoices são de uso único. Os invoices da Lightning usam a codificação bech32, que já é usada pela Segregated Witness para Bitcoin.
|
||||
|
||||
## Criando um invoice
|
||||
|
||||
Para criar um novo invoice na c-lightning, usaríamos o comando `lightning-cli --testnet invoice`.
|
||||
|
||||
Vamos ver como funcionaria com o c-lightning, usando argumentos de um valor (em milisats), um rótulo e uma descrição.
|
||||
```
|
||||
c$ lightning-cli --testnet invoice 100000 joe-payment "The money you owe me for dinner"
|
||||
{
|
||||
"payment_hash": "07a1c4bd7a38b4dea35f301c173cd8f9aac253b66bd8404d7ad829f226342490",
|
||||
"expires_at": 1603305795,
|
||||
"bolt11": "lntb1u1p0cw3krpp5q7suf0t68z6dag6lxqwpw0xclx4vy5akd0vyqnt6mq5lyf35yjgqdpj235x2grddahx27fq09hh2gr0wajjqmt9ypnx7u3qv35kumn9wgxqyjw5qcqp2sp5r3puay46tffdyzldjv39fw6tzdgu2hnlszamqhnmgjsuxqxavpgs9qy9qsqatawvx44x5qa22m7td84jau5450v7j6sl5224tlv9k5v7wdygq9qr4drz795lfnl52gklvyvnha5e5lx72lzzmgzcfnp942va5thmhsp5sx7c2",
|
||||
"warning_capacity": "No channels",
|
||||
"warning_mpp_capacity": "The total incoming capacity is still insufficient even if the payer had MPP capability."
|
||||
}
|
||||
```
|
||||
No entanto, para este exemplo, vamos gerar um invoice em um node LND e, em seguida, pagá-la no node c-lightning. Isso requer o comando `addinvoice` ligeiramente diferente na LND. Podemos usar o argumento `--amt` para indicar a quantia a ser paga (em milisats) e adicionar uma descrição usando o argumento `--memo`.
|
||||
|
||||
```
|
||||
lnd$ lncli -n testnet addinvoice --amt 10000 --memo "First LN Payment - Learning Bitcoin and Lightning from the Command line."
|
||||
{
|
||||
"r_hash": "6cacdedc95b89eec15e5244bd0957b88c0ab58b153eee549735b995344bc16bb",
|
||||
"payment_request": "lntb100u1p0cwnqtpp5djkdahy4hz0wc909y39ap9tm3rq2kk9320hw2jtntwv4x39uz6asdr5ge5hyum5ypxyugzsv9uk6etwwssz6gzvv4shymnfdenjqsnfw33k76twypskuepqf35kw6r5de5kueeqveex7mfqw35x2gzrdakk6ctwvssxc6twv5hqcqzpgsp5a9ryqw7t23myn9psd36ra5alzvp6lzhxua58609teslwqmdljpxs9qy9qsq9ee7h500jazef6c306psr0ncru469zgyr2m2h32c6ser28vrvh5j4q23c073xsvmjwgv9wtk2q7j6pj09fn53v2vkrdkgsjv7njh9aqqtjn3vd",
|
||||
"add_index": "1"
|
||||
}
|
||||
```
|
||||
Observe que esses invoices não fazem referência direta ao canal que criamos: isso é necessário para o pagamento, mas não para solicitar o pagamento.
|
||||
|
||||
## Compreendendo um invoice
|
||||
|
||||
O `bolt11 payment_request` que criamos é composto de duas partes: uma é legível por humanos e a outra são apenas dados.
|
||||
|
||||
> :book: **O que é um BOLT?** Os BOLTs são as [especificações individuais da Lightning Network](https://github.com/lightningnetwork/lightning-rfc).
|
||||
|
||||
### Lendo a parte legível do invoice
|
||||
|
||||
A parte legível dos invoices começa com um `ln`. É `lnbc` para Bitcoin mainnet, `lntb` para Bitcoin testnet ou `lnbcrt` para Bitcoin regtest.
|
||||
Em seguida, listamos os fundos solicitados no invoice.
|
||||
|
||||
Por exemplo, vamos olhar para a nossa fatura do node LND:
|
||||
```
|
||||
lntb100u1p0cwnqtpp5djkdahy4hz0wc909y39ap9tm3rq2kk9320hw2jtntwv4x39uz6asdr5ge5hyum5ypxyugzsv9uk6etwwssz6gzvv4shymnfdenjqsnfw33k76twypskuepqf35kw6r5de5kueeqveex7mfqw35x2gzrdakk6ctwvssxc6twv5hqcqzpgsp5a9ryqw7t23myn9psd36ra5alzvp6lzhxua58609teslwqmdljpxs9qy9qsq9ee7h500jazef6c306psr0ncru469zgyr2m2h32c6ser28vrvh5j4q23c073xsvmjwgv9wtk2q7j6pj09fn53v2vkrdkgsjv7njh9aqqtjn3vd
|
||||
```
|
||||
A parte legível por humanos é `ln` +`tb` + `100u`.
|
||||
|
||||
O `lntb` diz que esta é um invoice da Lightning Network para bitcoins Testnet.
|
||||
|
||||
O `100u` diz que é para 100 bitcoins vezes o multiplicador microsatoshi. Existem quatro multiplicadores de fundos (opcionais):
|
||||
|
||||
* `m` (mili): multiplique por 0,001
|
||||
* `u` (micro): multiplique por 0,000001
|
||||
* `n` (nano): multiplique por 0,000000001
|
||||
* `p` (pico): multiplique por 0,000000000001
|
||||
|
||||
100 BTC * 0,000001 = 0,0001 BTC, que é o mesmo que 10.000 satoshis.
|
||||
|
||||
### Lendo a parte do invoice referente aos dados
|
||||
|
||||
O resto do invoice ( `1p0cwnqtpp5djkdahy4hz0wc909y39ap9tm3rq2kk9320hw2jtntwv4x39uz6asdr5ge5hyum5ypxyugzsv9uk6etwwssz6gzvv4shymnfdenjqsnfw33k76twypskuepqf35kw6r5de5kueeqveex7mfqw35x2gzrdakk6ctwvssxc6twv5hqcqzpgsp5a9ryqw7t23myn9psd36ra5alzvp6lzhxua58609teslwqmdljpxs9qy9qsq9ee7h500jazef6c306psr0ncru469zgyr2m2h32c6ser28vrvh5j4q23c073xsvmjwgv9wtk2q7j6pj09fn53v2vkrdkgsjv7njh9aqqtjn3vd`) contém um marcador de tempo, dados especificamente marcados, e uma assinatura. Obviamente, não pode ler sem decodificá-lo, mas podemos pedir ao `lightning-cli` para fazer isso com o comando `decodepay`:
|
||||
```
|
||||
c$ lightning-cli --testnet decodepay lntb100u1p0cwnqtpp5djkdahy4hz0wc909y39ap9tm3rq2kk9320hw2jtntwv4x39uz6asdr5ge5hyum5ypxyugzsv9uk6etwwssz6gzvv4shymnfdenjqsnfw33k76twypskuepqf35kw6r5de5kueeqveex7mfqw35x2gzrdakk6ctwvssxc6twv5hqcqzpgsp5a9ryqw7t23myn9psd36ra5alzvp6lzhxua58609teslwqmdljpxs9qy9qsq9ee7h500jazef6c306psr0ncru469zgyr2m2h32c6ser28vrvh5j4q23c073xsvmjwgv9wtk2q7j6pj09fn53v2vkrdkgsjv7njh9aqqtjn3vd
|
||||
{
|
||||
"currency": "tb",
|
||||
"created_at": 1602702347,
|
||||
"expiry": 3600,
|
||||
"payee": "032a7572dc013b6382cde391d79f292ced27305aa4162ec3906279fc4334602543",
|
||||
"msatoshi": 10000000,
|
||||
"amount_msat": "10000000msat",
|
||||
"description": "First LN Payment - Learning Bitcoin and Lightning from the Command line.",
|
||||
"min_final_cltv_expiry": 40,
|
||||
"payment_secret": "e946403bcb54764994306c743ed3bf1303af8ae6e7687d3cabcc3ee06dbf904d",
|
||||
"features": "028200",
|
||||
"payment_hash": "6cacdedc95b89eec15e5244bd0957b88c0ab58b153eee549735b995344bc16bb",
|
||||
"signature": "304402202e73ebd1ef974594eb117e8301be781f2ba289041ab6abc558d432351d8365e902202a8151c3fd13419b9390c2b976503d2d064f2a6748b14cb0db64424cf4e572f4"
|
||||
}
|
||||
|
||||
```
|
||||
Aqui temos o que os elementos mais relevantes significam:
|
||||
|
||||
1. `currency`: A moeda a ser paga;
|
||||
2. `created_at`: Momento em que a fatura foi criada. O valor é dado em tempo UNIX, que é segundos desde 1970.
|
||||
3. `expiry`: O momento em que nosso node marca a fatura como inválida. O padrão é 1 hora ou 3600 segundos.
|
||||
4. `payee`: A chave pública da pessoa (node) que recebe o pagamento da Lightning Network;
|
||||
5. `msatoshi` e `amount_msat`: O valor de satoshis a ser pago;
|
||||
6. `description`: A descrição informada pelo usuário;
|
||||
7. `payment_hash`: O hash da pré-imagem que é usado para bloquear o pagamento. Só podemos resgatar um pagamento bloqueado com a pré-imagem correspondente ao hash de pagamento. Isso permite o roteamento na Lightning Network sem confiar em terceiros, criando um **Pagamento Condicional** a ser preenchido;
|
||||
8. `signature`: A assinatura codificada por DER.
|
||||
|
||||
> :book: ***O que são pagamentos condicionais?*** Embora os canais Lightning sejam criados entre dois participantes, vários canais podem ser conectados juntos, formando uma rede de pagamento que permite envio de valores entre todos os participantes da rede, mesmo aqueles sem um canal direto entre eles. Isso é feito usando um contrato inteligente denominado **Hashed Time Locked Contract**.
|
||||
|
||||
> :book: ***O que é um Hashed Time Locked Contract (HTLC)?*** Um HTLC é um pagamento condicional que usa hashlocks e timelocks para garantir a segurança do pagamento. O destinatário deve apresentar uma pré-imagem do pagamento ou gerar um comprovante criptográfico de pagamento antes de um determinado prazo, caso contrário o pagador pode cancelar o contrato gastando-o. Esses contratos são criados como saídas da **Transação de compromisso**.
|
||||
|
||||
> :book: ***O que é uma transação de compromisso?*** Uma transação de compromisso é uma transação que gasta a transação de financiamento original. Cada par possui a assinatura do outro par, o que significa que qualquer um pode gastar sua transação do compromisso como quiser. Depois que cada nova transação de confirmação é criada, a antiga é revogada. A transação de confirmação é uma maneira pela qual a transação de financiamento pode ser desbloqueada na blockchain, conforme discutiremos na seção [§19.3](19_3_Closing_a_Channel.md).
|
||||
|
||||
### Verificando nosso invoice
|
||||
|
||||
Existem dois elementos cruciais para verificar o invoice. O primeiro, obviamente, é o valor do pagamento, que já examinamos na parte legível. O segundo é o dado do `payee`, que é o pubkey do destinatário (node):
|
||||
```
|
||||
"payee": "032a7572dc013b6382cde391d79f292ced27305aa4162ec3906279fc4334602543",
|
||||
```
|
||||
Precisamos verificar se ele é o destinatário esperado.
|
||||
|
||||
Olhando nas seções anteriores, mais precisamente na seção [§18.3](18_3_Setting_Up_a_Channel.md#opening-a-channel), podemos observar que é de fato o ID do par que usamos quando criamos nosso canal. Também podemos verificá-lo no outro node com o comando `getinfo`.
|
||||
```
|
||||
lnd$ lncli -n testnet getinfo
|
||||
{
|
||||
"version": "0.11.0-beta.rc4 commit=v0.11.0-beta.rc4",
|
||||
"commit_hash": "fc12656a1a62e5d69430bba6e4feb8cfbaf21542",
|
||||
"identity_pubkey": "032a7572dc013b6382cde391d79f292ced27305aa4162ec3906279fc4334602543",
|
||||
"alias": "StandUp",
|
||||
"color": "#3399ff",
|
||||
"num_pending_channels": 0,
|
||||
"num_active_channels": 1,
|
||||
"num_inactive_channels": 0,
|
||||
"num_peers": 3,
|
||||
"block_height": 1862983,
|
||||
"block_hash": "00000000000000c8c2f58f6da2ae2a3884d6e84f55d0e1f585a366f9dfcaa860",
|
||||
"best_header_timestamp": "1602702331",
|
||||
"synced_to_chain": true,
|
||||
"synced_to_graph": true,
|
||||
"testnet": true,
|
||||
"chains": [
|
||||
{
|
||||
"chain": "bitcoin",
|
||||
"network": "testnet"
|
||||
}
|
||||
],
|
||||
"uris": [
|
||||
],
|
||||
"features": {
|
||||
"0": {
|
||||
"name": "data-loss-protect",
|
||||
"is_required": true,
|
||||
"is_known": true
|
||||
},
|
||||
"5": {
|
||||
"name": "upfront-shutdown-script",
|
||||
"is_required": false,
|
||||
"is_known": true
|
||||
},
|
||||
"7": {
|
||||
"name": "gossip-queries",
|
||||
"is_required": false,
|
||||
"is_known": true
|
||||
},
|
||||
"9": {
|
||||
"name": "tlv-onion",
|
||||
"is_required": false,
|
||||
"is_known": true
|
||||
},
|
||||
"13": {
|
||||
"name": "static-remote-key",
|
||||
"is_required": false,
|
||||
"is_known": true
|
||||
},
|
||||
"15": {
|
||||
"name": "payment-addr",
|
||||
"is_required": false,
|
||||
"is_known": true
|
||||
},
|
||||
"17": {
|
||||
"name": "multi-path-payments",
|
||||
"is_required": false,
|
||||
"is_known": true
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
No entanto, o `payee` também pode ser alguém novo, caso em que provavelmente precisaremos verificar com a pessoa que emitiu o invoice para garantir que está tudo correto.
|
||||
|
||||
## Resumo: Gerando um Invoice
|
||||
|
||||
Na maioria dos casos, precisamos receber um invoice para usar os pagamentos da Lightning Network. Neste exemplo, criamos um manualmente, mas se estivermos em um ambiente de produção, provavelmente teria sistemas fazendo isso automaticamente sempre que alguém adquirir produtos ou serviços. Claro, depois de receber um invoice, precisamos saber como lê-lo!
|
||||
|
||||
## O Que Vem Depois?
|
||||
|
||||
Vamos continuar "Usando a Lightning" na seção [§19.2: Pagando um Invoice](06_3_Sending_an_Automated_Multisig.md).
|
206
pt/19_2_Paying_a_Invoice.md
Normal file
206
pt/19_2_Paying_a_Invoice.md
Normal file
@ -0,0 +1,206 @@
|
||||
# 19.2: Pagando um Invoice
|
||||
|
||||
> :information_source: **NOTA:** Esta seção foi adicionada recentemente ao curso e é um rascunho inicial que ainda pode estar aguardando revisão.
|
||||
|
||||
Neste capítulo, aprenderemos como pagar um invoice usando o comando `lightning-cli pay`. Presume-se que já sabemos como analisar um invoice, de acordo com a seção [§19.1](19_1_Generate_a_Payment_Request.md) e sabemos que ele é válido.
|
||||
|
||||
## Verificando o saldo
|
||||
|
||||
Obviamente, a primeira coisa que precisamos fazer é nos certificarmos de que possuímos fundos suficientes para pagar o invoice. Neste caso, o canal configurado anteriormente com `032a7572dc013b6382cde391d79f292ced27305aa4162ec3906279fc4334602543` contém 100.000 satoshis. Este será o canal de pagamento do inoice.
|
||||
|
||||
```
|
||||
c$ lightning-cli --testnet listfunds
|
||||
{
|
||||
"outputs": [
|
||||
{
|
||||
"txid": "66694d23ca15efe379e5f4a71d9be1a2d65e383b89ee3abe126ee36a12f23c1d",
|
||||
"output": 1,
|
||||
"value": 99847,
|
||||
"amount_msat": "99847000msat",
|
||||
"scriptpubkey": "00142fe02e5be9283e8c5bcb93ae61421baf8cb64f9c",
|
||||
"address": "tb1q9lszuklf9qlgck7tjwhxzssm47xtvnuu4jslf8",
|
||||
"status": "confirmed",
|
||||
"blockheight": 1862856,
|
||||
"reserved": false
|
||||
}
|
||||
],
|
||||
"channels": [
|
||||
{
|
||||
"peer_id": "032a7572dc013b6382cde391d79f292ced27305aa4162ec3906279fc4334602543",
|
||||
"connected": true,
|
||||
"state": "CHANNELD_NORMAL",
|
||||
"short_channel_id": "1862856x29x0",
|
||||
"channel_sat": 100000,
|
||||
"our_amount_msat": "100000000msat",
|
||||
"channel_total_sat": 100000,
|
||||
"amount_msat": "100000000msat",
|
||||
"funding_txid": "66694d23ca15efe379e5f4a71d9be1a2d65e383b89ee3abe126ee36a12f23c1d",
|
||||
"funding_output": 0
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
Se não tivermos fundos suficientes, precisamos criar um novo canal.
|
||||
|
||||
## Pagando nosso invoice
|
||||
|
||||
Vamos usar o comando `lightning-cli pay` para pagar o invoice. Ele tentará encontrar uma rota para o destino fornecido, para posteriormente enviar os fundos solicitados. Isso é muito simples porque há um canal direto entre o pagador e o destinatário:
|
||||
```
|
||||
c$ lightning-cli --testnet pay lntb100u1p0cwnqtpp5djkdahy4hz0wc909y39ap9tm3rq2kk9320hw2jtntwv4x39uz6asdr5ge5hyum5ypxyugzsv9uk6etwwssz6gzvv4shymnfdenjqsnfw33k76twypskuepqf35kw6r5de5kueeqveex7mfqw35x2gzrdakk6ctwvssxc6twv5hqcqzpgsp5a9ryqw7t23myn9psd36ra5alzvp6lzhxua58609teslwqmdljpxs9qy9qsq9ee7h500jazef6c306psr0ncru469zgyr2m2h32c6ser28vrvh5j4q23c073xsvmjwgv9wtk2q7j6pj09fn53v2vkrdkgsjv7njh9aqqtjn3vd
|
||||
{
|
||||
"destination": "032a7572dc013b6382cde391d79f292ced27305aa4162ec3906279fc4334602543",
|
||||
"payment_hash": "6cacdedc95b89eec15e5244bd0957b88c0ab58b153eee549735b995344bc16bb",
|
||||
"created_at": 1602704828.948,
|
||||
"parts": 1,
|
||||
"msatoshi": 10000000,
|
||||
"amount_msat": "10000000msat",
|
||||
"msatoshi_sent": 10000000,
|
||||
"amount_sent_msat": "10000000msat",
|
||||
"payment_preimage": "1af4a9bb830e49b6bc8f0bef980630e189e3794ad1705f06ad1b9c71571dce0c",
|
||||
"status": "complete"
|
||||
}
|
||||
```
|
||||
Vamos observar todos os valores que estão em `msats`, não em `sats`!
|
||||
|
||||
### Pagando o invoice pela Lightning
|
||||
|
||||
No entanto, _não_ precisamos ter um canal com um node para pagá-lo. Só precisamos ter uma rota razoável pela Lightning Network.
|
||||
|
||||
Imagine que recebemos esta minúscula solicitação de pagamento de 11.111 msat:
|
||||
```
|
||||
c$ lightning-cli --testnet decodepay lntb111110p1p0cw43ppp5u0ngjytlw6ywec3x784jale4xd7h058g9u4mthcaf9rl2f7g8zxsdp2t9hh2gr0wajjqmt9ypnx7u3qv35kumn9wgs8gmm0yyxqyjw5qcqp2sp5kj4xhrthmfgcgyl84zaqpl9vvdjwm5x368kr09fu5nym74setw4s9qy9qsq8hxjr73ee77vat0ay603e4w9aa8ag9sa2n55xznk5lsfrjffxxdj2k0wznvcfa98l4a57s80j7dhg0cc03vwqdwehkujlzxgm0xyynqqslwhvl
|
||||
{
|
||||
"currency": "tb",
|
||||
"created_at": 1602704929,
|
||||
"expiry": 604800,
|
||||
"payee": "02f3d74746934494fa378235e5bc44cfdbb5b8779d839263fb7f9218be032f6f61",
|
||||
"msatoshi": 11111,
|
||||
"amount_msat": "11111msat",
|
||||
"description": "You owe me for dinner too!",
|
||||
"min_final_cltv_expiry": 10,
|
||||
"payment_secret": "b4aa6b8d77da518413e7a8ba00fcac6364edd0d1d1ec37953ca4c9bf56195bab",
|
||||
"features": "028200",
|
||||
"payment_hash": "e3e689117f7688ece226f1eb2eff35337d77d0e82f2bb5df1d4947f527c8388d",
|
||||
"signature": "304402203dcd21fa39cfbcceadfd269f1cd5c5ef4fd4161d54e9430a76a7e091c929319b02202559ee14d984f4a7fd7b4f40ef979b743f187c58e035d9bdb92f88c8dbcc424c"
|
||||
}
|
||||
```
|
||||
Se tentássemos pagar e não tivéssemos uma rota para o destinatário por meio da Lightning Network, poderíamos esperar um erro como este:
|
||||
```
|
||||
c$ lightning-cli --testnet pay lntb111110p1p0cw43ppp5u0ngjytlw6ywec3x784jale4xd7h058g9u4mthcaf9rl2f7g8zxsdp2t9hh2gr0wajjqmt9ypnx7u3qv35kumn9wgs8gmm0yyxqyjw5qcqp2sp5kj4xhrthmfgcgyl84zaqpl9vvdjwm5x368kr09fu5nym74setw4s9qy9qsq8hxjr73ee77vat0ay603e4w9aa8ag9sa2n55xznk5lsfrjffxxdj2k0wznvcfa98l4a57s80j7dhg0cc03vwqdwehkujlzxgm0xyynqqslwhvl
|
||||
{
|
||||
"code": 210,
|
||||
"message": "Ran out of routes to try after 11 attempts: see `paystatus`",
|
||||
"attempts": [
|
||||
{
|
||||
"status": "failed",
|
||||
"failreason": "Error computing a route to 02f3d74746934494fa378235e5bc44cfdbb5b8779d839263fb7f9218be032f6f61: \"Could not find a route\" (205)",
|
||||
"partid": 1,
|
||||
"amount": "11111msat"
|
||||
},
|
||||
...
|
||||
```
|
||||
Mas e se um host com o qual tínhamos um canal aberto é o destinatário pretendido?
|
||||
|
||||
Nesse caso, quando formos pagar a fatura, ele _automaticamente funcionará_!
|
||||
```
|
||||
c$ lightning-cli --testnet pay lntb111110p1p0cw43ppp5u0ngjytlw6ywec3x784jale4xd7h058g9u4mthcaf9rl2f7g8zxsdp2t9hh2gr0wajjqmt9ypnx7u3qv35kumn9wgs8gmm0yyxqyjw5qcqp2sp5kj4xhrthmfgcgyl84zaqpl9vvdjwm5x368kr09fu5nym74setw4s9qy9qsq8hxjr73ee77vat0ay603e4w9aa8ag9sa2n55xznk5lsfrjffxxdj2k0wznvcfa98l4a57s80j7dhg0cc03vwqdwehkujlzxgm0xyynqqslwhvl
|
||||
{
|
||||
"destination": "02f3d74746934494fa378235e5bc44cfdbb5b8779d839263fb7f9218be032f6f61",
|
||||
"payment_hash": "e3e689117f7688ece226f1eb2eff35337d77d0e82f2bb5df1d4947f527c8388d",
|
||||
"created_at": 1602709081.324,
|
||||
"parts": 1,
|
||||
"msatoshi": 11111,
|
||||
"amount_msat": "11111msat",
|
||||
"msatoshi_sent": 12111,
|
||||
"amount_sent_msat": "12111msat",
|
||||
"payment_preimage": "ec7d1b28a7b877cd92b83be396899e8bfc3ecb0b4f944f65afb4be7d0ee72617",
|
||||
"status": "complete"
|
||||
}
|
||||
```
|
||||
Essa é a verdadeira beleza da Lightning Network: Sem nenhum esforço dos participantes ponto a ponto, nossos canais individuais se tornam uma rede!
|
||||
|
||||
> :book: ***Como funcionam os pagamentos na rede?*** Digamos que o node A tem um canal aberto com o node B, o node B tem um canal aberto com o node C e o node A recebe uma fatura do node C de 11.111 msat. O node A paga ao node B 11.111 msat, mais uma pequena taxa, e então o node B paga 11.111 msat ao node C. Muito fácil. Mas lembre-se de que todos os canais são, na verdade, apenas registros de quem é o proprietário e de quanto é a Transação de Financiamento. Então o que realmente acontece é 11.111 msat da Transação de Financiamento no canal AB muda de A para B e, em seguida, 11.111 msat da Transação de Financiamento no canal BC muda de B para C. Isso significa que duas coisas são necessárias para que este pagamento funcione: Primeiro, cada canal deve ter capacidade suficiente para o pagamento e; Segundo, o pagador em cada canal deve possuir o suficiente da capacidade para fazer o pagamento.
|
||||
|
||||
Observe que, neste exemplo, 12.111 msat foram enviados para pagar uma fatura de 11.111 msat: o extra sendo uma taxa fixa muito pequena (não uma porcentagem) que foi paga ao intermediário.
|
||||
|
||||
## Verificando nosso saldo
|
||||
|
||||
Após efetuar um pagamento com sucesso, veremos que nossos fundos foram alterados corretamente.
|
||||
|
||||
Aqui está a aparência dos fundos para o node pagador após o pagamento inicial de 10.000 satoshis:
|
||||
```
|
||||
c$ lightning-cli --testnet listfunds
|
||||
{
|
||||
"outputs": [
|
||||
{
|
||||
"txid": "66694d23ca15efe379e5f4a71d9be1a2d65e383b89ee3abe126ee36a12f23c1d",
|
||||
"output": 1,
|
||||
"value": 99847,
|
||||
"amount_msat": "99847000msat",
|
||||
"scriptpubkey": "00142fe02e5be9283e8c5bcb93ae61421baf8cb64f9c",
|
||||
"address": "tb1q9lszuklf9qlgck7tjwhxzssm47xtvnuu4jslf8",
|
||||
"status": "confirmed",
|
||||
"blockheight": 1862856,
|
||||
"reserved": false
|
||||
}
|
||||
],
|
||||
"channels": [
|
||||
{
|
||||
"peer_id": "032a7572dc013b6382cde391d79f292ced27305aa4162ec3906279fc4334602543",
|
||||
"connected": true,
|
||||
"state": "CHANNELD_NORMAL",
|
||||
"short_channel_id": "1862856x29x0",
|
||||
"channel_sat": 90000,
|
||||
"our_amount_msat": "90000000msat",
|
||||
"channel_total_sat": 100000,
|
||||
"amount_msat": "100000000msat",
|
||||
"funding_txid": "66694d23ca15efe379e5f4a71d9be1a2d65e383b89ee3abe126ee36a12f23c1d",
|
||||
"funding_output": 0
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
Observe que a capacidade do canal permanece em 100.000 satoshis (isso nunca irá mudar!), Mas que o `our_amount` agora é de apenas 90.000 satoshis (ou 90.000.000 msat).
|
||||
|
||||
Depois de pagar a segunda fatura, de 11.111 msat, os fundos mudam novamente:
|
||||
```
|
||||
$ lightning-cli --testnet listfunds
|
||||
{
|
||||
"outputs": [
|
||||
{
|
||||
"txid": "66694d23ca15efe379e5f4a71d9be1a2d65e383b89ee3abe126ee36a12f23c1d",
|
||||
"output": 1,
|
||||
"value": 99847,
|
||||
"amount_msat": "99847000msat",
|
||||
"scriptpubkey": "00142fe02e5be9283e8c5bcb93ae61421baf8cb64f9c",
|
||||
"address": "tb1q9lszuklf9qlgck7tjwhxzssm47xtvnuu4jslf8",
|
||||
"status": "confirmed",
|
||||
"blockheight": 1862856,
|
||||
"reserved": false
|
||||
}
|
||||
],
|
||||
"channels": [
|
||||
{
|
||||
"peer_id": "032a7572dc013b6382cde391d79f292ced27305aa4162ec3906279fc4334602543",
|
||||
"connected": true,
|
||||
"state": "CHANNELD_NORMAL",
|
||||
"short_channel_id": "1862856x29x0",
|
||||
"channel_sat": 89987,
|
||||
"our_amount_msat": "89987000msat",
|
||||
"channel_total_sat": 100000,
|
||||
"amount_msat": "100000000msat",
|
||||
"funding_txid": "66694d23ca15efe379e5f4a71d9be1a2d65e383b89ee3abe126ee36a12f23c1d",
|
||||
"funding_output": 0
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
O `our_amount` agora é de apenas 89.987 satoshis, tendo pago 11.111 msat mais uma taxa de 1.000 msat.
|
||||
|
||||
## Resumo: Pagando um Invoice
|
||||
|
||||
Depois de recebermos um invoice, é fácil pagar com um único comando na Lightning. Mesmo se não tivermos um canal para o destinatário, o pagamento é simples, desde que haja uma rota entre nós e o node de destino.
|
||||
|
||||
## O Que Vem Depois?
|
||||
|
||||
Vamos continuar "Usando a Lightning" na seção [§19.3: Fechando um Canal na Lightning](19_3_Closing_a_Channel.md).
|
259
pt/19_3_Closing_a_Channel.md
Normal file
259
pt/19_3_Closing_a_Channel.md
Normal file
@ -0,0 +1,259 @@
|
||||
# 19.3: Fechando um canal
|
||||
|
||||
> :information_source: **NOTA:** Esta seção foi adicionada recentemente ao curso e é um rascunho inicial que ainda pode estar aguardando revisão.
|
||||
|
||||
Neste capítulo, aprenderemos como fechar um canal usando a interface de linha de comando `lightning-cli close`. Fechar um canal significa que nós e a nossa contraparte enviarão o saldo do canal acordado para a blockchain, pelo qual devemos pagar as taxas de transação e esperar que a mesma seja posta em um bloco. Um fechamento pode ser cooperativo ou não, mas funciona de qualquer maneira.
|
||||
|
||||
Para fechar um canal, primeiro precisamos saber o ID do node remoto. Podemos recuperá-lo de duas maneiras.
|
||||
|
||||
## Encontrando nossos canais pelos saldos
|
||||
|
||||
Podemos usar o comando `lightning-cli listfunds` para ver nossos canais. Este comando RPC exibe todos os fundos disponíveis, em `outputs` não gastos (UTXOs) na carteira interna ou bloqueados em `channels` (canais) abertos.
|
||||
```
|
||||
c$ lightning-cli --testnet listfunds
|
||||
{
|
||||
"outputs": [
|
||||
{
|
||||
"txid": "66694d23ca15efe379e5f4a71d9be1a2d65e383b89ee3abe126ee36a12f23c1d",
|
||||
"output": 1,
|
||||
"value": 99847,
|
||||
"amount_msat": "99847000msat",
|
||||
"scriptpubkey": "00142fe02e5be9283e8c5bcb93ae61421baf8cb64f9c",
|
||||
"address": "tb1q9lszuklf9qlgck7tjwhxzssm47xtvnuu4jslf8",
|
||||
"status": "confirmed",
|
||||
"blockheight": 1862856,
|
||||
"reserved": false
|
||||
}
|
||||
],
|
||||
"channels": [
|
||||
{
|
||||
"peer_id": "032a7572dc013b6382cde391d79f292ced27305aa4162ec3906279fc4334602543",
|
||||
"connected": true,
|
||||
"state": "CHANNELD_NORMAL",
|
||||
"short_channel_id": "1862856x29x0",
|
||||
"channel_sat": 89987,
|
||||
"our_amount_msat": "89987000msat",
|
||||
"channel_total_sat": 100000,
|
||||
"amount_msat": "100000000msat",
|
||||
"funding_txid": "66694d23ca15efe379e5f4a71d9be1a2d65e383b89ee3abe126ee36a12f23c1d",
|
||||
"funding_output": 0
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
"message_flags": 1,
|
||||
"channel_flags": 2,
|
||||
"active": true,
|
||||
"last_update": 1595508075,
|
||||
"base_fee_millisatoshi": 1000,
|
||||
"fee_per_millionth": 1,
|
||||
"delay": 40,
|
||||
"htlc_minimum_msat": "1000msat",
|
||||
"htlc_maximum_msat": "280000000msat",
|
||||
"features": ""
|
||||
}
|
||||
```
|
||||
|
||||
Poderíamos também recuperar o ID do enésimo canal em uma variável como esta:
|
||||
```
|
||||
c$ nodeidremote=$(lightning-cli --testnet listfunds | jq '.channels[0] | .peer_id')
|
||||
```
|
||||
|
||||
## Encontrando os canais usando o JQ
|
||||
|
||||
A outra maneira de encontrar canais para serem fechados é usando o comando `listchannels`. Ele retorna dados dos canais que são conhecidos pelo node. Como os canais podem ser bidirecionais, até dois nodes serão retornados por cada canal (um para cada direção).
|
||||
|
||||
No entanto, assim como no mundo real, a fofoca (gossip) da Lightning Network é muito eficaz e, em pouco tempo, iremos conhecer os milhares de canais. Isso é ótimo para enviar pagamentos via Lightning Network, mas é pouco útil para descobrir os nossos próprios canais. Fazer isso requer um pouco de trabalho do `jq`.
|
||||
|
||||
Primeiro, precisamos saber nosso próprio ID do node, que pode ser recuperado com o `getinfo`:
|
||||
```
|
||||
c$ nodeid=$(lightning-cli --testnet getinfo | jq .id)
|
||||
c$ echo $nodeid
|
||||
"03240a4878a9a64aea6c3921a434e573845267b86e89ab19003b0c910a86d17687"
|
||||
c$
|
||||
```
|
||||
Podemos então usar isso para procurar nos `listchannels` quaisquer canais onde nosso node seja a origem ou o destino:
|
||||
```
|
||||
c$ lightning-cli --testnet listchannels | jq '.channels[] | select(.source == '$nodeid' or .destination == '$nodeid')'
|
||||
{
|
||||
"source": "03240a4878a9a64aea6c3921a434e573845267b86e89ab19003b0c910a86d17687",
|
||||
"destination": "032a7572dc013b6382cde391d79f292ced27305aa4162ec3906279fc4334602543",
|
||||
"short_channel_id": "1862856x29x0",
|
||||
"public": true,
|
||||
"satoshis": 100000,
|
||||
"amount_msat": "100000000msat",
|
||||
"message_flags": 1,
|
||||
"channel_flags": 0,
|
||||
"active": true,
|
||||
"last_update": 1602639570,
|
||||
"base_fee_millisatoshi": 1,
|
||||
"fee_per_millionth": 10,
|
||||
"delay": 6,
|
||||
"htlc_minimum_msat": "1msat",
|
||||
"htlc_maximum_msat": "99000000msat",
|
||||
"features": ""
|
||||
}
|
||||
```
|
||||
Aqui está nosso node favorito `032a7572dc013b6382cde391d79f292ced27305aa4162ec3906279fc4334602543` novamente, como sendo o destino.
|
||||
|
||||
Depois de saber o que temos, podemos armazená-lo em uma variável:
|
||||
```
|
||||
c$ nodeidremote=$(lightning-cli --testnet listchannels | jq '.channels[] | select(.source == '$nodeid' or .destination == '$nodeid') | .destination')
|
||||
```
|
||||
|
||||
## Fechando um canal
|
||||
|
||||
Agora que temos um ID do node remoto, estamos prontos para usar o comando `lightning-cli close` para fechar um canal. Por padrão, ele tentará fechar o canal cooperativamente com o par, se quisermos fechá-lo unilateralmente, precisamos definir o argumento `unilateraltimeout` com o número de segundos de espera. Se definirmos como sendo 0 e o par estiver online, um fechamento mútuo ainda irá ser tentado. Para este exemplo, tentaremos um fechamento mútuo.
|
||||
```
|
||||
c$ lightning-cli --testnet close $nodeidremote 0
|
||||
{
|
||||
"tx": "02000000011d3cf2126ae36e12be3aee893b385ed6a2e19b1da7f4e579e3ef15ca234d69660000000000ffffffff021c27000000000000160014d39feb57a663803da116402d6cb0ac050bf051d9cc5e01000000000016001451c88b44420940c52a384bd8a03888e3676c150900000000",
|
||||
"txid": "f68de52d80a1076e36c677ef640539c50e3d03f77f9f9db4f13048519489593f",
|
||||
"type": "mutual"
|
||||
}
|
||||
```
|
||||
A transação de fechamento na cadeia é [f68de52d80a1076e36c677ef640539c50e3d03f77f9f9db4f13048519489593f] (https://blockstream.info/testnet/tx/f68de52d80a1076e36c67795f9f9db4f13048519489593f].
|
||||
|
||||
É essa transação de fechamento que realmente gasta os fundos que foram negociados de um lado para outro por meio de transações Lightning. Isso pode ser visto examinando a transação:
|
||||
```
|
||||
$ bitcoin-cli --named getrawtransaction txid=f68de52d80a1076e36c677ef640539c50e3d03f77f9f9db4f13048519489593f verbose=1
|
||||
{
|
||||
"txid": "f68de52d80a1076e36c677ef640539c50e3d03f77f9f9db4f13048519489593f",
|
||||
"hash": "3a6b3994932ae781bab80e159314bad06fc55d3d33453a1d663f9f9415c9719c",
|
||||
"version": 2,
|
||||
"size": 334,
|
||||
"vsize": 169,
|
||||
"weight": 673,
|
||||
"locktime": 0,
|
||||
"vin": [
|
||||
{
|
||||
"txid": "66694d23ca15efe379e5f4a71d9be1a2d65e383b89ee3abe126ee36a12f23c1d",
|
||||
"vout": 0,
|
||||
"scriptSig": {
|
||||
"asm": "",
|
||||
"hex": ""
|
||||
},
|
||||
"txinwitness": [
|
||||
"",
|
||||
"304402207f8048e29192ec86019bc83be8b4cac5d1fc682374538bed0707f58192d41c390220512ebcde122d53747feedd70c09153a40c56d09a5fec02e47642afdbb20aa2ac01",
|
||||
"3045022100d686a16084b60800fa0f6b14c25dca1c13d10a55c5fb7c6a3eb1c5f4a2fb20360220555f5b6e672cf9ef82941f7d46ee03dd52e0e848b9f094a41ff299deb8207cab01",
|
||||
"522102f7589fd8366252cdbb37827dff65e3304abd5d17bbab57460eff71a9e32bc00b210343b980dff4f2723e0db99ac72d0841aad934b51cbe556ce3a1b257b34059a17052ae"
|
||||
],
|
||||
"sequence": 4294967295
|
||||
}
|
||||
],
|
||||
"vout": [
|
||||
{
|
||||
"value": 0.00010012,
|
||||
"n": 0,
|
||||
"scriptPubKey": {
|
||||
"asm": "0 d39feb57a663803da116402d6cb0ac050bf051d9",
|
||||
"hex": "0014d39feb57a663803da116402d6cb0ac050bf051d9",
|
||||
"reqSigs": 1,
|
||||
"type": "witness_v0_keyhash",
|
||||
"addresses": [
|
||||
"tb1q6w07k4axvwqrmggkgqkkev9vq59lq5we5fcrzn"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"value": 0.00089804,
|
||||
"n": 1,
|
||||
"scriptPubKey": {
|
||||
"asm": "0 51c88b44420940c52a384bd8a03888e3676c1509",
|
||||
"hex": "001451c88b44420940c52a384bd8a03888e3676c1509",
|
||||
"reqSigs": 1,
|
||||
"type": "witness_v0_keyhash",
|
||||
"addresses": [
|
||||
"tb1q28ygk3zzp9qv223cf0v2qwygudnkc9gfp30ud4"
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"hex": "020000000001011d3cf2126ae36e12be3aee893b385ed6a2e19b1da7f4e579e3ef15ca234d69660000000000ffffffff021c27000000000000160014d39feb57a663803da116402d6cb0ac050bf051d9cc5e01000000000016001451c88b44420940c52a384bd8a03888e3676c1509040047304402207f8048e29192ec86019bc83be8b4cac5d1fc682374538bed0707f58192d41c390220512ebcde122d53747feedd70c09153a40c56d09a5fec02e47642afdbb20aa2ac01483045022100d686a16084b60800fa0f6b14c25dca1c13d10a55c5fb7c6a3eb1c5f4a2fb20360220555f5b6e672cf9ef82941f7d46ee03dd52e0e848b9f094a41ff299deb8207cab0147522102f7589fd8366252cdbb37827dff65e3304abd5d17bbab57460eff71a9e32bc00b210343b980dff4f2723e0db99ac72d0841aad934b51cbe556ce3a1b257b34059a17052ae00000000",
|
||||
"blockhash": "000000000000002a214b1ffc3a67c64deda838dd24d12154c15d3a6f1137e94d",
|
||||
"confirmations": 1,
|
||||
"time": 1602713519,
|
||||
"blocktime": 1602713519
|
||||
}
|
||||
```
|
||||
A entrada da transação é `66694d23ca15efe379e5f4a71d9be1a2d65e383b89ee3abe126ee36a12f23c1d`, que foi a transação de financiamento feita na seção [§18.3](18_3_Setting_Up_a_Channel.md). A transação tem duas saídas, uma para o node remoto e outra para a carteira local da c-lightning. A saída no índice 0 corresponde ao node remoto com um valor de 0,00010012 BTC e, a saída no índice 1 corresponde ao node local com um valor de 0,00089804 BTC.
|
||||
|
||||
A Lightning mostrará da mesma forma 89.804 satoshis retornados como um novo UTXO em nossa carteira:
|
||||
|
||||
```
|
||||
$ lightning-cli --network=testnet listfunds
|
||||
{
|
||||
"outputs": [
|
||||
{
|
||||
"txid": "66694d23ca15efe379e5f4a71d9be1a2d65e383b89ee3abe126ee36a12f23c1d",
|
||||
"output": 1,
|
||||
"value": 99847,
|
||||
"amount_msat": "99847000msat",
|
||||
"scriptpubkey": "00142fe02e5be9283e8c5bcb93ae61421baf8cb64f9c",
|
||||
"address": "tb1q9lszuklf9qlgck7tjwhxzssm47xtvnuu4jslf8",
|
||||
"status": "confirmed",
|
||||
"blockheight": 1862856,
|
||||
"reserved": false
|
||||
},
|
||||
{
|
||||
"txid": "f68de52d80a1076e36c677ef640539c50e3d03f77f9f9db4f13048519489593f",
|
||||
"output": 1,
|
||||
"value": 89804,
|
||||
"amount_msat": "89804000msat",
|
||||
"scriptpubkey": "001451c88b44420940c52a384bd8a03888e3676c1509",
|
||||
"address": "tb1q28ygk3zzp9qv223cf0v2qwygudnkc9gfp30ud4",
|
||||
"status": "confirmed",
|
||||
"blockheight": 1863006,
|
||||
"reserved": false
|
||||
}
|
||||
],
|
||||
"channels": [
|
||||
{
|
||||
"peer_id": "032a7572dc013b6382cde391d79f292ced27305aa4162ec3906279fc4334602543",
|
||||
"connected": false,
|
||||
"state": "ONCHAIN",
|
||||
"short_channel_id": "1862856x29x0",
|
||||
"channel_sat": 89987,
|
||||
"our_amount_msat": "89987000msat",
|
||||
"channel_total_sat": 100000,
|
||||
"amount_msat": "100000000msat",
|
||||
"funding_txid": "66694d23ca15efe379e5f4a71d9be1a2d65e383b89ee3abe126ee36a12f23c1d",
|
||||
"funding_output": 0
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
### Compreendendo os tipos de canais de fechamento.
|
||||
|
||||
O comando `close` do RPC tenta fechar um canal cooperativamente com nosso par ou unilateralmente após o argumento `unilateraltimeout` expirar. Isso traz alguma discussão adicional, pois vai ao cerne do design que não precisa de nenhuma confiança da Lightning:
|
||||
|
||||
Cada participante de um canal pode criar tantos pagamentos Lightning para a contraparte quanto os fundos permitirem. Na maioria das vezes não haverá desentendimentos entre os participantes, portanto, haverá apenas duas transações na rede, uma abrindo e outra fechando o canal. No entanto, pode haver cenários em que um par não está online ou não concorda com o estado final do canal ou quando alguém tenta roubar fundos da outra parte. É por isso que existem fechamentos cooperativos e forçados.
|
||||
|
||||
#### Fechamento Cooperativo
|
||||
|
||||
No caso de um fechamento cooperativo, ambos os participantes do canal concordam em fechar o canal e estabelecer o estado final na blockchain. Ambos os participantes devem estar online, pois o fechamento é realizado transmitindo um gasto incondicional da transação de financiamento com uma saída para cada par.
|
||||
|
||||
#### Fechamento Forçado
|
||||
|
||||
No caso de fechamento forçado, apenas um participante está online ou os participantes discordam sobre o estado final do canal. Nessa situação, um par pode realizar um fechamento unilateral do canal sem a cooperação do outro node. É executado transmitindo uma transação de confirmação que confirma o estado do canal anterior que ambas as partes concordaram. Esta transação de compromisso contém o estado do canal dividido em duas partes: O saldo de cada participante e todos os pagamentos pendentes (HTLCs).
|
||||
|
||||
Para realizar este tipo de fechamento, devemos especificar um argumento `unilateraltimeout`. Se este valor não for zero, o comando de fechamento fechará unilateralmente o canal quando esse número de segundos for atingido:
|
||||
```
|
||||
c$ lightning-cli --network=testnet close $newidremote 60
|
||||
{
|
||||
"tx": "0200000001a1091f727e6041cc93fead2ea46b8402133f53e6ab89ab106b49638c11f27cba00000000006a40aa8001df85010000000000160014d22818913daf3b4f86e0bcb302a5a812d1ef6b91c6772d20",
|
||||
"txid": "02cc4c647eb3e06f37fcbde39871ebae4333b7581954ea86b27b85ced6a5c4f7",
|
||||
"type": "unilateral"
|
||||
}
|
||||
|
||||
```
|
||||
## Resumo: Fechando um canal
|
||||
|
||||
Ao fechar um canal, realizamos uma transação na blockchain encerrando nosso relacionamento financeiro com o node remoto. Para fechar um canal, devemos levar em consideração nosso status e o tipo de fechamento que desejamos executar.
|
||||
|
||||
## O Que Vem Depois?
|
||||
|
||||
Vamos continuar "Usando a Lightning" na seção [§19.4: Expandindo a rede Lightning](19_3_Closing_a_Channel.md).
|
60
pt/19_4_Lightning_Network_Review.md
Normal file
60
pt/19_4_Lightning_Network_Review.md
Normal file
@ -0,0 +1,60 @@
|
||||
# 19.4: Expandindo a Lightning Network
|
||||
|
||||
> :information_source: **NOTA:** Esta seção foi adicionada recentemente ao curso e é um rascunho inicial que ainda pode estar aguardando revisão.
|
||||
|
||||
Esses dois capítulos cobriram apenas algumas das atividades mais importantes da Lightning. Há muito mais que pode ser feito e muitas variedades possíveis. A seguir, daremos algumas dicas importantes.
|
||||
|
||||
## Usando plugins c-lightning
|
||||
|
||||
O c-lightning é uma implementação leve, altamente personalizável e compatível com o padrão do protocolo Lightning Network. Ele estende a funcionalidade usando plugins. Principalmente, esses são subprocessos que são iniciados pelo daemon `lightningd` e podem interagir com o `lightningd` de várias maneiras:
|
||||
|
||||
* As opções de linha de comando permitem que os plugins registrem os próprios argumentos usando a linha de comando, que são então expostos por meio do `lightningd`;
|
||||
* A passagem de comando JSON-RPC permite que os plugins adicionem os próprios comandos à interface JSON-RPC;
|
||||
* As assinaturas de fluxo de eventos fornecem plug-ins com um mecanismo de notificação baseados em push para o `lightnind`;
|
||||
* Hooks são uma opção primitiva que permite que os plugins sejam notificados sobre eventos no daemon `lightningd` e modifiquem o comportamento ou transmitam comportamentos personalizados.
|
||||
|
||||
Um plugin pode ser escrito em qualquer linguagem e pode se comunicar com o `lightningd` através do stdin e stdout do plugin. O JSON-RPCv2 é usado como protocolo no topo dos dois fluxos, com o plugin atuando como servidor e `lightningd` atuando como cliente.
|
||||
|
||||
O repositório `lightningd` GitHub mantém uma lista atualizada de [plugins](https://github.com/lightningd/plugins) disponíveis.
|
||||
|
||||
## Usando Mobile Wallets
|
||||
|
||||
Atualmente, sabemos de duas carteiras de dispositivos móveis da Lightning que suportam a implementação do c-lightning.
|
||||
|
||||
Para dispositivos iOS, o FullyNoded é uma carteira de Bitcoin iOS open source que se conecta através do serviço autenticado Tor V3 ao nosso próprio full node. A funcionalidade FullyNoded está atualmente em desenvolvimento ativo e na fase beta inicial de testes.
|
||||
|
||||
* [FullyNoded](https://github.com/Fonta1n3/FullyNoded/blob/master/Docs/Lightning.md)
|
||||
|
||||
O SparkWallet é uma carteira GUI minimalista para a c-lightning, acessível pela web ou por meio de aplicativos móveis e de desktop para Android.
|
||||
|
||||
* [SparkWallet](https://github.com/shesek/spark-wallet)
|
||||
|
||||
## Usando diferentes implementações da Lightning
|
||||
|
||||
O c-lightning não é a nossa única opção. Hoje, existem três implementações amplamente utilizadas para a Lightning Network. Todos seguem as [Documentações Base para a Tecnologia Lightning (BOLT)](https://github.com/lightningnetwork/lightning-rfc), que descrevem um protocolo de segunda camada para transferências de bitcoins offchain. As especificações são atualmente um trabalho em andamento que ainda está sendo elaborado.
|
||||
|
||||
| Nome | Descrição | BitcoinStandup | Linguagem | Repositório |
|
||||
| ------------- | ------------- | :---: | ------------- | ------------- |
|
||||
| C-lighting | Blockstream | X | C | [Download](https://github.com/ElementsProject/lightning) |
|
||||
| LND | Lightning Labs | X | Go | [Download](https://github.com/lightningnetwork/lnd) |
|
||||
| Eclair | ACINQ | - | Scala | [Download](https://github.com/ACINQ/eclair) |
|
||||
|
||||
## Fazendo backups
|
||||
|
||||
Nosso node Lightning precisa estar online o tempo todo, caso contrário, nossa contraparte pode enviar um status de canal anterior e roubar nossos fundos. No entanto, há outro cenário em que os fundos podem ser perdidos, que é quando ocorre uma falha no hardware que impede o node de estabelecer um fechamento cooperativo com a contraparte. Isso provavelmente significará que, se não tivermos uma cópia exata do estado do canal antes da falha, teremos um estado inválido que pode fazer com que o outro node o considere como uma tentativa de fraude e use a transação penalizada. Nesse caso, todos os fundos serão perdidos. Para evitar esta situação indesejável, uma solução baseada na alta disponibilidade do banco de dados postgresQL [existe](https://github.com/gabridome/docs/blob/master/c-lightning_with_postgresql_reliability.md).
|
||||
|
||||
PS: Não testamos esta solução.
|
||||
|
||||
## Resumo: Expandindo a Lightning Network
|
||||
|
||||
Podemos usar diferentes implementações, plugins, carteiras para celular e backups para expandir nossa experiência com a Lightning.
|
||||
|
||||
## O Que Vem Depois?
|
||||
|
||||
Concluímos todo o livro Aprendendo sobre o Bitcoin usando a Linha de Comando, embora não precise visitar os [Apêndices](A0_Apêndices.md) que possuem configurações alternativas, podemos fazer isso agora.
|
||||
|
||||
Caso contrário, nós o encorajamos a ingressar nas comunidades de desenvolvedores e programadores e também, colocar nosso novo conhecimento para funcionar.
|
||||
|
||||
Também podemos nos ajudar aqui em Blockchain Commons com issues ou PRs para aprender sobre o Bitcoin ou para qualquer um de nossos outros repositórios, ou podemos até mesmo nos tornar um [patrocinador](https://github.com/sponsors/BlockchainCommons). Também podemos ajudar divulgando o trabalho, contando às pessoas nas redes sociais sobre o curso e o que aprendemos com ele!
|
||||
|
||||
Agora vá lá e faça da comunidade do Bitcoin um lugar melhor!
|
Loading…
x
Reference in New Issue
Block a user