Dominando Bitcoin
-
Author
mayaranogueira -
Category
Documents
-
view
258 -
download
6
Embed Size (px)
Transcript of Dominando Bitcoin
-
7/26/2019 Dominando Bitcoin
1/289
-
7/26/2019 Dominando Bitcoin
2/289
Elogios para 'Mastering Bitcoin'
"Quando eu falo sobre bitcoin para o pblico em geral, s vezes me perguntam
'mas como que isso realmente funciona?' Agora eu tenho uma tima resposta
para essa pergunta, porque qualquer um que ler o Mastering Bitcointer um
entendimento aprofundado de como ele funciona e estar bem preparado paradesenvolver a nova gerao de incrveis aplicativos de criptomoedas."
Gavin Andresen, Cientista Chefe da Bitcoin Foundation
"As tecnologias do Bitcoin e da blockchain esto se tornando peas
fundamentais na construo da prxima gerao da internet. Os melhores e
mais brilhantes profissionais do Vale do Silcio esto trabalhando nisso. O livro
do Andreas ir ajud-lo juntar-se revoluo do software no mundo dasfinanas."
Naval Ravikant, Co-fundador da AngelList
"Mastering Bitcoin a melhor referncia tcnica sobre o bitcoin atualmente
disponvel. E o bitcoin provavelmente ser visto retrospectivamente como a
tecnologia mais importante dessa dcada. Como tal, esse livro um item
indispensvel para qualquer desenvolvedor de software, especialmente
aqueles interessados em construir aplicativos com o protocolo bitcoin.
Altamente recomendado."
Balaji S. Srinivasan (@balajis), General Partner
A inveno da Blockchain do Bitcoin representa uma plataforma
completamente nova, que ir possibilitar um ecosistema to amplo e diverso
quanto a prpria Internet. Como um dos proeminentes lderes da ideologia,
Andreas Antonopoulos a escolha perfeita para escrever esse livro."
Roger Ver, Empreendedor e Investidor Bitcoin
1
-
7/26/2019 Dominando Bitcoin
3/289
ndice
-
7/26/2019 Dominando Bitcoin
4/289
Prefcio
Escrevendo o Livro do Bitcoin
A primeira vez que ouvi falar em bitcoin foi em meados de 2011. Minha reao imediata foi mais ou
menos essa "Pfft! Dinheiro de nerd!" e eu ignorei-o por mais seis meses, sem compreender a sua
importncia. Esta uma reao que eu tenho observado com frequncia entre muitas das pessoas mais
inteligentes que conheo, o que me d algum consolo. A segunda vez que me deparei com bitcoin, em
uma lista de discusso, eu decidi ler o seu "manual de instrues" oficial, o white paper escrito por
Satoshi Nakamoto, para ver do que se tratava. Ainda me lembro do momento em que eu terminei de
ler aquelas nove pginas, quando eu percebi que bitcoin no era simplesmente uma moeda digital,
mas uma rede de confiana que tambm poderia servir de base para aplicaes muito mais avanadas
do que apenas moedas. Aps constatar que o bitcoin no dinheiro, mas sim uma rede de confiana
descentralizada, comecei uma viagem de quatro meses para devorar cada pedao de informao que
eu poderia encontrar sobre o assunto. Eu me tornei obcecado e encantado, gastando 12 ou mais horas
por dia colado ao monitor, lendo, escrevendo, codificando e aprendendo o mximo que pude. Apspular muitas refeies, sa desse perodo de obsesso 9 quilos mais magro e determinado a dedicar-me
a trabalhar com bitcoin.
Dois anos depois, aps criar vrias pequenas startups para explorar servios e produtos relacionados
ao bitcoin, eu decidi que estava na hora de escrever meu primeiro livro. O Bitcoin foi um tpico que
me levou a um frenesi de criatividade e consumiu meus pensamentos; Foi a tecnologia mais
empolgante que eu encontrei desde que conheci a Internet. Estava na hora de compartilhar minha
paixo sobre essa incrvel tecnologia com uma audincia mais ampla.
Pblico Alvo
Esse livro foi escrito principalmente para programadores. Se voc sabe alguma linguagem de
programao, esse livro ir ensin-lo como as moedas criptogrficas funcionam, como utiliz-las e
como desenvolver softwares que trabalhem com elas. Os primeiros captulos tambm so adequados
como uma introduo aprofundada ao bitcoin para no-programadores, que queiram entender o
funcionamento interno do bitcoin e das criptomoedas.
Convenes Usadas Neste Livro
As seguintes convenes tipogrficas so usadas neste livro:
Itlico
Indica novos termos, URLs, endereos de e-mail, nomes e extenses de arquivos.
Largura constante
Usada para listagem de programas, assim como dentro de pargrafos para se referir a elementos de
programas como variveis e nomes de funes, banco de dados, tipos de dados, variveis de
1
-
7/26/2019 Dominando Bitcoin
5/289
-
7/26/2019 Dominando Bitcoin
6/289
comemorado. apoiado e recompensado por toda a comunidade bitcoin desde o seu incio at o fim.
Mais do que tudo, esse livro me permitiu ser uma parte de uma comunidade maravilhosa por dois
anos e no posso agradecer suficientemente por eu ter sido aceito por essa comunidade. H um
nmero imenso de pessoas para ser mencionadas pelo nome pessoas que encontrei em
conferncias, eventos, seminrios, meetups, encontros de pizza e pequenas reunies, assim como
tantos que se comunicam comigo via Twitter, Reddit, bitcointalk.org e pelo GitHub e que impactaram
esse livro de alguma forma. Cada ideia, analogia, pergunta, resposta e explicao que voc encontrar
nesse livro foi de algum modo inspirada, testada ou melhorada atravs da interao com acomunidade. Muito obrigado a todos pelo apoio; esse livro no teria acontecido sem vocs. Serei
eternamente grato.
A jornada para se tornar um autor comea, claro, muito antes do primeiro livro. Minha lngua nativa
(e tambm na escola) era o grego, e por isso tive que fazer um curso emergencial de ingls escrito
ainda no meu primeiro ano de universidade. Sou muito grato a Diana Kordas, minha professora de
ingls escrito, que muito me ajudou a construir a confiana e as habilidades que precisei naquele ano.
Mais para frente, j como profissional, desenvolvi minhas habilidades em escrita tcnica sobre data
centers, escrevendo para a revista Network World. Meu agradecimentos a John Dix e John Gallant, que
me deram meu primeiro trabalho como colunista na Network World, ao meu editor Michael Cooney emeu colega Johna Till Johnson, que editaram minhas colunas e as fizeram publicveis. Escrever 500
palavras por semana durante quatro anos me deu experincia suficiente para eventualmente
considerar a me tornar um autor. Obrigado Jean de Vera por ter me encorajado a tornar-me um
autor e por sempre acreditar e insistir que eu tinha um livro dentro de mim.
Obrigado tambm queles que me apoiaram quando enviei OReilly minha proposta de livro, ao
enviarem referncias e revisarem o esboo. Especificamente, obrigado a John Gallant, Gregory Ness,
Richard Stiennon, Joel Snyder, Adam B. Levine, Sandra Gittlen, John Dix, Johna Till Johnson, Roger Ver,
and Jon Matonis. Um obrigado especial ao Richard Kagan e Tymon Mattozko, que revisaram as
primeiras verses da proposta e a Matthew Owain Taylor, que fez a editorao da proposta.
Obrigado ao Cricket Liu, autor do ttulo DNS and BIND, que me apresentou OReilly. Outro obrigado
para Michael Loukides e Allyson Macdonald da OReilly, que trabalharam por meses, ajudando na
confeco desse livro. A Allyson foi especialmente paciente quando os prazos eram perdidos e as
entregas atrasavam quando a vida fazia sua interveno em nossa agenda planejada.
Os primeiros rascunhos dos primeiros captulos foram os mais difceis, pois o bitcoin um assunto
difcil de ser desvendado. Cada vez que eu puxava um fio sobre a tecnologia bitcoin, eu tinha que
puxar o novelo inteiro. Eu fiquei travado repetidas vezes, assim como um pouco desanimado -
enquanto lutava para fazer um tpico de fcil entendimento e criar uma narrativa ao redor de umassunto to denso tecnicamente. Eventualmente, decidi contar a estria do bitcoin atravs de estrias
de pessoas que usavam a criptomoeda e todo o livro ficou fcil de ser escrito. Devo meus
agradecimentos ao meu amigo e mentor, Richard Kagan, que me ajudou a desvendar a estria e a
superar os momentos de "bloqueio de escritor" e a Pamela Morgan, que revisou os primeiros
rascunhos de cada captulo e fez as perguntas difceis, com o propsito de torn-los melhores.
Obrigado tambm aos desenvolvedores do grupo San Francisco Bitcoin Developers Meetup e a Tariq
Lewis, co-fundador do grupo, por me ajudar a testar o material inicial.
3
-
7/26/2019 Dominando Bitcoin
7/289
Durante o desenvolvimento do livro, eu disponibilizei os primeiros rascunhos via GitHub e convidei o
pblico para comentar. Mais de uma centena de comentrios, sugestes, correes e contribuies me
foram enviadas em resposta. Tais contribuies foram reconhecidas e agradecidas publicamente em
Lanamento do Rascunho Inicial (Contribuies no GitHub). Obrigado especial para Minh T. Ngyuen,
que se voluntariou para gerenciar as contribuies no GitHub e muitas outras que ele prprio
adicionou. Obrigado tambm ao Andrew Naugler pelo desenho do infogrfico.
Uma vez que o livro foi rascunhado, ele passou por diversas rodadas de reviso tcnica. Obrigado aoCricket Liu e Lorne Lantz pelas extensas revises, comentrios e apoio.
Vrios desenvolvedores de bitcoin contriburam com exemplos de cdigos, revises, comentrios e
encorajamento. Obrigado a Amir Taaki e Eric Voskuil pelos exemplos de snippets de cdigo e muitos
comentrios de valor; a Vitalik Buterin e Richard Kiss pela ajuda com a matemtica da curva elptica e
contribuies com o cdigo; Gavin Andresen pelas correes, comentrios e encorajamento; Michalis
Kargakis pelos comentrios, contribuies e escrita btcd; e a Robin Inge pelos envios de erratas,
melhorando a segunda impresso do livro.
Eu devo o meu amor pelas palavras e livros minha me, Theresa, que me criou em uma casa comlivros enfileirados em cada parede. Minha me tambm me deu meu primeiro computador em 1982,
mesmo ela sendo uma tecnfoba assumida. Meu pai, Menelaos, um engenheiro civil que recm
publicou seu primeiro livro aos 80 anos de idade, foi quem me ensinou o pensamento lgico e
analtico, bem como o amor pela cincia e engenharia.
Obrigado a todos por me apoiarem durante toda esta jornada.
Lanamento do Rascunho Inicial (Contribuies no GitHub)
Muitos contribuidores enviaram comentrios, correes e adies para a verso inicial no GitHub.
Muito obrigado a todos por suas contribuies para esse livro. Abaixo, uma lista de contribuidores
notveis no GitHub, incluindo seus IDs em parnteses:
Minh T. Nguyen, editor de contribuio no GitHub (enderminh)
Ed Eykholt (edeykholt)
Michalis Kargakis (kargakis)
Erik Wahlstrm (erikwam)
Richard Kiss (richardkiss)
Eric Winchell (winchell)
Sergej Kotliar (ziggamon)
Nagaraj Hubli (nagarajhubli)
ethers
Alex Waters (alexwaters)
Mihail Russu (MihailRussu)
4
http://-/?-http://-/?- -
7/26/2019 Dominando Bitcoin
8/289
Ish Ot Jr. (ishotjr)
James Addison (jayaddison)
Nekomata (nekomata-3)
Simon de la Rouviere (simondlr)
Chapman Shoop (belovachap)
Holger Schinzel (schinzelh)
effectsToCause (vericoin)
Stephan Oeste (Emzy)
Joe Bauers (joebauers)
Jason Bisterfeldt (jbisterfeldt)
Ed Leafe (EdLeafe)
Edio AbertaEssa a edio aberta do "Mastering Bitcoin", publicado para tradues sob a licena Creative
Commons Atribuio-CompartilhaIgual (CC-BY-SA). Essa licena permite que voc leia, compartilhe,
copie, imprima, venda ou reutilize esse livro ou partes dele, desde que voc:
Utilize a mesma licena (Compartilha-Igual)
Inclua atribuio
Atribuio
Mastering Bitcoin por Andreas M. Antonopoulos LLC https://bitcoinbook.info
Copyright 2016, Andreas M. Antonopoulos LLC
Traduo
Se voc estiver lendo esse livro em um idioma que no seja o ingls, ele foi traduzido por voluntrios.
As seguintes pessoas contriburam para essa traduo:
Andr Torres (@Criptonauta) - Coordenao e traduo / Rodrigo Castilhos - Reviso e traduo
Fernando Bitti Loureiro
Fernando Paladini, Anderson Juhasc, Paulo Gomes
5
http://creativecommons.org/licenses/by-sa/4.0/http://creativecommons.org/licenses/by-sa/4.0/https://bitcoinbook.info/https://bitcoinbook.info/http://creativecommons.org/licenses/by-sa/4.0/http://creativecommons.org/licenses/by-sa/4.0/ -
7/26/2019 Dominando Bitcoin
9/289
Glossrio Rpido
Este glossrio rpido contm muitos dos termos relacionados ao bitcoin que sero usadas durante todo
o livro. Recomendamos que favorite essa seo para ter uma referncia rpida, caso necessrio.
endereo
Um endereo bitcoin se parece com 1DSrfJdB2AnWaFNgSbv3MZC2m74996JafV. Ele consiste de umasequncia de letras e nmeros comeando com um "1" (nmero um). Assim como voc pede para
algum enviar um email para seu endereo de email, voc pediria a outras pessoas para enviarem
bitcoin para seu endereo bitcoin.
bip
Bitcoin Improvement Proposals (Propostas de Melhoria Bitcoin). Um conjunto de propostas que
membros da comunidade bitcoin tm feito para melhorar o bitcoin. Por exemplo, BIP0021 uma
proposta para melhorar a estrutura do Identificador Uniforme de Recursos (URI) do bitcoin.
bitcoinO nome da unidade monetria (a moeda), a rede e o software.
bloco
Um agrupamento de transaes, marcadas com um registro de tempo e uma impresso digital do
bloco anterior. O cabealho do bloco codificado para produzir uma prova de trabalho, assim
validando as transaes. Blocos vlidos so adicionados blockchain atravs do consenso da rede.
blockchain
Uma lista de blocos validados, cada um ligado ao seu predecessor at chegar ao bloco gnesis.
confirmaes
Uma vez que uma transao includa em um bloco, ela recebe uma confirmao. Assim que outro
bloco minerado na mesma blockchain, a transao tem duas confirmaes, e assim continua. Seis
ou mais confirmaes so consideradas como prova suficiente de que a transao no pode ser
desfeita.
dificuldade
Um parmetro que afeta toda a rede e controla o quanto de esforo computacional necessrio
para produzir uma prova de trabalho.
meta de dificuldade
Uma dificuldade na qual toda a computao na rede encontrar blocos aproximadamente a cada 10
minutos.
calibragem da meta de dificuldade
Um reclculo da meta de dificuldade que afeta toda a rede e ocorre a cada 2.106 blocos, levando em
considerao o poder de hashing dos 2.106 blocos anteriores.
1
-
7/26/2019 Dominando Bitcoin
10/289
-
7/26/2019 Dominando Bitcoin
11/289
Introduo
O que Bitcoin?
Bitcoin um conjunto de conceitos e tecnologias que formam a base de um ecossistema de dinheiro
digital. As unidades de moeda chamadas bitcoins so usadas para armazenar e transmitir valor entreos participantes na rede Bitcoin. Os usurios Bitcoin comunicam-se entre si utilizando o protocolo
bitcoin principalmente atravs da Internet, mas outras formas de rede tambm podem ser usadas. A
implementao da pilha do protocolo bitcoin, est disponvel como software de cdigo aberto, pode ser
executada em uma ampla variedade de dispositivos de computao, incluindo laptops e smartphones,
o que torna a tecnologia de fcil acesso.
Os usurios podem transferir bitcoins atravs da rede para fazer as mesmas coisas que as moedas
convencionais podem fazer, incluindo compra e venda de bens, envio de dinheiro a pessoas e
organizaes ou mesmo a extenso de crdito. Os bitcoins podem ser comprados, vendidos ou trocados
por outras moedas em casas de cmbio especializadas - as populares exchanges. De certo modo, oBitcoin o dinheiro perfeito para a Internet, pois rpido, seguro e sem fronteiras.
Ao contrrio das moedas tradicionais, os bitcoins so inteiramente virtuais. No h moedas fsicas ou
mesmo moedas digitais por si s. As moedas de bitcoin se subentendem como transaes que
transferem valor de um remetente a um destinatrio. Os usurios de bitcoin possuem chaves que lhes
permitem provar a posse de transaes na rede bitcoin, desbloqueando o valor (em bitcoins) a ser
gasto e o transferindo para um novo destinatrio. Essas chaves geralmente so armazenadas em uma
carteira digital no computador ou smartphone de cada usurio. A posse da chave que desbloqueia uma
transao o nico pr-requisito para gastar os bitcoins, pondo o controle inteiramente nas mos de
cada usurio.
Bitcoin um sistema distribudo ponto-a-ponto (peer-to-peer ou P2P). Como tal, no existe um servidor
"central" ou ponto de controle. Os bitcoins so criados (gerados) atravs de um processo chamado de
"minerao", que consiste em competir para encontrar solues para um problema matemtico
enquanto se processam transaes de bitcoins. Qualquer participante na rede bitcoin (ou seja,
qualquer usando um dispositivo que execute a implementao completa de protocolo Bitcoin) pode ser
um minerador, bastando utilizar o poder de processamento de seu computador para verificar e
registrar transaes. Em mdia, a cada 10 minutos algum capaz de validar as transaes dos ltimos
10 minutos, sendo recompensado com bitcoins novinhos em folha. Essencialmente, a minerao de
bitcoins descentraliza as funes de emisso de moeda e de compensao tipicamente atribudas a umbanco central, dessa forma substituindo a necessidade de qualquer banco central.
O protocolo bitcoin contm algoritmos que regulam a funo de minerao atravs da rede. A
dificuldade da tarefa de processamento que os mineradores devem realizar registrar com sucesso
um bloco de transaes na rede bitcoin ajusta-se dinamicamente de tal forma que, em mdia,
algum bem-sucedido a cada 10 minutos, independentemente de quantos mineradores (e CPUs)
estejam trabalhando na tarefa a qualquer momento. O protocolo tambm reduz metade, a cada 4
anos, a taxa com que novos bitcoins so criados, limitando, assim, o nmero total de bitcoins que sero
1
-
7/26/2019 Dominando Bitcoin
12/289
-
7/26/2019 Dominando Bitcoin
13/289
-
7/26/2019 Dominando Bitcoin
14/289
milhes, transmitida instantaneamente e processada sem nenhuma taxa.
Satoshi Nakamoto afastou-se do pblico em abril de 2011, deixando a responsabilidade pelo
desenvolvimento do cdigo e da rede nas mo de um animado grupo de voluntrios. A identidade da
pessoa ou pessoas por trs do bitcoin ainda desconhecida. No entanto, nem Satoshi Nakamoto nem
qualquer outra pessoa exerce controle sobre o sistema bitcoin, que opera baseado em princpios
matemticos totalmente transparentes. A inveno em si revolucionria e j criou um novo campo
de estudos nas reas da computao distribuda, economia e econometria.
Uma Soluo para um Problema de Computao Distribuda
O invento de Satoshi Nakamoto tambm uma soluo prtica para um problema que at ento
no estava resolvido na computao distribuda, conhecido como o "Problema dos Generais
Bizantinos". Em resumo, o problema consiste em tentar tomar uma deciso atravs do
intercmbio de informaes sobre uma rede pouco confivel e potencialmente comprometida. A
soluo de Satoshi Nakamoto, que utiliza o conceito de prova de trabalho (proof-of-work) para
alcanar o consenso sem uma autoridade central confivel, representa um enorme avano na
cincia de computao distribuda e possui amplas aplicaes alm da ser um meio de
pagamento. Tal soluo pode ser usada para alcanar consenso em redes descentralizadas para
provar a honestidade de eleies, loterias, registros de bens, notarizao digital e mais.
Usos do Bitcoin, Seus Usurios e Suas Histrias
Bitcoin uma tecnologia usada para representar dinheiro, que fundamentalmente uma linguagem
para a troca de valor entre pessoas. Vamos conhecer as histrias de pessoas que esto usando bitcoin e
alguns dos usos mais comuns da moeda e do protocolo. Iremos reutilizar essas histrias ao longo dolivro para ilustrar os usos do dinheiro digital na vida real e como eles se tornaram possveis por meio
das vrias tecnologias que so partes do bitcoin.
Varejo de baixo valor nos Estados Unidos
A Alice mora na rea norte da baa da Califrnia. Ela ouviu falar sobre o bitcoin atravs dos seus
amigos e quer comear a us-lo. Iremos acompanhar a histria de como ela aprende a respeito do
bitcoin, adquire algumas moedas e ento gasta alguns de seus bitcoins para comprar uma xcara de
caf no Bobs Caf em Palo Alto. Esta histria ir nos apresentar ao software, s casas de cmbio e
transaes bsicas desde a perspectiva de um consumidor do varejo.
Varejo de produtos de alto valor nos Estados Unidos
A Carol dona de uma galeria de arte em San Francisco. Ela vende pinturas caras por bitcoin. Esta
histria nos vai apresentar os riscos de um ataque de consenso "51%" para varejistas de produtos de
alto valor.
Servios de contratos internacionais
O Bob, o dono da cafeteria de Palo Alto, est montando um novo website. Ele contratou um
4
-
7/26/2019 Dominando Bitcoin
15/289
-
7/26/2019 Dominando Bitcoin
16/289
-
7/26/2019 Dominando Bitcoin
17/289
-
7/26/2019 Dominando Bitcoin
18/289
Figure 2. O novo endereo bitcoin da Alice, na aba Solicitar do cliente Multibit
A parte mais importante desta tela o endereo bitcoinda Alice. Assim como um endereo de email, a
Alice pode compartilhar este endereo e qualquer um pode us-lo para mandar dinheiro diretamente
carteira dela. Na tela aparece uma longa sequncia de letras e nmeros:
1Cdid9KFAaatwczBwBttQcwXYCpvK8h7FK. Junto ao endereo bitcoin da carteira est um cdigo QR,
uma forma de cdigo de barras que contm a mesma informao, mas em um formato que pode ser
escaneado pela cmera de um smartphone. O cdigo QR a imagem quadrada que contm pequenos
quadrados preto e brancos no lado direito da janela. A Alice pode copiar o endereo bitcoin ou o cdigo
QR clicando no boto copy junto de cada um deles. Ao clicar no prprio cdigo QR ele ser ampliado,
podendo facilmente ser escaneado pela cmera de um smartphone.
A Alice pode tambm imprimir o cdigo QR como uma forma de passar facilmente seu endereo a
outras pessoas sem que eles tenham de se lembrar de digitar uma longa sequncia de letras e nmeros.
TIP
Os endereos bitcoin comeam sempre com o dgito 1 ou 3. Assim como endereos de
email, eles podem ser compartilhados com outros usurios bitcoin que podem us-los
para mandar bitcoin diretamente a sua carteira. Ao contrrio dos endereos de email,
voc pode criar novos endereos vontade, e todos eles direcionaro os fundos para sua
carteira. Uma carteira simplesmente uma coleo de endereos e as chaves que
desbloqueiam os fundos que esto nela. Voc pode aumentar a sua privacidade usando
um endereo diferente para cada transao. No h nenhuma limitao na quantidade deendereos que um usurio pode criar.
Agora a Alice est pronta para comear a usar sua nova carteira bitcoin.
Obtendo Os Seus Primeiros Bitcoins
Ainda no possvel comprar os bitcoins em um banco ou casa de cmbio de moedas estrangeiras. Em
2014, ainda era difcil adquirir bitcoins na maior parte dos pases. H algumas casas de cmbio
8
-
7/26/2019 Dominando Bitcoin
19/289
-
7/26/2019 Dominando Bitcoin
20/289
Enviando e Recebendo Bitcoins
Depois de criar a sua carteira bitcoin, Alice agora est pronta para receber fundos. A carteira gera
aleatoriamente uma chave privada (descrita em mais detalhes em [private_keys]) junto com o
endereo bitcoin correspondente. Nesse ponto, o endereo bitcoin dela ainda no conhecido pela
rede bitcoin, nem "registrado" em qualquer parte do sistema bitcoin. O endereo bitcoin dela
simplesmente um nmero que corresponde a uma chave que ela pode usar para controlar o acesso aos
fundos. No h uma conta ou associao entre aquele endereo e uma conta. At o momento em queeste endereo esteja referenciado como o destinatrio de um valor em uma transao publicada no
ledger ou registro contbil de bitcoin (a blockchain), ele simplesmente parte da vasta quantidade de
possveis endereos considerados "vlidos" em bitcoin. A partir do momento em que esteja associado
com uma transao, ele se torna parte dos endereos conhecidos na rede e a Alice poder comprovar o
saldo dela no registro pblico.
A Alice encontrou-se com o amigo dela, o Joe, que a apresentou ao bitcoin, em um restaurante local
para que eles possam trocar alguns dlares e colocar bitcoins na conta dela. Ela trouxe um papel com o
endereo dela e o cdigo QR impressos conforme aparecem na carteira bitcoin. No h nenhuma
informao que deva ser protegida, desde um ponto de vista de segurana, no endereo bitcoin. Elepode ser publicado em qualquer lugar sem nenhum risco de segurana conta da Alice.
A Alice quer trocar somente 10 dlares por bitcoin, para que assim ela no arrisque muito dinheiro
nessa nova tecnologia. Ela d ao Joe uma nota de $10 e o papel impresso com seu endereo para que o
Joe possa lhe mandar o montante equivalente em bitcoin.
Em seguida, Joe tem que descobrir a taxa de cmbio para que ele possa dar a quantidade certa de
bitcoins Alice. H centenas de aplicativos e pginas web que informar a taxa de mercado atual. Eis
alguns dos mais populares:
Bitcoin Charts
Um servio de listagem de dados de mercado que informa a taxa de cmbio do bitcoin em diversas
exchanges em todo o planeta, nas diferentes moedas locais
Bitcoin Average
Um site que permite, de forma simples, ver a mdia ponderada dos volumes negociados em cada
moeda.
ZeroBlock
Um aplicativo grtis para Android e iOS que mostra o preo do bitcoin em diferentes bolsas decriptomoedas (procure por ZeroBlock, um aplicativo de preo de mercado do bitcoin para Android e
iOS)
Bitcoin Wisdom
Outro servio de listagem de dados de mercado
10
http://-/?-http://bitcoincharts.com/http://bitcoinaverage.com/http://www.zeroblock.com/http://-/?-http://-/?-http://www.bitcoinwisdom.com/http://www.bitcoinwisdom.com/http://-/?-http://-/?-http://www.zeroblock.com/http://bitcoinaverage.com/http://bitcoincharts.com/http://-/?- -
7/26/2019 Dominando Bitcoin
21/289
Figure 3. ZeroBlock, um aplicativo de preo de mercado do bitcoin para Android e iOS
Usando um dos aplicativos ou sites recm listados, Joe determina o preo do bitcoin como
aproximadamente 100 dlares por bitcoin. Nesse momento, ele deveria dar a Alice 0.10 bitcoin,
tambm chamado de 100 millibits, em troca dos 10 dlares que ela lhe deu.
Uma vez que Joe determinou um preo justo para a troca, ele abre um aplicativo de carteira em seu
celular e seleciona "enviar" bitcoin. Por exemplo, se estiver usando a carteira da Blockchain em um
telefone Android, ele veria uma tela pedindo duas informaes, como mostrado em A tela de envio de
bitcoin da carteira mvel Blockchain.
O endereo bitcoin de destino para a transao
A quantidade de bitcoins para enviar
No campo para inserir o endereo bitcoin, h um pequeno cone que se parece com um cdigo QR. Isso
permite que Joe escaneie o cdigo de barras com a cmera de seu smartphone para que ele no tenha
que digitar o endereo bitcoin da Alice (1Cdid9KFAaatwczBwBttQcwXYCpvK8h7FK), o que seria algo
grande e difcil de se digitar. Joe toca no cone do cdigo QR e ativa a cmera para escanear o cdigo
QR da carteira impressa que a Alice trouxe consigo. O aplicativo de carteira mobile preenche o
endereo bitcoin e Joe pode verificar que o cdigo foi escaneado corretamente ao comparar algunsdgitos com o endereo impresso pela Alice.
Figure 4. A tela de envio de bitcoin da carteira mvel Blockchain
11
http://-/?-http://-/?-http://-/?-http://-/?- -
7/26/2019 Dominando Bitcoin
22/289
Ento o Joe digita o valor em bitcoins da transao, 0,10 bitcoin. Ele confere com cuidado para ter
certeza de que digitou a quantia correta, pois ele est a ponto de transmitir dinheiro e qualquer erro
pode sair muito caro. Finalmente ele aperta Send para transmitir a transao. A carteira mvel do Joe
constri a transao que assigna 0,10 bitcoin ao endereo da Alice, gerando os fundos da carteira do
Joe e assinando a transao com as chaves privadas dele. Isso informa a rede bitcoin que o Joe
autorizou uma transferncia de valor de um de seus endereos para o novo endereo da Alice.
medida que a transao se transmite conforme o protocolo peer-to-peer, ela rapidamente se propaga
pela rede bitcoin. Em menos de 1 segundo, a maioria dos ns com melhor conexo na rede recebem atransao e vem o endereo da Alice pela primeira vez.
Se a Alice tiver um smartphone ou um laptop com ela, tambm ser capaz de ver a transao. O
registro contbil do bitcoin um arquivo que no pra de crescer e que guarda cada uma das
transaes em bitcoin que j ocorreram desde o incio pblico, o que significa que tudo que ela
tem de fazer olhar seu prprio endereo e ver se quaisquer fundos foram mandados para ele. Ela
pode fazer isso facilmente no site blockchain.info, digitando o endereo dela no campo de busca. O
website lhe vai mostrar uma pagelistando todas as transaes de e para aquele endereo. Se a Alice
estiver olhando essa pgina, vai ver uma atualizao que mostra uma nova transao transferindo 0,10
bitcoin para o saldo dela logo depois do Joe apertar Send.
Confirmaes
Inicialmente, o endereo da Alice vai mostrar a transao do Joe como "Transao no
Confirmada." Isto significa que a transao j se propagou pela rede, mas ainda no foi includa
no registro contbil de transaes do bitcoin, conhecido como a blockchain (cadeia de blocos).
Para ser includa, a transao deve ser "escolhida" por um minerador e includa em um bloco de
transaes. Quando um novo bloco criado, em aproximadamente 10 minutos, as transaes
dentro do bloco passam a ser aceitas como "confirmadas" pela rede e ento podem ser gastas. Atransao vista instantaneamente por todos, mas s se torna "confiada" por todos quando est
includa em um novo bloco minerado.
A Alice agora a orgulhosa dona de 0,10 bitcoin que ela pode gastar. No prximo captulo,
observaremos sua primeira compra com bitcoin e examinaremos em maiores detalhes as tecnologias
de transao e propagao envolvidas.range="endofrange", startref="ix_ch01-asciidoc1")
12
http://bit.ly/1u0FFKLhttp://bit.ly/1u0FFKL -
7/26/2019 Dominando Bitcoin
23/289
-
7/26/2019 Dominando Bitcoin
24/289
-
7/26/2019 Dominando Bitcoin
25/289
-
7/26/2019 Dominando Bitcoin
26/289
-
7/26/2019 Dominando Bitcoin
27/289
-
7/26/2019 Dominando Bitcoin
28/289
Figure 4. Uma cadeia de transaes, onde o output de uma transao o input da prxima transao
O pagamento da Alice para o Bobs Cafe usa uma transao prvia como seu input. No captulo
anterior, a Alice recebeu bitcoins do amigo dela em troca de dinheiro. Aquela transao continha um
nmero de bitcoins "trancados" (alienados) com a chave da Alice. Sua nova transao para o Bobs Cafe
utiliza a transao prvia como um input e cria novos outputs para pagar pela xcara de caf e receber
o troco. As transaes formam uma cadeia, onde os inputs da ltima transao correspondem aosoutputs das transaes anteriores. A chave da Alice fornece a assinatura que desbloqueia estes outputs
de transaes prvios, desta maneira provando rede bitcoin que ela a dona dos fundos. Ela vincula
seu pagamento pelo caf ao endereo do Bob, desta maneira "alienando" este output com o requisito de
que Bob produza uma assinatura, liberando essa quantidade de bitcoins para ser gasta. Isso representa
a transferncia de valor entre Alice e Bob. Essa cadeia de transaes, do Joe para a Alice, e dela para o
Bob, ilustrada em Uma cadeia de transaes, onde o output de uma transao o input da prxima
transao.
Formas Comuns de TransaoA forma mais comum de transao um pagamento simples de um endereo para outro, que
frequentemente inclui algum "troco" que devolvido para o dono original. Esse tipo de transao
possui um input e dois outputs, e mostrada em A forma mais comum de transao..
6
http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?- -
7/26/2019 Dominando Bitcoin
29/289
-
7/26/2019 Dominando Bitcoin
30/289
-
7/26/2019 Dominando Bitcoin
31/289
Construindo uma Transao
O aplicativo de carteira contm toda a lgica para selecionar os inputs e outputs apropriados para
construir uma transao com os dados especificados pela Alice. Ela s precisa fornecer os dados de
destino e uma quantia: o seu aplicativo de carteira faz todo o resto, sem que ela sequer veja os
detalhes. Outro aspecto importante, que o aplicativo de carteira tambm pode construir transaes
mesmo estando completamente offline. Da mesma maneira que voc pode preencher um cheque em
casa para depois deposit-lo em um envelope no banco, uma conexo com a rede bitcoin no
necessria para que uma transao seja construda e assinada. A transao s precisa ser enviada para
a rede quando a pessoa quiser efetu-la.
Recebendo os Inputs Certos
O aplicativo de carteira da Alice ter primeiro que achar os inputs que podem pagar pela quantia que
ela quer enviar para o Bob. A maioria dos aplicativos de carteira mantm um pequeno banco de dados
de "outputs de transaes no gastos" que so trancados (alienados) com as prprias chaves da
carteira. Logo, a carteira de Alice iria conter uma cpia do output da transao do Joe, que foi criadana troca pelo dinheiro (ver [getting_first_bitcoin]). Um aplicativo de carteira de bitcoin que roda como
um cliente de ndice completo na verdade contm uma cpia de cada output no gasto de todas as
transaes presentes na blockchain. Isso permite que a carteira construa inputs de transao, alm de
verificar rapidamente se as transaes que chegam tem inputs corretos. No entanto, como um cliente
de ndice completo ocupa muito espao de armazenamento em disco, a maioria das carteiras roda
clientes "leves" que mantm somente o registro dos outputs no gastos do usurio.
Se a wallet no mantiver uma cpia dos outputs de transao no-gastos, ela pode fazer uma
requisio rede bitcoin para solicitar essa informao, usando as APIs (ou Interfaces de Programao
de Aplicaes) que os diferentes fornecedores colocam disposio, ou fazendo uma requisio a umn de ndice completo usando um API de bitcoin JSON RPC. Consultando todos os outputs no gastos do
endereo de bitcoin da Alicemostra que todos os outputs no-gastos para o endereo de bitcoin de
Alice mostram uma requisio API RESTful, construdo como um comando HTTP GET para uma URL
especfica. Essa URL ir retornar todos os outputs de transao no gastos para um endereo,
fornecendo para qualquer aplicativo a informao necessria para construir inputs de transao de tal
forma que os bitcoins sejam gastos. Ns usamos um simples cliente HTTP de linha de comando cURL
para solicitarmos a resposta.
Example 1. Consultando todos os outputs no gastos do endereo de bitcoin da Alice
$ curl https://blockchain.info/unspent?active=1Cdid9KFAaatwczBwBttQcwXYCpvK8h7FK
9
http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?- -
7/26/2019 Dominando Bitcoin
32/289
Example 2. Resposta consulta
{
"unspent_outputs":[
{
"tx_hash":"186f9f998a5...2836dd734d2804fe65fa35779",
"tx_index":104810202,
"tx_output_n": 0,
"script":"76a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac",
"value": 10000000,
"value_hex": "00989680",
"confirmations":0
}
]
}
A resposta no Resposta consultamostra um output no-gasto (um que ainda no foi resgatado) sob a
posse do endereo de Alice 1Cdid9KFAaatwczBwBttQcwXYCpvK8h7FK. A resposta inclui uma
referncia transao na qual esse valor no-gasto est contido (o pagamento do Joe) e seu valor em
satoshis, 10 milhes, equivalente a 0,10 bitcoin. Com essa informao, o aplicativo carteira de Alice
pode construir uma transao para transferir o valor para o endereo do novo dono.
TIP Veja a transao de Joe para Alice.
Como voc pode ver, a carteira de Alice contm bitcoins suficientes em um output no-gasto isolado
para pagar pela xcara de caf. Caso no contivesse, o aplicativo carteira de Alice teria que "vasculhar"
uma pilha de pequenos outputs no-gastos, como se estivesse pegando as moedas em uma bolsa, at
encontrar o suficiente para poder pagar o caf. Em ambos os casos, pode haver uma necessidade de
receber algum troco de volta, que o assunto que iremos ver na prxima seo, quando o aplicativo
carteira cria os outputs da transao (pagamentos).
Criando os Outputs
Um output de transao criado na forma de um script que cria uma alienao no valor a ser
transferido, de maneira que o valor s pode ser regastado se uma soluo for apresentada ao script. De
maneira simplificada, o output da transao de Alice ir conter um script que diz algo como "Esse
output pagvel para aquela pessoa que conseguir apresentar uma assinatura para a chave
correspondente ao endereo pblico de Bob". Como somente o Bob possui a carteira com as chaves
correspondentes quele endereo, somente a carteira de bob pode apresentar a assinatura para
resgatar esse output. A Alice ao fazer uma exigncia de assinatura do Bob, ela est fazendo uma
"alienao" ao valor de output.
10
http://-/?-http://bit.ly/1tAeeGrhttp://bit.ly/1tAeeGrhttp://-/?- -
7/26/2019 Dominando Bitcoin
33/289
Essa transao tambm incluir um segundo output, porque os fundos de Alice esto na forma de um
output de 0,10 BTC, que dinheiro demais para a transao de 0,015 BTC pela xcara de caf. A Alice
precisar de 0,085 BTC de troco. O pagamento do troco da Alice criado pela carteira de Alice na
mesma transao que o pagamento do Bob. Essencialmente, a carteira de Alice divide seus fundos em
dois pagamentos: um para o Bob, e outro de volta para si mesma. Ela pode ento usar o output do troco
em uma transao no futuro, gastando-o mais tarde.
Finalmente, para que a transao seja processada pela rede em tempo hbil, o aplicativo de carteira daAlice ir adicionar uma pequena taxa. Isso no est explcito na transao: isso est implcito na
diferena entre os inputs e os outputs. Se ao invs de receber 0,085 de troco, Alice cria somente 0,0845
como um segundo output, haver 0,0005 (metade de um milibitcoin) restantes. O input de 0,10 BTC no
totalmente gasto com os dois outputs, porque ele ir se somar at menos do que 0,10. A diferena
resultante a taxa de transaoque coletada pelo minerador como um pagamento por ter includo a
transao em um bloco e adicionar esse bloco no ledger da blockchain.
A transao resultante pode ser vista usando um aplicativo web explorador de blockchain, como visto
em Transao de Alice para o Bobs Cafe.
Figure 8. Transao de Alice para o Bobs Cafe
TIP Veja a transao de Alice para o Bobs Cafe.
Adicionando uma Transao ao Registro (Ledger)
A transao criada pelo aplicativo de carteira da Alice tem 258 bytes de comprimento e contm todas
as informaes necessrias para confirmar a sua posse dos fundos e para designar novos donos. Agora,
11
http://-/?-http://bit.ly/1u0FIGshttp://bit.ly/1u0FIGshttp://-/?- -
7/26/2019 Dominando Bitcoin
34/289
-
7/26/2019 Dominando Bitcoin
35/289
Minerao de Bitcoin
A transao foi propagada na rede bitcoin. Ela s vai tornar-se parte de ledger compartilhado (a
blockchain) quando for verificada e includa em um bloco, atravs de um processo chamado
minerao. Veja [ch8]para uma explicao mais detalhada.
O sistema de confiana do bitcoin baseado em computao. As transaes so agrupadas em blocos, o
que requer uma enorme quantidade de processamento para prov-las, mas apenas uma pequenaquantidade de processamento para verific-las como previamente provadas. O processo de minerao
do bitcoin possui dois propsitos:
A minerao cria novos bitcoins em cada bloco, quase como um banco central imprimindo novas
moedas e notas. A quantidade de bitcoin criada por bloco fixa e diminui com o tempo.
A minerao cria confiana ao garantir que as transaes sejam confirmadas somente se poder de
processamento suficiente for dedicado ao bloco que as contm. Mais blocos requerem mais
processamento, o que significa maior confiana.
Uma boa maneira de descrever a minerao como um jogo de sudoku, gigantesco e competitivo, que
reinicia cada vez que algum encontra uma soluo e cuja dificuldade se ajusta automaticamente, de
maneira que leve cerca de 10 minutos para que uma soluo seja encontrada. Imagine um sudoku
gigantesco, com milhares de colunas e linhas de tamanho. Se eu mostrar para voc um sudoku
completo, voc pode verificar rapidamente que ele est corretamente preenchido. No entando, se o
sudoku tiver apenas alguns quadrados preenchidos e o resto estiver vazio, levar muito trabalho para
resolv-lo! A dificuldade do sudoku pode ser ajustada ao mudar o seu tamanho (mais ou menos linhas
ou colunas), mas o sudoku ainda pode ser verificado de maneira rpida, mesmo que ele seja muito
grande. O "quebra-cabeas" usado no bitcoin baseado em um hash criptogrfico, que exibe
caractersticas semelhantes: ele assimetricamente difcil de resolver, mas fcil de verificar, e suadificuldade pode ser ajustada.
Em [user-stories], ns apresentamos o Jing, um estudante de engenharia da computao de Shanghai.
Ele est participando da rede bitcoin como um minerador. cada 10 minutos em mdia, Jing se une a
milhares de outros mineradores para uma corrida global para achar uma soluo para um bloco de
transaes. Encontrar a tal soluo, tambm chamada de prova de trabalho, requer quadrilhes de
operaes de hashing por segundo ao longo de toda a rede bitcoin. O algoritmo para a prova de
trabalho envolve fazer hashing com o cabealho do bloco e um nmero aleatrio com um algoritmo
criptogrfico SHA256 at que a soluo correspondente a um determinado padro surja. O primeiro
minerador a encontrar uma soluo ganha a rodada da competio e publica o bloco na blockchain.
Jing comeou a minerar em 2010 usando um computador destktop muito rpido para achar provas de
trabalho adequadas para novos blocos. Conforme mais mineradores comearam a se juntar rede
bitcoin, a dificuldade do problema cresceu rapidamente. Logo em seguida, Jing e outros mineradores
fizeram upgrade para um hardware mais especializado, como placas com unidades de processamento
grfico (GPUs) dedicadas de alta performance, como as placas de vdeo utilizadas para jogos de desktop
ou videogames. Nesse momento, a dificuldade est to alta que s rentvel minerar com circuitos
integrados especficos para a aplicao (ASIC), que essencialmente centenas de algoritmos de
13
http://-/?-http://-/?-http://-/?-http://-/?- -
7/26/2019 Dominando Bitcoin
36/289
-
7/26/2019 Dominando Bitcoin
37/289
mais processamento computacional neste bloco anterior, desta maneira fortalecendo a confiana nas
transaes contidas no bloco. Logo, aps esse processamento adicional do bloco contendo a transao
de Alice, considera-se que a transao da Alice contida no bloco recebeu uma "confirmao". Cada que
bloco minerado aps um bloco anterior contendo transaes, gera uma confirmao adicional para
cada uma destas transaes. Conforme os blocos se empilham um sobre os outros, torna-se
exponencialmente mais difcil de se reverter a transao, dessa maneira tornando-a cada vez mais
confivel pela rede.
No diagrama em Transao de Alice includa no bloco #277316 podemos ver o bloco #277316, que
contm a transao de Alice. Abaixo dele h 277316 blocos (incluindo o bloco #0), ligados uns aos
outros, formando uma corrente de blocos (blockchain) que se estende at o seu bloco inicial (#0),
tambm conhecido como bloco gnese. Ao longo do tempo, a "altura" da pilha de blocos aumenta,
aumentando a dificuldade de processamento computacional necessrio para cada bloco e para toda a
corrente. Os bloco minerados aps o bloco que contm a transao de Alice so considerados uma
garantia adicional, j que eles receberam mais processamento computacional em uma corrente cada
vez maior. Por conveno, considera-se irrevogvel o bloco que j recebeu seis ou mais confirmaes,
porque seria necessria uma imensa capacidade de poder computacional para invalidar ou recalcular
seis blocos. Ns iremos examinar em mais detalhes o processo de minerao e a maneira como eleconstri a confiana no [ch8].
15
http://-/?-http://-/?-http://-/?-http://-/?- -
7/26/2019 Dominando Bitcoin
38/289
-
7/26/2019 Dominando Bitcoin
39/289
gastos. Clientes de ndice completo (full-index) podem rastrear a origem dos fundos desde o incio, ou
seja, o momento em que os bitcoins foram gerados em um bloco, e, progredindo de transao a
transao, at chegarem ao endereo do Bob. Clientes leves (lightweight) podem fazer uma verificao
simplificada de pagamento (ver [spv_nodes]) ao confirmar que a transao est presente na blockchain
e que vrios blocos foram minerados aps ela, garantindo que ela foi aceita pela rede como vlida.
O Bob agora pode gastar o output desta e de outras transaes, ao criar suas prprias transaes que
usam esses outputs como inputs e os designam para um novo dono. Por exemplo, Bob pode pagar umfornecedor ao transferir, para este novo dono, o valor do pagamento da xcara de caf da Alice. Mais
provavelmente, o software de bitcoin do Bob ir agregar vrios pequenos pagamentos em um
pagamento maior, talvez concentrando em uma nica transao todo o lucro em bitcoins obtidos na
loja em um dia. Isso moveria todos os pagamentos para um endereo nico, usado como uma conta de
"checking" geral da loja. Para ver um diagrama de uma transao agregadora, leia Transao
agregadora de fundos.
medida que o Bob gasta os pagamentos que recebeu de Alice e outros clientes, ele estende a cadeia
de transaes, que por sua vez so adicionadas ao ledger global do blockchain para que todos possam
ver e confiar. Vamos assumir que o Bob paga seu webdesigner Gopesh em Bangalore para desenvolverum novo site. Agora a cadeia de transaes ir ficar parecida como na figura Transao da Alice
fazendo parte de uma cadeia de transao do Joe para o Gopesh.
Figure 10. Transao da Alice fazendo parte de uma cadeia de transao do Joe para o Gopesh
17
http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?- -
7/26/2019 Dominando Bitcoin
40/289
-
7/26/2019 Dominando Bitcoin
41/289
-
7/26/2019 Dominando Bitcoin
42/289
-
7/26/2019 Dominando Bitcoin
43/289
planejados para testes e contm o sufixo "rc". Verses estveis que possam ser executadas em sistemas
de produo no possuem sufixo. Da lista existente, selecione a verso mais recente, que at este
momento era v0.10.2. Para sincronizar o cdigo local com esta verso, use o comando git checkout.
$ git checkout v0.9.0rc1
Note: checking out 'v0.9.0rc1'.
HEAD is now at 15ec451... Merge pull request #3605
$
O cdigo-fonte inclui uma documentao, que pode ser encontrada em vrios arquivos. Veja a
documentao principal localizada em README.mdna pasta bitcoin ao digitar more README.md no
prompt e usando a barra de espao para ler a prxima pgina. Nesse captulo, iremos fazer o build do
cliente de bitcoin na linha de comando, tambm conhecido como bitcoind no Linux. Veja as instrues
para compilar o cliente bitcoind em linha de comando na sua plataforma ao digitar more doc/build-
unix.md. Instrues alternativas para Mac OS X e Windows podem ser encontradas na pasta doc, como
build-osx.mdou build-msw.md, respectivamente.
Analise cuidadosamente os pr-requisitos da verso, presentes na primeira parte da documentao do
mesmo. Estas so as bibliotecas que devem estar presentes em seu sistema antes que voc possa iniciar
a compilao do bitcoin. Se estes pr-requisitos estiverem ausentes, o processo ir falhar. Logo, voc
pode instal-los e ento continuar o processo de compilao de onde voc parou. Assumindo que os
pr-requisitos esto instalados, voc inicia o processo de compilao, gerando um conjunto de scripts
de construo que utilizam o script autogen.sh.
TIP
O processo de build do Bitcoin Core foi modificado para usar o sistema
autogen/configure/make a partir da verso 0.9. As verses mais antigas usam um Makefilesimples e funcionam um pouco diferente do exemplo demonstrado a seguir. Siga as
instrues para a verso que voc quer compilar. O autogen/configure/make introduzido
na 0.0 provavelmente ser o sistema de build usado para todas as verses futuras do
cdigo e o sistema demonstrado nos exemplos a seguir.
$ ./autogen.sh
configure.ac:12: instalando `src/build-aux/config.guess'
configure.ac:12: instalando `src/build-aux/config.sub'
configure.ac:37: instalando `src/build-aux/install-sh'configure.ac:37: instalando `src/build-aux/missing'
src/Makefile.am: instalando `src/build-aux/depcomp'
$
O script autogen.sh cria um conjunto de scripts de configurao automtica que iro interrogar seu
sistema a descobrir as configuraes corretas e garantir que voc tenha todas as bibliotecas
necessrias para compilar o cdigo. O mais importante desses o script configure que oferece vrias
4
-
7/26/2019 Dominando Bitcoin
44/289
-
7/26/2019 Dominando Bitcoin
45/289
-
7/26/2019 Dominando Bitcoin
46/289
-
7/26/2019 Dominando Bitcoin
47/289
$ which bitcoind
/usr/local/bin/bitcoind
$ which bitcoin-cli
/usr/local/bin/bitcoin-cli
A instalao padro do bitcoind o salva em/usr/local/bin. Quando voc rodar o bitcoind pela primeiravez, ele ir lembr-lo para criar um arquivo de configurao com uma senha forte para a interface
JSON-RPC. Execute o bitcoind ao digitar bitcoind no terminal:
$ bitcoind
Erro: Para usar a opo "-server", vocprecisa definir uma rpcpassword no arquivo deconfigurao:/home/ubuntu/.bitcoin/bitcoin.conf
recomendado que vocuse a seguinte senha aleatria:rpcuser=bitcoinrpc
rpcpassword=2XA4DuKNCbtZXsBQRRNDEwEY2nM6M4H9Tx5dFjoAVVbK(vocno precisa se lembrar dessa senha)O usurio e senha NO DEVEM ser iguais.Se o arquivo no existir, crie um com permisses de arquivo owner-somente leituraTambm recomenda-se definir um alertnotify, para que vocseja notificado sobreproblemas;
por exemplo: alertnotify=echo %s | mail -s "Alerta Bitcoin" [email protected]
Edite o arquivo de configurao em seu editor de preferncia e defina os parmetros, substituindo a
senha por uma senha forte como recomendado pelo bitcoind. Nouse a senha mostrada aqui. Crie umarquivo no interior da pasta .bitcoinde maneira que ela fique nomeada como .bitcoin/bitcoin.conf e
insira um usurio e senha:
rpcuser=bitcoinrpc
rpcpassword=2XA4DuKNCbtZXsBQRRNDEwEY2nM6M4H9Tx5dFjoAVVbK
Enquanto voc estiver editando esse arquivo de configurao, voc pode querer definir algumas outras
opes, como a txindex (ver ndice do Banco de Dados de Transaes e a Opo txindex). Para uma
listagem completa das opes disponveis, digite bitcoind --help.
Agora, execute o cliente Bitcoin Core. Ao ser executado pela primeira vez, ele ir reconstruir a
blockchain do bitcoin ao fazer o download de todos os blocos. Ela um arquivo de vrios gigabytes e
levar em mdia dois dias para ser completamente baixada. Voc pode diminuir o tempo de
inicializao da blockchain ao fazer o download de uma cpia parcial dela usando um cliente
BitTorrent a partir de SourceForge.
Execute o bitcoind em segundo plano com a opo -daemon:range="endofrange", startref="ix_ch03-
8
http://-/?-http://bit.ly/1cqdPl6http://bit.ly/1cqdPl6http://-/?- -
7/26/2019 Dominando Bitcoin
48/289
asciidoc3")
$ bitcoind -daemon
Bitcoin version v0.9.0rc1-beta (2014-01-31 09:30:15 +0100) _(N.T. A verso serdiferentede acordo com a verso baixada no GitHub)_Using OpenSSL version OpenSSL 1.0.1c 10 May 2012
Default data directory /home/bitcoin/.bitcoinUsing data directory /bitcoin/
Using at most 4 connections (1024 file descriptors available)
init message: Verifying wallet...
dbenv.open LogDir=/bitcoin/database ErrorFile=/bitcoin/db.log
Bound to [::]:8333
Bound to 0.0.0.0:8333
init message: Loading block index...
Opening LevelDB in /bitcoin/blocks/index
Opened LevelDB successfully
Opening LevelDB in /bitcoin/chainstateOpened LevelDB successfully
[... mais mensagens de inicializao ...]
Usando a API JSON-RPC do Bitcoin Core a partir da Linha
de Comando
O cliente Bitcoin Core implementa uma interface JSON-RPC que tambm pode ser acessada ao seutilizar o ajudante da linha de comando bitcoin-cli. A linha de comando nos permite experimentar
interativamente com as capacidades que tambm esto disponveis programaticamente atravs da API.
Para iniciar, invoque o comando help para ver uma lista dos comandos bitcoin RPC disponveis:
$ bitcoin-cli help
addmultisigaddress nrequired ["key",...] ( "account" )
addnode "node" "add|remove|onetry"
backupwallet "destination"
createmultisig nrequired ["key",...]
createrawtransaction [{"txid":"id","vout":n},...] {"address":amount,...}decoderawtransaction "hexstring"
decodescript "hex"
dumpprivkey "bitcoinaddress"
dumpwallet "filename"
getaccount "bitcoinaddress"
getaccountaddress "account"
getaddednodeinfo dns ( "node" )
getaddressesbyaccount "account"
9
-
7/26/2019 Dominando Bitcoin
49/289
getbalance ( "account" minconf )
getbestblockhash
getblock "hash" ( verbose )
getblockchaininfo
getblockcount
getblockhash index
getblocktemplate ( "jsonrequestobject" )
getconnectioncount
getdifficulty
getgenerate
gethashespersec
getinfo
getmininginfo
getnettotals
getnetworkhashps ( blocks height )
getnetworkinfo
getnewaddress ( "account" )
getpeerinfo
getrawchangeaddressgetrawmempool ( verbose )
getrawtransaction "txid" ( verbose )
getreceivedbyaccount "account" ( minconf )
getreceivedbyaddress "bitcoinaddress" ( minconf )
gettransaction "txid"
gettxout "txid" n ( includemempool )
gettxoutsetinfo
getunconfirmedbalance
getwalletinfo
getwork ( "data" )help ( "command" )
importprivkey "bitcoinprivkey" ( "label" rescan )
importwallet "filename"
keypoolrefill ( newsize )
listaccounts ( minconf )
listaddressgroupings
listlockunspent
listreceivedbyaccount ( minconf includeempty )
listreceivedbyaddress ( minconf includeempty )
listsinceblock ( "blockhash" target-confirmations )
listtransactions ( "account" count from )
listunspent ( minconf maxconf ["address",...] )
lockunspent unlock [{"txid":"txid","vout":n},...]
move "fromaccount" "toaccount" amount ( minconf "comment" )
ping
sendfrom "fromaccount" "tobitcoinaddress" amount ( minconf "comment" "comment-to" )
sendmany "fromaccount" {"address":amount,...} ( minconf "comment" )
sendrawtransaction "hexstring" ( allowhighfees )
sendtoaddress "bitcoinaddress" amount ( "comment" "comment-to" )
10
-
7/26/2019 Dominando Bitcoin
50/289
-
7/26/2019 Dominando Bitcoin
51/289
-
7/26/2019 Dominando Bitcoin
52/289
-
7/26/2019 Dominando Bitcoin
53/289
$ bitcoin-cli dumpwallet wallet.txt
$ more wallet.txt
# Dump da carteira criado por Bitcoin v0.9.0rc1-beta (2014-01-31 09:30:15 +0100)
# * Criado em 2014-02- 8dT20:34:55Z
# * O melhor bloco na poca do backup era 286234(0000000000000000f74f0bc9d3c186267bc45c7b91c49a0386538ac24c0d3a44),
# minerado em 2014-02- 8dT20:24:01Z
KzTg2wn6Z8s7ai5NA9MVX4vstHRsqP26QKJCzLg4JvFrp6mMaGB9 2013-07- 4dT04:30:27Z change=1 #
addr=16pJ6XkwSQv5ma5FSXMRPaXEYrENCEg47F
Kz3dVz7R6mUpXzdZy4gJEVZxXJwA15f198eVui4CUivXotzLBDKY 2013-07- 4dT04:30:27Z change=1 #
addr=17oJds8kaN8LP8kuAkWTco6ZM7BGXFC3gk
[... muitas outras chaves ...]
$
Endereos da Carteira e Recebendo TransaesComandos: getnewaddress, getreceivedbyaddress, listtransactions, getaddressesbyaccount, getbalance
O cliente referncia do bitcoin mantm um pool de endereos, o tamanho do qual exibido atravs do
keypoolsize quando voc usa o comando getinfo. Esses endereos so gerados automaticamente e
podem ser utilizados como endereos pblicos para receber pagamentos ou como endereos de troco.
Para gerar um desses endereos, use o comando getnewaddress:
$ bitcoin-cli getnewaddress
1hvzSofGwT8cjb8JU7nBsCSfEVQX5u9CL
Agora ns podemos usar esse endereo para enviar uma pequena quantidade de bitcoins para nossa
carteira bitcoind a partir de uma carteira externa (assumindo que voc tem alguns bitcoins em uma
exchange, carteira web ou outra carteira bitcoind em outro lugar). Para esse exemplo, ns enviaremos
50 milibits (0,050 bitcoin) para o endereo anterior.
Agora ns podemos requisitar o cliente bitcoind para a quantia recebida por esse endereo, e
especificar quantas confirmaes so necessrias antes que uma quantia seja contabilizada no saldo.
Para esse exemplo, ns iremos especificar zero confirmaes. Alguns segundos aps enviar o bitcoin
de outra carteira, ns iremos ver isso refletido na carteira. Ns usamos getreceivedbyaddress com o
endereo e o nmero de confirmaes definido para zero (0):
$ bitcoin-cli getreceivedbyaddress 1hvzSofGwT8cjb8JU7nBsCSfEVQX5u9CL 0
0.05000000
Se ns omitirmos o zero do final desse comando, ns iremos ver somente as quantias que tiveram pelo
14
-
7/26/2019 Dominando Bitcoin
54/289
-
7/26/2019 Dominando Bitcoin
55/289
[
"1LQoTPYy1TyERbNV4zZbhEmgyfAipC6eqL",
"17vrg8uwMQUibkvS2ECRX4zpcVJ78iFaZS",
"1FvRHWhHBBZA8cGRRsGiAeqEzUmjJkJQWR",
"1NVJK3JsL41BF1KyxrUyJW5XHjunjfp2jz",
"14MZqqzCxjc99M5ipsQSRfieT7qPZcM7Df",
"1BhrGvtKFjTAhGdPGbrEwP3xvFjkJBuFCa",
"15nem8CX91XtQE8B1Hdv97jE8X44H3DQMT",
"1Q3q6taTsUiv3mMemEuQQJ9sGLEGaSjo81",
"1HoSiTg8sb16oE6SrmazQEwcGEv8obv9ns",
"13fE8BGhBvnoy68yZKuWJ2hheYKovSDjqM",
"1hvzSofGwT8cjb8JU7nBsCSfEVQX5u9CL",
"1KHUmVfCJteJ21LmRXHSpPoe23rXKifAb2",
"1LqJZz1D9yHxG4cLkdujnqG5jNNGmPeAMD"
]
Finalmente, o comando getbalance mostrar o saldo total da carteira, somando todas as transaes
confirmadas com pelo menos minconf confirmaes:
$ bitcoin-cli getbalance
0.05000000
TIP
Se a transao ainda no foi confirmada, o saldo que getbalance retornar ser de zero. A
opo de configurao "minconf" determina o nmero mnimo de confirmaes que so
necessrias antes de uma transao aparecer no saldo.
Explorando e Decodificando as Transaes
Comandos: gettransaction, getrawtransaction, decoderawtransaction
Agora ns iremos explorar a transao que chega e que foi listada previamente usando o comando
gettransaction. Ns podemos coletar a transao atravs de seu hash de transao, mostrado em txid
anteriormente, com o comando gettransaction:
16
-
7/26/2019 Dominando Bitcoin
56/289
-
7/26/2019 Dominando Bitcoin
57/289
-
7/26/2019 Dominando Bitcoin
58/289
-
7/26/2019 Dominando Bitcoin
59/289
confirmada e ento gasta-o em dois outputs, um de 25 milibits para nosso novo endereo e outro de
24,5 milibits como troco de volta para o endereo original. A diferena de 0,5 milibits representa a taxa
de transao e ser creditada ao minerador que encontrar o bloco que inclui nossa transao.
Como voc pode perceber, a transao contm um scriptSig vazio porque ainda no foi assinada. Sem
uma assinatura, a transao no tem sentido; ns ainda no provamos que ns possumoso endereo
que contm o output no-gasto. Ao assinar, ns destravamos o bloqueio no output e provamos que ns
somos donos desse output e que podemos gast-lo. Ns usaremos o comando signrawtransaction paraassinar a transao. Esse comando usa a string hexadecimal da transao raw como parmetro:
TIPUm carteira criptografada deve ser desbloqueada antes que uma transao seja assinada,
pois a assinatura exige acesso s chaves secretas contidas no interior da carteira.
O comando signrawtransaction retorna outra transao raw codificada em hex. Ns decodificaremos
ela para ver o que mudou, com o comando decoderawtransaction:
Agora, o input usado na transao contm um scriptSig, que uma assinatura digital provando a posse
do endereo 1hvz... e removendo a trava no output de maneira que ele possa ser gasto. A assinatura fazcom que essa transao seja verificvel por qualquer n na rede bitcoin.
Agora est na hora de enviarmos a transao recm-criada para a rede. Ns faremos isso atravs do
comando sendrawtransaction, que recebe a string hexadecimal raw produzida pelo
signrawtransaction. Essa a mesma string que ns recm decodificamos:
O comando sendrawtransaction retorna um hash de transao (txid)assim que a transao enviada
para a rede. Ns podemos agora consultar esse ID da transao com gettransaction:
20
-
7/26/2019 Dominando Bitcoin
60/289
-
7/26/2019 Dominando Bitcoin
61/289
-
7/26/2019 Dominando Bitcoin
62/289
-
7/26/2019 Dominando Bitcoin
63/289
$ python3 -m venv /tmp/pycoin
$ . /tmp/pycoin/bin/activate
$ pip install pycoin==0.42
Baixando/descompactando pycoin==0.42
Baixando o pycoin-0.42.tar.gz (66kB): 66kB baixados
Executando o setup.py (path:/tmp/pycoin/build/pycoin/setup.py) egg_info para o
pacote pycoin
Instalando pacotes coletados: pycoin
Executando instalao setup.py para pycoin
Instalando tx script para /tmp/pycoin/bin
Instalando cache_tx script para /tmp/pycoin/bin
Instalando bu script para /tmp/pycoin/bin
Instalandog fetch_unspent script para /tmp/pycoin/bin
Instalando block script para /tmp/pycoin/bin
Instalando spend script para /tmp/pycoin/bin Instalando ku script para /tmp/pycoin/bin
Instalando genwallet script para /tmp/pycoin/bin
pycoin instalado com sucesso
Limpando...
$
Aqui est um exemplo de script Python para adquirir e gastar alguns bitcoins usando a biblioteca
pycoin:
24
-
7/26/2019 Dominando Bitcoin
64/289
-
7/26/2019 Dominando Bitcoin
65/289
-
7/26/2019 Dominando Bitcoin
66/289
-
7/26/2019 Dominando Bitcoin
67/289
-
7/26/2019 Dominando Bitcoin
68/289
Desde a inveno da criptografia de chave pblica, muitas funes matemticas adequadas foram
descobertas, como exponenciao de nmeros primos e multiplicao de curva elptica. Essas funes
matemticas so praticamente irreversveis, significando que elas so fceis de calcular em uma
direo, e inviveis de serem calculadas na direo oposta. Baseada nessas funes matemticas, a
criptografia permite a criao de segredos digitais e assinaturas digitais que no podem ser esquecidas.
O bitcoin usa multiplicao de curva elptica como base para sua criptografia de chave pblica.
No bitcoin, ns usamos criptografia de chave pblica para criar um par de chaves que controla oacesso aos bitcoins. O par de chave consiste em uma chave privada e
derivada dessa chave
uma
chave pblica nica. A chave pblica usada para receber os bitcoins, e a chave privada usada para
assinar transaes para gastar esses bitcoins.
Existe uma relao matemtica entre a chave pblica e a privada que permite que a chave privada seja
usada para gerar assinaturas nas mensagens. Essa assinatura pode ser validada em relao chave
pblica, sem a necessidade de se revelar a chave privada.
Ao gastar bitcoins, o atual dono dos bitcoins apresenta sua chave pblica e uma assinatura (diferente a
cada vez, mas criada a partir da mesma chave privada) em uma transao para gastar esses bitcoins.Atravs da apresentao da chave pblica e da assinatura, todos na rede bitcoin podem verificar e
aceitar a transao como vlida, confirmando que a pessoa que est transferindo os bitcoins realmente
os possui no momento da transferncia.
TIP
Na maioria das implementaes de carteira, as chaves privadas e pblicas so
armazenadas juntas como um par de chaves, por convenincia. No entanto, a chave
pblica pode ser calculada a partir da chave privada, ento tambm possvel se
armazenar apenas a chave privada.
Chaves Privada e Pblica
Uma carteira bitcoin contm um grupo de pares de chaves, cada um consistindo de uma chave privada
e uma chave pblica. A chave privada (k) um nmero, geralmente escolhido ao acaso. A partir da
chave privada, ns usamos multiplicao em curva elptica, uma funo criptogrfica de um nico
sentido, para gerar a chave pblica (K). A partir da chave pblica (K), ns iremos usar uma funo
hash criptogrfica de um sentido para gerar um endereo bitcoin (A). Nessa seo, ns iniciaremos
com a gerao da chave privada, analisaremos a matemtica de curva elptica que usada para torn-
la em uma chave pblica e, finalmente, a gerao do endereo bitcoin a partir da chave pblica. A
relao entre a chave privada, chave pblica e endereo bitcoin est demonstrada em Chave privada,
chave pblica e endereo bitcoin.
2
http://-/?-http://-/?-http://-/?-http://-/?- -
7/26/2019 Dominando Bitcoin
69/289
Figure 1. Chave privada, chave pblica e endereo bitcoin
Chaves Privadas
Uma chave privada nada mais do que um nmero, escolhido ao acaso. A posse e o controle da chave
privada tudo o que o usurio precisa para controlar todos os fundos associados ao endereo bitcoin
correspondente. A chave privada usada para criar assinaturas que so necessrias para se gastar
bitcoins ao comprovar a posse dos fundos usados em uma transao. A chave privada deve sempre ser
mantida em segredo, pois revel-la a terceiros equivalente a fornec-los o controle sobre todos os
bitcoins protegidos por aquela chave. Tambm deve ser feito backup da chave privada, alm de
proteg-la de perdas acidentais, pois ao ser perdida a chave no pode ser recuperada, e todos os fundos
protegidos por ela tambm sero perdidos para sempre.
TIP
A chave privada bitcoin apenas um nmero. Voc pode escolher suas chaves privadas
aleatoriamente usando uma moeda, um lpis e um papel: jogue a moeda 256 vezes e voc
ter os dgitos binrios de uma chave privada aleatria que voc pode usar em uma
carteira bitcoin. A chave pblica pode ento ser gerada a partir de sua chave privada.
Gerando uma chave privada a partir de um nmero aleatrio
O primeiro e mais importante passo na gerao de chaves encontrar uma fonte segura de entropia,
ou aleatoriedade. Criar uma chave bitcoin essencialmente a mesma coisa que pedir para algum
"Escolha um nmero entre 1 e 2256". O mtodo exato que voc usa para escolher esse nmero no
importa, contanto que no seja previsvel ou repetvel. O software Bitcoin baseia-se em geradores de
nmeros aleatrios do sistema operacional subjacente para produzir 256 bits de entropia
(aleatoriedade). Normalmente, o gerador de nmeros aleatrios do sistema operacional inicializado
por uma fonte humana de aleatoriedade, razo pela qual voc pode ser convidado para mexer o mouse
por alguns segundos. Para quem paranico, nada melhor do que jogar dados e depois anotar os
resultados com caneta e papel.
Mais precisamente, a chave privada pode ser qualquer nmero entre 1 e n - 1, onde n uma constante
(n = 1,158 * 1077, ligeiramente menor que 2256), definido como a ordem da curva elptica usada no
bitcoin (veja Explicando a Criptografia de Curva Elptica). Para criar tal chave, ns escolhemos
aleatoriamente um nmero de 256 bits e verificamos se ele menor do que n - 1. Em termos de
programao, isto geralmente obtido alimentando-se uma seqncia maior de bits aleatrios,
coletados a partir de uma fonte de aleatoriedade criptograficamente segura, ao algoritmo de hash
SHA256 que ir produzir convenientemente um nmero de 256 bits. Se o resultado for inferior a n - 1,
3
http://-/?-http://-/?- -
7/26/2019 Dominando Bitcoin
70/289
temos uma chave privada adequada. Caso contrrio, ns simplesmente tentamos novamente com
outro nmero aleatrio.
TIP
No escreva o seu prprio cdigo para criar um nmero aleatrio, nem utilize um gerador
de nmeros aleatrio "simples" oferecido pela sua linguagem de programao. Use um
gerador de nmeros pseudo-aleatrios criptograficamente seguro (CSPRNG) com uma
semente com fonte de entropia suficiente. Estude a documentao da biblioteca geradora
de nmeros aleatrios que voc escolher para se certificar de que criptograficamentesegura. O correto emprego do CSPRNG crtico para a segurana das chaves.
Abaixo est demonstrada uma chave privada (k) gerada aleatoriamente mostrada em formato
hexadecial (256 dgitos binrios mostrados como 64 dgitos hexadecimais, cada um com 4 bits):
1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD
TIP
O tamanho do espao possvel de Chaves Privadas existentes, 2^256 de tamanho
imcompreensvel. aproximadamente 10^77 na escala decimal. Estima-se que o universo
visvel contenha 10^80 tomos.
Para gerar uma nova chave com o cliente Bitcoin Core (veja [ch03_bitcoin_client]), Use o comando
getnewaddress. Por motivos de segurana exibida somente a chave pblica, no a chave privada.
Para pedir ao bitcoind para expor a chave privada, use o comando dumpprivkey. O comando
dumpprivkey mostra a chave privada em um formato checksum-codificado em Base58 chamado de
Wallet Import Format(WIF), que vamos examinar com mais detalhes em Formatos de chave privada.
Aqui est um exemplo da criao e exibio uma chave privada usando esses dois comandos:
$ bitcoind getnewaddress
1J7mdg5rbQyUHENYdx39WVWK7fsLpEoXZy
$ bitcoind dumpprivkey 1J7mdg5rbQyUHENYdx39WVWK7fsLpEoXZy
KxFC1jmwwCoACiCAWZ3eXa96mBM6tb3TYzGmf6YwgdGWZgawvrtJ
O comando dumpprivkey abre a carteira e extrai a chave privada que foi gerada pelo comando
getnewaddress. No possvel que o bitcoind descubra a chave privada a partir da chave pblica, a
menos que ambas estejam armazenadas na carteira.
TIP
O comando dumpprivkey no est gerando uma chave privada a partir de uma chave
pblica, j que isso impossvel. O comando simplesmente revela a chave privada que a
carteira j conhece e que foi gerada atravs do comando getnewaddress.
Voc tambm pode usar a ferramenta de linha de comando Bitcoin Explorer (ver [libbitcoin]) para
gerar e mostrar chaves privadas com os comandos seed, ec-new and ec-to-wif:
4
http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?- -
7/26/2019 Dominando Bitcoin
71/289
-
7/26/2019 Dominando Bitcoin
72/289
-
7/26/2019 Dominando Bitcoin
73/289
-
7/26/2019 Dominando Bitcoin
74/289
Python 3.4.0 (padro, Mar 30 2014, 19:23:13)
[GCC 4.2.1 Compatvel com Apple LLVM 5.1 (clang-503.0.38)] no darwin
Digite "help", "copyright", "credits" ou "license" para maiores informaes.
>>> p =
115792089237316195423570985008687907853269984665640564039457584007908834671663
>>> x = 55066263022277343669578718895168534326250603453777594175500187360389116729240
>>> y = 32670510020758816978083085130507043184471273380659243275938904335757337482424>>> (x ** 3 + 7 - y**2) % p
0
Na matemtica de curva elptica, existe um ponto chamado "ponto no infinito", que de certo modo
corresponde ao papel do 0 em uma adio. Em computadores, frequentemente representado por x =
y = 0 (que no satisfaz a equao da curva elptica, mas um caso isolado que pode ser facilmente
verificado).
H tambm um operador de passe[+], chamado "adio", que possui umas propriedades similares adio tradicional dos nmeros reais que as crianas no ensino fundamental aprendem. Dados dois
pontos P1e P2na curva, h um terceiro ponto P3= P1+ P2, tambm na curva elptica.
Geometricamente, esse terceiro ponto P3 calculado ao desenhar uma linha entre P1e P2. Essa linha
far a interseco com a curva elptica exatamente em um lugar adicional. Chame esse ponto P#' = (x,y).
Ento reflita no eixo x para obter P3= (x, -y).
Existem vrios casos especiais que explicam a necessidade de um "ponto no infinito."
Se P1e P2so o mesmo ponto, a linha "entre" P1e P2deveria estender para ser a tangente na curva noponto P1. Essa tangente far a interseco com a curva em um novo ponto exato. Voc pode usar
tcnicas de clculo para determinar a inclinao da linha tangente. Essas tcnicas curiosamente
funcionam, mesmo que estejamos restringindo nosso interesse para pontos na curva com duas
coordenadas inteiras!
Em alguns casos (ex: se P1e P2tm os mesmos valores x mas diferentes valores y), a linha tangente ser
exatamente vertical, que no caso P3 = "ponto no infinito".
Se P1 o "ponto no infinito", ento a soma P1+ P2= P2. De modo similar, se P2 o ponto no infinito,
ento P1+ P2= P1. Isso mostra como o ponto no infinito faz o papel do 0.
De forma que + associativo, que significa que (A + B + C = A + (B + C). O que significa que podemos
escrever A + B + C sem parnteses sem qualquer ambiguidade.
Agora que definimos adio, podemos definir multiplicao no modo padro que estende adio. Para
um ponto P na curva elptica, se k um nmero inteiro, ento kP = P + P + P + + P (k vezes). Note que
k algumas vezes confundido como um "expoente" nesse caso.
8
-
7/26/2019 Dominando Bitcoin
75/289
-
7/26/2019 Dominando Bitcoin
76/289
-
7/26/2019 Dominando Bitcoin
77/289
-
7/26/2019 Dominando Bitcoin
78/289
Figure 5. Chave pblica para endereo bitcoin: converso de uma chave pblica em um endereo bitcoin
Codificao Base58 e Base58Check
A fim de representar nmeros grandes de uma forma compacta, utilizando poucos smbolos, muitos
sistemas de computador utilizam uma mistura alfa-nmerica com base (ou raiz) maior do que 10. Por
12
-
7/26/2019 Dominando Bitcoin
79/289
exemplo, enquanto o sistema decimal tradicional utiliza os 10 numerais de 0 a 9, o sistema
hexadecimal utiliza 16, com as letras de A at F como os seis smbolos adicionais. Um nmero
representado no formato hexadecimal menor ao equivalente em decimal. Ainda mais compacto, a
representao Base64 utiliza 26 letras em caixa baixa, 26 letras em caixa alta, 10 numerais e mais dois
caracteres como "+" e "/" para transmitir dados binrios sobre mdias baseadas em texto, como o email.
A Base64 normalmente utilizada para anexar arquivos binrios em emails. A Base58 a codificao
binria baseada em texto desenvolvida para o bitcoin e utilizada e muitas outras criptomoedas. Ela
oferece um equilbrio entre uma representao compacta, leitura e deteco de erro e preveno. ABase58 um subconjunto da Base64, utilizando caixa alta, caixa baixa, letras e nmeros porm
omitindo alguns caracteres que so frequentemente confundidos e podem parecer idnticos quando
mostrados com certas fontes. Sendo especfico, a Base58 a Base64 sem o 0 (nmero zero), O (o
maisculo), l (ele minsculo), I (i maisculo), e os smbolos "\+" e "/". Ou, mais simplesmente, um
conjunto de letras maisculas e minsculas mais os nmeros, sem os quatro caracteres mencionados.
Example 1. O alfabeto Base58 do bitcoin
123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz
Para acrescentar segurana extra contra erros de digitao ou transcrio, o Base58Check um
formato de codificao Base58, frequentemente usado em bitcoin, que tem um cdigo de verificao de
erros embutido. O checksum composto de quatro bytes adicionais, acrescidos ao final dos dados
sendo codificados. O checksum derivado do hash dos dados codificados e, portanto, poder ser usado
para detectar e prevenir erros de transcrio e digitao. Quando o software decodificador se depara
com um cdigo Base58Check, ele calcula o checkum dos dados e o compara com o checksum includo
no cdigo. Se os dois no corresponderem, tem-se uma indicao de que o erro foi introduzido e o dado
Base58Check invlido. Por exemplo, isso previne um endereo bitcoin mal digitado de ser aceito pelosoftware da carteira como um destino vlido, um erro que, do contrrio, resultaria na perda de fundos.
Para converter dados (um nmero) no formato Base58Check, primeiro adicionamos um prefixo aos
dados, chamados de "byte de verso", que serve para identificar facilmente o tipo de dado codificado.
Por exemplo, no caso de um endereo bitcoin, o prefixo zero (0x00 em hexa), enquanto o prefixo
usado para codificar uma chave privada 128 (0x80 em hexa). Uma lista de prefixos comuns
apresentada em Base58Check prefixo de verso e exemplos de resultados codificados.
Em seguida, computamos o checksum "duplo-SHA", o que significa que aplicamos o algoritmo de hash
SHA256 duas vezes no resultado anterior (prefixo e dados):
checksum = SHA256(SHA256(prefix+data))
Pegamos apenas os primeiros quatro bytes do hash de 32 bytes resultante (hash do hash). Esses quatro
bytes servem como cdigo de verificao de erro, ou checksum. O checksum concatenado ao final.
O resultado composto de trs itens: um prefixo, os dados, e um checksum. Esse resultado codificado
13
http://-/?-http://-/?- -
7/26/2019 Dominando Bitcoin
80/289
-
7/26/2019 Dominando Bitcoin
81/289
-
7/26/2019 Dominando Bitcoin
82/289
Example 2. Criando um endereo bitcoin codificado em Base58Check a partir de uma chave privada
#include
int main()
{
// Private secret key.
bc::ec_secret secret;
bool success = bc::decode_base16(secret,
"038109007313a5807b2eccc082c8c3fbb988a973cacf1a7df9ce725c31b14776");
assert(success);
// Get public key.
bc::ec_point public_key = bc::secret_to_public_key(secret);
std::cout
-
7/26/2019 Dominando Bitcoin
83/289
-
7/26/2019 Dominando Bitcoin
84/289
-
7/26/2019 Dominando Bitcoin
85/289
$ bx base58check-decode KxFC1jmwwCoACiCAWZ3eXa96mBM6tb3TYzGmf6YwgdGWZgawvrtJ
wrapper
{
checksum 2339607926
payload 1e99423a4ed27608a15a2616a2b0e9e52ced330ac530edcc32c8ffc6a526aedd01
version 128
}
Codificando de hex para Base58Check
Para codificar em Base58Check (o oposto do comando anterior), ns usamos o comando base58check-
encode do Bitcoin Explorer (ver [libbitcoin]) e fornecemos a chave privada em hexadecimal, seguida
pelo Wallet Import Format (WIF) com prefixo de verso 128:
bx base58check-encode 1e99423a4ed27608a15a2616a2b0e9e52ced330ac530edcc32c8ffc6a526aedd
--version 128
5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1Jcn
Codificando de hex (chave comprimida) para Base58Check
Para codificar em Base58Check como uma chave privada "compactada" (veja Chaves privadas
comprimidas), ns concatenamos o sufixo 01 chave hexa e em seguida codificamos da forma descrita
acima:
$ bx base58check-encode
1e99423a4ed27608a15a2616a2b0e9e52ced330ac530edcc32c8ffc6a526aedd01 --version 128KxFC1jmwwCoACiCAWZ3eXa96mBM6tb3TYzGmf6YwgdGWZgawvrtJ
O formato comprimida-WIF resultante comea com um "K". Isso denota que a chave privada contida
tem um sufixo de "01" e ser usada para produzir apenas chaves pblicas comprimidas (ver Chaves
pblicas comprimidas).
Formatos de chave pblica
As chaves pblicas tambm so apresentadas de diferentes maneiras, principalmente como chaves
pblicas comprimidasou no-comprimidas.
Como vimos anteriormente, a chave pblica um ponto na curva elptica que consiste de um par de
coordenadas (x,y). Ela geralmente apresentada com o prefixo 04 seguida por dois nmeros de 256
bits, um para a coordenada x do ponto, e outro para a coordenada y. O prefixo 04 usado para
distinguir as chaves pblicas no-comprimidas das chaves pblicas comprimidas que comeam com 02
ou 03.
Aqui est a chave pblica gerada pela chave privada que ns criamos anteriormente, mostrada como
19
http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?- -
7/26/2019 Dominando Bitcoin
86/289
as coordenadas x e y:
x = F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A
y = 07CF33DA18BD734C600B96A72BBC4749D5141C90EC8AC328AE52DDFE2E505BDB
Aqui est a mesma chave pblica mostrada como um nmero de 520 bits (130 dgitos hexadecimais)
com o prefixo 04 seguido pelas coordenadas x e y, como, por exemplo, 04 x y:
K = 04F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A07CF33DA18BD734C600B96A72BBC4749D5141C90EC8AC328AE52DDFE2E505BDB
Chaves pblicas comprimidas
As chaves pblicas comprimidas comearam a ser usadas no bitcoin para reduzirem o tamanho das
transaes e para conservarem o espao em disco que os nodos usam para armazenar a blockchain,
que o banco de dados do bitcoin. A maioria das transaes incluem a chave pblica, que necessriapara se validar as credenciais do dono e poder gastar os bitcoins. Cada chave pblica requer 520 bits
(prefixo \+ x \+ y), que quando so multiplicados por vrias centenas de transaes por bloco, ou
dezenas de milhares de transaes por dia, acabam sendo uma grande quantidade de dados adicionais
na blockchain.
Como ns vimos na seo Chaves Pblicas, uma chave pblica um ponto (x,y) em uma curva elptica.
Como a curva expressa uma funo matemtica, um ponto na curva representa uma soluo para a
equao e, portanto, se ns soubermos a coordenada x, ns poderemos calcular a coordenada y ao
resolver a equao y2mod p = (x3+ 7) mod p. Isso nos permite armazenar somente a coordenada xdo
ponto da chave pblica, omitindo a coordenada y e reduzindo o tamanho da chave e o espaonecessrio para armazen-la em 256 bits. Uma reduo de quase 50% do tamanho de cada transao
economiza a utilizao de muito espao ao longo do tempo!
Enquanto as chaves pblicas no-comprimidas tem um prefixo 04, as chaves pblicas comprimidas
comeam com os prefixos 02 ou 03. Existe um motivo pelo qual s existem dois prefixos possveis:
como o lado esquerdo da equao y2, isso significa que a soluo para y uma raiz quadrada, que
pode ter um valor positivo ou negativo. Visualmente, isso significa que a coordenadayresultante pode
estar acima ou abaixo do eixo x. Como voc pode ver no grfico da curva elptica em Uma curva
elptica, a curva simtrica, sendo refletida pelo eixo x, como se fosse um espelho. Ento, enquanto
ns podemos omitir a coordenada y, ns temos que armazenar o sinaldo y (positivo ou negativo), ou,em outras palavras, ns temos que nos lembrar se ele estava acima ou abaixo do eixo x, pois cada uma
dessas opes representa um ponto diferente e uma chave pblica diferente. Quando se calcula a
curva elptica em aritmtica binria no campo finito da ordem prima p, a coordenada you par ou
mpar, o que corresponde ao sinal positivo/negativo explicado anteriormente. Portanto, para distinguir
entre os dois valores possveis de y, ns armazenamos a chave pblica comprimida com o prefixo 02 se
o y par, e 03 se ele mpar, permitindo que o software deduza corretamente a coordenada ya partir
da coordenada x e descomprima da chave pblica para as coordenadas completas do ponto. A
compresso de chave pblica ilustrada em Compresso de chave pblica.
20
http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://-/?- -
7/26/2019 Dominando Bitcoin
87/289
-
7/26/2019 Dominando Bitcoin
88/289
-
7/26/2019 Dominando Bitcoin
89/289
-
7/26/2019 Dominando Bitcoin
90/289
(importada como "bitcoin") para gerar e exibir as chaves e endereos em vrios formatos.
Example 4. Gerao de chaves e endereos e formatao com a livraria pybitcointools
import bitcoin
# Generate a random private key
valid_private_key = False
while not valid_private_key:
private_key = bitcoin.random_key()
decoded_private_key = bitcoin.decode_privkey(private_key, 'hex')
valid_private_key = 0 < decoded_private_key < bitcoin.N
print "Private Key (hex) is: ", private_key
print "Private Key (decimal) is: ", decoded_private_key
# Convert private key to WIF format
wif_encoded_private_key = bitcoin.encode_privkey(decoded_private_key, 'wif')print "Private Key (WIF) is: ", wif_encoded_private_key
# Add suffix "01" to indicate a compressed private key
compressed_private_key = private_key + '01'
print "Private Key Compressed (hex) is: ", compressed_private_key
# Generate a WIF format from the compressed private key (WIF-compressed)
wif_compressed_private_key = bitcoin.encode_privkey(
bitcoin.decode_privkey(compressed_private_key, 'hex'), 'wif')
print "Private Key (WIF-Compressed) is: ", wif_compressed_private_key
# Multiply the EC generator point G with the private key to get a public key point
public_key = bitcoin.fast_multiply(bitcoin.G, decoded_private_key)
print "Public Key (x,y) coordinates is:", public_key
# Encode as hex, prefix 04
hex_encoded_public_key = bitcoin.encode_pubkey(public_key,'hex')
print "Public Key (hex) is:", hex_encoded_public_key
# Compress public key, adjust prefix depending on whether y is even or odd
(public_key_x, public_key_y) = public_keyif (public_key_y % 2) == 0:
compressed_prefix = '02'
else:
compressed_prefix = '03'
hex_compressed_public_key = compressed_prefix + bitcoin.encode(public_key_x, 16)
print "Compressed Public Key (hex) is:", hex_compressed_public_key
# Generate bitcoin address from public key
24
-
7/26/2019 Dominando Bitcoin
91/289
-
7/26/2019 Dominando Bitcoin
92/289
-
7/26/2019 Dominando Bitcoin
93/289
Example 7. Instalando a livraria Python ECDSA e executando o script ec_math.py
$ # Instala o administrador de pacotes Python PIP
$ sudo apt-get install python-pip
$ # Instala a livraria Python ECDSA
$ sudo pip install ecdsa
$ # Executa o script
$ python ec-math.py
Secret:
38090835015954358862481132628887443905