Libro "Creación de contratos inteligentes de Solidez para la cadena de bloques Ethereum. Guía práctica


Durante más de un año trabajé en el libro "Creación de contratos inteligentes de solidez para la cadena de bloques Ethereum. Una guía práctica ”, y ahora este trabajo está completo, y el libro está publicado y disponible en Litros .

Espero que mi libro lo ayude a comenzar rápidamente a crear contactos inteligentes Solidity y distribuir aplicaciones DApp para la cadena de bloques Ethereum. Consta de 12 lecciones con ejercicios prácticos. Después de completarlos, el lector podrá crear sus propios nodos locales de Ethereum, publicar contratos inteligentes y llamar a sus métodos, intercambiar datos entre el mundo real y los contratos inteligentes utilizando oráculos, trabajar con la red de depuración de pruebas Rinkeby.

El libro está dirigido a todos los que estén interesados ​​en tecnologías avanzadas en el campo de las cadenas de bloques y quieran obtener rápidamente un conocimiento que les permita participar en un trabajo interesante y prometedor.

A continuación encontrará la tabla de contenido y el primer capítulo del libro (fragmentos del libro también están disponibles en Litros ). Espero recibir comentarios, comentarios y sugerencias. Intentaré tener todo esto en cuenta al preparar la próxima edición del libro.

Tabla de contenidos
Introduccion
Nuestro libro está destinado a aquellos que desean no solo comprender los principios de la cadena de bloques Ethereum, sino también adquirir habilidades prácticas para crear aplicaciones DApp distribuidas en el lenguaje de programación Solidity para esta red.

Este libro es mejor no solo para leer, sino para trabajar con él, completando las tareas prácticas descritas en las lecciones. Para trabajar, necesita una computadora local, un servidor virtual o en la nube con el sistema operativo Debian o Ubuntu instalado. También puede usar Raspberry Pi para completar muchas tareas.

En la primera lección, consideraremos los principios de operación de la cadena de bloques Ethereum y la terminología básica, así como también hablaremos sobre dónde puede usar esta cadena de bloques.

El propósito de la segunda lección es crear un nodo de blockchain privado de Ethereum para seguir trabajando como parte de este curso en el servidor Ubuntu y Debian. Consideraremos las características de la instalación de utilidades básicas, como geth, que garantiza el funcionamiento de nuestro nodo blockchain, así como el enjambre de datos descentralizado del almacén de datos.

La tercera lección le enseñará cómo experimentar con Ethereum en una microcomputadora Raspberry Pi económica. Instala el sistema operativo (OS) Rasberian en la Raspberry Pi, la utilidad Geth que proporciona la operación del nodo blockchain, así como el demonio del almacén de datos descentralizado Swarm.

La cuarta lección está dedicada a las cuentas y las unidades de criptomonedas en la red Ethereum, así como a cómo transferir fondos de una cuenta a otra desde la consola Geth. Aprenderá cómo crear cuentas, iniciar transacciones de transferencia de dinero, recibir el estado de la transacción y su recibo.

En la quinta lección, se familiarizará con los contratos inteligentes en la red Ethereum, aprenderá sobre su implementación por parte de la máquina virtual Ethereum.

Creará y publicará su primer contrato inteligente en la red privada de Ethereum y aprenderá cómo llamar a sus funciones. Para ello, utilizará el entorno de desarrollo Remix Solidity IDE. Además, aprenderá cómo instalar y usar el compilador por lotes solc.
También hablaremos sobre la llamada interfaz binaria Application Binary Interface (ABI) y enseñaremos cómo usarla.

La sexta lección está dedicada a la creación de scripts JavaScript que se ejecutan en Node.js y realizan operaciones con contratos inteligentes Solidity.

Instala Node.js en el sistema operativo Ubuntu, Debian y Rasberian, escribe scripts para publicar un contrato inteligente en la red local de Ethereum y llamar a sus funciones.

Además, aprenderá cómo transferir fondos entre cuentas regulares utilizando scripts, así como transferirlos a cuentas de contratos inteligentes.

En la séptima lección, aprenderá cómo instalar y usar el entorno integrado Truffle, que es popular entre los desarrolladores de contratos inteligentes de Solidity. Aprenderá a crear scripts JavaScript que invocan funciones de contrato utilizando el módulo truffle-contract y también probará su contrato inteligente con Truffle.

La octava lección trata sobre los tipos de datos de Solidez. Escribirás contratos inteligentes que funcionan con tipos de datos como enteros con y sin signo, números con signo, cadenas, direcciones, variables de tipo complejo, matrices, enumeraciones, estructuras y diccionarios.

En la novena lección, irá un paso más cerca de crear contratos inteligentes para la red central de Ethereum. Aprenderá a publicar contratos usando Truffle en la red privada Geth, así como en la red de prueba Rinkeby. La depuración de un contrato inteligente en la red Rinkeby es muy útil antes de publicarlo en la red principal, ya que casi todo es real, pero gratuito.

Como parte de la lección, creará un nodo de red de prueba Rinkeby, lo repondrá con fondos y publicará un contrato inteligente.

La lección 10 se enfoca en el almacenamiento de datos distribuidos de Ethereum Swarm. Con el almacenamiento distribuido, ahorra en el almacenamiento de grandes cantidades de datos en la cadena de bloques Ethereum.

Como parte de esta lección, creará un almacenamiento local de Swarm, realizará las operaciones de escritura y lectura de archivos, así como directorios con archivos. A continuación, aprenderá cómo trabajar con la puerta de enlace pública de Swarm, escribir scripts para acceder a Swarm desde Node.js, así como usar el módulo Perl Net :: Ethereum :: Swarm.

El propósito de la lección 11 es dominar los contratos inteligentes de Solidity usando el popular lenguaje de programación Python y el marco Web3.py. Instalará este marco, escribirá scripts para compilar y publicar un contrato inteligente, así como para llamar a sus funciones. Al mismo tiempo, Web3.py se utilizará solo y junto con el entorno de desarrollo integrado de Truffle.

En la lección 12, aprenderá cómo transferir datos entre contratos inteligentes y el mundo real utilizando oráculos. Esto es útil para recibir datos de sitios web, dispositivos IoT Internet of Things, varios dispositivos y sensores, y enviar datos de contratos inteligentes a estos dispositivos. En la parte práctica de la lección, creará un oráculo y un contrato inteligente que recibe el tipo de cambio actual de USD a rublos del sitio web del Banco Central de la Federación de Rusia.

Lección 1. Brevemente sobre la red y la cadena de bloques Ethereum
El propósito de la lección: familiarizarse con los principios de la cadena de bloques Ethereum, sus áreas de aplicación y terminología básica.
Ejercicios prácticos : no provistos en esta lección.

Apenas hay un desarrollador de software hoy que no haya escuchado nada sobre la tecnología Blockchain, las criptomonedas (criptomonedas o criptomonedas), Bitcoins (Bitcoin), oferta inicial de monedas (ICO, oferta inicial de monedas), contratos inteligentes (Contrato inteligente), así como otros conceptos y términos relacionados con la cadena de bloques.

La tecnología Blockchain abre nuevos mercados y crea empleos para programadores. Si comprende todas las complejidades de las tecnologías de criptomonedas y las tecnologías de contrato inteligente, entonces no debería tener problemas para aplicar este conocimiento en la práctica.

Debo decir que hay mucha especulación sobre las criptomonedas y blockchains. Dejaremos de lado las discusiones sobre los cambios en las tasas de criptomonedas, sobre la creación de pirámides, sobre las complejidades de la legislación sobre criptomonedas, etc. En nuestro curso de capacitación, nos centraremos principalmente en los aspectos técnicos de la aplicación de los contratos inteligentes de blockchain de Ethereum (Ethereum, ether) y el desarrollo de la denominada Aplicación Distribuida (DApp).

¿Qué es blockchain?


Blockchain (Blockchain, Block Chain) es una cadena de bloques de datos conectados de cierta manera. Al comienzo de la cadena se encuentra el primer bloque llamado bloque de génesis o bloque de génesis. Le sigue un segundo, luego un tercero, y así sucesivamente.

Todos estos bloques de datos se duplican automáticamente en numerosos nodos de la red blockchain. Esto garantiza el almacenamiento descentralizado de datos de blockchain.
Puede imaginar el sistema blockchain como una gran cantidad de nodos (servidores físicos o virtuales), conectados en red y replicando todos los cambios en la cadena de bloques de datos. Esto es como una computadora multiservidor gigante, y los nodos de dicha computadora (servidores) pueden estar dispersos por todo el mundo. Y usted también puede agregar su computadora a la red blockchain.

Base de datos distribuida


Blockchain se puede imaginar como una base de datos distribuida replicada a todos los nodos de la red blockchain. En teoría, la cadena de bloques estará operativa mientras funcione al menos un nodo que almacene todos los bloques de la cadena de bloques.

Registro de datos distribuidos


Blockchain se puede imaginar como un registro distribuido de datos y operaciones (transacciones). Otro nombre para dicho registro es ledger.

Puede agregar datos a un registro distribuido, pero no puede cambiarlos ni eliminarlos. Tal imposibilidad se logra, en particular, mediante el uso de algoritmos criptográficos, algoritmos especiales para agregar bloques a la cadena y almacenamiento de datos descentralizado.

Al agregar bloques y realizar operaciones (transacciones), se utilizan claves privadas y públicas. Restringen a los usuarios de blockchain al darles acceso solo a sus bloques de datos.

Transacciones


La cadena de bloques almacena información sobre operaciones (transacciones) en bloques. Al mismo tiempo, las transacciones antiguas ya completadas no se pueden revertir ni modificar. Las nuevas transacciones se almacenan en nuevos bloques agregados.

Por lo tanto, todo el historial de transacciones se puede registrar sin cambios en la cadena de bloques. Por lo tanto, la cadena de bloques se puede usar, por ejemplo, para almacenar de forma segura las operaciones bancarias, la información de derechos de autor, un historial de cambios en la propiedad de bienes inmuebles, etc.

La cadena de bloques Ethereum contiene los llamados estados del sistema. A medida que se completan las transacciones, el estado cambia de inicial a actual. Las transacciones se escriben en bloques.

Blockchains públicos y privados


Cabe señalar que todo lo anterior es cierto solo para las llamadas redes públicas de blockchain, que no pueden ser controladas por individuos o entidades legales, organismos estatales o gobiernos.
Las llamadas redes privadas de blockchain están bajo el control total de sus creadores, y todo es posible allí, por ejemplo, el reemplazo completo de todos los bloques de la cadena.

Aplicaciones prácticas de blockchain


¿Para qué puede venir blockchain?

En resumen, blockchain le permite realizar transacciones (transacciones) de manera segura entre personas que no confían entre sí o en las empresas. Los datos registrados en blockchain (transacciones, datos personales, documentos, certificados, contratos, facturas, etc.) no pueden falsificarse ni reemplazarse después de la grabación. Por lo tanto, sobre la base de blockchain, puede crear, por ejemplo, registros distribuidos confiables de varios tipos de documentos.

Por supuesto, usted sabe que los sistemas de criptomonedas se crean sobre la base de blockchains, diseñados para reemplazar el papel moneda ordinario. El papel moneda también se llama dinero fiduciario (de Fiat Money).
Blockchain proporciona almacenamiento e inmutabilidad de transacciones registradas en bloques, por lo tanto, también se puede usar para crear sistemas de criptomonedas. Contiene el historial completo de la transferencia de fondos criptográficos entre diferentes usuarios (cuentas), y se puede rastrear cualquier operación.

Aunque las transacciones dentro de los sistemas de criptomonedas pueden ser anónimas, retirar la criptomoneda e intercambiarla por dinero fiduciario generalmente conduce a la divulgación de la identidad del propietario del activo de la criptomoneda.

Los llamados contratos inteligentes, que son software que se ejecuta en la red Ethereum, automatizan el proceso de cerrar acuerdos y controlar su ejecución. Esto es especialmente efectivo si el pago de la transacción se realiza con la criptomoneda Ether.

Los contratos inteligentes Ethereum blockchain y Ethereum escritos en el lenguaje de programación Solidity se pueden usar, por ejemplo, en las siguientes áreas:

  • alternativa a la notarización de documentos;
  • almacenamiento del registro de bienes inmuebles e información sobre transacciones con bienes inmuebles;
  • almacenamiento de información de copyright sobre propiedad intelectual (libros, imágenes, música, etc.);
  • creación de sistemas de votación independientes;
  • finanzas y banca;
  • logística internacional, seguimiento del movimiento de mercancías;
  • almacenamiento de datos personales como un análogo de un sistema de tarjeta de identidad;
  • transacciones seguras en el campo comercial;
  • almacenamiento de los resultados de los exámenes médicos, así como el historial de los procedimientos prescritos

Problemas de blockchain


Pero, por supuesto, ¡no todo es tan simple como parece!

Hay problemas para verificar los datos antes de agregarlos a la cadena de bloques (por ejemplo, ¿no son falsos?), Problemas en la seguridad del sistema y el software de aplicación utilizado para trabajar con la cadena de bloques, problemas con la capacidad de utilizar métodos de ingeniería social para robar el acceso a las billeteras de criptomonedas, etc. .p.

Nuevamente, si no se trata de una cadena de bloques pública, cuyos nodos se encuentran dispersos por todo el mundo, sino de una cadena de bloques privada propiedad de una persona u organización, entonces el nivel de confianza aquí no será más alto que el nivel de confianza en esta persona o esta organización.

También se debe tener en cuenta que los datos grabados en la cadena de bloques están disponibles para todos. En este sentido, la cadena de bloques (especialmente la pública) no es adecuada para almacenar información confidencial. Sin embargo, el hecho de que la información en blockchain no se pueda cambiar puede ayudar a prevenir o investigar todo tipo de actividades fraudulentas.

Las aplicaciones de Ethereum descentralizadas serán convenientes si paga por su uso con criptomonedas. Cuantas más personas posean una criptomoneda o estén listas para comprarla, más populares serán las aplicaciones DApp y los contratos inteligentes.

Entre los problemas comunes de la cadena de bloques que impiden su aplicación práctica, se puede mencionar la velocidad limitada de agregar nuevos bloques y el costo relativamente alto de las transacciones. Pero las tecnologías en esta área se están desarrollando activamente, y hay esperanzas de que los problemas técnicos se resuelvan con el tiempo.

Otro problema es que los contratos inteligentes de blockchain de Ethereum funcionan en un entorno de máquina virtual aislado y no tienen acceso a datos del mundo real. En particular, el programa de contrato inteligente no puede leer datos de sitios o dispositivos físicos (sensores, contactos, etc.), ni puede enviar datos a ningún dispositivo externo. Discutiremos este problema y los métodos para resolverlo en una lección dedicada a los llamados Oráculos: intermediarios de información de contratos inteligentes.

También hay restricciones legales. En algunos países, por ejemplo, está prohibido usar la criptomoneda como medio de pago, pero puede poseerla como un tipo de activo digital, como los valores. Dichos activos se pueden comprar y vender en la bolsa de valores. En cualquier caso, al crear un proyecto que funcione con criptomonedas, debe familiarizarse con la legislación del país bajo cuya jurisdicción cae su proyecto.

¿Cómo se forma la cadena blockchain?


Como ya hemos dicho, blockchain es una simple cadena de bloques de datos. Primero, se forma el primer bloque de esta cadena, luego se le agrega el segundo bloque, y así sucesivamente. Se supone que los datos de la transacción se almacenan en bloques y se agregan al último bloque.

En la fig. 1.1 mostramos la versión más simple de una secuencia de bloques, donde el primer bloque se refiere al siguiente.


Fig. 1.1. Secuencia simple de bloques

En esta realización, sin embargo, es muy fácil falsificar el contenido de cualquier bloque de la cadena, ya que los bloques no contienen ninguna información para proteger contra los cambios. Dado que blockchain está destinado al uso de personas y empresas entre las cuales no hay confianza, podemos concluir que este método de almacenamiento de datos para blockchain no es adecuado.

Protejamos los bloques de la falsificación. En la primera etapa, intentaremos proteger cada bloque con una suma de comprobación (Fig. 1.2).


Fig. 1.2. Agregue protección de bloque de datos con una suma de verificación

Ahora, un atacante no puede simplemente cambiar un bloque porque contiene una suma de verificación de los datos del bloque. La comprobación de la suma de comprobación mostrará que los datos han cambiado.

Para calcular la suma de verificación, puede usar una de las funciones hash, como MD-5, SHA-1, SHA-256, etc. Las funciones hash calculan un cierto valor (por ejemplo, como una cadena de texto de longitud constante) como resultado de realizar operaciones irreversibles en un bloque de datos. Las operaciones dependen del tipo de función hash.

Incluso con un pequeño cambio en el contenido del bloque de datos, el valor de la función hash también cambiará. Al analizar el valor de la función hash, es imposible restaurar el bloque de datos para el que se calculó.

¿Sería suficiente esa protección? Lamentablemente no.

En este esquema, la suma de comprobación (función hash) protege solo bloques individuales, pero no toda la cadena de bloques. Conociendo el algoritmo de cálculo de la función hash, un atacante puede reemplazar fácilmente el contenido de un bloque. Además, nada le impedirá eliminar bloques de la cadena o agregar nuevos.

Para proteger toda la cadena en su conjunto, es posible almacenar un hash de datos del bloque anterior en cada bloque junto con los datos (Fig. 1.3).


Fig. 1.3. Agregue el hash del bloque anterior al bloque de datos

En este esquema, para cambiar un bloque, debe volver a calcular las funciones hash de todos los bloques posteriores. Parecería, ¿cuál es el problema?

En las cadenas de bloques reales, también se crean dificultades artificiales para agregar nuevos bloques: se utilizan algoritmos que requieren muchos recursos informáticos. Dado que para realizar cambios en un bloque, no solo se debe contar un bloque, sino todos los posteriores, será extremadamente difícil hacerlo.

Recuerde también que los datos de blockchain se almacenan (duplican) en numerosos nodos de red, es decir, . , .. .

, .

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




La direccion





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
Agregue el parámetro eip150Block al archivo genesis.json:
{
"config": {
"chainId": 1999,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0
},
"difficulty": "10",
"gasLimit": "5100000",
"alloc": {}
}

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


All Articles