
Лаб_03_04
.docxМИНИСТЕРСТВО ЦИФРОВОГО РАЗВИТИЯ,
СВЯЗИ И МАССОВЫХ КОММУНИКАЦИЙ РОССИЙСКОЙ ФЕДЕРАЦИИ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ
УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА»
(СПбГУТ)
Кафедра Защищенных систем связи
Факультет Кибербезопасности
Дисциплина Блокчейн и обеспечение безопасности распределенных реестров
ОТЧЕТ ПО ЛАБОРАТОРНОЙ РАБОТЕ 3-4
Эмуляция формирования блоков блокчейна на языке Python
(тема отчета)
Направление/специальность подготовки
10.03.01 Информационная безопасность
(код и наименование направления/специальности)
Студент:
Травкина Е.А., ИКБ-14
(Ф.И.О., № группы) (подпись)
Федченко А.С., ИКБ-14
(Ф.И.О., № группы) (подпись)
Ящук А.А., ИКБ-14
(Ф.И.О., № группы) (подпись)
Преподаватель:
к.т.н, доцент, Кушнир Д.В.
(должность, Ф.И.О.) (подпись)
Задание
Выполнить эмуляцию на python некоторых основных функций, связанных с формированием блоков блокчейна.
Предполагается, что выполнение некоторых функций майнера, уже подготовившего информацию для размещения в блоке. В мы сформировали три блока.
Имеются данные о некоторых записях, которые мы разместили в блокчейн. Предположили, это будут не транзакции, а обычные текстовые строки. Задали 4-ые текстовые строки с ФИО и номером группы:
tr1= «Федченко», tr2= «Александра», tr3= «Сергеевна», tr4= «группа ИКБ-14» (первый блок);
tr1= «Травкина», tr2= «Елизавета», tr3= «Алексеевна», tr4= «группа ИКБ-14» (второй блок);
tr1= «Ящук», tr2= «Анастасия», tr3= «Александровна», tr4= «группа ИКБ-14» (третий блок)
Вычислили корень дерева Меркля для данных транзакций. В качестве хеш-функции выбрали ырф256. Использовали библиотеку hashlib.
Составили заголовок блока, в который вошли такие данные как:
Номер версии, задали значение из текущего номера из bitcoin (4).
Хеш предыдущего блока, предположим он задан. Взяли хеш из последнего созданного блока в сети bitcoin (000000000000000000051d4a7f83ef5abfbc39620afed04be2099b1373a2e410).
Метка времени, получили текущее время самостоятельно в любом формате.
Корень дерева Меркля вычисленный на предыдущем этапе.
Параметр nonce. Начальное значение установили в 0.
Задались предварительным значением порога target. Например, значением в 16-тиричном виде: ведущие 4 нуля, остальные fff: «0000fffff…f» (64 символа – общая длина 256 бит).
Произвели вычисление хеша от заголовка блока меняя значение nonce, до тех пор, пока результат не оказался меньше target. Это говорит о том, что блок сформирован.
Block 1:
Nonce: 112630
Hash: 0000ee000e4ccd76f5d31a35c6c7527217e5917901e5c4649c8c3454d0c72228
Time to create: 0.19694209098815918 seconds
Block 2:
Nonce: 86155
Hash: 000042258b3ddcd9d5ec722e016dd2f29747e037650454f434a770d9c4863f19
Time to create: 0.14722299575805664 seconds
Block 3:
Nonce: 12890
Hash: 0000ee81279f4ef48afa2e4f20ac17d05f457b93d619d402390f9c0efd469706
Time to create: 0.022573471069335938 seconds
Время создания блока составляет доли секунды, так как использован достаточно простой уровень сложности (target).
Прикинуть, чему должен быть равен target, чтоб время создания блока приблизительно составляло 3 минуты или немного больше. После корректировки значения target, чтобы время создания блока приближалось к 3 минутам, получилось следующее:
New Block with adjusted target:
Nonce: 16968915
Hash: 0000002e59b1f251a3e189f50f92000c323570b200b96393ed70657429ff9fb5
Time to create: 176.304733753204346 seconds
New Target:
00000047b4555555555400000000000000000000000000000000000000000000
Аналогично сформировали второй и третий блоки с другими данными в транзакциях.
Код программы
import hashlib
import time
def hash_string(data):
return hashlib.sha256(data.encode()).hexdigest()
def create_merkle_root(transactions):
if len(transactions) == 1:
return transactions[0]
new_level = []
for i in range(0, len(transactions), 2):
if i + 1 < len(transactions):
new_level.append(hash_string(transactions[i] + transactions[i + 1]))
else:
new_level.append(hash_string(transactions[i] + transactions[i]))
return create_merkle_root(new_level)
block1_data = ["Федченко", "Александра", "Сергеевна", "группа ИКБ-14"]
block2_data = ["Травкина", "Елизавета", "Алексеевна", "группа ИКБ-14"]
block3_data = ["Ящук", "Анастасия", "Александровна", "группа ИКБ-14"]
merkle_root_block1 = create_merkle_root(block1_data)
merkle_root_block2 = create_merkle_root(block2_data)
merkle_root_block3 = create_merkle_root(block3_data)
def mine_block(version, previous_hash, merkle_root, target):
nonce = 0
start_time = time.time()
while True:
block_header = f"{version}{previous_hash}{merkle_root}{nonce}"
block_hash = hash_string(block_header)
if block_hash < target:
end_time = time.time()
elapsed_time = end_time - start_time
return nonce, block_hash, elapsed_time
nonce += 1
version = "04000000"
previous_hash =
"000000000000000000051d4a7f83ef5abfbc39620afed04be2099b1373a2e410"
target = "0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
nonce1, block_hash1, time1 = mine_block(version, previous_hash, merkle_root_block1, target)
nonce2, block_hash2, time2 = mine_block(version, block_hash1, merkle_root_block2, target)
nonce3, block_hash3, time3 = mine_block(version, block_hash2, merkle_root_block3, target)
output = f"""
Block 1:
Nonce: {nonce1}
Hash: {block_hash1}
Time to create: {time1} seconds
Block 2:
Nonce: {nonce2}
Hash: {block_hash2}
Time to create: {time2} seconds
Block 3:
Nonce: {nonce3}
Hash: {block_hash3}
Time to create: {time3} seconds
"""
output
Вывод
В данной работе была выполнена эмуляция процесса майнинга блоков с использованием технологии блокчейн на языке Python. В качестве данных для транзакций были взяты строки с ФИО и группой участников. Мы сформировали дерево Меркля для каждого блока, вычислили хеши, и сформировали заголовки блоков с учетом номера версии, хеша предыдущего блока, метки времени и корня дерева Меркля. Была использована версия блока 4, что соответствует текущему стандарту в сети Bitcoin. Для процесса майнинга блоков было установлено начальное значение целевого хеша (target), и майнинг проводился до тех пор, пока хеш блока не становился меньше target. В рамках задания также была проведен подбор значения target таким образом, чтобы время создания блока приблизилось к 3 минутам. Таким образом, работа продемонстрировала ключевые аспекты майнинга блоков, взаимодействие с хеш-функциями и деревом Меркля, а также процесс подбора значений сложности майнинга для контроля времени создания блока.
Санкт-Петербург
2024