🐍 Как Python применяется в блокчейн
Почему популярный язык программирования используется для блокчейна? Какие готовые инструменты Python помогут реализовать собственный проект? Как пошагово создать распределенную базу данных? На эти вопросы мы постараемся ответить в статье.
Блокчейн без крипты или сферы применения распределенных баз данных
Люди часто считают блокчейн «чем-то про криптовалюты», поэтому в сети можно встретить много спекулятивных материалов вокруг этой технологии. Действительно, впервые блокчейн был использован в качестве реестра транзакций Bitcoin в 2008 году. Это изобретение сделало биткоин первой цифровой валютой, которая решила проблему двойного расходования без необходимости в доверенном органе или центральном сервере. С тех пор сферы применения технологии значительно расширились.
*Не путать с распределенными вычислениями!
В настоящее время блокчейн внедряется в различных социальных и корпоративных сегментах. К ним относятся электронное управление, социальные сети, электронная коммерция, транспорт, логистика, профессиональные коммуникации и многое другое.
Смарт-контракты
Смарт-контракты на основе блокчейна – это предлагаемые контракты, которые могут быть частично выполнены или принудительно исполнены без вмешательства человека.
Видеоигры
В ноябре 2017 года была запущена игра CryptoKitties, которая продемонстрировала использование блокчейна для каталогизации игровых активов.
Торговля электроэнергией
Блокчейн также используется в одноранговой торговле электроэнергией – эта парадигма работы энергосистемы позволяет продавцам генерировать энергию в жилищах, офисах и на фабриках, а также делиться ею друг с другом на местном рынке.
Защита от подделок
Блокчейн можно использовать для обнаружения подделок путем уникальных идентификаторов связанных с продуктами, документами и грузами, которые нельзя подделать или изменить.
Python на цепи или преимущества Python для блокчейн
Хотя первоначально блокчейн для Bitcoin был реализован на C++, многие разработчики и специалисты по обработке данных обращаются к другим языкам программирования. Остановимся подробнее на Python.
Простота и популярность
Python поддерживается большим и увлеченным сообществом разработчиков, что гарантирует стабильность и надежность. Язык прост в освоении, что позволяет менее опытным разработчикам немедленно вносить свой вклад в проекты.
Например, в Python пробелами обозначают блоки кода, и разработчикам не нужно беспокоиться о добавлении фигурных скобок или ключевых слов. Это удобно для создания цепочки блоков без необходимости писать большое количество текста в программе.
Компилировать или нет – вот в чем вопрос
В отличие от C++, Python – язык сценариев, который не требует компиляции перед запуском, что делает жизнь разработчиков более комфортной. В компилируемом языке для исправления ошибки вам придется остановить приложение, вернуться к исходному коду, отредактировать и перекомпилировать его, а потом перезапустить программу. В 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 до блокчейн на основе графов.
Пошаговое руководство
Для начала поставим библиотеку запросов и 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».