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

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

В целом, блок состоит из даты транзакции, из отметки времени и ссылки на предыдущий блок. В реализации блока я создала класс Block со следующими атрибутами:
  • Индекс — хранит местоположение блока во всей цепочке
  • Отметка времени — дата и время, в которое был создан блок
  • Основные данные — данные, которые хранятся в блоке (к примеру, кто купил, сколько купил и т.п.)
  • Предыдущий хэш — хэш предыдущего блока в цепочке
  • Текущий хэш — хэш текущего блока; Если вы не знакомы с хэшированием, то хэширование, по сути, сопоставляет данные произвольной длины с данными фиксированного размера; хэш — строка, представляющая блок.
Я вычисляю хэш блока алгоритмом SHA-256, который является криптографическим алгоритмом хэширования. Затем хэширую атрибуты, представляющие блок — индекс, отметку времени, основные данные, хэш предыдущего блока. Функция «calculateHash» возвращает 256-битовую строку со всеми переданными в неё данными. Не забудьте подключить hashlib, без неё код не будет работать.

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

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

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

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

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

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

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

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

Ниже вы увидите код, который создаёт объект BlockChain под названием annaCoin и добавляет в него блоки. Я доказываю безопасность annaCoin, проверяя валидность цепочки блоков перед любым вмешательством, а также после атаки на блок.
Вывод функции:
Замечание: я добавила функции вывода в код BlockChain и в класс Block, чтобы результат тестирования был более читабельным. Я не включала функции вывода в код, вставленный в статью, чтобы он был более понятен.
Полный скрипт здесь: https://github.com/annamcabee/Block-Chain Перевод статьи Anna McAbee: Learning about Block Chain with Python
Предыдущая статьяС нуля до разработчика игр: как начать создавать видеоигры, если у вас нет опыта
Следующая статьяФункциональное программирование со Scala: введение