Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/228: Рейтинг темы: голосов - 228, средняя оценка - 4.61
2 / 2 / 0
Регистрация: 05.11.2018
Сообщений: 55

Проверка блокчейна

08.11.2018, 10:58. Показов 45604. Ответов 8

Студворк — интернет-сервис помощи студентам
Ограничение времени 1 секунда
Ограничение памяти 64Mb
Ввод стандартный ввод или input.txt
Вывод стандартный вывод или output.txt

Блокчейн (blockchain) переводится как «цепочка блоков». Это способ хранения данных, защищённый от подделки, используемый, в частности, криптовалютой биткоин.

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

Напишите программу, которая проводит проверку правильности хэшей в модельном блокчейне с простой хэш-функцией. Блок bn с номером n включает полезную информацию mn, представленную натуральным числом, rn — случайное число от 0 до 255 и hn — хеш (целое число от 0 до 255). У каждого блока хэш вычисляется по формуле (здесь mod означает остаток от деления), при вычислении хэша начального блока h0 вместо хэша предыдущего блока берётся ноль. При этом каждый блок представлен одним числом bn = hn + rn×256 + mn×2562. При этом требуется, чтобы хэш hn был меньше 100.

Формат ввода
На первой строке вводится натуральное число N — количество блоков.
Далее следуют N чисел bn, каждое на отдельной строке.

Формат вывода
Следует вывести номер первого блока, у которого неправильный хэш (не меньше 100 или не совпадает с вычисленным по указанной в условии формуле), или -1, если все хэши в блокчейне правильные. Нумерация блоков идёт с нуля, т. е. они имеют номера от 0 до N-1.
Миниатюры
Проверка блокчейна  
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.11.2018, 10:58
Ответы с готовыми решениями:

Проверка блокчейна
Блокчейн (blockchain) переводится как «цепочка блоков». Это способ хранения данных, защищённый от подделки, используемый, в частности,...

Проверка блокчейна
PYTHON Блок bn с номером n включает полезную информацию mn, представленную натуральным числом, rn — случайное число от 0 до 255 и hn — хеш...

Получить данные из блокчейна
Здравствуйте! Не могу получить данные из контракта. Подключился к метамаску, создал деплой функцию контракта - развернул контракт на...

8
1 / 1 / 0
Регистрация: 02.01.2019
Сообщений: 12
03.01.2019, 21:24
Блин ребята помогите плиз, срочно надо. Спасибо заранее
0
208 / 95 / 15
Регистрация: 27.07.2018
Сообщений: 323
04.01.2019, 12:04
mimimimimimimim,
It's easy
Python
1
2
3
4
5
6
7
8
9
10
11
12
n = int(input())
p = 0
bad = - 1
for i in range(n):
    b = int(input())
    h, r, m = b % 256, (b // 256) % 256, b // 256 ** 2
    t = ((m + r + p) * 37) % 256
    if t != h or h >= 100:
        bad = i
        break
    p = h
print(bad)
If i help you, not forget press but 'Thanks'.
17
1 / 1 / 0
Регистрация: 02.01.2019
Сообщений: 12
04.01.2019, 15:09
Thank!!!
1
5 / 4 / 1
Регистрация: 12.02.2017
Сообщений: 11
13.03.2020, 00:26
Цитата Сообщение от CyberGame Посмотреть сообщение
mimimimimimimim,
It's easy
Python
1
2
3
4
5
6
7
8
9
10
11
12
n = int(input())
p = 0
bad = - 1
for i in range(n):
    b = int(input())
    h, r, m = b % 256, (b // 256) % 256, b // 256 ** 2
    t = ((m + r + p) * 37) % 256
    if t != h or h >= 100:
        bad = i
        break
    p = h
print(bad)
If i help you, not forget press but 'Thanks'.
Привет.
А не мог бы пояснить как ты из условия это взял?
Python
1
h, r, m = b % 256, (b // 256) % 256, b // 256 ** 2
3
2 / 2 / 0
Регистрация: 28.09.2020
Сообщений: 17
17.11.2020, 16:19
Смотри, делишь всю первую формулу на 256. Тогда слева будет b % 256, а справа выражение r * 256 + m * 256 ** 2 делится на 256, но также справа имеется член h, значит остаток от деления правой части на 256 равен h. Значит h == b % 256. Теперь заметим, что r + m * 256 == b // 256. Если теперь найти остаток от деления данного выражения на 256, то он (остаток) будет равен b // 256 % 256, т.к m * 256 делится на 256, а r - свободный член, являющийся остатком.

Добавлено через 1 минуту
Спасибо, очень помогли!
0
1 / 1 / 0
Регистрация: 07.10.2022
Сообщений: 12
06.11.2022, 22:17
вопрос, а почему мы именно делим на 256. в условии не написано ничего про это и сказано про рандом? за пояснение и за код спасибо
0
2 / 2 / 0
Регистрация: 08.01.2023
Сообщений: 1
08.01.2023, 23:54
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
last_h = 0
for i in range(int(input())):
    block = int(input())
    now_h = block % 256 # "первый разряд" от умножения на 256
    r = (block // 256) % 256 # "средний разряд" от умножения на 256
    m = block // 256 ** 2 # "крайний разряд" от умножения на 256
    calc_h = (37 * (m + r + last_h)) % 256 # хеш по формуле
    if calc_h != now_h or calc_h > 100:
        print(i)
        break
    last_h = calc_h
else:
    print(-1)
Я кажется понял, это работает как с разрядами десятков:
bn = hn + rn * 256 + mn * 256 ** 2, мы сдвигаем каждый элемент на разряд.
например (пример в нашей любимой 10ричной системе исчисления):
n = first + second * 10 + third * (10 ** 2)
n = str(first) + str(second) + str(third) т.е. и в первом и во втором случае они идут друг за другом. Поэтому мы и можем вытаскивать по разряду из блока
2
1 / 1 / 0
Регистрация: 01.02.2023
Сообщений: 2
01.02.2023, 15:58
Добавлено через 21 секунду
Привет! Здорово объяснил, спасибо!
Был один момент, на котором я затупил, объясню для тех, кто тоже не понял:
В решении мы тянем элементы из разрядов в обратном порядке, потому что нам и в задании их дали в обратном порядке.

То есть, 375 = 3 * 100 + 7 * 10 + 5, а не 5 + 7 * 10 + 3 * 100, как нам дали в задании.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.02.2023, 15:58
Помогаю со студенческими работами здесь

Ищем программистов блокчейна и криптографов
Ищем программистов блокчейна и криптографов , требуется группа для создания смарт контрактов и работы на разных блокчейнах

Практика с алгоритмом блокчейна и собственная наработка
Всех приветствую!:senor: Интересуюсь таким вопросом: кто пробовал создавать какие-либо проекты или только какие-нибудь свои наработки...

Что быстрее, проверка на null, или проверка на тип перечисления в запросе?
вопрос такой. если несколько таблиц. сходных по структуре в запросе. в первой таблице типТовара = перечисление.тратата.набор во...

Перегрузить операции: % проверка на принадлежность; * пересечение множеств; < проверка на подмножество
Здравствуйте, можете пожалуйста помочь сделать лабу на С++. Тема: ПЕРЕГРУЗКА ОПЕРАЦИЙ Цель работы - получить практические навыки...

Проверка кода и советы по его улучшению. Генерация случайных чисел и проверка на уникальность
Привет народ! Занимаюсь изучением Java, захотелось реализовать выборку случайных чисел для лотереи. Вроде бы все прописал и программа даже...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru