Как выглядит биткойн-хеш
Обновлено: 21.11.2024
При добыче биткойнов используется функция подтверждения работы хэш-наличными; для алгоритма hashcash требуются следующие параметры: служебная строка, одноразовый номер и счетчик. В биткойне служебная строка закодирована в структуре данных заголовка блока и включает в себя поле версии, хэш предыдущего блока, корневой хеш дерева Меркла всех транзакций в блоке, текущее время и сложность. Биткойн хранит одноразовый номер в поле extraNonce, которое является частью транзакции coinbase, которая хранится как крайний левый листовой узел в дереве merkle (coinbase — это специальная первая транзакция в блоке). Параметр счетчика имеет размер 32 бита, поэтому каждый раз, когда он переносится, поле extraNonce должно увеличиваться (или иным образом изменяться), чтобы избежать повторения работы. Основы алгоритма hashcash довольно просты для понимания и более подробно описаны здесь. При майнинге биткойнов алгоритм hashcash многократно хеширует заголовок блока, увеличивая поля counter и extraNonce. Увеличение поля extraNonce влечет за собой пересчет дерева Меркла, поскольку транзакция coinbase является самым левым конечным узлом. Блок также время от времени обновляется по мере того, как вы над ним работаете.
Заголовок блока содержит следующие поля:
Поле | Назначение | Обновлено, когда. | Размер (в байтах) |
---|---|---|---|
Версия | Блокировать номер версии | Вы обновляете программное обеспечение, и оно указывает новую версию | 4 |
hashPrevBlock | 256-битный хэш заголовка предыдущего блока | Входит новый блок | 32 |
hashMerkleRoot | 256-битный хэш на основе всех транзакций в блоке | Транзакция принята | 32 |
Время | Временная метка текущего блока в секундах с 1970-01-01T00:00 UTC | Каждые несколько секунд | 4 |
Биты | Текущая цель в компактном формате | Сложность изменена | 4 |
Nonce | 32-битное число (начинается с 0) | Пробуен хэш (с шагом) | 4 |
Тело блока содержит транзакции. Они хэшируются только косвенно через корень Merkle. Поскольку транзакции не хэшируются напрямую, хеширование блока с 1 транзакцией требует столько же усилий, сколько и хеширование блока с 10 000 транзакций.
Компактный формат target представляет собой особый вид кодирования с плавающей запятой, в котором используется 3 байта мантиссы, начальный байт используется в качестве показателя (где используются только 5 младших битов) и его основание равно 256. Большинство этих полей будут одинаково для всех пользователей. Там могут быть некоторые незначительные различия в метках времени. Обычно одноразовый номер будет другим, но он увеличивается строго линейно. «Nonce» начинается с 0 и увеличивается для каждого хэша. Всякий раз, когда Nonce переполняется (что происходит часто), часть extraNonce транзакции генерации увеличивается, что изменяет корень Merkle.
Кроме того, крайне маловероятно, что два человека будут иметь один и тот же корень Merkle, потому что первая транзакция в вашем блоке — это генерация, «отправленная» на один из ваших уникальных биткойн-адресов. Поскольку ваш блок отличается от блоков всех остальных, вы (почти) гарантированно будете генерировать разные хэши. Каждый хэш, который вы вычисляете, имеет такие же шансы на победу, как и любой другой хэш, рассчитанный сетью.
Биткойн использует: SHA256(SHA256(Block_Header)) но вы должны быть осторожны с порядком байтов.
Например, этот код Python вычисляет хэш блока с наименьшим хэшем по состоянию на июнь 2011 г., блок 125552. Заголовок состоит из шести полей, описанных выше, объединенных вместе как значения с прямым порядком байтов в шестнадцатеричной записи:
Эндианство
Обратите внимание, что хэш, представляющий собой 256-битное число, имеет много начальных нулевых байтов при сохранении или печати в виде шестнадцатеричной константы с обратным порядком байтов, но при сохранении или печати с прямым порядком байтов у него есть завершающие нулевые байты. Например, если он интерпретируется как строка, а младший (или начало) адрес строки сохраняет младший значащий байт, это прямой порядок следования байтов.
Выходные данные blockexplorer отображают хэш-значения в виде чисел с обратным порядком байтов; запись для чисел обычная (начальные цифры - это самые значащие цифры, читаемые слева направо).
Для другого примера, вот версия на простом C без какой-либо оптимизации, многопоточности или проверки ошибок.
Джейк Франкенфилд — опытный писатель, освещающий широкий спектр тем деловых новостей. Его работы публиковались, в частности, в Investopedia и The New York Times. Он проделал обширную работу и исследования в области Facebook и сбора данных, Apple и пользовательского опыта, блокчейна и финансовых технологий, а также криптовалюты и будущего денег.
Амилкар Чаварриа — предприниматель в области финансовых технологий и блокчейна, обладающий более чем десятилетним опытом запуска компаний.Он преподает криптографию, блокчейн и финтех в Корнелле с 2019 года и в Массачусетском технологическом институте и Уортоне с 2021 года. Он консультирует правительства, финансовые учреждения, регулирующие органы и стартапы. Он также занимал руководящие должности в Goldman Sachs и BlackRock.
Скайлар Кларин — специалист по проверке фактов и специалист по личным финансам с обширным опытом, включая ветеринарные технологии и изучение фильмов.
Что такое хэш?
Хеш – это математическая функция, которая преобразует входные данные произвольной длины в зашифрованные выходные данные фиксированной длины. Таким образом, независимо от исходного объема данных или размера файла, его уникальный хэш всегда будет одного размера. Более того, хэши нельзя использовать для «реинжиниринга» входных данных из хешированных выходных данных, поскольку хеш-функции являются «односторонними» (как мясорубка: вы не можете положить говяжий фарш обратно в стейк). Тем не менее, если вы используете такую функцию для тех же данных, ее хеш будет идентичным, поэтому вы можете проверить, что данные те же (т. е. неизмененные), если вы уже знаете их хеш.
Хеширование также необходимо для управления блокчейном в криптовалюте.
Ключевые выводы
- Хеш — это функция, отвечающая зашифрованным требованиям, необходимым для решения вычислений в блокчейне.
- Хэши имеют фиксированную длину, поскольку практически невозможно угадать длину хэша, если кто-то пытается взломать блокчейн.
- Одни и те же данные всегда будут давать одно и то же хеш-значение.
- Хэш, как одноразовый номер или решение, является основой сети блокчейна.
- Хеш создается на основе информации, содержащейся в заголовке блока.
Как работают хэши
Обычные хеш-функции принимают входные данные переменной длины для возврата выходных данных фиксированной длины. Криптографическая хэш-функция сочетает в себе возможности передачи сообщений хеш-функции со свойствами безопасности.
Хеш-функции – это структуры данных, которые обычно используются в вычислительных системах для таких задач, как проверка целостности сообщений и аутентификация информации. Хотя они считаются криптографически «слабыми», поскольку могут быть решены за полиномиальное время, их нелегко расшифровать.
Криптографические хеш-функции добавляют функции безопасности к обычным хеш-функциям, что затрудняет обнаружение содержимого сообщения или информации о получателях и отправителях.
В частности, криптографические хеш-функции обладают следующими тремя свойствами:
- Они не допускают столкновений. Это означает, что никакие два входных хэша не должны сопоставляться с одним и тем же выходным хэшем.
- Их можно скрыть. Должно быть трудно угадать входное значение хеш-функции по ее выходным данным.
- Они должны подходить для головоломок. Должно быть сложно выбрать вход, который обеспечивает предопределенный выход. Таким образом, входные данные должны быть выбраны из как можно более широкого распределения.
Из-за особенностей хэшей они широко используются в онлайн-безопасности — от защиты паролей до обнаружения утечек данных и проверки целостности загруженного файла.
Хеширование и криптовалюты
Основой криптовалюты является блокчейн, представляющий собой глобальную книгу, образованную путем связывания отдельных блоков данных транзакций. Блокчейн содержит только проверенные транзакции, что предотвращает мошеннические транзакции и двойное расходование валюты. Полученное зашифрованное значение представляет собой ряд цифр и букв, которые не похожи на исходные данные и называются хешем. Майнинг криптовалют предполагает работу с этим хешем.
Хеширование требует обработки данных из блока с помощью математической функции, что приводит к выходным данным фиксированной длины. Использование выходных данных фиксированной длины повышает безопасность, поскольку любой, кто пытается расшифровать хэш, не сможет определить, насколько длинным или коротким является ввод, просто взглянув на длину выходных данных.
Расчет хэша начинается с данных, доступных в заголовке блока, и по сути представляет собой решение сложной математической задачи. Заголовок каждого блока содержит номер версии, метку времени, хэш, использованный в предыдущем блоке, хэш корня Merkle, одноразовый номер и целевой хеш.
Майнер сосредотачивается на одноразовом номере, строке чисел. Это число добавляется к хешированному содержимому предыдущего блока, которое затем хэшируется. Если этот новый хэш меньше или равен целевому хешу, то он принимается в качестве решения, майнер получает вознаграждение, и блок добавляется в цепочку блоков.
Процесс проверки транзакций в блокчейне основан на шифровании данных с использованием алгоритмического хеширования.
Особые соображения
Расчет хэша требует от майнера определить, какую строку использовать в качестве одноразового номера, что само по себе требует значительного количества проб и ошибок. Это связано с тем, что одноразовый номер представляет собой случайную строку.Крайне маловероятно, что майнер успешно найдет правильный одноразовый номер с первой попытки, а это означает, что майнер потенциально может протестировать большое количество вариантов одноразового номера, прежде чем получить его правильно. Чем выше сложность (показатель того, насколько сложно создать хэш, отвечающий требованиям целевого хэша), тем больше времени может потребоваться для создания решения.
Пример хеша
Хеширование слова "привет" приведет к получению вывода той же длины, что и хэш для "Я иду в магазин". Функция, используемая для генерации хэша, является детерминированной, что означает, что она будет давать один и тот же результат каждый раз, когда используется один и тот же ввод. Он может эффективно генерировать хэшированный ввод; это также усложняет определение входных данных (что приводит к майнингу), а небольшие изменения во входных данных приводят к неузнаваемому, совершенно другому хешу.
Обработка хэш-функций, необходимых для шифрования новых блоков, требует значительной вычислительной мощности компьютера, что может быть дорогостоящим. Чтобы побудить отдельных лиц и компании, называемые майнерами, инвестировать в необходимые технологии, криптовалютные сети вознаграждают их как новыми токенами криптовалюты, так и комиссией за транзакцию. Майнеры получают компенсацию только в том случае, если они первыми создают хэш, соответствующий требованиям, указанным в целевом хеше.
Часто задаваемые вопросы
Что такое хэш-функция?
Хеш-функции – это математические функции, которые преобразуют или "отображают" заданный набор данных в битовую строку фиксированного размера, известную также как "хэш-значение".
Как рассчитывается хеш-значение?
Хэш-функция использует сложные математические алгоритмы, которые преобразуют данные произвольной длины в данные фиксированной длины (например, 256 символов). Если вы измените один бит где-либо в исходных данных, изменится все значение хеш-функции, что делает его полезным для проверки точности цифровых файлов и других данных.
Для чего в блокчейнах используются хэши?
Хэши используются в нескольких частях системы блокчейн. Во-первых, каждый блок содержит хэш заголовка предыдущего блока, что гарантирует, что при добавлении новых блоков ничего не было изменено. Кроме того, майнинг криптовалюты с использованием доказательства работы (PoW) использует хэширование случайно сгенерированных чисел для получения определенного хэш-значения, содержащего серию ведущих нулей. Эта произвольная функция требует больших ресурсов, что затрудняет захват сети злоумышленником.
Все, что вы всегда хотели знать о хешировании биткойнов, но боялись спросить.
19 февраля 2017 г., 12:35. Всемирное координированное время
Любой, кто интересуется биткойнами, когда-либо слышал фразу "криптографическая хэш-функция". Но что именно это означает и как это связано с криптовалютой?
Хэш-функции – важная часть не только протокола биткойн, но и информационной безопасности в целом.
В следующей статье мы рассмотрим несколько простых примеров их работы, а также простую демонстрацию.
Что такое хеш-функция?
Говоря абстрактно, хеш-функция — это математический процесс, который принимает входные данные любого размера, выполняет над ними операцию и возвращает выходные данные фиксированного размера.
В более конкретном примере это можно использовать для получения в качестве входных данных последовательности букв любой длины, которую мы называем строкой, и возврата последовательности букв фиксированной длины. Независимо от того, является ли входная строка одной буквой, словом, предложением или целым романом, выходные данные, называемые дайджестом, всегда будут одинаковой длины.
Хеш-функция такого типа обычно используется для хранения паролей.
Когда вы создаете учетную запись пользователя в любой веб-службе, для которой требуется пароль, пароль проходит через хэш-функцию, и хеш-дайджест сообщения сохраняется. Когда вы вводите свой пароль для входа в систему, та же хеш-функция запускается для введенного вами слова, и сервер проверяет, соответствует ли результат сохраненному дайджесту.
Это означает, что если хакер сможет получить доступ к базе данных, содержащей сохраненные хэши, он не сможет немедленно скомпрометировать все учетные записи пользователей, потому что нет простого способа найти пароль, который создал любой заданный хэш.
Простые хеш-функции в Python
Вы можете поэкспериментировать со значениями хэша, используя Python, язык программирования, установленный по умолчанию в операционных системах Mac и Linux. (В этом руководстве предполагается, что вы используете какую-либо версию OS X или Linux, поскольку использование Python в Windows более сложно.)
Сначала откройте терминал, введите python и нажмите ENTER.
Это перенесет вас в Python REPL, среду, в которой вы можете опробовать команды Python напрямую, а не писать программу в отдельном файле.
Затем введите следующее, нажимая клавишу ВВОД после каждой строки и клавишу TAB там, где отмечено:
Теперь вы создали функцию hash() , которая будет вычислять и распечатывать хеш-значение для заданной строки, используя алгоритм хеширования MD5. Чтобы запустить его, поместите строку между круглыми скобками в кавычки, например:
И нажмите ENTER, чтобы увидеть хеш-дайджест этой строки.
Вы увидите, что вызов хеш-функции для одной и той же строки всегда будет генерировать один и тот же хэш, но добавление или изменение одного символа будет генерировать совершенно другое хеш-значение:
Хэш-функции в биткойнах
В протоколе биткойн хеш-функции являются частью алгоритма хеширования блоков, который используется для записи новых транзакций в блокчейн в процессе майнинга.
В майнинге биткойнов входными данными для функции являются все самые последние, еще не подтвержденные транзакции (наряду с некоторыми дополнительными входными данными, относящимися к метке времени и ссылке на предыдущий блок).
В приведенном выше примере кода мы уже видели, что изменение небольшой части входных данных для хэш-функции приводит к совершенно другому результату. Это свойство имеет решающее значение для алгоритма «доказательства работы», используемого в майнинге: чтобы успешно «решить» блок, майнеры пытаются объединить все входные данные со своей собственной произвольной частью входных данных таким образом, чтобы результирующий хеш начинался с определенное количество нулей.
В качестве базовой демонстрации мы могли бы попробовать «майнинг» с помощью нашей хэш-функции Python, вручную добавив восклицательные знаки после «CoinDesk рулит!» пока не найдем хэш, начинающийся с одного нуля.
Конечно, вычисление хэша для биткойн-блока, который на момент написания должен начинаться с 18 нулей, требует чрезвычайно большого объема вычислений (и поэтому совокупная вычислительная мощность всех компьютерам в сети по-прежнему требуется около 10 минут для решения блока).
Потребность в такой большой вычислительной мощности означает, что новые биткойны добываются в течение длительного периода времени, а не сразу.
Чтобы заработать биткойны с помощью майнинга, вам нужно проделать огромный объем работы, необходимый для решения блока, и, зарабатывая это вознаграждение, вы фиксируете все новые транзакции в блоке, который добавляется в постоянную запись всех предыдущих транзакций: блокчейн.
Лидер в области новостей и информации о криптовалютах, цифровых активах и будущем денег, CoinDesk — это средство массовой информации, которое стремится соответствовать самым высоким журналистским стандартам и соблюдает строгий набор редакционных правил. CoinDesk — независимая операционная дочерняя компания Digital Currency Group, которая инвестирует в криптовалюты и блокчейн-стартапы. В рамках вознаграждения некоторые сотрудники CoinDesk, в том числе сотрудники редакции, могут получить доступ к капиталу DCG в виде прав на прирост стоимости акций, которые передаются в течение нескольких лет. Журналистам CoinDesk не разрешается напрямую покупать акции DCG.
Подпишитесь на наш ежедневный информационный бюллетень First Mover, в котором рассказывается о последних изменениях на криптовалютных рынках.
Зарегистрировавшись, вы будете получать электронные письма об обновлениях продуктов CoinDesk, мероприятиях и маркетинге, и вы соглашаетесь с нашими условиями обслуживания и политикой конфиденциальности.
Криптографические хеш-функции генерируют строку символов фиксированной длины из записей данных любой длины. Запись данных может быть словом, предложением, более длинным текстом или целым файлом.
- Криптографическая хэш-функция используется в целях безопасности и составляет основу криптозащиты.
- Хеш-функция превращает случайный ввод данных (ключей) в строку байтов с фиксированной длиной и структурой (хэш-значение).
- Хэш транзакции позволяет легко идентифицировать транзакции в блокчейне.
В этом уроке вы подробно узнаете о хеш-функциях.
Что такое хэш-функция?
Как вы узнали из урока 6 промежуточного раздела Академии Bitpanda, сеть Биткойн зависит от набора правил, называемого алгоритмом консенсуса Proof of Work. Этот алгоритм консенсуса представляет собой набор правил, которые управляют сетью блокчейн. Помимо криптовалют, хеш-функции чаще всего используются для хранения паролей.
Давайте вернемся к самым основам. Математическая функция используется для иллюстрации выражения или отношения, включающего одну или несколько переменных или наборов. Следовательно, функция связывает вход с выходом.
Примером этого может быть размер и цена гамбургеров в ресторане.
Стоимость бургера определяется его размером.
Поэтому в данном случае стоимость зависит от размера.
Допустим, вы можете купить маленькие, средние и большие гамбургеры, и их стоимость составляет 1,50, 2,50 и 3,50 доллара США соответственно.
Введите размер гамбургера.
Выход — это стоимость бургера.
Хеш-функция превращает ввод (например, текст) в строку байтов фиксированной длины и структуры. Результат или созданное значение называется «хеш-значением» или «контрольной суммой». Любое хэш-значение, созданное из данных с использованием определенного алгоритма хеширования, всегда имеет одинаковую длину и является однонаправленным — его нельзя обратить.
Готовы получить свой крипто-значок? Проверьте свои знания здесь
Термин "хэш-функция" происходит от французского слова "hacher", что означает "разбивать на мелкие кусочки". Это указывает на то, что хеш-функция предназначена для "разбивания" данных. Другой тип структуры данных, хэш-таблица, часто используется для быстрого обнаружения любых двух идентичных хэшей (значений хэшей).
После того, как Диффи и Хеллман впервые определили необходимость однонаправленной хеш-функции в своей основополагающей статье 1976 года по криптографии с открытым ключом, в течение следующих двух десятилетий развитие криптографии быстро развивалось. В 1990 году криптограф и профессор Массачусетского технологического института Рональд Ривест изобрел хеш-функцию MD4, а затем функции MD5 и MD6. В 1995 году АНБ (Агентство национальной безопасности) разработало алгоритм SHA-1 (Secure Hash Algorithm 1) на основе разработки Ривеста, за которым последовало обновление SHA-2 в 2001 году. в качестве основы алгоритма консенсуса Биткойн.
Назначение хеш-функций
Хэш-функции возникли из-за необходимости сделать содержимое одинаковым по длине, с одной стороны, и для использования в качестве уникальных идентификаторов, с другой. Типичные варианты использования хеш-функций вне сферы криптовалюты включают:
- Вычисление (короткой) контрольной суммы для объекта, например контрольной суммы для ISBN (международного стандартного номера книги)
- Идентификация любого контента почти без двусмысленности, но все же «кратко», не раскрывая ничего о контенте в криптографических приложениях
Свойства хеш-функций
Криптографическая хеш-функция должна быть эффективной с точки зрения вычислений, то есть она должна быстро создавать хэш-значение. Он должен быть детерминированным — каждый раз, когда вы вводите определенный ввод, он должен производить один и тот же вывод и быть устойчивым к прообразу, что означает, что он не может раскрывать какую-либо информацию о вводе в выводе.
Наконец, хэш-функция должна быть устойчивой к коллизиям, что гарантирует невозможность получения одинаковых выходных данных двумя разными входными данными. Это детерминированная функция, устойчивость к прообразу и устойчивость к коллизиям, которые составляют три наиболее важных свойства хеш-функций в процессе майнинга биткойнов.
Хеш-функция должна быть устойчивой к коллизиям, что гарантирует невозможность получения одинаковых выходных данных двумя разными входными данными.
Хэш-функции в процессе майнинга
При повторном быстром прохождении процесса проверки в сети Биткойн блок объединяется и содержит несколько транзакций, а также информацию о предыдущем блоке. Это означает, что если кто-то захочет изменить реестр или дважды потратить транзакцию, ему или ей придется изменить хэш во всех предыдущих блоках.
Чтобы связанный блок был добавлен в цепочку блоков, майнерам необходимо найти хеш, соответствующий целевой сложности. Каждый блок содержит заголовок блока с номером блока, хэш предыдущего блока и «одноразовый номер», включающий отметку времени. Назначение одноразового номера — изменение входных данных для криптографической хэш-функции, то есть увеличение случайности вычислений в процессе майнинга.
Решение хеша
Затем узел начинает «хешировать» данные, преобразовывая их в хэш-значение или «хэш», который всегда должен содержать определенное количество нулей. Узел проверяет, соответствует ли хеш критериям сложности. Хэш должен начинаться с правильного количества нулей. Если хэш соответствует критериям сложности, он передается другим майнерам в сети. Первый майнер, который найдет действительный хэш, проверяет блок на новый блок и получает вознаграждение за блок и комиссию в биткойнах.
Если хэш не соответствует критериям сетевой сложности, выбирается и хэшируется другой одноразовый номер. Майнерам, вероятно, придется генерировать много хэшей с большим количеством одноразовых номеров, пока они не найдут одноразовый номер, отвечающий трудностям. Это повторяющийся и энергоемкий процесс, известный как майнинг биткойнов, который требует большой вычислительной мощности.
Хеш-функции составляют основу процесса Proof-of-Work. Без подтверждения и производства хеш-транзакций блокчейн не будет защищенным от несанкционированного доступа и неизменным, и будет невозможно доказать, кто и в какое время владел какой суммой биткойнов.
По мере того, как Биткойн приближается к массовому внедрению и признанию, его фундаментальная модель безопасности, характеризуемая майнингом, становится все более и более тщательной с каждым днем.
Люди все больше обеспокоены и интересуются воздействием майнинга биткойнов на окружающую среду, безопасностью и степенью децентрализации базовой модели и даже потенциальным влиянием прорыва в области квантовых вычислений на будущее биткойнов и других криптовалют. р>
Часто доказательство работы описывается как "криптографическая головоломка", но что это за головоломка на самом деле?
Чтобы по-настоящему понять эти вопросы (и любые возможные ответы), вам необходимо иметь фундаментальное представление о майнинге биткойнов и его эволюции.
В этой статье будут рассмотрены все технические компоненты и движущиеся части доказательства работы, а также то, как они легко синхронизируются друг с другом, чтобы сделать Биткойн децентрализованной платформой, какой она является сегодня.
Почему майнинг работает: криптографическое одностороннее хеширование
Блокчейн Биткойн часто описывается как база данных, которая является криптографически безопасной и, следовательно, неизменной. В основе этой неизменности и безопасности лежит технология криптографического хеширования.
Криптографическая хеш-функция – это математическая функция, которая, проще говоря, принимает любые входные данные и сопоставляет их со строкой фиксированного размера.
- Детерминированный — для любого ввода в криптографическую хэш-функцию результирующий вывод всегда будет одним и тем же.
- Быстро. Вычисление выходных данных хэш-функции при любых входных данных является относительно быстрым процессом (не требует сложных вычислений).
- Уникальный — каждый вход в функцию должен давать совершенно случайный и уникальный результат (другими словами, никакие два входа не приводят к одному и тому же результату).
- Необратимый — при наличии выходных данных хэш-функции невозможно получить исходные входные данные.
Эти правила обеспечивают основу, которая позволяет майнингу биткойнов защищать сеть.
В частности, создатель протокола биткойнов Сатоши Накомото решил использовать хеш-функцию SHA-256 в качестве основы для майнинга биткойнов. Это особая криптографическая хеш-функция, обладающая указанными выше свойствами математически доказана. Он всегда выводит 256-битное число (самая основная единица вычислений), которое обычно представляется в шестнадцатеричной системе счисления с 64 символами для удобочитаемости.
Вывод функции SHA-256 обычно называется хэшем ее ввода.
Ввод хеш-функции дает совершенно уникальный результат
Вот пример ввода и вывода функции SHA-256 (вы можете попробовать сами здесь):
Интересно, что в большинстве мест, где используется хеширование в протоколе Биткойн, используется двойное хеширование. Это означает, что вывод исходной функции SHA-256 затем помещается обратно в функцию SHA-256 для получения другого вывода. Вот как выглядит этот процесс:
Двойное хеширование используется для защиты от атак дней рождения. Атака дня рождения — это сценарий, в котором злоумышленник может создать тот же хэш, что и другой ввод, используя совершенно другой ввод (называемый коллизией). Это нарушает третье свойство уникальности. Без него два совершенно разных блока биткойнов могут быть представлены одним и тем же хэшем, что позволяет злоумышленникам потенциально переключать блоки.
С функцией SHA-256 вероятность такой атаки бесконечно мала. Если бы это не было почти невозможно, SHA-256 считался бы неработающим.
Однако другие хэш-функции в прошлом были "сломанными". Чтобы предотвратить это в будущем с SHA-256 (и эффективно нарушить модель безопасности Биткойн), лучше всего хешировать хэш. Это снижает вдвое вероятность возникновения коллизии, делая протокол намного более безопасным.
На очень высоком уровне майнинг биткойнов — это система, в которой все транзакции биткойнов отправляются майнерам биткойнов. Майнеры выбирают транзакции объемом в один мегабайт, связывают их в качестве входных данных с функцией SHA-256 и пытаются найти конкретный выход, который принимает сеть. Первый майнер, который найдет этот выход и опубликует блок в сети, получает вознаграждение в виде комиссии за транзакцию и создания нового биткойна.
Давайте сделаем еще один шаг и углубимся в саму цепочку биткойнов, чтобы увидеть, что именно делают майнеры для обеспечения безопасности сети.
Майнинг биткойнов: техническое введение
Майнинг был представлен как решение проблемы двойной траты. Если у меня есть 1 биткойн, и я отправлю его Бобу, а затем попытаюсь отправить тот же биткойн Алисе, сеть гарантирует, что будет принята только одна транзакция. Это достигается с помощью хорошо известного процесса, называемого майнингом.
Прежде чем углубляться в технические подробности, важно понять, почему майнинг необходим для защиты сети. Поскольку фиатная валюта существует сейчас, валюта, которой мы владеем, создается и проверяется федеральным резервом. Поскольку Биткойн работает в соответствии с жесткими принципами децентрализации и консенсуса, не может существовать центральный орган, который бы проверял и устанавливал отметки времени выпуска этой валюты и валидации любых транзакций, которые происходят с этой валютой.
Сатоши Накамото предложил единственное известное на тот момент решение этой проблемы проверки в системе, ориентированной на консенсус. Эта схема, названная в официальном документе Биткойн как доказательство работы, элегантно оправдывает то, что транзакции проверяются теми, кто готов потратить на это достаточно физической вычислительной энергии и времени, одновременно вводя стимул для стимулирования рыночной конкуренции. Эта конкуренция позволяет свойству децентрализации проявляться и органично развиваться в рамках экосистемы.
Взгляд внутрь блока
Блок Биткойн состоит в основном из двух компонентов:
1. Транзакции в виде дерева Меркле
Компьютеры для майнинга собирают достаточно транзакций, чтобы заполнить блок и объединить их в дерево Меркле.
Дерево Меркла — относительно простая концепция: транзакции лежат в нижней части дерева в виде листьев и хешируются с помощью функции SHA-256. Комбинация двух листовых транзакций снова хэшируется с использованием функции SHA-256 для формирования родителя листьев. Этот родитель непрерывно хешируется вверх в сочетании с другими родителями хешированных транзакций, пока не будет создан единственный корень. Хэш этого корня фактически является уникальным представлением транзакций, находящихся под ним.
Визуализация того, как строится дерево Меркла — листья в самом низу дерева — это транзакции
Корень дерева Меркла представляет собой комбинацию хэшей всех транзакций в дереве.
Напоминаем, что для любых входных данных хеш-функции выходные данные полностью уникальны. Поэтому, как только большинство узлов в сети получают добытый блок, корень хэш-дерева Меркла действует как неизменная сводка всех транзакций в данном блоке.
Если злоумышленник попытается изменить содержимое транзакции в блоке, его хэш будет изменен. Это изменение хэша будет распространяться вверх по дереву меркла транзакции до тех пор, пока не будет изменен хэш корня. Затем любой узел может быстро обнаружить это злонамеренное действие, сравнив корень дерева Меркла измененного блока с корнем дерева Меркла действительного блока.
2. Заголовок блока
Заголовок блока представляет собой сводку содержимого самого блока. Он содержит следующие шесть компонентов:
- Версия программного обеспечения, на котором работает биткойн-клиент.
- Временная метка блока
- Корень дерева Меркла, содержащего транзакции.
- Хеш блока перед ним
- Ононс
- Цель
Помните, что корень дерева меркле транзакций действует как эффективная сводка каждой транзакции в блоке без необходимости просматривать каждую транзакцию.
Хеш предыдущего блока позволяет сети правильно разместить блок в хронологическом порядке. Именно отсюда происходит термин «блокчейн» — каждый блок связан с предыдущим блоком.
Ононс и цель — это то, что делает майнинг активным. Они являются основой для решения головоломки SHA-256, которую должны решить майнеры.
Обратите внимание, что все эти данные в заголовке блока сжаты до 80 байтов с использованием нотации, называемой прямым порядком байтов, что делает передачу заголовков блоков между узлами тривиально эффективным процессом. В целях этого объяснения мы проигнорируем это сжатие и будем считать, что данные находятся в исходной форме.
Объяснение проблемы майнинга
Цель, хранящаяся в заголовке блока, представляет собой просто числовое значение, хранящееся в битах. В традиционной системе счисления с основанием 10 эта цель находится в диапазоне от 0 до 2²²⁴ (число, состоящее из 67 и более цифр), в зависимости от того, сколько майнеров соревнуются за решение этой задачи одновременно.
Напоминаем, что результат SHA-256 — это просто число. Цель майнера — взять заголовок текущего блока, добавить к нему случайное число, называемое одноразовым номером, и вычислить его хэш. Это числовое значение хеша должно быть меньше целевого значения.
На этом все.Но это гораздо легче сказать, чем сделать.
Вспомните первое свойство SHA-256: ввод в хеш-функцию всегда приводит к одному и тому же результату. Следовательно, если майнер взял заголовок блока, хешировал его и понял, что значение хеш-функции не меньше целевого, ему пришлось бы каким-то образом изменить ввод, чтобы попытаться найти хэш ниже целевого значения.
Здесь появляется одноразовый номер.
Майнер добавляет число (начиная с 0), называемое одноразовым номером, в заголовок блока и хеширует это значение. Если значение хеш-функции не меньше целевого, майнер увеличит одноразовый номер на 1, снова добавит его в заголовок блока и хэширует это измененное значение. Этот процесс повторяется непрерывно, пока не будет найден хэш меньше целевого значения.
Пример майнинга
Вот примерное представление о том, что составляло заголовок первого блока:
- Корень транзакции в блоке Genesis:
- Первая известная версия Биткойн: 0.1.0
- Временная метка блока: 2009–01–03 18:15:05
- Цель (это также самая высокая цель, которая когда-либо была):
- Нет предыдущего хэша блока — это был первый блок, так что это уникальный случай
Последний заголовок блока после объединения его компонентов:
Данные блока Genesis (включая одноразовый номер, но давайте притворимся, что это не так), источник: bitcointalk
Давайте возьмем этот большой заголовок и вычислим двойной хеш:
И целевой, и выходной хэш представляют собой невероятно большие числа при преобразовании в 10-кратную (помните, длина более 67 цифр). Вместо того, чтобы пытаться продемонстрировать сравнение двух здесь, следующая функция Python обрабатывает сравнение:
True возвращается, если хэш меньше целевого значения, иначе false.
Вот результат с нашей целью и хешем блока:
Теперь мы берем исходное шестнадцатеричное значение блока и добавляем к нему 1. Вот следующий результат:
Обратите внимание, что самая последняя цифра теперь равна 1 из-за добавления одноразового номера
Затем мы запускаем тот же алгоритм хеширования и сравниваем эти измененные данные. Если это не ниже цели, продолжайте повторять.
После того, как найден успешный хэш, последний одноразовый номер, использованный для поиска этого решения, сохраняется в блоке.
Это означает, что Сатоши Накомото повторил этот процесс более 2 миллиардов раз, прежде чем нашел приемлемый хэш.
Я написал небольшую реализацию этого процесса добычи блоков Genesis на Python, которую можно найти на моем GitHub.
Посмотрите, сколько времени вам потребуется, чтобы успешно добыть блок Genesis!
Осторожно: extraNonce
Значение nonce в заголовке блока сохраняется как 32-битное число. Это означает, что максимальный одноразовый номер, который кто-либо может получить, равен 2³² (приблизительно 4 миллиарда). После 4 миллиардов итераций одноразовый номер исчерпывается, и если решение не найдено, майнеры снова застревают.
Решение этой проблемы состоит в том, чтобы добавить поле в базу монет (содержимое транзакции блока, хранящееся в виде дерева Меркла), которое называется extraNonce. Размер этого extraNonce ограничен только размером самого блока, поэтому он может быть настолько большим, насколько этого хотят майнеры, если размер блока находится в пределах ограничений протокола.
Если все 4 миллиарда возможных значений nonce исчерпаны, дополнительный Nonce добавляется и увеличивается в coinbase. Вычисляется новый корень меркла и впоследствии новый заголовок блока, и одноразовый номер повторяется еще раз. Этот процесс повторяется до тех пор, пока не будет найден достаточный хэш.
Лучше не добавлять extraNonce до тех пор, пока одноразовый номер не будет исчерпан, потому что любое изменение extraNonce изменяет дерево меркла. Это требует дополнительных вычислений, чтобы распространять изменение вверх, пока не будет вычислен новый корень дерева Меркла.
Награда майнера
Майнер, который успешно опубликует блок быстрее всех, получает новый биткойн, созданный из воздуха. Эта награда в настоящее время составляет 12,5 BTC. Как же появляются эти биткойны?
Каждый майнер просто добавляет в свой блок новую выходную транзакцию, которая присваивает себе 12,5 биткойнов, прежде чем начать добычу блока. Сетевой протокол примет эту специальную транзакцию как действительную после получения вновь проверенного блока. Эта специальная транзакция называется транзакцией генерации.
Майнер обязан добавить эту транзакцию в блок перед ее майнингом. Был как минимум один случай, когда майнеры забыли добавить вознаграждение к транзакции перед добычей блока, что фактически уничтожило 12,5 BTC!
Проверка подтверждения работы
Допустим, наш майнер нашел хэш меньше целевого. Все, что нужно сделать этому майнеру, — это опубликовать добытый блок с исходными шестью компонентами на любых подключенных узлах.
Этот узел, получающий блок, сначала проверит набор транзакций, чтобы убедиться, что все транзакции действительны (например, все транзакции правильно подписаны, а монеты не тратятся дважды и/или не создаются из воздуха).
Затем он просто дважды хэширует заголовок блока и гарантирует, что значение ниже включенного целевого значения блока. Как только блок считается действительным, новый узел будет продолжать распространять этот блок по сети до тех пор, пока каждый узел не получит актуальную книгу.
Как видите, недавно опубликованные блоки могут быть легко проверены любым заданным узлом. Однако публикация действительного блока в сети требует невероятно большой вычислительной мощности (таким образом, электроэнергии и времени). Именно эта асимметрия позволяет обеспечить безопасность сети и в то же время позволяет лицам, желающим осуществлять экономическую деятельность в сети, делать это относительно беспрепятственно.
Время блокировки и корректировка цели
Когда первые майнеры начали добычу, каждый из них контролировал время блока. Каждый биткойн-блок имеет установленное время блокировки 10 минут. Это означает, что при текущем уровне вычислительной мощности (сетевого хешрейта) в сети узлы всегда будут ожидать, что новые проверенные блоки будут создаваться в среднем каждые 10 минут.
Разумно ожидать, что блоки будут созданы в течение 10 минут, поскольку известна вероятность нахождения блока с учетом хешрейта сети.
Например, возьмем самую простую цель, которая когда-либо существовала в биткойнах: генезисный блок. Вероятность того, что любой отдельный хеш окажется меньше самой простой цели, составляет 1 к 2³². Это один из четырех миллиардов. Следовательно, мы можем разумно ожидать, что кто-то запустит 2³² итерации задачи майнинга, чтобы найти правильный хэш. Узлы в сети ожидали, что четыре миллиарда таких итераций будут выполняться всеми майнерами в сети каждые 10 минут.
Если при большом размере выборки блоков блоки начинают появляться быстрее, чем за 10 минут, это явный признак того, что узлы в сети обрабатывают четыре миллиарда хэшей гораздо быстрее, чем за 10 минут. Эта ситуация побуждает каждый узел пропорционально корректировать цель в зависимости от увеличения (или уменьшения) мощности сети, чтобы гарантировать, что блоки продолжают создаваться каждые 10 минут.
На самом деле узлы в сети отслеживают время блока в 2016 блоках, что составляет ровно две недели. Каждые две недели общее время блокировки сравнивается с ожидаемым временем блокировки (которое составляет 20 160 минут).
Чтобы получить новую цель, просто умножьте существующую цель на отношение общего фактического времени блокировки за последние две недели, чтобы получить ожидаемое время блокировки. Это скорректирует цель пропорционально количеству входящей или выходящей вычислительной мощности в сети.
Формула для расчета новой цели, запускаемая каждые 20 160 минут (две недели) каждым узлом Биткойн
Время блока и возможность легко рассчитать вероятность нахождения допустимого блока позволяют узлам легко отслеживать и определять общую мощность хэширования в сети и настраивать сеть. Независимо от того, сколько вычислительной мощности добавляется в сеть или как быстро она добавляется, в среднем время блокировки всегда будет оставаться на уровне 10 минут.
Текущий общий хешрейт в сети составляет 28,27 экзахэша в секунду. Это 28,27 x 10¹⁸ хэшей, которые выполняются каждую секунду на всех компьютерах в сети.
Вкратце
Теперь мы всесторонне рассмотрели следующее:
- Почему криптографическое одностороннее хеширование жизненно важно для доказательства работы
- Разбивка построения блока биткойнов
- Фактический процесс майнинга и сама итерация
- Как узлы могут легко проверять другие блоки
- Как сети удается поддерживать алгоритм и конкурентоспособность, отслеживая время блокировки и корректируя цель.
Теперь вы сможете понять и объяснить, как на самом деле работает доказательство работы и почему он считается полностью безопасным алгоритмом, обеспечивающим децентрализацию и консенсус!
Подпишитесь на меня в Twitter и Medium, если вы заинтересованы в более подробных и информативных статьях, подобных этим, в будущем!
Читайте также: