Найти в Дзене
Nuances of programming

Изучение Blockchain на Python

Оглавление

Неделю назад я поняла, почему испытывала неприязнь к Bitcoin. У меня не было его, и я не понимала как он работает. Я начала изучать Bitcoin с технологии, на которой он построен, а точнее, с BlockChain. Я училась, делая скрипты на Python, которые создают этот самый BlockChain, поэтому, я бы хотела поделиться своими наработками со всеми, кто хочет узнать больше про BlockChain.

Содержание блока

В целом, блок состоит из даты транзакции, из отметки времени и ссылки на предыдущий блок. В реализации блока я создала класс Block со следующими атрибутами:

  • Индекс — хранит местоположение блока во всей цепочке
  • Отметка времени — дата и время, в которое был создан блок
  • Основные данные — данные, которые хранятся в блоке (к примеру, кто купил, сколько купил и т.п.)
  • Предыдущий хэш — хэш предыдущего блока в цепочке
  • Текущий хэш — хэш текущего блока; Если вы не знакомы с хэшированием, то хэширование, по сути, сопоставляет данные произвольной длины с данными фиксированного размера; хэш — строка, представляющая блок.

Я вычисляю хэш блока алгоритмом SHA-256, который является криптографическим алгоритмом хэширования. Затем хэширую атрибуты, представляющие блок — индекс, отметку времени, основные данные, хэш предыдущего блока. Функция «calculateHash» возвращает 256-битовую строку со всеми переданными в неё данными. Не забудьте подключить hashlib, без неё код не будет работать.

-2

Блоки цепочки

Инициализация цепочки

Для начала, первый блок цепочки называется «первичным блоком» (или «блоком генезиса»). Это просто исходный блок, с которого начинается вся цепочка. В моей реализации, когда создаётся BlockChain, то первичный блок создаётся автоматически.

Добавление блока

Чтобы добавить новый блок в цепочку, вам необходимо получить хэш предыдущего блока, а далее вычислить хэш нового. Поскольку хэш предыдущего блока — это данные, передающиеся в хэш-функцию, вычисление хэша нового блока должно быть выполнено после получения предыдущего хэша. Функция «getLastestBlock» используется только для получения последнего блока в цепочке, поэтому, когда вы добавляете блок, он автоматически становится предыдущим.

Защита цепочки

Технология BlockChain устойчива к изменениям конструкции. Одна часть, отвечающая за безопасность, гарантирует, что ссылки между блоками не были подделаны, поэтому, предыдущий хэш в блоке #3 фактически эквивалентен хэшу в блоке #2. Это то, что я проверяю в функции «isChainValid». Другая часть, также отвечающая за безопасность, гарантирует, что данные в блоке не были подвергнуты изменениям с момента создания блока. Например, если кто-то попытается изменить внутри блока имя того, кто сделал транзакцию, операция будет предотвращена для обеспечения безопасности. Если данные в блоке были подделаны, то хэш блока также поменяется, поскольку данные передаются в хэш-функцию. Изменение значение хэша также учитывается в функции «isChainValid», чтобы проверить, изменились ли данные с момента создания блока.

-3

Тестируем написанный BlockChain с Anna Coin

Ниже вы увидите код, который создаёт объект BlockChain под названием annaCoin и добавляет в него блоки. Я доказываю безопасность annaCoin, проверяя валидность цепочки блоков перед любым вмешательством, а также после атаки на блок.

-4

Вывод функции:

-5
Замечание: я добавила функции вывода в код BlockChain и в класс Block, чтобы результат тестирования был более читабельным. Я не включала функции вывода в код, вставленный в статью, чтобы он был более понятен.

Полный скрипт здесь: https://github.com/annamcabee/Block-Chain

Читайте нас в телеграмме, vk

Перевод статьи Anna McAbee: Learning about Block Chain with Python