Добро пожаловать в серию «от нуля до блокировки в Python», где мы построим реализацию приложения Blockchain, в частности, криптовалюту с нуля. На протяжении всего серии мы построим и улучшим функциональные возможности, пока у нас не будет полностью функциональная демонстрация.
Отказ от ответственности: Обратите внимание, что это ни в коем случае не предназначено для использования в реальном сценарии, используемый здесь код предназначен только для образовательных целей.
В этой части мы построим следующую базовую функциональность Blockchain:
- Возможность добавления блоков к
- Простое доказательство алгоритма работы (POW)
- Возможность добавления транзакций
- Возможность моих новых блоков
- Возможность заменить цепь новым
И мы будем держать следующие для будущих сообщений:
- Управление кошельком
- Подписать транзакции
- Рют
Как работает блокчан?
Прежде чем мы прыгаем прямо в код, вам нужно было бы иметь некоторое основное понимание о том, что такое блокчан, как работает распределенная книга и основные идеи криптографических функций, таких как SHA256, если вы совсем не там, или вы просто хотите усилить ваши знания Пожалуйста, посмотрите в мою статью Но как биткойн на самом деле работает?
Пусть весело начнется
Сейчас мы готовы начать разработку нашего модуля Blockchain по модулю, в этой статье я буду указывать на шаг за шагом с образцами и объяснениями кода, проходя через мой мыслительный процесс и реализацию кода. Чтобы оставаться сосредоточенным на главных концепциях, я не прикрою здесь, как я реализовал документацию Swagger или тесты для кода, но можно найти копию полного рабочего примера здесь:
https://github.com/livecodestream/blockchainpy/tree/part_1
Основные структуры
Первое, что нам нужно обсудить для нашего блокчана, – это блоки, а данные, которые мы хотим хранить в наших блоках. Для наших целей мы будем хранить информацию транзакции, поэтому данные, такие как отправитель, получатель и сумма. Для наших целей мы будем использовать классы, будет проще понять и следовать коду.
Это чрезвычайно просто, и мы уже создали проверить
Функция мы будем использовать позже, пока мы просто не допустим никаких транзакций с отрицательными суммами для предотвращения кражи монет. Далее наше блок определение:
Block = { index: number timestamp: number transactions: [Transactions] nonce: string previous_hash: string hash: string }
Наш блок также прост, он содержит индекс, временную метку, список транзакций, которые принадлежат к блоку, не имеете, что мы будем использовать в качестве Доказательство работы хеш к предыдущему блоку и хеш для нашего блока.
С блоками все выглядят немного странно, поэтому давайте пойдем шаг за шагом. Важная функция в этом классе – это метод hash_block
который сериализует информацию о блоке (минус атрибуты HASH) и возвращает представление SHA256 объекта. Это представление затем используется в качестве параметра HASH блока и позже будет использоваться в качестве криптографического доказательства того, что блок не был изменен.
Блокчан
Теперь нам нужно приклеить его вместе со всей логикой Blockchain. Наш блокчан также будет классом, где мы собираемся хранить всю информацию, которую нам нужно для мониторинга и функционирования блокчана.
Характеристики
self.__chain = [] self.__current_transactions = [] @property def last_block(self): return self.__chain[-1] @property def last_transaction(self): return self.__current_transactions[-1] @property def pending_transactions(self): return self.__current_transactions @property def full_chain(self): return self.__chain
Это все, что нам нужно для размещения нашего блокчана, по крайней мере, на данный момент. Давайте рассмотрим, что каждый все о:
- __Cheain: список блоков, представляющих блокчан [частные]
- __Current_Tranctions: список транзакций, которые еще не являются частью блока [Private]
- last_block: Последний блок, добавленный в цепь
- last_transaction: последняя транзакция, добавленная в цепь
- pending_transactions: возвращает атрибут __Current_Transactions
- full_chain: возвращает атрибут __chain
Конструктор
В нашем конструкторе мы простым инициализируем 2 списка и создаем наш первый блок, который называется блоком Genesis. У него не будут никаких транзакций, не привязанных к нему, нет, нет, и это предыдущее хеш будет простым 00
представлять, что нет предыдущих хэш.
Создание транзакций
Просто как генерируя объект транзакции, подтверждающий, если это действительно и присоединяет его к цепочке.
Доказательство работы
Сейчас мы начинаем с тяжелых блокностей, доказательства работы. Доказательство работы состоит из 2 функций, одного доказательства рабочего генератора и другого валидатора. То, как наша реализация работает, принимая новейший блок и добавить не совсем такой, чтобы удовлетворить, что:
f`{last_nonce}{last_hash}{nonce}`
Hahhed с SHA256 приведет к 4 ведущим нулям.
Единственный способ найти наше значение NONECE – это попробовать ошибку, мы начнем со значение 0, и добавляя 1 одновременно, пока функция проверки не даст положительности. Это предназначено для того, чтобы быть процессором интенсивным расчетом для предотвращения вставки или обновления поврежденных блоков.
Мой
Теперь мы готовы моим нашим первым блок, давайте посмотрим, как сделать это, осмотрите процесс:
- Мы рассчитываем не совсем для нашего нового блока
- Мы создаем новую транзакцию, чтобы дать шахтеру награду, эта транзакция будет иметь 0 в качестве отправителя и будет генерировать 1 монету на адрес вознаграждения
- Мы создадим блок и добавлю его в цепочку
Давайте теперь рассмотрим add_block
Функция и что это влечет за собой:
Когда мы получаем сейчас к этому моменту, все начинают выглядеть немного странно вокруг Validate_Block
функция. Какие все эти IFS? Основная цель этой функции состоит в том, чтобы подтвердить, что блок относится к цепочке, что Previous_Hash
Атрибуты совпадают с предыдущим блоком, что хеш, хранящийся в блоке, соответствует фактически рассчитанному хэш, и что наше доказательство работы действительна.
Замена блокчана
Это очень важный шаг, в случае конфликта на блокчане среди сверстников, нам нужна система для определения системы, которая является правильной, для того, что мы будем следовать за биткойнском подходе, говоря, что цепочка с наибольшей работой правильный, как мы находились в предыдущем сообщение
Количество работ будет очень простым расчетом на данный момент, и это количество блоков на цепочке. Я знаю, что есть комната для улучшения, и мы можем работать над этим позже. Вот как выглядит код:
Просто, мы сравниваем размеры цепочек, мы уверены, что новая цепочка имеет все действительные блоки, и мы просто вставляем в нашу блокчану все недостающие блоки, замечательные, кроме этого:
# Then we compare each block with its previous one for x in range(1, len(chain_to_validate)): if not self.validate_block(chain_to_validate[x], chain_to_validate[x - 1]): return False
Это повредит твоим глазам? Каждый раз, когда мы хотим проверить входящую цепочку, нам нужно проверить все блоки на цепочке, должно быть лучшего подхода, особенно если мы считаем многие из этих блоков, которые мы, вероятно, имеем на нашей собственной цепочке. Ну … есть лучший способ, но сейчас он не будет освещен, мы посмотрим на это в будущем посте, но если вы заинтриговываются и хотите выполнить исследование и создать PR, вы можете сделать это:), просто посмотрите на Merkle деревьев Отказ
Поздравляю!
Вот так … в значительной степени … Вам все еще нужно раскрыть все методы, которые мы обсуждали на сервере своего рода, в моем демонстрационном проекте, я использую колбу и чванство, чтобы у вас есть пользовательский интерфейс, чтобы проверить и посмотреть, что происходит. Вся информация для запуска проекта находится на Readme файл.
До сих пор еще много работы, как создать управление узлом и синхронизацией, подписания транзакций, добавление деревьев Merkle и т. Д. Я собираюсь продолжать работать над проектом и регулярно публиковать здесь обновления Так что оставайся настроен!
Большое спасибо за пребывание со мной так долго, надеюсь, этот проект был интересным. Если вы хотите узнать больше, или если вы хотите, чтобы я работал по конкретной теме, пожалуйста, напишите мне на jc@livecodestream.dev. Я буду рад поддержать.
Счастливое кодирование!
Оригинал: “https://dev.to/livecodestream/from-zero-to-blockchain-in-python-part-1-25j2”