Источник: Coin Post
Если вы интересуетесь технической стороной криптовалют и тем, как работает блокчейн, то хеширование — это одна из основных тем, которая даст вам ключ к пониманию того, как устроены эти новые peer-to-peer технологии.
Что же такое хеширование?
Говоря простым языком, хеширование — это преобразование массива данных любого объема в исходную строку фиксированной 0длины. Для более легкого понимания назовем их Input (входящий массив данных) и Output (полученный хеш, т.е. уже упомянутая выше строка фиксированной длины). В отношении криптовалют, таких как, например, Bitcoin, транзакции, которые являются основным массивом данных, проходят через алгоритм хеширования (в основу работы Bitcoin положен алгоритм SHA-256), который в результате дает исходную строку фиксированной длины.
Давайте на небольшом примере посмотрим, как устроен процесс хеширования. Для преобразования массива информации в хеш мы применим уже упомянутый выше алгоритм SHA-256 (Secure Hashing Algorithm):
Как видите, вне зависимости от длины и объема Input на выходе всегда получается одинаковый Output, который имеет фиксированную длину в 256 бит. Это имеет решающее значение, особенно когда нужно преобразовать в хеш большие и очень большие массивы информации, как например, множество транзакций в сети Bitcoin или Ethereum.
Успешное применение хеширования в блокчейне и криптовалютах объясняется уникальными свойствами криптографической хеш-функции, о которой мы и поговорим в следующем разделе.
Криптографическая хеш-функция и ее свойства
Криптографические хеш-функции — это особый вид хеш-функций, которые обладают свойствами, позволяющими сделать использование хеш-функций в криптовалютах безопасным и надежным. Ниже мы подробно рассмотрим все эти свойства.
Свойство 1: Детерминированность
Это означает, что независимо от того, сколько раз вы будете преобразовывать Input в Output, на выходе всегда получится один и тот же хеш. Данное свойство хеш-функции играет очень важную роль, поскольку в противном случае было бы невозможно отслеживать исходные данные.
Свойство 2: Быстрое вычисление
Хеш-функция должна быстро возвращать исходные данные. В противном случае система просто не будет эффективной. Особенно это актуально для популярных криптовалют, в блок которых входит большое количество транзакций.
Свойство 3: Стойкость к атаке поиска прообраза
Суть свойства стойкости к атаке поиска прообраза состоит в следующем: если мы знаем значение H (A), в котором A — Input, а H (A) — Output, т.е. хеш, то нахождение значения A является практически неосуществимой задачей. Здесь стоит сделать акцент именно на слове «неосуществимо», а не на «невозможно». Ведь работа майнеров доказывает, что при определенных обстоятельствах эта задача становится выполнимой. Давайте рассмотрим небольшой пример.
Вы используете телефон, который отображает не номера, а их хеши, созданные в системе алгоритма SHA-256. Вы знаете, что ваш номер известен только 7 людям, номера которых вы также знаете. Чтобы узнать, от какого абонента вы пропустили звонок, вам нужно просто узнать хеши этих семи номеров, а потом каждый из них сравнить с хешем номера, который отобразился в списке пропущенных звонков.
Однако такой метод поиска Input актуален лишь при работе с небольшими массивами данных, но когда у нас просто огромный объем информации, получить Input путем применения данного метода (он называется «brute force» — метод «грубой силы») становится очень сложной задачей. Данный математический метод заключается в переборе всех допустимых вариантов Input, их преобразование в Output и сравнение с имеющимся хешем. Сложность нахождения правильного решения напрямую зависит от объема исходной информации.
В случае применения метода brute force есть три варианта развития событий:
Свойство 4: Стойкость к коллизии
Вероятность нахождения двух Input, которые бы имели один и тот же Output после прохождения процесса хеширования, должна быть максимально приближенной к нулю. Теоретически это может быть возможным, однако время, которое было бы затрачено на поиск двух одинаковых прообразов должно измеряться десятками лет. Данное свойство имеет очень важное значение, когда мы говорим о вопросе цифровой безопасности в криптовалютах. В криптографии способность противостоять возможности поиска второго прообраза называется стойкостью к коллизии.
В этом контексте стоит упомянуть такое явление как «парадокс дня рождения». В чем его суть?
Прежде всего, нужно сказать, что шанс встретить двух незнакомых людей, которые бы родились в один и тот же день, равен 0,27%. Однако если в одном помещении одновременно находятся 366 людей, то шанс, что как минимум двое из них родились в один и тот же день, возрастают до 100%. Очевидно, что чем большее количество людей находится в одной группе, тем более высока вероятность того, что два человека будут иметь день рождения в один день.
«Парадокс дня рождения» используется в криптографической атаке, которая называется атакой «дней рождения» и в которой метод brute force применяется для поиска двух Input с одинаковым Output. «Парадокс дня рождения» помогает создать коллизию, потому что метод «грубой силы» при применении «парадокса дня рождения» становится более эффективным, чем без него. Однако несмотря на это в системе Bitcoin данный вид атаки малоприменим, поскольку шанс создать коллизию — примерно один к триллиону.
Свойство 5: Лавинный эффект
Данное свойство означает, что внесение даже незначительных изменений в Input приводит кардинальному изменению Output, т.е. хеша. Посмотрим на простой пример:
Как видите, хеши одной и той же фразы кардинально отличаются. И при этом все, что мы сделали — просто изменили регистр двух символов.
Данное свойство криптографических хеш-функций играет одну из самых главных (если не самую главную) ролей в обеспечении безопасности и надежности блокчейна. Каждый блок содержит в себе хеш предыдущего блока, и чтобы изменить данные одного блока, придется изменить данные предыдущего — и так по цепочке вплоть до самого первого genesis-блока. Как можно догадаться, это практически нереализуемо.
Свойство 6: Высокий показатель энтропии
Данное свойство означает, что хеши массивов данных должны быть максимально распределены в системе, т.е. обладать высоким показателем энтропии (энтропия — в информатике это мера неопределенности ситуации).
Рассмотрим небольшой пример. Так, у нас есть уравнение Y = H (k | x). Так, если Y является Output, а значение k обладает высоким показателем энтропии, то найти такое значение x (Input), которое бы удовлетворяло уравнению, будет практически невозможно.
«Высокая энтропия» означает состояние, при котором значение выбрано из такого широкого круга всевозможных вариантов, что попытки угадывания методом рандомного подбора не имеет никаких шансов на успех. Например, число, которое находится в рамках от 1 до 10, обладает низким показателем энтропии, в то время как число, которое находится между 1 и 2^256 имеет высокий показатель энтропии.
Если принять во внимание описанное выше, то можно сказать, что криптографическая хеш-функция превращает процесс подбора исходных данных для злоумышленников в игру в рулетку, т.е. шанс найти правильный Input должен быть очень низким, однако при этом каждый Input должен всегда иметь неизменный Output.
Структура данных
Структура данных — это способ хранения данных. В блокчейне структура данных, задействованных в процессе хеширования, представлена двумя видами элементов: указателями и связанными списками.
Указатели
Указатели в программировании — это переменные, которые ссылаются на другие переменные, вне зависимости от вида языка программирования. Вместо того чтобы хранить числовые значения переменных, указатели содержать лишь своего рода «ссылку» на них. Как можно понять из названия, указатели «показывают путь» к расположению других переменных.
Например, выражение int b = 100 означает, что есть некая переменная b, которая содержит в себе целое числовое значение 100.
Связанные списки
Связанные списки имеют общие черты со структурой блокчейна, в которой каждый блок включает в себя данные предыдущего блока. В блокчейне связанные списки функционируют по такой схеме:
Указатели — это часть структуры данных, они знают адрес следующего блока, входящего в общую цепочку. Стоит сказать, что последний блок имеет нулевой указатель, которому не присваивается никакой значение до того момента, пока не будет создан следующий блок в цепочке.
Блокчейн состоит из связанных между собой блоков, каждый из которых имеет хещ-указатель — это особый вид указателей, которые содержат ссылку на предыдущий блок. Хеш-указатели добавляют адрес предыдущего блока только после прохождения исходного массива данных через алгоритм хеширования — это позволяет сделать связь между двумя блоками надежной и защищенной.
Однако genesis-блок не содержит этот указатель. В его состав входит только указатель, который связывает его со вторым блоком цепи. Этот особый хеш-указатель содержит хеш-данные genesis-блока.
Такая система неуязвима перед атаками злоумышленников, которые могут попытаться изменить данные в блокчейне, потому что любое изменение в Input неизбежно приводит к изменениям в Output. Если была совершена попытка атаки на конкретный блок, участники сети (ноды) сразу же получают оповещение об этом и отклоняют запрос на внесение изменений. Это гарантирует неизменность блоков в блокчейне и безопасность системы. Однако если бы каждый блок не имел свой уникальный хеш, его отслеживание было бы невозможным.
Информация, которая содержится в заголовке каждого блока, отвечает за его идентификацию. Каждый заголовок блока включает в себя следующие элементы:
- Номер версии блокчейна (необходимо для отслеживания обновлений и изменений в протоколе).
- Временную метку блока UNIX.
- Сложность сети (определяется количеством нулей, которые соответствуют текущему уровню протокола Proof of Work).
- Хеш-указатель.
- Nonce (значение, которое ищут майнеры для того, чтобы создать блок и присвоить ему правильный хеш).
- Хеш корня Меркла, который состоит из хешей транзакций, входящих в конкретный блок.
Каждый из этих элементов играет очень важную роль в создании блока. Например, nonce очень важен, потому что майнеры перебирают множество вариантов, прежде чем один из участников сети найдет правильное значение и создаст правильную строку блока. В частности, факт нахождения nonce раньше других гарантирует майнеру получение вознаграждения в виде криптовалюты.
Дерево Меркла отвечает за упорядочивание и хранение транзакций внутри блока. Дерево Меркла выглядит так:
В самом низу древовидной структуры дерева Меркла находятся листовые узла (на приведенной выше картинке это L1, L2, L3 и L4). Выше них расположены несколько уровней дочерних узлов — это все узлы, которые находятся ниже корневого узла. На картинке это узлы Hash 0-0, Hash 0-1, Hash 1-0, Hash 1-1 и Hash 0, Hash 1. В самом верху находится корневой хеш дерева Меркла (в нашем случае он называется Top Hash).
Древовидная структура корня Меркла помогает отследить расположение определенной транзакции и получить доступ к ее данным, как, например, время создания, объём, адрес отправителя и получателя и т.д.
Хеширование в сети Bitcoin
Говоря простым языком, Bitcoin майнинг — это поиск новых блоков, которые после нахождения добавляются в блокчейн. Этим и занимаются майнеры — они обеспечивают беспрерывный рост блокчейна. Для этого используются огромные вычислительные мощности — каждый майнер делает свой вклад в увеличение общего хешрейта (вычислительной мощности) сети Bitcoin. От показателя общего хешрейта зависит скорость проведения операции хеширования каждым майнером — чем выше общий хешрейт сети, тем больший объем вычислительной работы за меньшее количество времени должен сделать майнер.
Майнеры используют вычислительные ресурсы для решения загадки, зашифрованной в строке, которая представляет собой набор цифр, который всегда начинается с множества нулей (чем больше нулей, тем выше сложность сети). Они должны найти правильное число nonce, добавление которого сформирует правильную строку блока. Процесс подстановки nonce в строку длится до тех пор, пока не будет найдено верное решение. Иногда количество попыток может доходить до миллионов раз. Тот майнер, который первым найдет верное решение, добавляет блок в блокчейн и получает за это вознаграждение.
С математической точки зрения данный процесс описывается следующей формулой: H (k | x) = Y, в которой K — это nonce, x — хеш блока, а Y — текущая сложность сети. Процесс подбора nonce рандомный и основан на применении метода brute force. Поэтому майнинговое оборудование непрерывно генерирует рандомные сроки до тех пор, пока не будет найдено верное значение nonce. На данный момент майнеры имеют 10 минут на добавление каждого нового блока, что обеспечивает низкую вероятность возникновения коллизий и создания блоков-орфанов (потерянных блоков, которые не были добавлены в блокчейн, например, в том случае, когда nonce был найден почти одновременно несколькими майнерами или при попытке хакеров внести изменения в транзакции).
Хеширование играет решающую роль в майнинге, поскольку оно лежит в основе работы алгоритма Proof-of-Work, который используется в сети Bitcoin, Ethereum и многих других криптовалют. Хеширование обеспечивает безопасность и надежность системы, предохраняет ее от создания коллизий и возможного взлома. Без хеширования не существовало бы блокчейна, по крайней мере, в том виде, в котором мы его имеем сегодня.