Category: Блокчейн

19
Мар
2021

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

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

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

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

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

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

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

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

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

Видеоигры

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

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».

20
Окт
2020

Курс по блокчейн-разработке

Узнаете, как работают системы распределённого реестра, криптография, сетевые уровни взаимодействия, протоколы анонимизации и смарт-контракты.
— Читать дальше «Курс по блокчейн-разработке»

03
Сен
2020

15-17 сентября, Москва: конференция TestCon Moscow 2020

Специалисты поделятся инструментами и лучшими практиками для проведения тестов в целях улучшения качества программного обеспечения.
— Читать дальше «Конференция TestCon Moscow 2020»

29
Июл
2020

1 августа, онлайн: JavaGlobal Summit’20

Лучшие кейсы, семинары и живое общение в режиме вопросов и ответов с докладчиками из Oracle, Microsoft, IBM, JCP и других топовых компаний.
— Читать дальше «JavaGlobal Summit’20»

25
Ноя
2019

29 ноября – 1 декабря, Новосибирск: конференция DevFest

Ежегодное мероприятие, которое проводит сообщество GDG. За три дня можно послушать доклады про мобильную и веб-разработку, машинное обучение и безопасность.
— Читать дальше «Конференция DevFest Siberia 2019»

04
Окт
2019

14–15 октября, Москва: воркшоп Hyperledger BootCamp Russia

Первый в России буткемп глобального блокчейн-сообщества Hyperledger, который будет полезен как новичкам, так и опытным участникам.
— Читать дальше «Воркшоп Hyperledger BootCamp Russia»

25
Сен
2019

16–17 ноября, Москва: хакатон ProHack 4.0

Для специалистов, нацеленных на развитие в промышленном секторе. Кейсы для участников подготовили «УралХим», «ФосАгро», «Газпромнефть» и «Норникель». 
— Читать дальше «Хакатон ProHack 4.0»

25
Июн
2019

11–12 июля, Санкт-Петербург: конференция Hydra 2019

Конференция о современных параллельных и распределённых системах, а также о научных подходах и теоремах, лежащих в их основе.
— Читать дальше «Конференция Hydra 2019»

28
Ноя
2018

Конференция RustRush 2018

15–16 декабря в Москве пройдёт первая в России международная конференция для разработчиков на Rust — RustRush 2018. Что в программе? Основные темы конференции — веб, блокчейн, высокая производительность и системное программирование. На конференцию прие…