В первой части статьи были представлены некоторые из проблем, с которыми сталкиваются обычные люди в стремлении понять, что же на самом деле такое биткоин и как он работает. Кроме того мы в обобщенном виде рассмотрели стратегическую роль модели программного обеспечения с открытым исходным кодом, p2p сети и цифровых подписей.
Во второй части рассматривается процесс хеширования и то, какую существенную роль он играет в технической структуре биткоина. Также обсудим, как вся система была задумана и создана таким образом, чтобы стать самофинансируемой с самого своего начала и на неограниченное время.
Создание хеша
Хеширование играет совершенно отличную роль от цифровых подписей. Этот процесс доказывает, что сообщение не было изменено. Выполнение процедуры создания хеша от одного и того же сообщения всегда дает один и тот же результат. Если хеш не соответствует предыдущему, это является предупреждением, что нынешняя версия сообщения не соответствует оригиналу. Для иллюстрации приведем сообщение от Мюррея Ротбарда. Он написал:
«It must be reiterated here that value scales do not exist in a void apart from the concrete choices of action». —Murray Rothbard, 1962 (перевод: «Необходимо повторить, что не существует никакой ценностной шкалы в пустоте, кроме конкретных вариантов действий» — Мюррей Ротбанд, 1962 год)
Полученный по алгоритму SHA256 (такой же используется и в биткоин) хеш будет выглядеть так:
68ea16d5ddbbd5c9129710e4c816bebe83c8cf7d52647416302d590290ce2ba8
Любое сообщение любого размера может пройти через хеш-функцию. Алгоритм разбивает его, смешивает части и делает это до тех пор, пока итоговый результат не станет фиксированной длины, который в соответствии с алгоритмом SHA256 принимает форму, показанную выше. Для каждого другого сообщения будет свой собственный хеш.
Есть некоторые критические свойства хорошего хеш-алгоритма. Во-первых, одно и то же сообщение производит один и тот же цифровой вид, который был изначально. Во-вторых, он работает только в одном направлении. Даже мельчайшие изменения в оригинальном сообщении кардинально изменят хеш, без какой-либо взаимосвязи между входным сообщением и результатом на выходе. Это называется «лавинный эффект». В-третьих, шансы получения такого цифрового вида от измененного сообщения являются ничтожными. Это называется «устойчивость к коллизиям». Невозможно создать измененное сообщение, которое бы создавало в точности такой же цифровой вид, как и оригинальное.
Чтобы продемонстрировать эти эффекты, ниже приведен хеш того же самого сообщения, в котором всего лишь убраны кавычки.
It must be reiterated here that value scales do not exist in a void apart from the concrete choices of action. —Murray Rothbard, 1962
Измененное сообщение выдает такую хеш-функцию:
0a7a163d989cf1987e1025d859ce797e060f939e2c9505b54b33fe25a9e860ff
Сравните ее с предыдущим результатом:
68ea16d5ddbbd5c9129710e4c816bebe83c8cf7d52647416302d590290ce2ba8
Минимальное изменение в оригинальном сообщении – удаление всего двух кавычек – привело к совершенно другому результату, который не имеет никакого отношения к «правильному» хешу. В итоге, хеш дает быстрый ответ «да» или «нет» на один ключевой вопрос: является ли сообщение по-прежнему оригинальным и не менялось ли оно? Если сообщение отличается, хеш не сможет отобразить, насколько оно было изменено, он лишь констатирует, изменялось ли оно вообще или нет.
Казалось бы, в чем польза от этого? Биткоин является приложением, в котором хеширование оказалось действительно крайне полезным. В биткоин хеширование является краеугольным камнем и делает невозможным изменение транзакций и записей о них. Как только хеши сгенерированы внутри блокчейна, далее их подделка невозможна.
Транзакции и как майнеры конкурируют за поиск новых блоков
Биткоин-кошельки используются для создания транзакций. Они включают в себя сумму, которая будет отправлена, адреса отправителя и получателя, и некоторую служебную информацию. Все это хешируется вместе. Итоговый хеш подписывается любым ключом, чтобы создать уникальную цифровую подпись, действительную только для этой сделки, и ни для какой другой. Далее эта информация транслируется по сети в незашифрованном открытом виде. Возможным это становится только благодаря тому, что подпись и проверочный ключ не раскрывают секретного ключа.
Чтобы предотвратить попытки провести один блок дважды и совершить своего рода мошенничество под названием «двойная трата», когда одни те же биткоины расходуются дважды, узлы проверяют новые транзакции, сопоставляя их с блокчейном и другими новыми сделками. Такой подход позволяет убедиться, что одни и те же блоки транзакций не проводятся более одного раза.
Каждый майнер собирает действительные новые транзакции и включает их в качестве кандидата на публикацию очередного одобренного блока цепи. Каждый майнер хеширует все новые сделки вместе. Это производит один единственный хеш («mrkl_root»), который делает записи каждой другой транзакции в блоке независимыми.
Каждый хеш для любого блока-кандидата отличается от любого другого блока-кандидата, не в последнюю очередь потому, что майнер включает свой собственный уникальный майнинг-адрес, чтобы он мог получить награду за проделанную работу, если его блок-кандидат действительно будет одобрен в качестве следующего блока цепочки (блокчейна).
Блок-кандидат какого майнера становится в итоге «победителем»? Для того, чтобы конкурирующие друг с другом майнеры признали блок в качестве следующего одобренного для блокчейна, выигравший майнер должен сгенерировать хеш заголовка своего блока-кандидата, который должен отвечать жестокому условию. Все другие майнеры могут сразу же проверить этот ответ и признать его как правильный или нет.
Тем не менее, даже при том, что это правильное решение, оно иметь значение только для того майнера, который нашел его для своего собственного блока. Никто другой не сможет просто взять чужой правильный ответ и использовать его для продвижения своего блока-кандидата в качестве реального победителя. Поэтому правильный ответ можно свободно распространять по сети без опаски, что его присвоит кто-то другой. Этот уникальный «отборочный» хеш называется «доказательством проделанной работы».
Природа и применение хешей, на первый взгляд, являются противоестественными, но они являются необходимыми элементами в том, что делает бикткойн возможным.
Пример добытого блока
Ниже приведен пример некоторых ключевых данных из фактического блока.
“hash”:”0000000000000000163440df04bc24eccb48a9d46c64dce3be979e2e6a35aa13″,
“prev_block”:”00000000000000001b84f85fca41040c558f26f5c225b430eaad05b7cc72668d”,
“mrkl_root”:”83d3359adae0a0e7d211d983ab3805dd05883353a1d84957823389f0cbbba1ad”,
“nonce”:3013750715,
Верхняя строка (“hash”) была фактически успешным хешем заголовка для этого блока. Она начинается с большого количества нулей, потому что победный хеш должен быть ниже значения, установленного при текущем уровне сложности. Единственный способ найти победителя является продолжение попыток снова и снова.
Этот процесс часто описывается в популярной прессе как «решение сложной математической задачи», но это только вводит в заблуждение. Это скорее чрезвычайно простая и прямолинейная задача, которую могут «вынести» только компьютеры. Просто нужно запускать и запускать хеш-функцию миллионы и миллиарды раз, пока где-то в сети не найдется под нее подходящий ответ. Шансы конкретного майнера найти такой хеш для собственного блока-кандидата являются ничтожными и это при том, что в сети в среднем каждые 10 минут находится по одному новому блоку. Победитель получает награду в размере 25 новых биткоинов и все сборы с включенных в него транзакций.
Как собирается награда?
Блоки-кандидаты преопределены заранее так, что вознаграждения контролируются собственным уникальным адресом майнера. Это так потому, что майнер уже включил этот адрес в свой собственный уникальный блок-кандидат до того, как он стал победителем. Адрес для вознаграждения также уже включен в данные блока в самом начале. Изменение адреса вознаграждения может привести к аннулированию победы хеша и с ним всего этого блока.
Кроме того, майнер может только потратить вознаграждения от блоков, которые на самом деле стали частью основной цепи, потому что только те блоки могут стать референсными для будущих сделок. Такая конструкция полностью определяет первоначальный контроль всех новых биткоинов. Точнее, кто победит является случайностью. Чтобы поднять вероятность выигрыша, майнер может лишь попытаться внести большую долю в текущую общую мощность хеширования в конкуренции с другими майнерами, которые пытаются сделать то же самое.
Как показано выше, на примере цитаты Ротбарда, совершенно разный хеш выходит даже после малейшего изменения первоначального сообщения. Вот почему протокол включает в себя место для номера, который стартует с нуля и изменяется на единицу для каждой новой попытки хеша (“nonce”). Только это крошечное изменение, даже если остальная часть данных останется неизменной, генерирует совершенно другой хеш каждый раз в поисках победителя. В приведенном выше примере это выглядит как будто майнер нашел выигрышный хеш для этого блока в определенный момент после трех миллиардов попыток (“nonce”:3013750715). Заметьте, такое количество попыток совершил только один майнер или майнинг-пул. Представьте параллельные безуспешные попытки всех других майнеров. И все это только для участия в соревновании за данный конкретный блок.
Ключевым моментом для понимания является то, что поиск хеша при текущем уровне сложности является чрезвычайно конкурентным и трудным делом, а дальнейшая его верификация – вопрос тривиальный. Остальные майнеры делают это и двигаются вперед. Они используют недавно обнаруженный хеш предыдущего заголовка блока (“prev_block”) в качестве одного из входов для своего следующего урожая блоков-кандидатов (что обеспечивает вертикальную целостность единой цепи блоков) и гонка продолжается на основе оставшегося пула из неподтвержденных транзакций.
Мощная, самофинансируемая, проверяемая сеть.
Майнинговая сеть Биткоин имеет мощность, по состоянию на конец сентября 2014 года, около 250 петахешей в секунду и растет логарифмическими темпами так, что скоро текущий показатель покажется детской загадкой. Это означает, что около 250 квадриллионов хешей проверятся в сети каждую секунду. Это, безусловно, самая мощная сеть распределенных вычислений в мире, которая при этом только продолжает наращивать свои обороты.
Вознаграждение за блоки и операционные издержки помогают производству и поддержанию всей этой сети в децентрализованном порядке. Поскольку генерирование блоков является случайным и распределяется в среднем пропорционально мощности хеширования, это помогает стимулировать всех участников все время. Многие майнеры участвуют в совместной добыче и становятся членами майнинг-пулов, для того чтобы получать хоть какую-то стабильную прибыль.
Сеть разработана для полного самофинансирования участниками с самого начала на неопределенный срок в будущем. Вначале, вознаграждение за новые монеты гораздо больше и доход от платы за транзакции ниже. В конце концов останется только доход от сборов за подтверждение транзакций.
Если биткоин останется успешным в долгосрочной перспективе, к тому времени, преобладающим будет доход от транзакций и, вероятно, в одном блоке будет на много больше порядков транзакций с помощью чего можно приумножить среднее вознаграждение за транзакцию.
Это был краткий обзор некоторых из ключевых технических элементов биткоина. Алгоритмы хеширования и цифровые подписи – относительно новые изобретения, но понимание их работы и предназначения является важным для усвоения принципов работы сети Биткоин. Каждый из основных элементов Биткоин вносит вклад в центральные функции проверки, учета и предотвращения мошенничества. Эти технические опоры и функции, которые они поддерживают, очень далеки от мошеннических схем по типу «схем Понци», насколько это возможно.