Dominando Bitcoin

download Dominando Bitcoin

If you can't read please download the document

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