Создайте простой блокчейн

В этой статье я хотел бы дать простое введение в мир блокчейна, шаг за шагом проведя вас через процесс программирования самостоятельно. Мы будем использовать язык программирования python, с помощью которого (на мой взгляд) концепции могут быть показаны наиболее простым способом. Итак, начнем!

Краткое введение

С тех пор, как Биткойн появился на рынке, технология блокчейн не только пережила большой ажиотаж, но и претерпела множество изменений. Как только вы начнете погружаться в этот бассейн знаний, вы можете не найти выхода. Так много всего предстоит открыть! В моем понимании самое простое определение блокчейна следующее:

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

Итак, блокчейн - это база данных. Есть блоки, каждый блок может содержать данные. Все идет нормально. Что означает децентрализация? Что ж, взгляните на классическую структуру Интернета. После посещения веб-сайта ваш компьютер подключается к серверу того, на котором запущен сайт. Вы - клиент, который просто запрашивает некоторую информацию с сервера. Такую архитектуру сети можно назвать централизованной. Если вы спроектируете сеть таким образом, чтобы каждый участник работал и как сервер, и как клиент, должен следовать некоторым определенным правилам и обмениваться данными друг с другом, чтобы держать всех в курсе, вы можете добиться децентрализации. Что в этом так привлекательно, так это то, что вам больше не нужно полагаться на какую-то третью сторону. Итак, теперь мы немного больше поняли, что такое блокчейн. Давайте немного погрузимся в код.

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

Функции криптографического хеширования

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

Но в названии этого раздела написано криптографическая хэш-функция. Есть разница? Ах да, есть! Такие хеш-функции, как описано выше, в большинстве случаев не являются функциями, как мы их знаем из школы. Скорее всего, рассматривать их как алгоритм, который когда-то разработал какой-то гениальный айтишник. Чтобы получить криптографическую хеш-функцию, алгоритм должен выполнять некоторые определенные свойства.

  1. Какой бы элемент вы ни хотели хешировать, алгоритм сможет сделать это за короткое время.
  2. Неважно, как часто вы применяете алгоритм для хеширования вашего элемента, вы всегда получите одно и то же значение для хеша.
  3. Вы не можете восстановить исходный элемент из хеш-значения - единственная возможность - это атака грубой силой (означает просто попытку каждого возможного элемента).
  4. Если вы измените элемент, который хотите хэшировать, совсем немного, вы получите совершенно другое значение хеширования после применения алгоритма.
  5. Алгоритм хеширования работает таким образом, что два разных хешированных элемента никогда не дадут вам одно и то же значение хеширования.

Если хеш-алгоритм, разработанный одним из гениальных ИТ-специалистов, упомянутых выше, обладает всеми этими свойствами, он называется криптографической хеш-функцией. После того, как мы проработали много теории, пришло время немного программировать. Мы собираемся что-то хешировать.

Откройте свою среду IDE python и начните вводить код:

import hashlib
import json
data = “I am gonna be hashed”
data_package = json.dumps(data).encode(‘utf-8’)
Hash = hashlib.sha256(data_package).hexdigest()
print(Hash)

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

data = “I am gonna be hashed”

мы определяем строку с именем data, которая содержит некоторую информацию, которую мы хотим хэшировать. После этого помещаем в json-формат

data_package = json.dumps(data).encode(‘utf-8’)

и сохраните его в переменной с именем data_package. Затем эта переменная будет хеширована. Мы вызываем функцию sha256, которая включена в хэш-библиотеку

Hash = hashlib.sha256(data_package).hexdigest()

и превратите хеш-значение, прежде чем сохранять его в переменной Hash, в шестнадцатеричный код. Кстати, алгоритм хеширования sha256 также используется в сети Биткойн.
После вычисления хеша мы его распечатываем. Результат должен выглядеть примерно так:

ea7ca0fe96c8497152be798c9d57376dc13aa23beb1bc36e9021b29c6590e884

Поздравляю! Вы рассчитали свое первое хеш-значение!

Теперь о блокчейне

Пришло время кодировать часть блокчейна! Сначала я снова дам небольшое теоретическое введение. Сам блокчейн (без учета всей этой части децентрализации) представляет собой список блоков. Каждый блок содержит информацию - в простейшей форме хеш-значение, данные и хеш-значение предыдущего блока. Значение хэша самого блока зависит от данных и предыдущего хэша. Итак, немного математически, с алгоритмом sha256:

Hash(Block) = sha256(data + previousHash)

Чтобы еще раз визуализировать эту концепцию, взгляните на картинку ниже.

Не говоря уж о теории, вот код:

import hashlib
import json
blockchain = []
def generateBlock(previousHash,data):
    dic = {‘data’:data,’previousHash’:previousHash}
    dic_package = json.dumps(dic).encode()
    Hash = hashlib.sha256(dic_package).hexdigest()
    block = {‘Hash’:Hash,’data’:data,’previousHash’:previousHash}
    return block
genesisBlock = generateBlock(0,’I am the first block!’)
blockchain.append(genesisBlock)
secondBlock = generateBlock(genesisBlock.get(‘Hash’),’I am the second block!’)
blockchain.append(secondBlock)
print(blockchain)

Итак, давайте поработаем над этими строками кода. В первых двух строках мы снова импортировали библиотеки hashlib и json. Пока ничего не изменилось. Затем мы определили блокчейн как пустой список:

blockchain = []

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

def generateBlock(previousHash,data):

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

dic = {‘data’:data,’previousHash’:previousHash}
dic_package = json.dumps(dic).encode()
Hash = hashlib.sha256(dic_package).hexdigest()

мы помещаем предыдущий хэш и данные в словарь, чтобы получить структуру во всем этом. Именно этот словарь будет хеширован в следующих строках. Сам блок тогда также определяется как словарь:

block = {‘Hash’:Hash,’data’:data,’previousHash’:previousHash}

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

genesisBlock = generateBlock(0,’I am the first block!’)
blockchain.append(genesisBlock)

мы генерируем Genesis Block, так называется первый блок блокчейна. Аргумент для предыдущего хеша установлен в 0. Данные - это просто информация, что это первый блок. После создания блока Genesis он добавляется к все еще пустому списку, называемому цепочкой блоков. После этого генерируем второй блок:

secondBlock = generateBlock(genesisBlock.get(‘Hash’),’I am the second block!’)
blockchain.append(secondBlock)

Мы получаем хеш-значение из блока Genesis и устанавливаем для переменной previousHash это значение, а в данных мы говорим, что это второй блок. Опять же, мы добавляем этот блок в цепочку блоков. Результат в итоге должен выглядеть примерно так:

[
{‘Hash’: ‘488be7d7f7aed0508b519ebcc0847a5304aa97098dc6b06f30df77fbef126aba’, ‘data’: ‘I am the first block!’, ‘previousHash’: 0}, 
{‘Hash’: ‘6014a2cf8b80f4b1f0dca57ad6cf32477261921db60176412024914af176ecba’, ‘data’: ‘I am the second block!’, ‘previousHash’: ‘488be7d7f7aed0508b519ebcc0847a5304aa97098dc6b06f30df77fbef126aba’}
]

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

Надеюсь, вам понравилось это пошаговое руководство, и спасибо, что прочитали!