diff --git a/.gitignore b/.gitignore index 7caf954..ff262b6 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ node_modules/ tools/runkeeper/ docker-compose.override.yml +package-lock.json diff --git a/README.pt-br.md b/README.pt-br.md new file mode 100644 index 0000000..9aa58d5 --- /dev/null +++ b/README.pt-br.md @@ -0,0 +1,10 @@ +# Blockchain Demo + +Uma demonstração web sobre conceitos de blockchain. + +Leia em: + +1. https://blockchain4devs.github.io/blockchain-demo/docs/pt-br/ +2. [https://blockchain4devs.github.io/blockchain-demo/docs/pt-br/blockchain-demo.pdf (PDF)](https://blockchain4devs.github.io/blockchain-demo/docs/pt-br/blockchain-demo.pdf) + +Os fontes desses docucumentos estão disponíveis no diretório [docs/pt-br](docs/pt-br). diff --git a/docs/pt-br/.gitignore b/docs/pt-br/.gitignore new file mode 100644 index 0000000..59798f6 --- /dev/null +++ b/docs/pt-br/.gitignore @@ -0,0 +1,3 @@ +/index.* +!/index.adoc +/blockchain-demo.* diff --git a/docs/pt-br/build b/docs/pt-br/build new file mode 100755 index 0000000..cb95de2 --- /dev/null +++ b/docs/pt-br/build @@ -0,0 +1,96 @@ +#!/bin/bash +set +x +set -e + +BASE_DIR=`cd "$(dirname "$0")"; pwd` +PROJECT_DIR=`cd "$BASE_DIR/../.."; pwd` +RELATIVE_DIR=${BASE_DIR##$PROJECT_DIR/} + +config=build.conf +[ -f "$BASE_DIR"/$config ] || config=$config.sample +source "$BASE_DIR"/$config + +# called automatically when you invoke this script +check_prerequisites() { + which asciidoctor > /dev/null || { + echo "ERROR: install asciidoctor first!" + exit 1 + } + + if $generate_pdf + then + if $use_fopub + then + [ -x "$fopub" ] || { + echo "ERROR: can't execute $fopub!" + exit 1 + } + else + which asciidoctor-pdf > /dev/null || { + echo "ERROR: install asciidoctor-pdf first!" + exit 1 + } + fi + fi +} + +# used to remove generated docs (HTML and/or PDF) +_clean() { + rm -f index.{html,xml} + rm -f $pdf_name $xml_name +} + +# used to build the main doc (HTML and/or PDF) +_build() { + local result + + asciidoctor index.adoc + result=$? + + $generate_pdf || exit $result + + if $use_fopub + then + asciidoctor -b docbook -d book -a data-uri! index.adoc -o $xml_name + $fopub $xml_name + else + asciidoctor-pdf -o $pdf_name index.adoc + fi +} + +# used to publish the generated docs to GitHub Pages +_publish() { + local published_dir=`mktemp -d` + local remote_repo=`git config --get remote.origin.url` + [ ".$remote_repo" = "." ] && { + echo 'The remote repository is not configured!' + return 1 + } + + mkdir -p "$published_dir/$RELATIVE_DIR" + rsync -av --delete \ + --include='*.html' \ + --include='*.pdf' \ + --include='images/' \ + --include='images/**' \ + --exclude='*' \ + . $published_dir/$RELATIVE_DIR/ + + local msg="Published at `date`" + cd "$published_dir" + git init + git add -A + git commit -m "$msg" + git push --force $remote_repo master:gh-pages + cd - &> /dev/null +} + +check_prerequisites +cd "$BASE_DIR" +op=$1 +[ "$op" ] || op=build +type _$op &> /dev/null || { + echo "Usage: `basename $0` [build]|" + exit 1 +} +_$op diff --git a/docs/pt-br/build.conf.sample b/docs/pt-br/build.conf.sample new file mode 100644 index 0000000..a2c26e4 --- /dev/null +++ b/docs/pt-br/build.conf.sample @@ -0,0 +1,7 @@ +#!/bin/bash + +generate_pdf=${generate_pdf:-true} +use_fopub=${use_fopub:-false} +pdf_name=${pdf_name:-blockchain-demo.pdf} +xml_name=${pdf_name%.pdf}.xml +fopub=${fopub:-~/Projects/github.com/asciidoctor/asciidoctor-fopub/bin/fopub} diff --git a/docs/pt-br/definitions.adoc b/docs/pt-br/definitions.adoc new file mode 100644 index 0000000..8f8cb38 --- /dev/null +++ b/docs/pt-br/definitions.adoc @@ -0,0 +1,12 @@ +:PauloJeronimo: {uri-paulojeronimo}[Paulo Jerônimo] +:AndersBrownworth: {uri-andersbrownworth}[Anders Brownworth] +:blockchain4devs: {uri-blockchain4devs}[blockchain4devs] +:blockchain-demo-src: {uri-blockchain4devs}/blockchain-demo +:blockchain: Blockchain +:rootdir: link:{uri-blockchain-demo-2}[blockchain-demo] +:macOS: {uri-macOS}[macOS] + +ifdef::backend-html5[] +:rootdir: ../.. +:blockchain: pass:[Blockchain] +endif::[] diff --git a/docs/pt-br/demonstracao/a-blockchain-utilizada-no-controle-de-transacoes/coinbase-transactions.adoc b/docs/pt-br/demonstracao/a-blockchain-utilizada-no-controle-de-transacoes/coinbase-transactions.adoc new file mode 100644 index 0000000..f17f246 --- /dev/null +++ b/docs/pt-br/demonstracao/a-blockchain-utilizada-no-controle-de-transacoes/coinbase-transactions.adoc @@ -0,0 +1,46 @@ +[[coinbase-transactions]] += Transações Gênese + +Como vimos uma {blockchain} voltada ao controle de transações precisa manter um registro imutável dessas transações. +Mas, além disso, em se tratando de transações, é essencial conseguirmos verificar se elas realmente são válidas. +Num sistema financeiro, para que uma pessoa possa gastar algum dinheiro, ela precisa ter saldo, óbvio. +Então, esse dinheiro deve ter vindo de alguém que, por sua vez, recebeu de outro alguém e assim suscessivamente. +Voltando no tempo dessa forma, chegaremos até o ponto em que o dinheiro surgiu. + +Poderíamos nos imaginar na figura de mineradores reais. +Encontrando uma mina de ouro, utilizaríamos parte do ouro que minerássesmos para trocá-lo por coisas. +Devemos nos lembrar que toda mina de ouro é finita. +A moeda (o ouro nesse caso) é simplesmente algo que utilizamos para facilitar uma troca por algo que queremos. +As pessoas que recebem esse ouro, por sua vez, poderiam dividí-lo em porções ainda menores para comprar coisas de outras pessoas. +O Bitcoin funciona exatamente assim, como o ouro. + +Vamos fazer uma representação sistêmica desse processo. +Para entender como surge o dinheiro numa {blockchain}, precisamos definir o {uri-coinbase-transaction}[conceito de transação gênese] (ou transação coinbase). + +Nessa demonstração, {AndersBrownworth} é o "descobridor de uma mina". +Sendo assim, a primeira coisa que ele faz é criar para si um {uri-genesis-block}[bloco gênese], de identificador 1. +Esse bloco não contém nenhuma transação além de uma, especial, chamada de `Coinbase`. +Essa transação especial é de "ninguém" para a pessoa que criou o bloco, no caso, um minerador. +Nessa {blockchain}, Anders resolve se dar 100 dólares no primeiro bloco (1). + +[NOTE] +==== +* O {uri-blockchain-genesis-block}[bloco gênese na Blockchain do Bitcoin], criada por {uri-satoshi-nakamoto}[Satoshi Nakamoto] tem o identificador 0. +* No caso do Bitcoin, o valor de {uri-coinbase}[Coinbase] foi de 50 BTC quando a rede foi criada. +Em seguida, caiu para 25 e, no ano passado, foi para 12.5 BTC. Esse valor sempre decairá. +* No Bitcoin, o valor de `Coinbase` é um valor que é reivindicado por um minerador como prêmio pela mineração do bloco. +==== + +No bloco 2, existem transações. +O importante nessa implementação de {blockchain} é que, agora, dá pra saber se uma transação é válida. +Vejamos como. + +No bloco 4, por exemplo, Sophia transfere para Jackson, 8 dólares. +Será que Sophia realmente tinha 8 dólares? +Para saber isso, vamos ao bloco anterior (3). +Sophia não teve transações nesse bloco. +Vamos ao anterior novamente (2). +Nesse bloco, Sophia recebeu, de Anders, 10 dólares. +Então, sem dúvida, Sophia pode gastar esse dinheiro. + +Portanto, com essa nova implementação de {blockchain}, agora conseguimos verificar se uma transação é válida. diff --git a/docs/pt-br/demonstracao/a-blockchain-utilizada-no-controle-de-transacoes/index.adoc b/docs/pt-br/demonstracao/a-blockchain-utilizada-no-controle-de-transacoes/index.adoc new file mode 100644 index 0000000..fdf7372 --- /dev/null +++ b/docs/pt-br/demonstracao/a-blockchain-utilizada-no-controle-de-transacoes/index.adoc @@ -0,0 +1,10 @@ +[[a-blockchain-utilizada-no-controle-de-transacoes]] += A Blockchain utilizada no controle de transações icon:dollar[] + +:leveloffset: +1 + +include::tokens.adoc[] + +include::coinbase-transactions.adoc[] + +:leveloffset: -1 diff --git a/docs/pt-br/demonstracao/a-blockchain-utilizada-no-controle-de-transacoes/tokens.adoc b/docs/pt-br/demonstracao/a-blockchain-utilizada-no-controle-de-transacoes/tokens.adoc new file mode 100644 index 0000000..574d46e --- /dev/null +++ b/docs/pt-br/demonstracao/a-blockchain-utilizada-no-controle-de-transacoes/tokens.adoc @@ -0,0 +1,41 @@ +[[tokens]] += Tokens + +Na {uri-blockchain-demo-tokens}[aba Tokens] visualizamos uma das possíveis aplicações da {blockchain}. +Ela pode ser utilizada para um sistema financeiro. +Em essência, <>, a origem da {blockchain} foi para tornar possível a existência do {uri-bitcoin-paper}[Bitcoin]. +Em inglês, o termo https://www.google.com.br/search?q=what+is+a+token[token] é dado para uma coisa que esteja servindo como uma representação visível ou tangível de um fato, qualidade, sentimento, etc. +Dessa forma o campo `Data` numa {blockchain} pode representar um `token` que, nesse contexto, significa um registro de várias transações. +Cada transação, por sua vez, registra que pessoa está enviando uma quantia (em moeda icon:dollar[]) para outra pessoa. + +Como já vimos, o registro de dados numa {blockchain} é imutável. +Logo, se esses dados forem transações, elas também serão imutáveis. +E, num registro dessa espécie, é essencial essa imutabilidade pois nenhuma pessoa de boa fé gostaria de ver transações sendo adulteradas. +A {blockchain} resolve isso. +Se tentarmos fazer uma alteração nos dados de qualquer transação poderemos notar que o bloco será invalidado. + +Nessa demonstração, as transações são representadas de forma muito simplificada. +Basicamente, cada transação possui apenas três (3) campos: quem está enviando um valor, quem está recebendo e, por fim, o valor. +Fundamentalmente, para um sistema de transações, essas são as três informações chave. +É muito importante que saibamos de onde uma quantia saiu e para onde ela foi. + +É claro que apenas essas três informações não são suficientes para se contruir um sistema realmente utilizável. +Afinal, as pessoas querem privacidade e anonimato por razões óbvia (de segurança). +Ninguém utilizaria um sistema, como esse, onde estão públicas as informações do nome da pessoa e dos valores que ela movimenta. +Então, num sistema como o Bitcoin, ao invés de utilizarmos nomes, utilizamos endereços. + +Da mesma forma que não queremos adulterações nos dados, devemos evitar outras possibilidades de fraudes. +Há um tipo de fraude que não seria possível de ser verificada numa {blockchain} implementada da forma como estamos fazendo agora. +Essa fraude seria uma pessoa tentar "gastar" o mesmo diheiro duas vezes. +Isso é conhecido como "gasto duplo". + +Exemplificando a possibilidade de gasto duplo através de um passo a passo: + +. Darcy tem 25 dólares e quer comprar algo de Bingley. +. Ela passa seus 25 dólares para o Bingley. +. Utilizando essa {blockchain}, ela também tenta comprar algo de Jane, gastando mais 25 dólares. +. O problema: será que Darcy tinha, realmente, 50 dólares? +Ou será que ela está tentando gastar os mesmos 25 dólares que já possuia? +Como nessa {blockchain} não há o registro do saldo anterior de Darcy, isso poderia ser possível. Concorda? + +Então, claramente, essa {blockchain} precisa ser evoluída. diff --git a/docs/pt-br/demonstracao/index.adoc b/docs/pt-br/demonstracao/index.adoc new file mode 100644 index 0000000..0325077 --- /dev/null +++ b/docs/pt-br/demonstracao/index.adoc @@ -0,0 +1,16 @@ +[[demonstracao]] += Demonstração + +:srcdir: ../../.. + +:leveloffset: +1 + +include::o-que-e-um-hash.adoc[] + +include::o-que-e-um-bloco.adoc[] + +include::o-que-e-uma-blockchain/index.adoc[] + +include::a-blockchain-utilizada-no-controle-de-transacoes/index.adoc[] + +:leveloffset: -1 diff --git a/docs/pt-br/demonstracao/o-que-e-um-bloco.adoc b/docs/pt-br/demonstracao/o-que-e-um-bloco.adoc new file mode 100644 index 0000000..b3c52a4 --- /dev/null +++ b/docs/pt-br/demonstracao/o-que-e-um-bloco.adoc @@ -0,0 +1,34 @@ +[[o-que-e-um-bloco]] += O que é um Bloco? + +Vamos agora para a {uri-blockchain-demo-block}[aba Block]. +Adicionaremos, acima do campo `Data` aprensentado na aba `Hash`, dois outros campos: `Block` e `Nonce`. +Eles serão explicados agora. +Também vamos criar um botão `Miner` e explicar qual será sua utilidade. +Com a adição desses novos elementos, estamos criando o que chamaremos de *Bloco*. + +Um bloco, então, tem um número identificador (`Block`), um `Nonce`, e pode ser "minerado" quado clicarmos no botão `Miner`. +Também notemos que o campo `Hash` agora possui um valor interessante, iniciado por quatro zeros ("0000"). +Esse valor de `Hash` é bastante singular. +Ele é criado através de uma *regra que é utilizada para verificar se o bloco é válido*. +Nesse nosso caso, a regra é bem simples: o valor do `Hash`, calculado em função do valor inserido em `Data` (e dos outros campos), precisará começar com esses quatro zeros. + +Para encontar um `Hash` que safisfaça essa regra, após inserir os dados que desejamos no campo `Data`, iremos alterar o valor de `Nonce`. +O número identificador do bloco (`Block`) será gerado automaticamente (apesar de podermos modificá-lo, para testes, nesse exemplo). +Esse cáculo do `Hash` será repetidamente refeito, até encontarmos um `Hash` que comece com esses quatro zeros. + +Você pode notar também que, qualquer mudança nos campos (`Block`, `Nonce` e `Data`) altera o valor de `Hash`. + +Manualmente, poderíamos ficar tentando modificar o valor de `Nonce` até encontarmos a solução para esse problema. +Mas, fazendo isso, poderemos passar vários minutos ou horas (ou mesmo dias) em tentativas. +Então, o botão `Miner` servirá para realizar essa tarefa pra nós. + +A atividade de {uri-mining}["mineração"], então, é nesse nosso caso uma tarefa que será executada pelo computador. +Ela será realizada em função do valor de todos os campos e buscará um `Hash` que atenda a regra estabelecida: começar com quatro zeros. +Essa regra também é conhecida por "desafio matemático". +Você pode notar que esse desafio (no nosso caso e em várias outras formas de propô-lo) não é uma função complexa. +Por outro lado, ela é onerosa pois pode cosumir muito tempo de processamento. +O trabalho de "mineração" realizado dessa forma é também conhecido por {uri-proof-of-work}["Proof of Work"]. + +Após um bloco ser "minerado", a conferência de sua validade é algo extremamente simples e rápido. +Essa conferência é apenas o cálculo do `Hash` de todos os campos (`Block` + `Nonce` + `Data`) e a obediência a regra estabelecida (em nosso caso, um `Hash` começando com quatro zeros iniciais). diff --git a/docs/pt-br/demonstracao/o-que-e-um-hash.adoc b/docs/pt-br/demonstracao/o-que-e-um-hash.adoc new file mode 100644 index 0000000..9876109 --- /dev/null +++ b/docs/pt-br/demonstracao/o-que-e-um-hash.adoc @@ -0,0 +1,67 @@ +[[o-que-e-um-hash]] += O que é um Hash? + +Hashes são parte de várias informações armazenadas na {blockchain} e são essenciais para garantir sua segurança. + +Matematicamente falando, uma {uri-funcao-hash}[função hash] é um algoritmo que mapeia dados de comprimento variável para dados de comprimento fixo. +Os valores retornados por uma função hash são chamados valores hash, códigos hash, somas hash, checksums ou, simplesmente, hashes. + +Nessa demonstração, a {uri-blockchain-demo-hash}[aba Hash] possibilita a entrada de uma informação de tamanho qualquer (no campo `Data`) e produz um `Hash` de tamanho fixo. +A função SHA256 é uma das variantes do {uri-sha-2}[SHA-2] e utilizada para gerar esse código hash. +Esse código é geralmente representado por uma string de 64 caracteres hexadecimais (de "0" a "9" e de "a" a "f"). +Obviamente, além dessa função, existem várias outras que poderiam ser utilizadas para gerar uma string de tamanho fixo a partir de uma quantidade de dados variáveis. +Outros exemplos de funções (dentre várias) são o MD5 e o SHA-1. + +Ao se gerar um hash, espera-se que a cadeia fixa produzida a partir de um conjunto de informações tenha sempre um valor diferente para outro conjunto de entrada. +Se o hash gerado num conjunto de dados for igual ao de outro, ocorre o que chamamos de colisão. +Quanto menos colisões houverem ao se gerar um hash para um conjunto de informações diferentes, melhor o algoritmo de Hash. + +Foram necessários 20 anos para que fosse {uri-announcing-first-sha1-collision}[anunciada a primeira colisão de hash para a função SHA-1]. +Isso quer dizer que esse algoritmo foi considerado seguro e utilizado por todo esse espaço de tempo, sem problemas. +O site {uri-shattered} demonstra que, para se proferir um ataque onde se tentaria obter um hash igual para um `input` diferente utilizando o algoritmo SHA-1, seriam necessárias 9.223.372.036.854.775.808 de execuções do algoritmo. +Ou seja, um número monstruoso de compressões. +Para ser realizado esse número de compressões, seriam necessários 6.500 anos de processamento de uma CPU comum (ou 110 anos de uma GPU). + +Uma colisão de SHA-1 pode ser visualizada, como na execução/resultado dos comandos apresentados a seguir: + +[NOTE] +==== +Essa execução/resultado de comandos é feita num shell (Bash) de um {macOS}. +Mas, ela também pode ser adaptada e realizada em outros sistemas operacionais. +==== + +---- +$ for n in 1 2; do curl -s -O https://shattered.it/static/shattered-$n.pdf; done +$ open shattered-*.pdf +$ diff shattered-*.pdf +Binary files shattered-1.pdf and shattered-2.pdf differ +$ shasum shattered-*.pdf +38762cf7f55934b34d179ae6a4c80cadccbb7f0a shattered-1.pdf +38762cf7f55934b34d179ae6a4c80cadccbb7f0a shattered-2.pdf +---- + +O código JavaScript da {uri-blockchain-demo-hash}[aba Hash] (`views/hash.jade`) é um código escrito em {uri-jade}[Jade]. +Ele calcula o hash através de um código (em JavaScript) que executa a função sha256. + +[source,javascript] +.public/javascripts/lib/sha256.js +---- +include::{srcdir}/public/javascripts/blockchain.js[lines=1..4] +---- + +Obviamente, a função hash implementada em JavaScript também deve produzir o mesmo resultado que uma função que pode ser chamada via linha de comando. +Sendo assim, também é possível gerar o hash de uma string informada no quadro `Data` através de uma linha de comando (em Bash, por exemplo). + +O Hash para a string vazia (valor inicial do quadro), pode ser calculado assim: + +---- +echo -n ''|shasum -a 256 +---- + +Então, o hash de "Paulo Jerônimo" poderia ser calculado assim: + +---- +echo -n 'Paulo Jerônimo'|shasum -a 256 +---- + +Para se aprofundar um pouco mais em funções hash aplicadas a moedas digitais e saber quando colisões em valores de hash tem importância nesse contexto, recomenda-se a leitura do artigo {uri-history-of-hash-function-attacks}["Lessons From The History Of Attacks On Secure Hash Functions"]. diff --git a/docs/pt-br/demonstracao/o-que-e-uma-blockchain/a-blockchain-e-distribuida-e-descentralizada.adoc b/docs/pt-br/demonstracao/o-que-e-uma-blockchain/a-blockchain-e-distribuida-e-descentralizada.adoc new file mode 100644 index 0000000..0c53f52 --- /dev/null +++ b/docs/pt-br/demonstracao/o-que-e-uma-blockchain/a-blockchain-e-distribuida-e-descentralizada.adoc @@ -0,0 +1,30 @@ +[[a-blockchain-e-distribuida-e-descentralizada]] += A Blockchain é distribuída e descentralizada + +Vimos que uma {blockchain} é uma estrutura de dados confiável que só aceita inserções de dados. +Ou seja, ela é resistente a mudanças. +Mas, além disso, uma {blockchain} é também uma rede de computadores onde essa estrutura de dados é replicada. +Dessa forma, sua estrutura de dados existe, distribuída, em cada um dos computadores (nós) dessa rede. + +O objetivo principal da distribuição de uma {blockchain} entre vários nós é impedir que mesmo sendo ela válida num único nó, ela só seja totalmente válida quando houver um {uri-consenso}[consenso] (na rede) de que suas informações também são válidas em todos os outros nós. +Numa {blockchain}, os nós pertencentes a sua rede são responsáveis por validar dados e retransmití-los de forma que eles sejam replicados em todos os nós. +Mais especificamente, quando dados precisam ser inseridos num bloco, todos os nós devem verificar se esses dados são válidos. +Caso não sejam, esses dados serão descartados e não retransmitidos aos próximos nós. + +A validação de dados, obviamente, depende do que são esses dados. +A primeira {blockchain} foi construída para resolver um problema complexo: a tranferência de valores. +Dando crédito: [[a-origem-da-blockchain]]*os conceitos de {blockchain} que estamos aprendendo surgiram para fazer a moeda digital {uri-bitcoin}[Bitcoin] entrar em funcionamento*. +Perceba que só agora estamos falando de uma das várias possibilidades de aplicação da {blockchain}. +Apresentaremos, ainda, vários outros casos de uso de uma {blockchain}. + +O que diferencia a solução da {blockchain}, dada para o Bitcoin, de soluções bancárias tradicionais que resolvem esse problema, entretanto, é a descentralização. +Detalharemos mais sobre transações, logo a frente. +Mas, por enquanto, é importante saber que uma {blockchain}, por ser descentralizada, precisa criar algoritmos que promovam a manutenção de um consenso entre os nós. + +É através de consenso que uma {blockchain} identifica se uma cópia de seus dados, que está num nó, é realmente válida ou não. +Acessando a {uri-blockchain-demo-distributed}[aba Distributed] podemos identificar que a alteração de uma das cópias da {blockchain} num dos nós é possível de ser realizada. +E, essa alteração pode, com certeza, tornar a cópia da {blockchain} válida nesse nó. +Como vimos, para isso ocorrer, seria necessário refazer os cálculos de `Hash` para cada bloco a partir do que for modificado. +Mas, caso isso ocorra, outros nós da rede percebem a diferença e, automaticamente, eliminam a participação do nó que possui a {blockchain} adulterada. +Isso é feito através de consenso. +A rede que está certa é a rede que detém a maioria do consenso (51%). diff --git a/docs/pt-br/demonstracao/o-que-e-uma-blockchain/index.adoc b/docs/pt-br/demonstracao/o-que-e-uma-blockchain/index.adoc new file mode 100644 index 0000000..87feba2 --- /dev/null +++ b/docs/pt-br/demonstracao/o-que-e-uma-blockchain/index.adoc @@ -0,0 +1,10 @@ +[[o-que-e-uma-blockchain]] += O que é uma Blockchain? + +:leveloffset: +1 + +include::uma-visualizacao-grafica.adoc[] + +include::a-blockchain-e-distribuida-e-descentralizada.adoc[] + +:leveloffset: -1 diff --git a/docs/pt-br/demonstracao/o-que-e-uma-blockchain/uma-visualizacao-grafica.adoc b/docs/pt-br/demonstracao/o-que-e-uma-blockchain/uma-visualizacao-grafica.adoc new file mode 100644 index 0000000..022e95c --- /dev/null +++ b/docs/pt-br/demonstracao/o-que-e-uma-blockchain/uma-visualizacao-grafica.adoc @@ -0,0 +1,41 @@ +[[uma-visualizacao-grafica]] += Uma visualização gráfica + +Finalmente, vamos à {uri-blockchain-demo-blockchain}[aba {blockchain}] para entender o que é esse conceito genial, numa visualização gráfica! 😃 + +Nessa aba, apenas para fins de demonstração, apresentamos cinco (5) blocos encadeados. +Observe que, agora, foi adicionado o campo `Prev`. +Esse campo também é um `Hash`. +No primeiro bloco, seu valor é nulo. +Para todos os demais blocos, o campo `Prev` armazena o valor do `Hash` do bloco anterior. +Assim, agora há um encademento que forma o que chamamos de "corrente de blocos". +Ou, o nome bonito em inglês: {blockchain}. + +O objetivo desse encadeamento entre os blocos é muito simples. +Se você fizer uma alteração em qualquer campo do bloco o seu `Hash` será alterado. +Consequentemente, todos os blocos posteriores a essa alteração também não serão mais considerados válidos. +O motivo para isso é que, a partir do momento em que é modificado o `Hash` de um bloco, o valor de `Prev`, registrado no bloco posterior, não coincidirá mais. +Logo, uma {blockchain} considerará todos os blocos inválidos a partir de algum que tenha sido adulterado em qualquer um de seus campos. + +Para fazer uma {blockchain} adulterada ser novamente considerada válida, alguns passos seriam necessários. +Por exemplo, vamos supor que estamos fazendo uma alteração de dados apenas no último bloco. +Nesse caso, tornar a {blockchain} válida é algo simples: basta recalcular o `Hash` desse bloco executando a operação `Miner`. +Ou seja, executar o processo de mineração. + +O problema real surge ao ser feita uma tentativa de alterar um bloco que não é o último! +Vamos ver também que a dificuldade de se alterar um bloco é gradativamente aumentada quando ele vai se aproximando do primeiro bloco (ou se distanciando do último). +Suponhamos, por exemplo, que alguém tentasse fazer a adulteração de um dado no bloco 3. +Para que isso fosse possível, a operação de mineração para todos deveria ser novamente realizada a partir desse bloco. +Assim, o custo de tornar um bloco válido vai aumentando exponencialmente a medida em que ele se aproxima do primeiro bloco. + +Podemos observar, então, que uma {blockchain} é uma estrutura (ou um banco) de dados que rejeita modificações que não sejam no último bloco. +Poderíamos fazer uma comparação com um livro onde só é possível se escrever na última página. +E, continuando nessa linha, esse livro só poderia ser escrito a caneta. +Por fim, qualquer tentativa de se modificar um dado registrado nesse livro o deixaria manchado (ou rasurado) para sempre. + +Uma {blockchain} é citada por muitos como sendo "o protocolo da confiança". +Um dos motivos é decorrente do fato de somente ser possível se adicionar informações. +Não são permitidas alterações de informação, pois, pelo que vimos, a rede rejeita mudanças através de seu protocolo. +Finalmente, é importante entender que uma {blockchain} é uma estrutura de dados que fica "na mão de muitos". +Ou seja, é descentralizada. +Vamos agora entender como uma {blockchain} é considerada ainda mais segura quando ela é distribuída entre vários nós de uma rede. diff --git a/docs/pt-br/enviando-um-obrigado.adoc b/docs/pt-br/enviando-um-obrigado.adoc new file mode 100644 index 0000000..4c60283 --- /dev/null +++ b/docs/pt-br/enviando-um-obrigado.adoc @@ -0,0 +1,14 @@ +[[enviando-um-obrigado]] += Enviando um obrigado + +Se você gostou deste projeto, incluindo seu texto e vídeos, e deseja enviar um "obrigado", saiba que Bitcoin e Ethereum são, agradecidamente, aceitos por seus desenvolvedores nos seguintes endereços: + +* {uri-andersbrownworth}[Anders Brownworth] (desenvolvedor/criador deste projeto): +** Bitcoin (BTC): `1K3NvcuZzVTueHW1qhkG2Cm3viRkh2EXJp` +* {uri-paulojeronimo}[Paulo Jerônimo] (desenvolvedor/criador deste documento e de vídeos em português) +** Bitcoin (BTC): `1LTrDUdUw2zCS7LE93hDuvYiG326VnxL6k` +** Ether (ETH): `0xc8780E07eE3C0f058315a20D2fD7dE6d2505f7a3` + +Claramente, parte do valor depositado será revertido em melhorias neste projeto. + +include::todo.adoc[leveloffset=+1] diff --git a/docs/pt-br/index.adoc b/docs/pt-br/index.adoc new file mode 100644 index 0000000..200bc1d --- /dev/null +++ b/docs/pt-br/index.adoc @@ -0,0 +1,30 @@ += Blockchain: Uma visualização gráfica +Paulo Jerônimo +V1.0, {localdatetime} +:toc: left +:toc-title: Conteúdo +:toclevels: 4 +:icons: font +:setanchors: + +:srcdir: ../.. + +include::uris.conf[] +include::definitions.adoc[] + +:leveloffset: +1 + +:numbered!: +include::introducao.adoc[] + +<<< +:numbered: +include::instalacao/index.adoc[] + +<<< +include::demonstracao/index.adoc[] + +<<< +include::enviando-um-obrigado.adoc[] + +:leveloffset: -1 diff --git a/docs/pt-br/instalacao/index.adoc b/docs/pt-br/instalacao/index.adoc new file mode 100644 index 0000000..b04d88d --- /dev/null +++ b/docs/pt-br/instalacao/index.adoc @@ -0,0 +1,10 @@ +[[instalacao]] += Instalação local + +:leveloffset: +1 + +include::instalacao-direta.adoc[] + +include::instalacao-via-docker.adoc[] + +:leveloffset: -1 diff --git a/docs/pt-br/instalacao/instalacao-direta.adoc b/docs/pt-br/instalacao/instalacao-direta.adoc new file mode 100644 index 0000000..d9a5e8a --- /dev/null +++ b/docs/pt-br/instalacao/instalacao-direta.adoc @@ -0,0 +1,29 @@ +[[instalacao-direta]] += Direta, utilizando o teu próprio sistema operacional (SO) + +Baixe o código: + +[source,bash,subs="attributes"] +---- +git clone {uri-blockchain-demo-src} +---- + +Para rodar essa aplicação, você deverá ter instalado o {uri-nodejs}[Node.js]. Em seguida, instale as dependências dessa aplicação através do {uri-npm}[npm]. + +[NOTE] +==== +A instalação do comando npm pode ser executada, no {macOS}, através de um único comando: `brew install npm`. Isso é tudo que é necessário fazer neste sistema operacional. +==== + +---- +cd blockchain-demo +npm install +---- + +Execute o servidor: + +---- +./bin/www +---- + +Abra o teu browser e acesse a URL da página de demonstração: http://localhost:3000. diff --git a/docs/pt-br/instalacao/instalacao-via-docker.adoc b/docs/pt-br/instalacao/instalacao-via-docker.adoc new file mode 100644 index 0000000..9fbdfae --- /dev/null +++ b/docs/pt-br/instalacao/instalacao-via-docker.adoc @@ -0,0 +1,46 @@ +[[instalacao-via-docker]] += Utilizando o Docker + +Baixe o código: + +[source,bash,subs="attributes"] +---- +git clone {uri-blockchain-demo-src} +---- + +Faça a construção do contêiner Docker: + +---- +cd blockchain-demo +docker-compose up -d +---- + +Abra o teu browser e acesse a URL da página de demonstração: http://localhost:3000. + +[NOTE] +==== +Se você estiver utilizando outro SO que não o Linux (um {macOS} por exemplo) antes de executar o `docker-compose`, será necessário a instalação e a configuração do {uri-docker-machine}[docker-machine]. +Além disso, a URL que você acessará no browser não estará em `localhost`. +Nesse caso, siga os passos no subtópico a seguir. +Ele demonstra como utilizar o `docker-machine` para criar uma máquina virtual utilizando o {uri-virtualbox}[VirtualBox]. +==== + +[[instalacao-via-docker-virtualbox]] +== Numa máquina virtual (criada no VirtualBox e gerenciada pelo docker-machine) + +---- +docker-machine create --driver virtualbox default +eval "$(docker-machine env default)" +---- + +Abra o teu browser e acesse a URL da página de demonstração que devera ser `http://:3000`. + +[NOTE] +==== +O comando `docker-machine ip` pode ser chamada para determinar o IP da máquina virtual executando o docker. +Então, no {macOS}, o seguinte comando pode ser utilizado para abrir a browser na URL da demonstração: + +---- +open http://$(docker-machine ip):3000 +---- +==== diff --git a/docs/pt-br/introducao.adoc b/docs/pt-br/introducao.adoc new file mode 100644 index 0000000..19332d7 --- /dev/null +++ b/docs/pt-br/introducao.adoc @@ -0,0 +1,37 @@ +[[introducao]] += Introdução + +Este projeto provê uma aplicação web, interativa, para demonstrar conceitos básicos e fundamentais de uma {blockchain} (ou, traduzindo ao pé da letra para o português, corrente de blocos). + +[NOTE] +==== +O {uri-blockchain-demo-2-src}[código fonte deste projeto] (incluindo este documento) é aberto e está disponível. +==== + +ifdef::backend-html5[] +[NOTE] +==== +Você também pode {uri-blockchain-demo-2-docs-pt-br}/blockchain-demo.pdf[baixar e ler este documento em formato PDF]. +==== +endif::[] + +ifndef::backend-html5[] +[NOTE] +==== +Você pode visualizar uma versão online deste documento acessando o endereço {uri-blockchain-demo-2-docs-pt-br}. +==== +endif::[] + +A demonstração de uso da aplicação deste projeto pode ser visualizada em duas (2) versões: + +. {uri-blockchain-101-demo}[Blockchain 101 - Demo]: Vídeo original (em inglês) (criado por {AndersBrownworth}). +. {uri-blockchain-demo-2-playlist}[Blockchain: uma visualização gráfica]: Playlist com 10 vídeos, em português do Brasil, criados por {PauloJeronimo} para a organização {blockchain4devs}. `Plus`: {uri-blockchain-dfjug}[Blockchain]: hangout (apresentação), sobre esse assunto, com o {uri-dfjug}[DFJUG]. + +Através dos vídeos acima é feita uma apresentação, visual, que consideramos ser bastante elucidante nos conceitos elementares de uma {blockchain}. +A aplicação apresentada introduz o conceito de um {uri-livro-razao}[livro-razão] (distribuído). +Ela está em execução, neste momento, no seguinte endereço: + +* {uri-anders-blockchain} + +Você também pode fazer o {uri-blockchain-demo-2-src}[download deste projeto] a partir do GitHub e fazer a execução dessa aplicação, localmente, em teu ambiente. +Isso é explicado logo a seguir, no primeiro tópico desse documento. diff --git a/docs/pt-br/todo.adoc b/docs/pt-br/todo.adoc new file mode 100644 index 0000000..2170003 --- /dev/null +++ b/docs/pt-br/todo.adoc @@ -0,0 +1,16 @@ +[[melhorias-que-voce-pode-aguardar]] += Melhorias que você pode aguardar neste projeto + +Para o {uri-blockchain-demo-2-src}[fork] do {uri-blockchain-demo-src}[projeto original] são esperadas as seguintes evoluções: + +. Criação de legendas (_closed captions_) em inglês para os vídeos disponibibilizados em português (pt-br). +. Internacionalização da aplicação para português. +. Adição de uma cópia da aplicação (em execução) no endereço {uri-blockchain-demo-2}. +.. Geração de um site estático (para publicação no endereço acima sem a necessidade de um servidor executando o Node.js). +... Substituição do gerenciador de pacotes (de {uri-npm}[npm] p/ {uri-yarn}[yarn]). +... Utilização do {uri-gulp}[Gulp] para a construção desse site estático. +... Substituição da camada de visualização (de {uri-jade}[Jade] p/ {uri-pug}[Pug]). +. Alteração da página principal da aplicação, para que ela também apresente links para a visualização dos vídeos em português. +. Criação de https://en.wikipedia.org/wiki/QR_code[QR Code] para os endereços (de Bitcoin e/ou Ethereum) publicados neste documento. + +Por fim, espera-se que as adições realizadas neste fork sejam aceitas e incorporadas ao {uri-blockchain-demo-src}[projeto original]. diff --git a/docs/pt-br/uris.conf b/docs/pt-br/uris.conf new file mode 100644 index 0000000..49485fc --- /dev/null +++ b/docs/pt-br/uris.conf @@ -0,0 +1,49 @@ +:uri-nodejs: https://nodejs.com +:uri-npm: https://docs.npmjs.com/getting-started/what-is-npm +:uri-docker-machine: https://docs.docker.com/machine/ +:uri-virtualbox: https://virtualbox.org +:uri-andersbrownworth: https://github.com/anders94 +:uri-blockchain-101-demo: https://www.youtube.com/watch?v=_160oMzblY8 +:uri-paulojeronimo: http://paulojeronimo.com +:uri-blockchain4devs: http://github.com/blockchain4devs +:uri-livro-razao: https://pt.wikipedia.org/wiki/Raz%C3%A3o_(contabilidade) +:uri-anders-blockchain: http://anders.com/blockchain/ +:uri-funcao-hash: https://pt.wikipedia.org/wiki/Fun%C3%A7%C3%A3o_hash +:uri-sha-2: https://pt.wikipedia.org/wiki/SHA-2 +:uri-announcing-first-sha1-collision: https://security.googleblog.com/2017/02/announcing-first-sha1-collision.html +:uri-shattered: https://shattered.it/ +:uri-history-of-hash-function-attacks: https://z.cash/technology/history-of-hash-function-attacks.html +:uri-mining: https://en.wikipedia.org/wiki/Bitcoin_network#Mining +:uri-proof-of-work: https://en.wikipedia.org/wiki/Proof-of-work_system +:uri-bitcoin: https://bitcoin.org +:uri-bitcoin-paper: https://bitcoin.org/bitcoin.pdf +:uri-jade: http://jadelang.net/ +:uri-pug: https://pugjs.org +:uri-gulp: http://gulpjs.com/ +:uri-yarn: https://yarnpkg.com +:uri-consenso: https://pt.wikipedia.org/wiki/Consenso +:uri-macOS: https://en.wikipedia.org/wiki/MacOS + +:uri-blockchain-demo: http://anders.com/blockchain +:uri-blockchain-demo-src: {uri-andersbrownworth}/blockchain-demo +:uri-blockchain-demo-hash: {uri-blockchain-demo}/hash.html +:uri-blockchain-demo-block: {uri-blockchain-demo}/block.html +:uri-blockchain-demo-blockchain: {uri-blockchain-demo}/blockchain.html +:uri-blockchain-demo-distributed: {uri-blockchain-demo}/distributed.html +:uri-blockchain-demo-tokens: {uri-blockchain-demo}/tokens.html + +:uri-blockchain4devs-github-io: http://blockchain4devs.github.io +:uri-blockchain-demo-2: {uri-blockchain4devs-github-io}/blockchain-demo +:uri-blockchain-demo-2-src: {uri-blockchain4devs}/blockchain-demo +:uri-blockchain-demo-2-docs: {uri-blockchain-demo-2}/docs +:uri-blockchain-demo-2-docs-pt-br: {uri-blockchain-demo-2-docs}/pt-br +:uri-blockchain-demo-2-playlist: https://goo.gl/To4bPb + +:uri-satoshi-nakamoto: https://en.bitcoin.it/wiki/Satoshi_Nakamoto +:uri-coinbase: https://en.bitcoin.it/wiki/Coinbase +:uri-coinbase-transaction: https://bitcoin.org/en/glossary/coinbase-transaction +:uri-genesis-block: https://en.bitcoin.it/wiki/Genesis_block +:uri-blockchain-genesis-block: https://blockchain.info/pt/block/000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f + +:uri-dfjug: http://www.dfjug.org/ +:uri-blockchain-dfjug: https://goo.gl/fJ9QuD