Skip to content

Instantly share code, notes, and snippets.

@bordalix
Created March 19, 2022 15:56
Show Gist options
  • Save bordalix/593cda2bd652919306e0a7689821108a to your computer and use it in GitHub Desktop.
Save bordalix/593cda2bd652919306e0a7689821108a to your computer and use it in GitHub Desktop.
As transações em Bitcoin são constituídas por inputs e outputs.
Os inputs identificam de onde vêm os bitcoins, os outputs para onde vão os bitcoins.
Os outputs são pequenos programas que bloqueiam os bitcoins contra determinado challenge. Por exemplo, um output pode ser “este bitcoins pertencem a quem provar que tem a chave privada que originou a seguinte chave publica”.
Portanto, um output seria qualquer coisa do género:
<public key> : 02b4632d… (33 bytes)
<opcode>: checkSig (2 bytes)
Neste caso, o output é um P2PK (Pay to Public Key) e para o “desbloquear”, a transação que o usar como input terá de apresentar uma assinatura feita com a chave privada correspondente (checkSig = check signature).
Vamos assumir que eu controlo essa chave privada (os bitcoins são meus) e que esse UTXO (Unspent Transaction Output) vale 1 milhão de satoshis (€400).
Eu quero enviar-te 100.000 satoshis. O que eu faço é criar uma transação que tem esse utxo como input. Para o efeito, eu tenho de:
1. Identificar o utxo:
- Identificador da transação onde ele apareceu - TxId (32 bytes)
- Índice na lista de utxos dessa transação - vout (1 byte)
2. Desbloquear o utxo:
- Assinar com a respectiva chave privada
- Adicionar a assinatura à transação (73 bytes)
Como o meu utxo é superior ao valor que eu quero transferir-te, não preciso de mais inputs. Se não fosse, ia adicionando inputs até ter um valor superior ou igual ao valor que quero enviar-te.
Agora tenho de fazer os outputs da minha transação:
- Um output terá a tua chave pública (endereço) que tu me enviaste de alguma forma, no valor de 100.000 satoshis
- Um output que terá uma chave pública minha (o troco) no valor de 900.000 satoshis.
Posto isto, divulgo esta transação pela rede para que os miners a incluam num bloco, ou como se diz na gíria, para que a transação seja confirmada.
Após a confirmação, o utxo original morreu (foi spent) e temos agora 2 novos utxos (o teu de 100.000 e o meu de 900.000). A soma de todos os utxos é igual ao número de bitcoins em circulação.
Esta transação tem um input com 106 bytes de informação, e 2 outputs com 35 bytes cada, ou seja, ocupa 176 bytes. Quanto maior, mais recursos usa no sistema (largura de banda e espaço nos blocos) pelo que existe o incentivo de pagar-se fees por byte.
O fee é calculado pela diferença entre o valor dos inputs e o valor dos outputs. No exemplo que dei, eu não estou a pagar fees (porque ambos os valores são iguais) mas se o meu troco fosse 890.000 então o miner ficaria com os 10.000 que faltam.
Caso haja mais transações a querer ser confirmadas do que espaço disponível em bloco, os miners irão escolher as transações que pagam mais fees. Caso contrário, até transações com fee 0 entram. Ao domingo de manhã ainda é possível ;)
Tudo isto para dizer que as transações em Bitcoin continuam muito baratas (<1€) mas caras o suficiente para não servirem para micro-pagamentos, daí o Lightning.
O Lightning resolve o problema não indo à blockchain. Eu e tu metemos satoshis num mesmo output, ou seja, criamos uma transação com inputs do meu lado e do teu. Vamos supor 10.000 satoshis cada um, que pode ser desbloqueado de várias formas alternativas:
- Com a assinatura de ambos, é o que quisermos fazer
- Só com a assinatura de um, ok, mas então o outro tem 2 semanas para poder “reclamar”.
Como eu não confio em ti, antes de colocar os satoshis no pote eu exijo-te uma transação já assinada por ti que diz que eu sou dono de 10.000 satoshis do pote. Ou seja, uma transação que tem esse output partilhado como input, e que um dos outputs sou eu no valor de 10.000 satoshis.
Se alguma coisa correr mal, eu pego nessa transação, adiciono a minha assinatura e envio para a rede e recupero os meus 10.000 satoshis. Faço o mesmo por ti. Se tudo correr bem, nunca iremos precisar de enviar estas transações para a rede.
A este output (utxo) partilhado chama-se um canal de Lightning.
Para enviar-te 1.000 satoshis “no canal”, tu primeiro exiges-me uma transacção assinada por mim que diz que tu és dono de 11.000 e que eu sou dono de 9.000. Só depois de receberes isso é que consideras que recebeste.
A estas transações chama-se PSBT (Partially Signed Bitcoin Transactions) e é a base do Lightning. Os PSBT tem um número de sequência, e um número maior sobrepõem-se às anteriores. A transmissão de valor em Lightning é feita através da troca de PSBTs, que nunca vão à chain. Por princípio nunca haverá discrepância entre o Lightning e o Bitcoin.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment