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

Kate

Administrator
Команда форума

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

Люди часто считают блокчейн «чем-то про криптовалюты», поэтому в сети можно встретить много спекулятивных материалов вокруг этой технологии. Действительно, впервые блокчейн был использован в качестве реестра транзакций Bitcoin в 2008 году. Это изобретение сделало биткоин первой цифровой валютой, которая решила проблему двойного расходования без необходимости в доверенном органе или центральном сервере. С тех пор сферы применения технологии значительно расширились.
Блокчейн (от англ. blockchain) – распределенная (децентрализованная) база данных, которая позволяет осуществлять прямые транзакции между двумя сторонами без необходимости в авторитетном посреднике. Эта технология может быть использована для любых взаимосвязанных блоков информации (цепочек).
*Не путать с распределенными вычислениями!
В настоящее время блокчейн внедряется в различных социальных и корпоративных сегментах. К ним относятся электронное управление, социальные сети, электронная коммерция, транспорт, логистика, профессиональные коммуникации и многое другое.

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




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

Видеоигры​

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

CryptoKitties

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

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

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

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

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

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

Открываем соседнее окно и запускаем:
$ curl http://127.0.0.1:5000/chain

Получаем
42e821ff5b0aff639f66480f2345677b.png

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

Резюме​

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


Источник статьи: https://proglib.io/p/kak-python-primenyaetsya-v-blokcheyn-2021-03-19
 
Сверху