Livro “Criando contratos inteligentes Solidity para o blockchain Ethereum. Guia Prático


Por mais de um ano, trabalhei no livro “Criando contratos inteligentes Solidity para o blockchain Ethereum. Um guia prático ”, e agora este trabalho está concluído, e o livro está publicado e disponível em Litros .

Espero que meu livro ajude você a criar rapidamente contatos inteligentes Solidity e aplicativos DApp distribuídos para o blockchain Ethereum. Consiste em 12 lições com exercícios práticos. Depois de concluí-los, o leitor poderá criar seus próprios nós locais do Ethereum, publicar contratos inteligentes e chamar seus métodos, trocar dados entre o mundo real e contratos inteligentes usando oráculos, trabalhar com a rede de depuração de teste Rinkeby.

O livro é dirigido a todos os interessados ​​em tecnologias avançadas no campo de blockchains e deseja obter rapidamente conhecimentos que lhes permitam se envolver em um trabalho interessante e promissor.

Abaixo, você encontrará o índice e o primeiro capítulo do livro (fragmentos do livro também estão disponíveis em litros ). Espero receber feedback, comentários e sugestões. Vou tentar levar tudo isso em consideração ao preparar a próxima edição do livro.

Sumário
1. Introdução
Nosso livro é destinado a quem deseja não apenas entender os princípios da blockchain Ethereum, mas também adquirir habilidades práticas na criação de aplicativos DApp distribuídos na linguagem de programação Solidity para esta rede.

Este livro é melhor não apenas para ler, mas para trabalhar com ele, concluindo as tarefas práticas descritas nas lições. Para funcionar, você precisa de um computador local, servidor virtual ou em nuvem com o sistema operacional Debian ou Ubuntu instalado. Você também pode usar o Raspberry Pi para concluir muitas tarefas.

Na primeira lição, consideraremos os princípios de operação da blockchain Ethereum e a terminologia básica, além de falar sobre onde você pode usar essa blockchain.

O objetivo da segunda lição é criar um nó blockchain privado do Ethereum para trabalhos adicionais como parte deste curso no servidor Ubuntu e Debian. Consideraremos os recursos da instalação de utilitários básicos, como o geth, que garante a operação de nosso nó blockchain, bem como o daemon de data warehouse descentralizado do enxame.

A terceira lição ensinará como experimentar o Ethereum em um microcomputador Raspberry Pi barato. Você instala o sistema operacional Rasberian (OS) no Raspberry Pi, o utilitário Geth que fornece a operação do nó blockchain, bem como o daemon descentralizado de data warehouse do Swarm.

A quarta lição é dedicada a contas e unidades de criptomoeda na rede Ethereum, bem como a transferência de fundos de uma conta para outra a partir do console Geth. Você aprenderá como criar contas, iniciar transações de transferência de dinheiro, receber status de transação e seu recebimento.

Na quinta lição, você se familiarizará com contratos inteligentes na rede Ethereum, aprenderá sobre sua implementação pela máquina virtual Ethereum.

Você criará e publicará seu primeiro contrato inteligente na rede privada Ethereum e aprenderá como chamar suas funções. Você usará o ambiente de desenvolvimento Remix Solidity IDE para isso. Além disso, você aprenderá como instalar e usar o compilador de lote solc.
Também falaremos sobre a chamada interface binária da Application Binary Interface (ABI) e ensinaremos como usá-la.

A sexta lição é dedicada à criação de scripts JavaScript em execução no Node.js e na execução de operações com contratos inteligentes Solidity.

Você instala o Node.js no sistema operacional Ubuntu, Debian e Rasberian, escreve scripts para publicar um contrato inteligente na rede local Ethereum e chamar suas funções.

Além disso, você aprenderá como transferir fundos entre contas regulares usando scripts, bem como transferi-los para contas de contrato inteligentes.

Na sétima lição, você aprenderá como instalar e usar o ambiente integrado Truffle, que é popular entre os desenvolvedores de contratos inteligentes do Solidity. Você aprenderá como criar scripts JavaScript que invocam funções de contrato usando o módulo de trufa-contrato e também testará seu contrato inteligente com a Trufa.

A oitava lição trata dos tipos de dados do Solidity. Você escreverá contratos inteligentes que funcionam com tipos de dados como números inteiros assinados e não assinados, números assinados, seqüências de caracteres, endereços, variáveis ​​de tipo complexo, matrizes, enumerações, estruturas e dicionários.

Na nona lição, você dará um passo à frente na criação de contratos inteligentes para a rede principal do Ethereum. Você aprenderá como publicar contratos usando o Truffle na rede privada Geth, bem como na rede de teste Rinkeby. Depurar um contrato inteligente na rede Rinkeby é muito útil antes de publicá-lo na rede principal - quase tudo é real, mas gratuito.

Como parte da lição, você criará um nó da rede de teste Rinkeby, reabastecerá com fundos e publicará um contrato inteligente.

A lição 10 se concentra no armazenamento de dados distribuídos do Ethereum Swarm. Usando o armazenamento distribuído, você economiza no armazenamento de grandes quantidades de dados na blockchain Ethereum.

Como parte desta lição, você criará um armazenamento local do Swarm, executará as operações de gravação e leitura de arquivos, bem como diretórios com arquivos. Em seguida, você aprenderá como trabalhar com o gateway público Swarm, gravará scripts para acessar o Swarm a partir do Node.js., além de usar o módulo Perl Net :: Ethereum :: Swarm.

O objetivo da lição 11 é dominar os contratos inteligentes do Solidity usando a popular linguagem de programação Python e a estrutura Web3.py. Você instalará essa estrutura, gravará scripts para compilar e publicar um contrato inteligente, além de chamar suas funções. Ao mesmo tempo, o Web3.py será usado por si só e em conjunto com o ambiente de desenvolvimento integrado da Truffle.

Na lição 12, você aprenderá como transferir dados entre contratos inteligentes e o mundo real usando oráculos. Isso é útil para você receber dados de sites, dispositivos da Internet das Coisas da IoT, vários dispositivos e sensores e enviar dados de contratos inteligentes para esses dispositivos. Na parte prática da lição, você criará um oráculo e um contrato inteligente que recebe a taxa de câmbio atual em dólares norte-americanos por rublo no site do Banco Central da Federação Russa.

Lição 1. Brevemente sobre a blockchain e a rede Ethereum
O objetivo da lição: familiarizar-se com os princípios da blockchain Ethereum, suas áreas de aplicação e terminologia básica.
Exercícios práticos : não fornecidos nesta lição.

Atualmente, dificilmente existe um desenvolvedor de software que ouça nada sobre a tecnologia Blockchain, criptomoedas (moeda criptográfica ou criptográfica), Bitcoins (Bitcoin), oferta inicial de moedas (ICO, oferta inicial de moedas), contratos inteligentes (Contrato Inteligente), bem como outros conceitos e termos relacionados ao blockchain.

A tecnologia Blockchain abre novos mercados e cria empregos para programadores. Se você entender todos os meandros das tecnologias de criptomoeda e tecnologias de contrato inteligente, não deverá ter problemas em aplicar esse conhecimento na prática.

Devo dizer que há muita especulação sobre criptomoedas e blockchains. Deixaremos de lado discussões sobre mudanças nas taxas de criptomoedas, sobre a criação de pirâmides, sobre os meandros da legislação sobre criptomoedas, etc. Em nosso curso de treinamento, focaremos principalmente nos aspectos técnicos da aplicação dos contratos inteligentes da Ethereum blockchain (Ethereum, éter) e no desenvolvimento do chamado Aplicativo Distribuído (DApp).

O que é blockchain?


Blockchain (Blockchain, Block Chain) é uma cadeia de blocos de dados conectados de uma certa maneira. No início da cadeia é o primeiro bloco chamado bloco de gênese ou bloco de gênese. É seguido por um segundo, depois um terceiro e assim por diante.

Todos esses blocos de dados são duplicados automaticamente em vários nós da rede blockchain. Isso garante o armazenamento descentralizado dos dados da blockchain.
Você pode imaginar o sistema blockchain como um grande número de nós (servidores físicos ou virtuais), em rede e replicando todas as alterações na cadeia de blocos de dados. É como um computador multiservidor gigante, e os nós desse computador (servidores) podem estar espalhados pelo mundo. E você também pode adicionar seu computador à rede blockchain.

Banco de dados distribuído


Blockchain pode ser imaginado como um banco de dados distribuído replicado para todos os nós da rede blockchain. Em teoria, o blockchain estará operacional enquanto pelo menos um nó que armazena todos os blocos do blockchain estiver funcionando.

Registro de dados distribuídos


Blockchain pode ser imaginado como um registro distribuído de dados e operações (transações). Outro nome para esse registro é razão.

Você pode adicionar dados a um registro distribuído, mas não pode alterá-los ou excluí-los. Essa impossibilidade é alcançada, em particular, usando algoritmos criptográficos, algoritmos especiais para adicionar blocos à cadeia e armazenamento descentralizado de dados.

Ao adicionar blocos e executar operações (transações), chaves privadas e públicas são usadas. Eles restringem os usuários de blockchain, dando-lhes acesso apenas aos seus blocos de dados.

Transações


A blockchain armazena informações sobre operações (transações) em blocos. Ao mesmo tempo, transações antigas já concluídas não podem ser revertidas ou alteradas. Novas transações são armazenadas em novos blocos adicionados.

Assim, todo o histórico de transações pode ser registrado inalterado no blockchain. Portanto, o blockchain pode ser usado, por exemplo, para armazenar com segurança operações bancárias, informações sobre direitos autorais, um histórico de alterações na propriedade imobiliária etc.

A blockchain Ethereum contém os chamados estados do sistema. À medida que as transações são concluídas, o estado muda de inicial para atual. As transações são gravadas em blocos.

Bloqueios públicos e privados


Deve-se notar que tudo o que foi dito acima é verdadeiro apenas para as chamadas redes públicas de blockchain, que não podem ser controladas por indivíduos ou entidades legais, órgãos estatais ou governos.
As chamadas redes privadas de blockchain estão sob o controle total de seus criadores, e tudo é possível lá, por exemplo, a substituição completa de todos os blocos da cadeia.

Aplicações práticas de Blockchain


O que a blockchain pode trazer?

Em resumo, o blockchain permite realizar transações (transações) com segurança entre pessoas que não confiam umas nas outras ou em empresas. Os dados gravados no blockchain (transações, dados pessoais, documentos, certificados, contratos, faturas etc.) não podem ser falsificados ou substituídos após a gravação. Portanto, com base no blockchain, você pode criar, por exemplo, registros distribuídos confiáveis ​​de vários tipos de documentos.

Obviamente, você sabe que os sistemas de criptomoeda são criados com base em blockchains, projetados para substituir o papel-moeda comum. O papel-moeda também é chamado de moeda fiduciária (da Fiat Money).
A blockchain fornece armazenamento e imutabilidade de transações registradas em blocos, portanto, também pode ser usada para criar sistemas de criptomoeda. Ele contém todo o histórico da transferência de fundos de criptografia entre diferentes usuários (contas) e qualquer operação pode ser rastreada.

Embora as transações nos sistemas de criptomoeda possam ser anônimas, retirar a criptomoeda e trocá-la por dinheiro fiduciário geralmente leva à divulgação da identidade do proprietário do ativo de criptomoeda.

Os chamados contratos inteligentes, que são softwares executados na rede Ethereum, automatizam o processo de conclusão de negócios e controle de sua execução. Isso é especialmente eficaz se o pagamento da transação for realizado com criptomoeda Ether.

O blockchain Ethereum e os contratos inteligentes Ethereum escritos na linguagem de programação Solidity podem ser usados, por exemplo, nas seguintes áreas:

  • alternativa ao reconhecimento de firma de documentos;
  • armazenamento do registro de imóveis e informações sobre transações com imóveis;
  • armazenamento de informações de direitos autorais sobre propriedade intelectual (livros, imagens, música etc.);
  • criação de sistemas de votação independentes;
  • finanças e bancos;
  • logística internacional, acompanhando o movimento de mercadorias;
  • armazenamento de dados pessoais como análogo de um sistema de cartões de identidade;
  • transações seguras no campo comercial;
  • armazenamento dos resultados dos exames médicos, bem como a história dos procedimentos prescritos

Problemas de Blockchain


Mas, é claro, nem tudo é tão simples quanto parece!

Há problemas com a verificação dos dados antes de adicioná-los ao blockchain (por exemplo, eles não são falsos?), Problemas na segurança do sistema e software de aplicativos usados ​​para trabalhar com o blockchain, problemas com a capacidade de usar métodos de engenharia social para roubar acesso a carteiras de criptomoedas etc. .p.

Novamente, se não se trata de uma blockchain pública, cujos nós estão espalhados por todo o mundo, mas de uma blockchain privada de propriedade de uma pessoa ou organização, o nível de confiança aqui não será maior que o nível de confiança nessa pessoa ou organização.

Também deve-se ter em mente que os dados gravados na blockchain ficam disponíveis para todos. Nesse sentido, o blockchain (especialmente o público) não é adequado para armazenar informações confidenciais. No entanto, o fato de que as informações na blockchain não podem ser alteradas pode ajudar a prevenir ou investigar todos os tipos de atividades fraudulentas.

Os aplicativos Ethereum descentralizados serão convenientes se você pagar pelo uso com criptomoeda. Quanto mais pessoas possuírem uma criptomoeda ou estiverem prontas para comprá-la, mais aplicativos DApp mais populares e contratos inteligentes obterão.

Entre os problemas comuns da blockchain que impedem sua aplicação prática, pode-se mencionar a velocidade limitada de adicionar novos blocos e o custo relativamente alto das transações. Mas as tecnologias nessa área estão se desenvolvendo ativamente e há esperanças de que os problemas técnicos sejam resolvidos com o tempo.

Outro problema é que os contratos inteligentes de blockchain da Ethereum funcionam em um ambiente isolado de máquina virtual e não têm acesso a dados do mundo real. Em particular, o programa de contrato inteligente não pode ler dados de sites ou dispositivos físicos (sensores, contatos etc.), nem pode enviar dados para dispositivos externos. Discutiremos esse problema e os métodos para resolvê-lo em uma lição dedicada aos chamados Oracles - intermediários de informações de contratos inteligentes.

Também existem restrições legais. Em alguns países, por exemplo, é proibido usar criptomoeda como meio de pagamento, mas você pode possuí-lo como um tipo de ativo digital, como títulos. Esses ativos podem ser comprados e vendidos na bolsa de valores. De qualquer forma, ao criar um projeto que funcione com criptomoedas, você precisa se familiarizar com a legislação do país sob cuja jurisdição seu projeto se enquadra.

Como é formada a cadeia de blockchain


Como já dissemos, a blockchain é uma cadeia simples de blocos de dados. Primeiro, o primeiro bloco dessa cadeia é formado, depois o segundo bloco é adicionado e assim por diante. Supõe-se que os dados da transação sejam armazenados em blocos e adicionados ao último bloco.

Na fig. 1.1, mostramos a versão mais simples de uma sequência de blocos, onde o primeiro bloco se refere ao próximo.


Fig. 1.1 Sequência simples de blocos

Nesta modalidade, no entanto, é muito fácil falsificar o conteúdo de qualquer bloco na cadeia, uma vez que os blocos não contêm nenhuma informação para proteger contra alterações. Dado que o blockchain é destinado ao uso de pessoas e empresas entre as quais não há confiança, podemos concluir que esse método de armazenamento de dados para o blockchain não é adequado.

Vamos proteger os blocos de falsificação. No primeiro estágio, tentaremos proteger cada bloco com uma soma de verificação (Fig. 1.2).


Fig. 1.2 Adicionar proteção de bloco de dados com uma soma de verificação

Agora, um invasor não pode simplesmente alterar um bloco porque contém uma soma de verificação dos dados do bloco. A verificação da soma de verificação mostrará que os dados foram alterados.

Para calcular a soma de verificação, você pode usar uma das funções de hash, como MD-5, SHA-1, SHA-256, etc. As funções de hash calculam um determinado valor (por exemplo, como uma sequência de texto de comprimento constante) como resultado da execução de operações irreversíveis em um bloco de dados. As operações dependem do tipo de função hash.

Mesmo com uma pequena alteração no conteúdo do bloco de dados, o valor da função hash também mudará. Ao analisar o valor da função hash, é impossível restaurar o bloco de dados para o qual foi calculado.

Essa proteção seria suficiente? Infelizmente não.

Nesse esquema, a soma de verificação (função hash) protege apenas blocos individuais, mas não toda a cadeia de blocos. Conhecendo o algoritmo de cálculo da função hash, um invasor pode substituir facilmente o conteúdo de um bloco. Além disso, nada o impedirá de remover blocos da cadeia ou adicionar novos.

Para proteger toda a cadeia como um todo, é possível armazenar um hash de dados do bloco anterior em cada bloco junto com os dados (Fig. 1.3).


Fig. 1.3 Adicione o hash do bloco anterior ao bloco de dados

Nesse esquema, para alterar um bloco, é necessário recalcular as funções de hash de todos os blocos subsequentes. Parece, qual é o problema?

Em blockchains reais, dificuldades artificiais são criadas adicionalmente para adicionar novos blocos - são usados ​​algoritmos que exigem muitos recursos de computação. Dado que para fazer alterações em um bloco, não é apenas um bloco que precisa ser contado, mas todos os subsequentes, será extremamente difícil fazer isso.

Lembre-se também de que os dados da blockchain são armazenados (duplicados) em vários nós da rede, ou seja, . , .. .

, .

Ethereum


Ethereum , DApp. , Ethereum (-, smart contracts), Solidity.

2013 , Bitcoin Magazine, 2015 . , , Ethereum - Solidity.


(mining) , « ». , .. Ethereum.

, , (miner).
(), , Nonce, -, . Ethash, Ethereum, Nonce .

Nonce, (PoW, Proof-of-work). , Ethereum, — Ether. 5 Ether, .

, Ethereum , , . , Solidity DApp Ethereum.


, . , , .

. — ( ), . , Ethereum - Solidity. , , ..

, . , , , , - , , .

. . , , .

2. Ubuntu Debian


Geth Swarm Ubuntu
Geth Swarm Debian

Go

Go
Geth Swarm

genesis.json






Geth


3. Raspberry Pi 3
Raspberry Pi 3
Rasberian

SSH
IP

Go
Go

Go
Geth Swarm




4.



geth account

Ethereum
Ethereum


eth.sendTransaction




5.
- Ethereum
-
Ethereum
Remix Solidity IDE



ABI



solc
solc Ubuntu
solc Debian
HelloSol

solc Rasberian


6. - Node.js
Node.js
Ubuntu
Debian
Ganache-cli
Web3
solc
Node.js Rasberian

-




ABI



-
-
Web3 1.0.x





- HelloSol

getBalance call_contract_get_promise.js
-


7. Truffle
Truffle
HelloSol

contracts
migrations
test
truffle-config.js
HelloSol

HelloSol Truffle
HelloSol JavaScript Node.js
truffle-contract
getValue getString
setValue setString

Web3 1.0.x
- HelloSol

Truffle
Solidity
JavaScript


8. Solidity




O endereço





mapping


9. Rinkeby
Truffle Geth


Truffle
geth
Truffle
Truffle Rinkeby
Geth Rinkeby


Rinkeby
Rinkeby
Rinkeby
Truffle Rinkeby

Node.js
Truffle Rinkby


10. Ethereum Swarm
Ethereum Swarm
Swarm

Ethereum Swarm
Ethereum Swarm



Swarm
Swarm Node.js
Perl Net::Ethereum::Swarm
Net::Ethereum::Swarm



11. Web3.py Ethereum Python
Web3.py

easysolc
Web3.py



abi


abi JSON



Truffle Web3.py


12.
-




USDRateOracle
-
Web Socket
RateUpdate
RateUpdate
-






, , Ethereum, . .

Fatal: Failed to write genesis block: unsupported fork ordering: eip150Block not enabled, but eip155Block enabled at 0
Inclua o parâmetro eip150Block no arquivo genesis.json:
{
"config": {
"chainId": 1999,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0
},
"difficulty": "10",
"gasLimit": "5100000",
"alloc": {}
}

Source: https://habr.com/ru/post/pt467347/


All Articles