Blockchain Básico Uma introdução não técnica em 25 passos Daniel Drescher
Novatec
Original English language edition published by Apress, Copyright © 2017 by Apress, Inc. Portuguese-language edition for Brazil copyright © 2018 by Novatec Editora. All rights reserved. Edição original em Inglês publicada pela Apress, Copyright © 2017 pela Apress, Inc. Edição em Português para o Brasil copyright © 2018 pela Novatec Editora. Todos os direitos reservados. Copyright © 2018 da Novatec Editora Ltda. Todos os direitos reservados e protegidos pela Lei 9.610 de 19/02/1998. É proibida a reprodução desta obra, mesmo parcial, por qualquer processo, sem prévia autorização, por escrito, do autor e da Editora. Editor: Rubens Prates LIS20180409 Tradução: Lúcia A. Kinoshita Revisão gramatical: Tássia Carvalho Editoração eletrônica: Carolina Kuwabata ISBN: 978-85-7522-669-8 Histórico de impressões: Abril/2018
Primeira edição
Novatec Editora Ltda. Rua Luís Antônio dos Santos 110 02460-000 – São Paulo, SP – Brasil Tel.: +55 11 2959-6529 Email: novatec@novatec.com.br Site: www.novatec.com.br Twitter: twitter.com/novateceditora Facebook: facebook.com/novatec LinkedIn: linkedin.com/in/novatec
PASSO 1 Pensando em camadas e em aspectos Analisando sistemas separando-os em camadas e aspectos Este passo estabelece as bases para o nosso caminho de aprendizado sobre blockchain, apresentando uma maneira de organizar e padronizar a nossa comunicação acerca dessa tecnologia. O passo explica como podemos analisar um sistema de software e por que é importante considerá-lo como uma composição de camadas. Além disso, mostraremos como é possível sair ganhando ao considerar as diferentes camadas de um sistema e como essa abordagem nos ajuda a compreender o blockchain. Por fim, o passo apresenta uma rápida introdução ao conceito de integridade de software e enfatiza a sua importância.
A metáfora Você tem um telefone celular? Eu diria que sim, pois a maioria das pessoas atualmente tem pelo menos um. Qual é o seu nível de conhecimento sobre os diferentes protocolos de comunicação sem fio usados para enviar e receber dados? Até que ponto você conhece as ondas eletromagnéticas, que são a base da comunicação móvel? A maioria de nós não conhece muito bem esses detalhes, pois isso não é necessário para utilizar um telefone celular, e não temos tempo para aprender a seu respeito. Separamos mentalmente o telefone celular em partes que precisamos conhecer e aquelas que podem ser ignoradas ou aceitas naturalmente. Essa forma de abordar a tecnologia não está restrita aos telefones celulares. Ela é utilizada o tempo todo, quando aprendemos a usar um novo aparelho de TV, um computador, uma máquina de lavar roupas e assim por diante. No entanto, essas partições mentais são extremamente individuais, pois o 16
Passo 1 ■ Pensando em camadas e em aspectos
17
que consideramos ou não importante depende de nossas preferências individuais, da tecnologia específica e de nossos objetivos e experiências. Como resultado, a sua partição mental para um telefone celular poderá ser diferente da minha para o mesmo telefone celular. Em geral, isso resulta em problemas de comunicação, em particular se eu tentar explicar o que você deveria saber sobre um determinado telefone celular. Assim, unificar o modo de particionar um sistema é o ponto principal ao ensinar e discutir uma tecnologia. Este passo explica como particionar ou dividir um sistema em camadas e, desse modo, define a base para a nossa comunicação sobre blockchain.
Camadas de um sistema de software As duas maneiras seguintes de particionar um sistema são usadas neste livro: • aplicação versus implementação; • aspetos funcionais versus aspetos não funcionais.
Aplicação versus implementação Separar mentalmente as necessidades do usuário da parte interna técnica de um sistema resulta em uma separação entre a camada de aplicação e a camada de implementação. Tudo que pertence à camada de aplicação diz respeito às necessidades do usuário (por exemplo, ouvir música, tirar fotos ou reservar quartos de hotel). Tudo que pertence à camada de implementação está relacionado a fazer essas tarefas acontecerem (por exemplo, converter informações digitais em sinais acústicos, reconhecer a cor de um pixel em uma câmera digital ou enviar mensagens pela internet para um sistema de reservas). Os elementos da camada de implementação são técnicos por natureza, e considerados um meio para um fim.
Aspetos funcionais versus aspectos não funcionais Distinguir o que um sistema faz de como o faz resulta na separação entre aspectos funcionais e aspectos não funcionais. Exemplos de aspectos funcionais são: enviar dados por uma rede, reproduzir uma música, tirar fotos e manipular pixels individuais de uma imagem. Exemplos de aspectos não
18
Blockchain Básico
funcionais são: uma interface gráfica de usuário bonita, um software de execução rápida e a capacidade de manter os dados de usuários privados e salvos. Outros aspectos não funcionais importantes de um sistema são a segurança e a integridade. Ter integridade significa que um sistema se comportará conforme esperado, e envolve muitos aspectos, por exemplo, segurança e correção.1 Há uma boa maneira de lembrar a diferença entre aspectos funcionais e não funcionais de um sistema, fazendo referência ao uso da gramática na linguagem natural: os verbos descrevem ações, ou o que é feito, enquanto os advérbios descrevem como as ações são executadas. Por exemplo, uma pessoa pode andar rapidamente ou lentamente. Nos dois casos, a ação de “andar” é idêntica, mas a forma como é feita difere. Como regra geral, podemos dizer que os aspectos funcionais são semelhantes aos verbos, enquanto os aspectos não funcionais se assemelham aos advérbios.
Considerando duas camadas ao mesmo tempo É possível identificar os aspectos funcionais e não funcionais ao mesmo tempo em que se separam as camadas de aplicação e de implementação, resultando em uma tabela bidimensional. A Tabela 1.1 mostra o resultado da divisão mental de um telefone celular em camadas, feita dessa maneira. Tabela 1.1 – Exemplo de divisão mental de um telefone celular em camadas Camada
Aplicação
Implementação
Aspectos funcionais Tirar fotos Fazer chamadas telefônicas Enviar emails Navegar pela Internet Enviar mensagens de bate-papo Salvar dados de usuário internamente Estabelecer uma conexão com o conector móvel mais próximo Acessar pixels na câmera digital
Aspectos não funcionais A interface gráfica de usuário é bonita É fácil de usar As mensagens são enviadas rapidamente Armazenar dados de modo eficiente Economizar energia Manter a integridade Garantir a privacidade do usuário
A Tabela 1.1 pode explicar a visibilidade de elementos específicos de um sistema (ou a falta dela) aos seus usuários. Os aspectos funcionais da camada de aplicação são os elementos mais óbvios de um sistema, pois atendem às 1 Chung, Lawrence, et al. Non-functional requirements in software engineering (Requisitos não funcionais em engenharia de software). Vol. 5. Nova York: Springer Science & Business Media, 2012.
Passo 1 ■ Pensando em camadas e em aspectos
19
necessidades evidentes dos usuários. Em geral, esses são os elementos sobre os quais os usuários aprendem. Por outro lado, os aspectos não funcionais da camada de implementação raramente são vistos como elementos principais do sistema. Em geral, são considerados como naturalmente disponíveis.
Integridade A integridade é um importante aspecto não funcional de qualquer sistema de software. Ela tem três componentes principais2: • Integridade dos dados: os dados usados e mantidos pelo sistema são completos, corretos e livres de contradições. • Integridade comportamental: o sistema se comporta conforme esperado e está livre de erros de lógica. • Segurança: o sistema é capaz de restringir o acesso aos seus dados e às suas funcionalidades somente aos usuários autorizados. A maioria de nós não pensa muito na integridade dos sistemas de software, considerando-os como naturalmente existentes, pois, na maior parte das vezes, felizmente interagimos com sistemas que mantêm a sua integridade. Isso se deve ao fato de os programadores e os engenheiros de software terem investido muito tempo e esforço no desenvolvimento de sistemas a fim de proporcionar a integridade e mantê-la. Como resultado, talvez tenhamos ficado um pouco mimados quando se trata de apreciar o trabalho feito pelos engenheiros de software para criar sistemas que mantenham alto nível de integridade. Nossos sentimentos, porém, poderão mudar assim que interagirmos com um sistema que falhe quanto a esse aspecto. Haverá ocasiões em que você poderá deparar com perda de dados, um comportamento sem lógica do software ou perceberá que pessoas estranhas foram capazes de acessar seus dados privados. Pode haver ocasiões em que o seu telefone celular, seu computador, seu software de emails, seu processador de texto ou sua planilha de cálculos o deixarão irritado a ponto de você se esquecer das boas maneiras! Nessas situações, começaremos a perceber que a integridade 2 Boritz, J. Efrim. IS practitioners’ views on core concepts of information integrity (Visões dos profissionais de SI sobre conceitos essenciais da integridade de informações). International Journal of Accounting Information Systems 6.4 (2005): 260–279.
20
Blockchain Básico
do software é uma commodity extremamente valiosa. Portanto, não deve ser nenhuma surpresa que os profissionais de software gastem boa parte de seu tempo trabalhando nesse aspecto não funcional aparentemente minúsculo da camada de implementação.
Panorama Este passo apresentou uma introdução a alguns princípios gerais da engenharia de software. Em particular, os conceitos de integridade e de aspectos funcionais versus aspectos não funcionais, assim como de aplicação versus implementação de um sistema de software foram apresentados. Compreender esses conceitos ajudará a apreciar o escopo mais amplo no qual o blockchain está inserido. O próximo passo apresentará o quadro geral usando os conceitos descritos neste passo.
Resumo • Os sistemas podem ser analisados separando-os em: • camada de aplicação versus camada de implementação • aspetos funcionais versus aspectos não funcionais. • A camada de aplicação tem como foco as necessidades do usuário, enquanto a camada de implementação se concentra em fazê-las acontecer. • Os aspectos funcionais enfocam no que é feito, enquanto os aspectos não funcionais se concentram em como é feito. • A maioria dos usuários está preocupada com os aspectos funcionais da camada de aplicação de um sistema, enquanto os aspectos não funcionais, em particular aqueles da camada de implementação, são menos visíveis aos usuários. • A integridade é um importante aspecto não funcional de qualquer sistema de software e inclui três elementos principais: • integridade dos dados;
Passo 1 ■ Pensando em camadas e em aspectos
21
• integridade comportamental; • segurança. • A maioria das falhas de software, por exemplo, perda de dados, comportamento sem lógica ou estranhos acessando os dados privados de uma pessoa, é resultado da violação da integridade do sistema.