🐍 Как Python применяется в блокчейн

Почему популярный язык программирования используется для блокчейна? Какие готовые инструменты Python помогут реализовать собственный проект? Как пошагово создать распределенную базу данных? На эти вопросы мы постараемся ответить в статье.

Блокчейн без крипты или сферы применения распределенных баз данных

Люди часто считают блокчейн «чем-то про криптовалюты», поэтому в сети можно встретить много спекулятивных материалов вокруг этой технологии. Действительно, впервые блокчейн был использован в качестве реестра транзакций Bitcoin в 2008 году. Это изобретение сделало биткоин первой цифровой валютой, которая решила проблему двойного расходования без необходимости в доверенном органе или центральном сервере. С тех пор сферы применения технологии значительно расширились.

Блокчейн (от англ. blockchain) – распределенная (децентрализованная) база данных, которая позволяет осуществлять прямые транзакции между двумя сторонами без необходимости в авторитетном посреднике. Эта технология может быть использована для любых взаимосвязанных блоков информации (цепочек).

*Не путать с распределенными вычислениями!

В настоящее время блокчейн внедряется в различных социальных и корпоративных сегментах. К ним относятся электронное управление, социальные сети, электронная коммерция, транспорт, логистика, профессиональные коммуникации и многое другое.

Смарт-контракты

Смарт-контракты на основе блокчейна – это предлагаемые контракты, которые могут быть частично выполнены или принудительно исполнены без вмешательства человека.

Видеоигры

В ноябре 2017 года была запущена игра CryptoKitties, которая продемонстрировала использование блокчейна для каталогизации игровых активов.

Торговля электроэнергией

Блокчейн также используется в одноранговой торговле электроэнергией – эта парадигма работы энергосистемы позволяет продавцам генерировать энергию в жилищах, офисах и на фабриках, а также делиться ею друг с другом на местном рынке.

Защита от подделок

Блокчейн можно использовать для обнаружения подделок путем уникальных идентификаторов связанных с продуктами, документами и грузами, которые нельзя подделать или изменить.

Таков далеко не полный список сфер применения технологии. Для лучшего понимания ее принципов рекомендуем ознакомиться со статьей где принципы blockchain подробно описаны на примере покемонов.

Python на цепи или преимущества Python для блокчейн

Хотя первоначально блокчейн для Bitcoin был реализован на C++, многие разработчики и специалисты по обработке данных обращаются к другим языкам программирования. Остановимся подробнее на Python.

Простота и популярность

Python поддерживается большим и увлеченным сообществом разработчиков, что гарантирует стабильность и надежность. Язык прост в освоении, что позволяет менее опытным разработчикам немедленно вносить свой вклад в проекты.

Простота и минимализм лежат в основе Python. Не зря важный принцип философии этого популярного языка программирования гласит: «Должен быть один – и желательно только один – очевидный способ сделать это».

Например, в Python пробелами обозначают блоки кода, и разработчикам не нужно беспокоиться о добавлении фигурных скобок или ключевых слов. Это удобно для создания цепочки блоков без необходимости писать большое количество текста в программе.

Компилировать или нет – вот в чем вопрос

В отличие от C++, Python – язык сценариев, который не требует компиляции перед запуском, что делает жизнь разработчиков более комфортной. В компилируемом языке для исправления ошибки вам придется остановить приложение, вернуться к исходному коду, отредактировать и перекомпилировать его, а потом перезапустить программу. В Python нужно только исправить ошибку и перезагрузить приложение: вам не придется перекомпилировать код.

Готовые пакеты для Blockchain

Еще одно важное преимущество использования Python в проекте blockchain заключается в наличии бесплатных пакетов для упрощения разработки. Остановимся на этом подробнее.

Инструменты

Для Python есть множество инструментов и библиотек, которые можно использовать при разработке технологий блокчейн. Многие из них доступны бесплатно в официальных репозиториях.

Hashlib

Модуль реализует общий интерфейс для множества различных алгоритмов безопасного хеширования. Технология блокчейн сильно зависит от динамической криптографии.

Flask

В случае реального блокчейна его необходимо распределить, чтобы разные пользователи могли инициировать транзакции и создавать блоки. Для распределенных и веб-реализаций в Python существуют разные фреймворки: Flask – один из самых популярных инструментов.

$ pip install flask

Populus

Populus – это среда разработки смарт-контрактов для блокчейна Ethereum. Она была разработана, чтобы упростить жизнь программистов Python Ethereum.

$ pip install populus

Библиотека запросов

Requests – это элегантная и простая HTTP-библиотека для Python. Она понадобится в блокчейн, чтобы отправлять запрос на построение новой транзакции и добавление ее в блок.

$ pip install requests

Помимо этого набора инструментов вы можете найти на Github множество других подходящих библиотек на Python – от API до блокчейн на основе графов.

Пошаговое руководство

Лучший способ в чем-либо разобраться – сделать это на практике. Приведем пошаговое руководство по сборке простейшей цепочки блоков с помощью Python на коленке.

Для начала поставим библиотеку запросов и Flask (предполагается что Python у вас уже установлен).

$ python -m pip install requests
$ pip install flask

Класс блока

Объединение блоков в цепочку происходит таким образом, что при подделке одного из них остальная часть цепочки становится недействительной. Чтобы реализовать это в Python, мы сначала создаем класс блока с атрибутами.

class Block:
    def __init__(self, index, transactions, timestamp, previous_hash):
        self.index = index
        self.transactions = transactions
        self.timestamp = timestamp
        self.previous_hash = previous_hash
        self.nonce = 0

Хеширование

Python может использовать любую стандартную криптографическую хеш-функцию, например, из входящих в набор SHA-2. SHA-256 может быть реализован путем добавления метода compute_hash в блок класса:

from hashlib import sha256
 import json 
    def compute_hash(self):
        block_string = json.dumps(self.__dict__, sort_keys=True)
        return sha256(block_string.encode()).hexdigest()

Хеширование всех блоков обеспечивает безопасность каждого из них в отдельности, что делает чрезвычайно трудным вмешательство в данные внутри блоков.

Блокчейн

Создадим новый класс для блокчейна. Информация обо всех данных в каждом блоке устанавливает механизм защиты целостности всей цепочки. Для этого используем переменную previous_hash. Для инициализации блокчейна определяем create_genesis_blockmethod. Это создает начальный блок с индексом 0 и предыдущим хешем 0. Затем мы добавляем его в список, который отслеживает каждый блок.

import time
class Blockchain:
    def __init__(self):
        self.unconfirmed_transactions = []
        self.chain = []
        self.create_genesis_block()
    def create_genesis_block(self):
        genesis_block = Block(0, [], time.time(), "0")
        genesis_block.hash = genesis_block.compute_hash()
        self.chain.append(genesis_block)
#Функция для создания блока генезиса и добавления его в цепь
    @property
    def last_block(self):
        return self.chain[-1]

Proof-Of-Work

Система Proof-of-Work постепенно усложняет выполнение работы, необходимой для создания нового блока. Это означает, что модифицировавший предыдущий блок пользователь должен будет повторить работу этого блока и всех следующих за ним.

Чтобы реализовать такую систему, мы можем добавить метод proof_of_work в класс цепочки блоков.

difficulty = 2
    def proof_of_work(self, block):
        block.nonce = 0
        computed_hash = block.compute_hash()
        while not computed_hash.startswith('0' * Blockchain.difficulty):
            block.nonce += 1
            computed_hash = block.compute_hash()
        return computed_hash

Процедура майнинга

Добавляем еще несколько методов в класс цепочки блоков: чтобы собрать все вместе и чтобы мы могли фактически построить цепочку. Изначально будем хранить данные каждой транзакции в unconfirmed_transactions.

def is_valid_proof(self, block, block_hash):
        return (block_hash.startswith('0' * Blockchain.difficulty) and
                block_hash == block.compute_hash())
    def add_new_transaction(self, transaction):
        self.unconfirmed_transactions.append(transaction)
    def mine(self):
        if not self.unconfirmed_transactions:
            return False
        last_block = self.last_block
        new_block = Block(index=last_block.index + 1,
                          transactions=self.unconfirmed_transactions,
                          timestamp=time.time(),
                          previous_hash=last_block.hash)
        proof = self.proof_of_work(new_block)
        self.add_block(new_block, proof)
        self.unconfirmed_transactions = []
        return new_block.index

API

Чтобы использовать наш блокчейн, нужно будет создать интерфейс, с которым смогут взаимодействовать несколько пользователей или узлов. Для этого используем Flask.

from flask import Flask, request
import requests
app = Flask(__name__)
blockchain = Blockchain()

Сначала мы определяем веб-приложение и создаем локальную цепочку блоков. Затем создаем конечную точку, которая позволяет нам отправлять запрос для отображения соответствующей информации о блокчейне.

@app.route('/chain', methods=['GET'])
def get_chain():
    chain_data = []
    for block in blockchain.chain:
        chain_data.append(block.__dict__)
    return json.dumps({"length": len(chain_data),
                       "chain": chain_data})
app.run(debug=True, port=5000)

Проверяем

Запускаем наш блокчейн из каталога

$ python3 blockchain.py

Вывод должен быть похож на это:

Открываем соседнее окно и запускаем:

$ curl  http://127.0.0.1:5000/chain

Получаем

Работает, что и требовалось доказать.

Резюме

Мы привели максимально упрощенный пример реализации блокчейн на Python, который позволяет наглядно разобрать принципы этой технологии и ознакомиться с основными инструментами. Полную версию использованного в статье кода можно взять на Gitlab.

Еще один интересный вариант доступен в статье «Реализуем свой Bitcoin на Python».

ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ

admin
11 декабря 2018

ООП на Python: концепции, принципы и примеры реализации

Программирование на Python допускает различные методологии, но в его основе...
admin
28 июня 2018

3 самых важных сферы применения Python: возможности языка

Существует множество областей применения Python, но в некоторых он особенно...
admin
13 февраля 2017

Программирование на Python: от новичка до профессионала

Пошаговая инструкция для всех, кто хочет изучить программирование на Python...