Хочешь уверенно проходить IT-интервью?

Мы понимаем, как сложно подготовиться: стресс, алгоритмы, вопросы, от которых голова идёт кругом. Но с AI тренажёром всё гораздо проще.
💡 Почему Т1 тренажёр — это мастхэв?
- Получишь настоящую обратную связь: где затык, что подтянуть и как стать лучше
- Научишься не только решать задачи, но и объяснять своё решение так, чтобы интервьюер сказал: "Вау!".
- Освоишь все этапы собеседования, от вопросов по алгоритмам до диалога о твоих целях.
Зачем листать миллион туториалов? Просто зайди в Т1 тренажёр, потренируйся и уверенно удиви интервьюеров. Мы не обещаем лёгкой прогулки, но обещаем, что будешь готов!
Реклама. ООО «Смарт Гико», ИНН 7743264341. Erid 2VtzqwP8vqy
Блокчейн без крипты или сферы применения распределенных баз данных
Люди часто считают блокчейн «чем-то про криптовалюты», поэтому в сети можно встретить много спекулятивных материалов вокруг этой технологии. Действительно, впервые блокчейн был использован в качестве реестра транзакций 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».
Комментарии