imasters.com.br
Open in
urlscan Pro
45.42.162.11
Public Scan
URL:
https://imasters.com.br/back-end/como-o-bitcoin-forca-o-consenso-entre-os-generais-bizantinos
Submission: On May 21 via api from BY — Scanned from DE
Submission: On May 21 via api from BY — Scanned from DE
Form analysis
2 forms found in the DOM/resultado-de-busca
<form action="/resultado-de-busca" class="search-form">
<div class="search-form__field"><label class="search-form__label">Digite sua palavra-chave</label><input type="text" name="s" class="search-form__input" placeholder="O que você procura?"></div><button type="submit" class="search-form__submit"><span
class="icon icon--search "><svg width="17px" height="17px" viewBox="0 0 30 30">
<title>Busca</title>
<path fill="currentColor"
d="M22.764 20.643l6.797 6.797c0.586 0.586 0.586 1.536 0 2.121s-1.536 0.586-2.121 0l-6.797-6.797c-2.171 1.713-4.912 2.736-7.893 2.736-7.042 0-12.75-5.708-12.75-12.75s5.708-12.75 12.75-12.75c7.042 0 12.75 5.708 12.75 12.75 0 2.98-1.023 5.722-2.736 7.893zM19.74 19.548c1.708-1.756 2.76-4.154 2.76-6.798 0-5.385-4.365-9.75-9.75-9.75s-9.75 4.365-9.75 9.75c0 5.385 4.365 9.75 9.75 9.75 2.644 0 5.041-1.052 6.798-2.76 0.029-0.034 0.059-0.068 0.092-0.1s0.066-0.063 0.1-0.092z">
</path>
</svg></span></button>
</form>
<form>
<header class="newsletter__header">
<h2 class="title-highlight">Assine nossa<strong class="title-highlight__large">Newsletter</strong></h2>
<p>Fique em dia com as novidades do iMasters! Assine nossa newsletter e receba conteúdos especiais curados por nossa equipe</p>
</header>
<div class="newsletter__form"><span id="" class="field--has-icon field field--email "><span class="field__content"><input type="email" id="" name="newsletterEmail" placeholder="Qual é o seu e-mail?"><span class="icon icon--package "><svg
width="20px" height="20px" viewBox="0 0 28 30">
<title>package</title>
<path fill="currentColor"
d="M20.572 11.435c-0.008 0.004-0.016 0.008-0.024 0.012l-5.548 2.774v12.211l9.306-4.653c0.425-0.211 0.693-0.644 0.694-1.118v-11.44l-4.428 2.214zM10.301 4.077l9.699 4.849 3.449-1.724-9.144-4.572c-0.35-0.174-0.761-0.173-1.109-0.001l-2.895 1.448zM7.506 5.474l-3.455 1.727 9.699 4.849 3.455-1.727-9.699-4.849zM6.836 3.014c0.068-0.042 0.139-0.078 0.213-0.107l5.032-2.516c1.051-0.522 2.286-0.522 3.338 0l10 5c1.274 0.633 2.080 1.933 2.081 3.357v11.913c-0.001 1.423-0.807 2.723-2.078 3.355l-10 5c-1.056 0.529-2.3 0.529-3.356 0l-10.003-5.002c-1.273-0.641-2.072-1.949-2.063-3.366v-11.901c0.001-1.423 0.807-2.723 2.078-3.355l4.758-2.379zM12.5 26.439v-12.217l-10-5-0 11.436c-0.003 0.475 0.263 0.911 0.684 1.123l9.316 4.658z">
</path>
</svg></span></span></span><button type="submit" class="btn-primary btn-primary--submit">Assinar</button></div>
</form>
Text Content
we are developers * Fórum iMasters * Portal E-Commerce Brasil * iMasters Business Busca close-circle Digite sua palavra-chave Busca POWERED BY: * facebook * twitter * linkedin * packageBack-End * packageMobile * packageFront End * packageDevSecOps * packageDesign & UX * packageData * packageAPIs e Microsserviços Back-End 21 nov, 2017 COMO O BITCOIN FORÇA O CONSENSO ENTRE OS GENERAIS BIZANTINOS? * facebook-color * twitter-color * linkedin-color COMPARTILHE! FÁBIO AKITA Tem 34 artigos publicados com 115600 visualizações desde 2015 Publicidade FÁBIO AKITA 34edit Co-fundador da Codeminer 42, empresa de desenvolvimento de software principalmente para startups. Desde 2008 é o criador e organizador do Rubyconf Brasil, uma das maiores conferências de tecnologia da América Latina. Tem experiência de 20 anos no mercado de software, tendo passado pelo mercado de grandes agências, consultoria SAP corporativo e pelo primeiro boom de startups em 2000. Leia mais 10 mai, 2018 RODANDO O ARCH LINUX PELO WINDOWS 10! 7 mai, 2018 [SMALLTIPS] RODANDO O GITLAB CI RUNNER LOCALMENTE 17 abr, 2018 7MASTERS BLOCKCHAIN – BLOCKCHAIN EM 7 MINUTOS > “É possível quebrar a blockchain?” Essa é uma questão justa. Se você conhece alguma coisa sobre a arquitetura blockchain, instintivamente conclui que “não”, é bastante improvável que alguém a quebre. Na prática, é basicamente impossível. É bastante surpreendente que a maioria dos meus programadores pares tenham muita dificuldade para superar o preconceito contra criptomoedas. Não tenho ideia de onde esse preconceito vem, mas conheço pessoas muito inteligentes que podem resolver os problemas mais difíceis de escalabilidade da web, mas que nunca antes olhou para o papel original e extremamente curto de Satoshi Nakamoto descrevendo o blockchain. Sério, o paper Bitcoin: A Peer-to-Peer Electronic Cash System é tão ridiculamente pequeno e fácil de entender que a maioria dos estudantes de informática deve ser capaz de compreendê-lo. Então, todos os programadores inteligentes que eu conheço devem poder entendê-lo em uma pausa para o café. Qualquer programador médio deve poder ler e entender esse documento em mais ou menos 30 minutos. Você pode simplificar um modelo mental como uma Linked List, e cada nó da lista é o que chamamos de bloco. Cada bloco é uma estrutura estúpida com os ponteiros anteriores/posteriores e um corpo composto por uma estrutura semelhante à árvore (uma árvore Merkle, para ser mais exato). A pegadinha é que cada bloco possui a assinatura hash do bloco anterior, criando assim uma “cadeia” segura. Daí o “block-chain”. Sim, em termos de Ciência da Computação, estamos lidando com níveis de graduação de estruturas de dados aqui. Se você entender uma Linked List e uma árvore binária estúpida, além da coisa de criptografia mais fácil de entender, um estúpido Digest Hash, como SHA256 e, boom, você entende o básico do banco de dados blockchain. Sim, é apenas um banco de dados. Um banco de dados distribuído para ser mais exato. Ou um banco de dados distribuído muito grosso e simples para esse assunto. Não é muito eficiente, e isso contrasta com os bancos de dados distribuídos NoSQL mais sérios, como Redis ou Cassandra. Portanto, as habilidades de consulta são basicamente inexistentes, além de encontrar um bloco por sua identidade. Claro, o código-fonte do Bitcoin é mais sofisticado do que isso, mas o básico é realmente tão ridículo que você não precisa de mais de 20 linhas de código Ruby para replicá-lo. Confira esta implementação de exemplo de Gerald Bauer. require "digest" # for hash checksum digest function SHA256 class Block attr_reader :index attr_reader :timestamp attr_reader :data attr_reader :previous_hash attr_reader :hash def initialize(index, data, previous_hash) @index = index @timestamp = Time.now @data = data @previous_hash = previous_hash @hash = calc_hash end def calc_hash sha = Digest::SHA256.new sha.update( @index.to_s + @timestamp.to_s + @data + @previous_hash ) sha.hexdigest end def self.first( data="Genesis" ) # create genesis (big bang! first) block ## uses index zero (0) and arbitrary previous_hash ("0") Block.new( 0, data, "0" ) end def self.next( previous, data="Transaction Data..." ) Block.new( previous.index+1, data, previous.hash ) end end Certo? Uma pergunta permanece: como essa estrutura estúpida se tornou um banco de dados “distribuído”? Agora, ou você precisa ter uma “cópia-mestra” centralizada, da qual todas as outras cópias são replicadas, ou você precisa de alguma forma de “consenso” entre as diferentes cópias. Como chegar ao consenso entre o nó rogue e aleatório em todo o mundo? Esse é o problema que se chama “Byzantine Fault Tolerance” (“tolerância a falhas bizantinas”, em tradução livre), explicado e resolvido magistralmente por Barbara Liskov e Miguel Castro, do MIT, em 1999. Em poucas palavras, imagine que você tem generais bizantinos, cada um com seus próprios exércitos, em torno de uma cidade hostil. Agora, você pode atacar ou recuar. Mas todos os generais devem fazer uma coisa ou outra, em consenso. Como chegar ao consenso quando não há comunicação direta com todos os generais e, pior ainda, quando alguns dos generais podem ser traidores ou agentes duplos? Esse é o tipo de problema que enfrentamos aqui. Qualquer pessoa na Internet pode fazer o download de uma cópia do blockchain, e elas podem verificar se os blocos são válidos e não adulterados por recompor os hash digests para cada bloco. Mas como você adiciona novos blocos e faz os outros nós aceitarem seu novo bloco? Foi por isso que Satoshi adicionou a chamada “Proof of Work” (“Prova de Trabalho”) à equação. Lembra que eu disse que cada bloco é encadeado ao anterior, contendo o hash do bloco anterior? A computação de um hash digest é bastante trivial nos dias de hoje. Em Ruby, se você fizer isto: Digest::SHA256.hexdigest("abcd") # => "88d4266fd4e6338d13b845fcf289579d209c897823b9217da3e161936f031589" Digest::SHA256.hexdigest("123") # => "a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3" Demora uma fração de milissegundo para rodar. Agora, e se eu pedir que você encontre o hash que começa com uma certa quantidade de “zeros” no início do hash? Por exemplo: # I want to find 4 zeros ("0000") in the hash: Digest::SHA256.hexdigest("79026" + "123") # => "0000559fb4a55f135c7db3d83405b86b4b63cd035993873a5b676bae08b64334" Como eu sei que tive que incluir “79026” no início? Eu não sei, eu tenho que começar de 0 e incrementar um por um até encontrar o hash com o formato que eu quero. Se verificarmos o exemplo de Gerald, implementaríamos essa pesquisa desta forma: def compute_hash_with_proof_of_work( difficulty="00" ) nonce = 0 loop do hash = calc_hash_with_nonce( nonce ) if hash.start_with?( difficulty ) return [nonce,hash] ## bingo! proof of work if hash starts with leading zeros (00) else nonce += 1 ## keep trying (and trying and trying) end end end def calc_hash_with_nonce( nonce=0 ) sha = Digest::SHA256.new sha.update( nonce.to_s + "123" ) sha.hexdigest end Apenas um simples SHA256 leva a algo entre 0.000010 e 0.000020 segundos (lembre-se: frações de milissegundos). Agora, quanto tempo leva para descobrir “79026” (que chamamos de “nonce”)? > puts Benchmark.measure { compute_hash_with_proof_of_work("0000") } 0.190000 0.000000 0.190000 ( 0.189615) Sim, consideravelmente mais, agora leva 0,18 segundos em vez de 0,000020. Podemos aumentar a variável “difficult” para tornar ainda mais difícil de encontrar o nonce. E é exatamente assim que o Bitcoin é implementado: cada bloco ajusta o difficult, então o tempo mais rápido que se leva para encontrar o hash para o próximo bloco é de cerca de 10 minutos. E isso, meus amigos, é o que chamamos de “MINERAÇÃO“. O que um mineiro faz é calcular um loop, incrementando o nonces, sobre o resumo do bloco para encontrar o nonce correto. Quando um nonce é encontrado, o mineiro pode adicionar o bloco ao blockchain e transmiti-lo para outros nós. Os outros nós podem então verificar novamente (e agora é apenas o procedimento de 0.000020 segundos novamente, super-rápido). Quando os nós controlam e confirmam o nonce, todos eles adicionam o bloco ao topo do blockchain. E, geralmente, quando os outros mineiros continuam adicionando outros blocos em cima disso, esse bloco se torna “solidificado”. O bloco mais recente no topo do blockchain geralmente é instável, mas uma vez que você tem mais blocos em cima dele, ele é considerado mais “garantido”. É por isso que a maioria das trocas e outros serviços que aceitam Bitcoin aguardam a chamada confirmação de “6 blocos”. E pela dificuldade ser tal, que o nó mais rápido leva em torno de “10 minutos” para encontrar esse nonce, um bloco é dito ser “seguro” quando cerca de uma hora se passou e seis blocos foram adicionados após ele. PODEMOS QUEBRAR ISSO? Agora você entenderá por que falamos de “poder de hash” quando falamos de mineração. A mineração é o ato de assinar e confirmar blocos para o blockchain. É um serviço de manutenção, razão pela qual você recompensa os mineiros com “taxas de transação” e algumas “satoshis” (frações de 1 Bitcoin) pelo seu trabalho. E também por que você chama essa “Proof of Work”, porque quando alguém descobre um nonce, sabemos que foi necessária uma grande quantidade de computação hash. E também por que falamos sobre CPUs ou GPUs que os mineiros usam para ter “taxas de hash”. Você precisa ter uma capacidade absurda para poder mineirar Bitcoins atualmente. Ninguém usará uma plataforma construída em casa para fazê-lo. É preciso construir hardware especial, como o famoso AntMiners. Um USD 1,500 AntMiner S9 é capaz de calcular aproximadamente 14 TH. Cada criptomoeda diferente do Bitcoin calcula hashes de maneira diferente, de modo que a hashrate difere de moeda para moeda. O atual Hash Power de toda a rede de consenso de Bitcoin atinge quase 14 EH (exa-hashes ou milhões de tera-hashes). Então, digamos que eu sou um bilionário e quero trollar a comunidade de Bitcoin, acrescentando poder de hash suficiente para superar todo o poder de hash da rede. Eu teria que comprar 1 milhão de AntMiner s9, ou um investimento de aproximadamente US$ 1,5 bilhão! E isso sem adicionar a energia necessária para inicializar e executar essas máquinas, é claro. Mas, mesmo assim, você sabe o que acontece? Lembra-se da variável difficult que mencionei acima? Ela irá se ajustar novamente, para garantir que o próximo bloco demore 10 minutos para calcular novamente! Então, não, mesmo se você estiver disposto a desperdiçar US$ 1,5 bilhão, você não vai quebrá-lo. E é assim que o Bitcoin lida com os generais bizantinos nessa rede de consenso. *** Artigo traduzido com autorização do autor. Publicado originalmente em: http://www.akitaonrails.com/2017/11/01/how-does-bitcoin-force-consensus-among-byzantine-generals De 0 a 10, o quanto você recomendaria este artigo para um amigo? 012345678910 FILEARTIGOS PUBLICADOS POR ESTE AUTOR FÁBIO AKITA 10 mai, 2018play RODANDO O ARCH LINUX PELO WINDOWS 10! FÁBIO AKITA 7 mai, 2018play [SMALLTIPS] RODANDO O GITLAB CI RUNNER LOCALMENTE FÁBIO AKITA 17 abr, 2018play 7MASTERS BLOCKCHAIN – BLOCKCHAIN EM 7 MINUTOS FÁBIO AKITA 19 mar, 2018play COMO FAZER PARA APRENDER NOVAS LINGUAGENS? FÁBIO AKITA 22 jan, 2018play IMPLANTAÇÃO RUBY ON RAILS EM NÍVEL DE PRODUÇÃO NO KUBERNETES ENGINE DO GOOGLE CLOUD – PARTE 02 FÁBIO AKITA 9 jan, 2018play CRIPTOMOEDAS: É UMA BOLHA? ISSO IMPORTA? Saiba mais FÁBIO AKITA * facebook * twitter * url * e-mail edit34 Artigo(s) Co-fundador da Codeminer 42, empresa de desenvolvimento de software principalmente para startups. Desde 2008 é o criador e organizador do Rubyconf Brasil, uma das maiores conferências de tecnologia da América Latina. Tem experiência de 20 anos no mercado de software, tendo passado pelo mercado de grandes agências, consultoria SAP corporativo e pelo primeiro boom de startups em 2000. ESTE PROJETO É MANTIDO E PATROCINADO PELAS EMPRESAS ASSINE NOSSANEWSLETTER Fique em dia com as novidades do iMasters! Assine nossa newsletter e receba conteúdos especiais curados por nossa equipe packageAssinar * Sobre o iMasters * Política de Privacidade * Fale conosco * Quero ser autor * Fórum * iMasters Business