О блокчейне простыми словами: подробный разбор технологии «для чайников»

Эта статья написана простым языком, но изобилует техническими подробностями, которые, возможно, вас не заинтересуют. Если вы просто хотите почитать о блокчейне в общих чертах, рекомендую перейти к версии лайт 🙂

Несмотря на бурное развитие технологии блокчейн, в Интернете довольно трудно найти подробную информацию о принципах её работы, изложенную простыми словами. Все публикации, которые мне удалось обнаружить, делятся на две категории. Первые допускают чудовищные упрощения и никак не отвечают на конкретные вопросы о работе реальной технологии. Вторые написаны для профессионалов и опускают важные технические подробности, неочевидные для большинства людей.

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

Я постараюсь максимально подробно рассказать о том, что такое блокчейн, и «на пальцах» объяснить алгоритмы, лежащие в основе работы этой технологии. Мы разберёмся в том, как хранятся, передаются и защищаются данные, а также постараемся ответить на вопрос, возникающий у любого пытливого читателя: почему блокчейн устроен именно так, как он устроен.

Надо сказать, что «просто» — не значит «коротко». Блокчейн построен на непривычных принципах, требующих подробного объяснения, поэтому статья получилась довольно объёмной.

Так как протокол Bitcoin является наиболее популярной реализацией блокчейна, мы будем придерживаться именно этой модели.

Введение в блокчейн: что такое цепь транзакций

Для того, чтобы понять, откуда вообще растут корни блокчейна, смоделируем простую ситуацию.

Петя и Вася живут на затерянном острове, и Петя нашёл 10 одинаковых белых камней. Они договорились, что эти камни будут платёжным средством в их маленькой островной экономике.

Изобразим начальное состояние экономики в виде схемы.

Предположим, что они совершают между собой примитивные торговые операции (покупку и продажу дров для костра, рыбы, кокосов). В результате их «баланс» постоянно изменяется: кто-то отдаёт камни, а кто-то их получает. Запишем «баланс» Пети и Васи после каждой сделки.

Примечательно, что информация о текущем балансе на самом деле является избыточной. Чтобы не таскать лишние данные, мы можем просто записывать информацию о приходах и расходах, вычисляя баланс «на лету». Таким образом, вместо двух субъектов (Васи и Пети) у нас останется одна сделка.

Правда, тогда для установления текущего баланса нам придётся делать подсчёт по всей цепочке от начала до конца. Чтобы упростить расчёты, условимся для каждой передачи денег указывать вход и выход.

Например, Петя хочет передать Васе 4 камня. Как проверить, есть ли у него достаточное количество камней (4 или больше)? Просто посмотреть на предыдущий шаг: изначально у Пети было 10 камней.

Чтобы не запутаться, пронумеруем каждую сделку.

Напомню, мы рассматриваем платёж под номером 2. Что же будет являться входом для этой сделки? Очевидно, средства, которые были у Пети на первом шаге, то есть 10 камней.

Что будет являться выходом? 4 камня, которые Петя хочет передать Васе.

Попробуем переписать нашу схему с двумя сделками, используя вход и выход?

Теперь мы знаем, с какого входа (зачисления) брать деньги для выхода (перевода)…или нет?

Попробуем добавить четвёртый шаг. Пусть Петя хочет передать Васе 4 камня.

На шаге 3 Петя получил 3 камня, а теперь он хочет отправить 4 камня. «Ну и что с того?» — скажет внимательный читатель, — «ведь у нас есть шаг 1, где Петя получает 10 камней».

Проблема в том, что часть из этих 10 камней Петя уже потратил. Нам придётся просмотреть всю цепочку приходов и расходов Пети, чтобы вычислить текущее количество камней — в противном случае Петя сможет отправить камни, которых у него на самом деле нет. Очень муторный алгоритм, требующий большого количества расчётов — особенно если звеньев в цепи было бы не 3, а 33, и в каждом из них Петя совершал бы какое-то действие.

А что если записывать в качестве выхода сразу две сделки? Первая сделка по-прежнему будет отправлять камни получателю, а вторая возьмёт неизрасходованный остаток отправителя и как бы «вернёт» его самому отправителю.

В качестве входа также могут выступить сразу несколько сделок. Напомню, на 4-м шаге Петя хочет отправить Васе 4 камня. Теперь цепочка выглядит следующим образом:

Ура! Теперь нам не нужно сканировать всю цепочку: достаточно лишь просмотреть последние несколько шагов, в которых хранится информация об «остатках».

Наконец, Петя и Вася должны подписать каждое действие. Как и в любом документе, подпись подтверждает намерения конкретного отправителя и обеспечивает защиту от мошенничества.

Схема транзакций в блокчейне со входами, выходами и подписью

Как это соотносится с реальным блокчейном?

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

На самом деле для идентификации транзакций используется не номера, а особые структуры, но пока для нас это не столь важно. Позже мы внесём необходимые уточнения.

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

А где же подпись? Проблема в том, что объяснение принципов работы электронной подписи затрагивает объёмный раздел криптографии, требующий отдельной и очень подробной статьи (которую мы обязательно напишем). Ограничимся следующими знаниями:

  • отправитель обладает парой ключей шифрования: открытым и закрытым.
  • закрытый ключ знает только отправитель. С помощью закрытого ключа можно сгенерировать электронную подпись транзакции.
  • открытый ключ отправителя может увидеть любой желающий. Открытый ключ позволяет подтвердить достоверность электронной подписи, не раскрывая при этом содержимое закрытого ключа.

Информация для тех, кто обладает техническим складом ума, не боится окунуться в дебри криптографии и хочет нагуглить подробности. Электронная подпись транзакции формируется с помощью асимметричной схемы. Адреса получателей и отправителей являются хешами открытого ключа ECDSA. Подробную формулу вычисления хеша можно найти в Bitcoin wiki.

Благодаря тому, что каждая транзакция имеет стандартный набор данных, мы можем легко проверить каждую новую сделку в цепочке по следующему алгоритму:

  1. В новой транзакции Б вход является ссылкой на транзакцию А, которая имела место в прошлом.

    Как мы уже видели на примере с Петей, входов может быть несколько, но суть от этого не меняется: мы просто проверим каждый из них.

  2. Проверяем выходы транзакции А.
  3. Если на выходах транзакции А висит столько же или больше «денег», сколько на выходах транзакции Б, значит, денег хватает и Б осуществима (иначе — отклоняем транзакцию).
  4. Проверяем электронную подпись отправителя. Если она неверна — отклоняем транзакцию.
  5. В том случае, если на выходах А денег больше, чем на выходах Б, «возвращаем» лишнюю часть в качестве дополнительного выхода.

Для человека подобный поиск транзакций в цепочке выглядит сложновато, но компьютер на основе простого алгоритма быстро разберётся, что к чему.

Итак, теперь мы знаем, что такое транзакция и какую роль она занимает в блокчейне. Для того, чтобы продолжить наше рассуждение, необходимо перенести действие с тропического острова в глобальную экономику. Итак, теперь нашим блокчейном пользуются не 2 человека, а, скажем, 2 миллиона человек.

Проблема доверия

Если попытаться построить на основе нашей «островной» платёжной системы нечто более серьёзное, мы сразу же столкнёмся с проблемой доверия. Кто будет подтверждать корректность транзакций? В каком порядке эти транзакции обрабатывать? Где хранить информацию?

В классическом случае этот процесс регулируют банки или платёжные системы. Они выступают в роли гарантов, которые хранят данные обо всех операциях и пользуются всеобщим доверием. Проблема в том, что всеобщее доверие может приводить к неприятным последствиям, таким как:

  • махинации сотрудников или владельцев банка;
  • закрытие доступа к банковскому счёту по причине давления государства или несоответствия внутренним правилам обработки платежей;
  • технический сбой или потеря большого массива данных о транзакциях;
  • «слив» информации о крупных переводах третьим лицам;
  • а ещё есть центральные банки, которые могут управлять эмиссией в своих интересах (случай, известный обывателю как «печать долларов»);
  • и так далее.

А что если мы вообще обойдёмся без банков? Что если реестр данных о транзакциях будет храниться на множестве независимых компьютеров?

А как это сделать?

Вспомним историю с Петей и Васей. Только условимся, что теперь они абсолютно не знают друг друга. Соответственно, между ними нет никаких доверительных отношений: прямо как между вами и китайцем, у которого вы заказываете наркотики с Alphabay барахло с Aliexpress.

А камни назовём биткоинами (сокращённо — BTC, по первым согласным в слове «Bitcoin»). Рассмотрим предыдущую схему.

Чтобы не захламлять рисунки лишней информацией, я убрал подписи из транзакций. Просто имейте в виду, что они там есть, но сейчас это не столь важно.

Возьмём, к примеру, транзакцию #3. Вася хочет отправить Пете 3 BTC. Мы уже знаем, что ближайшим входом является транзакция #2, в которой Вася получил 4 BTC. Хотя постойте: кто это — «мы»?

Проблема в том, что у нас нет единого центра, такого как банк или платёжная система. Из-за этого невозможно установить порядок приходов и расходов и проверить, действительно ли у Васи есть 3 BTC для отправки, или же он нас обманывает, ведь база данных хранится только на его компьютере.

А что если хранить базу данных с приходами и расходами сразу на всех компьютерах, участвующих в совершении платежей?

Распределённая база данных

Сделаем так, что каждая новая транзакция будет отправляться сразу на все узлы, использующие нашу систему. Как только пользователь получает транзакцию, он сразу же сообщает об этом другим участникам системы. Теперь реестр транзакций хранится на каждом компьютере в сети Bitcoin.

Распределенная база транзакций

Тогда Петя сможет проверить базу данных в своём компьютере и узнать, действительно ли у Васи были достаточные 3 BTC на момент отправки.

Звучит неплохо, вот только новую транзакцию легко подделать. Предположим, что Вася — человек низких моральных принципов. Он пересылает деньги на компьютер Пети, и одновременно с этим отправляет ту же самую сумму (то есть тот же вход) на компьютер Маши. Вот как выглядят эти транзакции:

Компьютеры Пети и Маши хранят одинаковые данные о предыдущей транзакции в Сети. Если информация о сделках в один и тот же момент времени придёт на компьютеры Пети и Маши, обе транзакции будут приняты как достоверные! Возникает проблема «двойного расходования», когда участники сети несогласованно принимают одни и те же виртуальные монеты.

Пример схемы с двойным расходованием

Вспомним о том, что теперь реестр транзакций хранится на каждом компьютере в сети Bitcoin. Значит, проверить платёж Васи могут не только Петя и Маша, но и все остальные пользователи. На жестком диске каждого из них хранится собственная копия реестра всех транзакций в Bitcoin, так что Петя, получив новую транзакцию, может отправить её для проверки остальным участникам сети (в том числе Маше).

И Маша может сделать то же самое.

Итак, теперь не только Петя и Маша, но и другие компьютеры в сети (кстати, они называются нодами или узлами) проверяют возможность совершения сделки, используя собственный реестр. В том случае, если достаточное количество пользователей проверило сделку, её можно считать корректной и завершённой.

Как компьютеры в блокчейне находят друг друга?

Каждый узел в блокчейне является независимым: не существует единого сервера, через который проходили бы все данные о транзакциях. Всё общение между нодами происходит напрямую, peer-to-peer. Связь между узлами в блокчейне напоминает скачивание файлов с помощью торрентов, хотя технически реализована несколько иначе.

Если вы запускаете программу-клиент впервые, она обращается к списку DNS-серверов, «зашитых» в программный код. Эти серверы хранят IP-адреса всех компьютеров в блокчейне. Если же произошло нечто экстраординарное, и все DNS-серверы стали недоступны, программа обратится к списку конкретных IP-адресов, которые также «зашиты» в неё разработчиками. Впрочем, подобные случаи истории неизвестны.

Если же вы уже подключались к блокчейн-сети в прошлом, программа в первую очередь загрузит список узлов, собранный за время последнего подключения.

Теперь при попытке отправить Пете и Маше одни и те же деньги будет подтверждена только одна транзакция. Вот только почему мы так уверены в надёжности «проверяющих»? И ещё: «достаточное количество проверок» — это сколько?

Предположим, что наша сеть всё ещё объединяет 2 миллиона пользователей. Большинство из них запускает программу обработки транзакций от случая к случаю — для того, чтобы передать или получить свои BTC. Следовательно, огромная часть нод (напомню, нодами называются компьютеры в сети Bitcoin) в каждый конкретный момент времени будет отключена.

В таком случае нечестному на руку Васе становится не так уж и трудно создать множество «подставных» нод, которые будут подтверждать транзакцию, которую он сам и отправил. Если количество узлов, используемых Васей, будет составлять значительную часть нод в данный момент времени, у него получится произвести двойное расходование одних и тех же средств.

Так мы приходим к концепции Proof of Work (POW), которая является краеугольным камнем в принципах работы сети Bitcoin и других популярных проектов на блокчейне. Но перед этим разберёмся с ещё одним важным вопросом: поговорим о блоках.

Откуда берутся блоки в блокчейне и можно ли обойтись без блоков?

Почему-то во всех публикациях блоки рассматриваются как данность. Только что вы читали о подтверждении транзакций, и вот уже мысль автора перешла на некие «блоки», из которых составляется цепочка. Почему? Зачем? Давайте разберёмся.

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

Причина, по которой транзакции объединяются в блоки, довольно проста: это удобнее и быстрее, чем отправлять отдельные транзакции между компьютерами. Использование блоков экономит большое количество времени и сетевого трафика, упрощая сортировку сделок в хронологическом порядке.

Блок в блокчейне

Чуть ниже мы увидим, что для подтверждения транзакции каждому компьютеру в сети нужно осуществить довольно сложные проверки и вычисления. Учитывая тот факт, что транзакции независимо (peer-to-peer) отправляются на каждую отдельную ноду, придётся потратить большое количество времени, чтобы согласовать порядок их следования между всеми нодами. Гораздо проще установить порядок внутри блока на одном конкретном компьютере и отправить готовый блок всем участникам сети. Чуть ниже мы выясним, как это происходит на практике.

Как видите, никакого глубинного смысла в использовании блоков искать не нужно. Просто запомните, что отдельные транзакции объединяются в крупные блоки для экономии времени и повышения стабильности работы сети.

Не спешите. Постарайтесь переварить новую информацию. Приготовьте себе чашку чая или кофе, соберитесь с мыслями и откройте свой разум для восприятия финального «кирпичика» (на самом деле здоровенного кирпича), лежащего в основании концепции блокчейна.

Что такое Proof of Work (POW) и зачем это нужно

Итак, напомню, что мы столкнулись с двумя серьёзными проблемами:

  1. нодам нет никакого смысла постоянно находиться онлайн и проверять транзакции;
  2. проверка транзакции — очень простая операция, так что любой пользователь может создать сколь угодно много нод и «проверить» свою собственную транзакцию. Из-за этого в полный рост встаёт проблема двойного расходования.

Решить обе проблемы позволяет подход, который на первый взгляд (да и на второй тоже) выглядит довольно странно. Нужно заставить каждый компьютер заниматься не только проверкой транзакций, но и решением сложной задачи, требующей большого количества вычислительных ресурсов.

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

Представим, что теперь нодам нужно не просто подтверждать транзакцию, но и решать сложную задачу, требующую больших затрат времени, процессорной мощности и электричества. Для этого каждая нода в сети должна обладать солидной мощностью, так что Вася не сможет установить контроль над большей частью сети: у него просто-напросто не хватит денег, чтобы купить столько оборудования.

Конечно, у Васи всё ещё есть теоретический шанс совершить двойное расходование, но мы поговорим об этом чуть позже. В первую очередь давайте посмотрим, что представляет из себя «сложная задача». Для этого познакомимся с понятием хеш.

Что такое хеш

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

Более подробно познакомиться с теорией хеширования можно в Википедии.

В блокчейне Bitcoin используется хеширование по алгоритму SHA-256. Скажем, строка «Привет!», зашифрованная в SHA-256, будет выглядеть так:

b2b11afc89e6a4635f13e1fe404909ee873b2aa9b4d62ce414d327d39fef258e

А текст данной статьи, скопированный из Word, ровно до этого слова (вот именно, от первого абзаца до того слова!)  — так:

eca0ae04b088b673b8c8031f169295f065e16da698c4e627815fd9fb5211f6e0

При этом шифрование одной и той же строки всегда будет давать один и тот же результат — попробуйте самостоятельно зашифровать слово «Привет!» на этом сайте.

Таким образом, можно зашифровать сколь угодно длинную последовательность символов и получить строку строго определённой длины, которую невозможно расшифровать.

Как Proof of Work и хеш связаны между собой

Допустим, что мы владеем одним из узлов в сети.

Мы регулярно получаем новые транзакции для подтверждения. Для каждой транзакции нужно проверить входы, выходы и электронную подпись. Если всё верно — записываем транзакцию в блок, который пока что существует только на нашем компьютере.

Размер блока ограничен — например, в середине 2017 года предельный объём составляет 1 мегабайт.

Мы договорились, что теперь нам нужно не только проверять транзакции, но и решать задачу. В чём она заключается?

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

Итак, хеш блока создаётся на основе:

  1. информации о включенных в него транзакциях;
  2. хеша предыдущего блока.

Но где же здесь решение задачи?

Мы уже говорили о том, что хеширование работает только в одну сторону: невозможно предсказать, какую строку мы получим в результате шифрования. Зададим условие: пусть хеш каждого блока начинается с нуля.

Но как это сделать, если мы создаём хеш на основе двух параметров, и эти параметры нельзя изменить? Очень просто: добавить третий параметр! Теперь хеш генерируется на основе следующих данных:

  1. информация о транзакциях в блоке;
  2. хеш предыдущего блока;
  3. какое-то число, позволяющее сгенерировать хеш под наше условие.

Кстати, это число называют словом nonce.

Как устроена цепочка блоков в блокчейне

Для примера возьмём нашу строку «Привет!» Напомню её хеш:

b2b11afc89e6a4635f13e1fe404909ee873b2aa9b4d62ce414d327d39fef258e

Давайте попробуем «приклеивать» к началу этой строки числа, начиная с 0, и вычислять хеш полученной строки. Например:

0Привет! — a2955f0c3b83ef311837fd362d4431f6df7375cb27747e111debcdec4a4db4f1
1Привет! — a8b32762615587825bc05a2ef039a8aa47dc75a34f728bf3eee9d385ecb7224f
2Привет! — e24185f0776d170d30c8be4d1635e24ba3bf61cf8b41709bb8275d91b8be9be1

Как видите, нет никакой возможности предсказать, какое число позволит нам получить ноль в начале хеша. Придётся действовать тупым перебором. В какой-то момент мы обнаружим число 27, которое удовлетворяет нашему условию: хеш начинается с нуля.

27Привет! — 0feebe2c78aa627f4b9b27e7b6eb9a06ab89490ee6e2c736c0b63f9dcc3d0ccf

Что ещё более важно: зная строку «Привет!» и число 27, любой компьютер сможет очень быстро убедиться, что мы действительно совершили работу по подбору этого числа. Ему достаточно просто склеить эти два объекта и вычислить их хеш. Если результат совпадёт с нашей строкой, значит, мы действительно подобрали верное число, а не предоставили какой-то «левый» хеш.

Представим, что вместо слова «Привет!» нам нужно использовать данные из блока с транзакциями (как на последней схеме). Представим также, что в алгоритме блокчейна задано условие: блок считается завершённым, когда его хеш начинается, например, с 18 нулей.

Вероятность генерации хеша с 18 ведущими нулями чрезвычайно мала, поэтому нам придётся перебрать гигантское количество чисел, прежде чем мы получим подходящий результат. Если же мы обнаружили такое число, остаётся транслировать его остальным участникам сети вместе с готовым блоком и полученным хешем с 18 нулями. Теперь каждый участник сети может осуществить проверку, склеив это число с данными из блока. Если хеши совпали — значит, работа по подбору числа действительно была произведена.

В этом и заключается смысл Proof of Work. Мы совершаем большую вычислительную работу, результат которой легко проверить другим участникам сети.

Так как столь сложный подбор чисел требует огромных ресурсов, отдельно взятый человек или организация просто не смогут взять под свой контроль сколь-нибудь значимую часть сети.

Мы почти закончили. Осталось лишь понять, зачем кому-то тратить такие вычислительные мощности для проверки транзакций.

Награда за генерацию блока

Дело в том, что в алгоритме изначально предусмотрено вознаграждение за генерацию нового блока. Первая транзакция в каждом блоке имеет один выход и ни одного входа — это и есть та самая награда, размер которой зафиксирован в алгоритме сети Bitcoin. Когда один из узлов успешно подбирает хеш с 18 нулями, он отправляет блок с этой транзакцией другим участникам сети, которые производят следующие операции:

  1. проверяют, действительно ли был подобран правильный хеш;
  2. проверяют каждую транзакцию в блоке, в том числе и ту, которая была указана в качестве «награды». Награда берётся как бы «из ни откуда» и не имеет входов, а вот её размер должен равняться строго определённому числу (например, 12.5 BTC).

Если блок создан верно, узел включает этот блок в свою собственную цепочку. Таким образом постепенно обновляется цепочка блоков на каждом компьютере в сети, то есть узлы приходят к консенсусу. Теперь все транзакции, включенные в этот блок, считаются осуществлёнными.

Транзакция-награда также подтверждается во всей сети, в результате чего происходит «признание победы». Именно это вознаграждение позволяет успешно применять концепцию Proof of Work: узлы работают не «за идею», а за биткоины. Кто быстрее сгенерирует блок с правильным хешем и правильными транзакциями — тот и получит вожделенные цифровые монеты. Этот процесс назвали английским словом майнинг (mining — добыча ископаемых в шахте).

Именно в процессе майнинга и осуществляется эмиссия биткоинов, то есть генерация новых «монет» в сети. В классических монетарных системах эмиссию осуществляет центральный банк. В случае с биткоином новые монеты генерируются в процессе создания блоков.

Кроме того, каждый отправитель тоже платит небольшую комиссию для того, чтобы его транзакция была включена в блок. Здесь опять же срабатывает конкурентный принцип: чем больше комиссия, тем больше вероятность, что майнер включит ваш платёж в ближайший блок, ведь для него это выгодно. В итоге майнер получает не только награду за блок, но и комиссию за каждую транзакцию.

Комиссия за транзакцию не прописывается отдельно. Достаточно сделать сумму выходов немного меньше, чем сумма входов. Полученную разницу майнер заберёт себе.

Теперь мы можем записать окончательный алгоритм работы блокчейна Bitcoin.

Финальный алгоритм работы блокчейна

  1. Пользователь создаёт транзакцию, имеющую входы (ссылки на предыдущие транзакции, подтверждающие наличие средств), выходы (адреса получателей) и электронную подпись.
  2. Транзакция отправляется на множество независимых узлов (нод).
  3. Каждая нода проверяет корректность транзакции. Если всё верно, узел включает транзакцию в свой новый блок, при этом размер блока не может превышать X мегабайт.
  4. Для каждого блока подбирается хеш с N ведущих нулей. Хеш формируется на основе всех транзакций, хеша предыдущего блока и случайного числа nonce.
  5. Тот узел, который успешно осуществляет эту работу, отправляет блок с меткой времени, хеш блока и случайное число nonce другим участникам сети.
  6. Участники сети проверяют хеш полученного блока и корректность каждой транзакции. Если всё верно, блок становится частью их собственной цепочки, и транзакции считаются осуществлёнными.

А если два или более узлов одновременно сгенерировали разные блоки?

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

Обратимся к рисунку:

Разветвление цепи в блокчейне

Итак, цепь «раздвоилась»: часть компьютеров голосует за блок А, другая часть — за блок B. В этом случае действует правило: каждый узел продолжает работать со своей копией цепочки, пока в блокчейне не появится более длинная цепь.

Достаточно осознать тот факт, что длина цепи напрямую связана с количеством работы, затраченной на подбор хешей. Соответственно, более длинная цепь имеет более высокий приоритет.

Как только одна из ветвей становится длиннее, все узлы признают её более весомой, и включают её в свой блокчейн.

Таким образом, ваша транзакция будет считаться совершённой тогда, когда она окажется в более длинной цепочке.

Наконец, мы переходим к последнему нерешённому вопросу. «Достаточное количество узлов», подтвердивших правильность блока — это сколько?

О 6 подтверждениях, двойном расходовании и 10% мощности

Из предыдущего пункта мы можем вывести важное следствие. Так как сложность генерации блока является одинаковой для всех участников сети, владелец определённой группы узлов имеет следующую вероятность «быть первым»:

Мощность своих узлов / Мощность всей сети * 100%

Например, если мы можем рассчитывать хеши со скоростью 2 хеша в секунду, а вся сеть — со скоростью 100 хешей в секунду, то мы первыми сгенерируем очередной блок с вероятностью:

2 / 100 * 100% = 2%

В теории злоумышленник Вася всё-таки может провести двойное расходование средств в сети Bitcoin по следующему алгоритму:

  1. Отправляем магазину деньги (транзакцию) в обмен на товар. Магазин дожидается, пока транзакция попадёт в блок самой длинной цепочки в сети, после чего отправляет товар Васе.
  2. Вася, владеющий огромной мощностью, начинает скрытно генерировать абсолютно верные блоки, в которых отсутствует его собственная транзакция.
  3. В какой-то момент «скрытая» цепочка Васи становится длиннее, чем общая цепочка. В этот момент Вася рассылает свои блоки другим участникам сети. Они видят, что новая цепь длиннее, все блоки имеют правильные хеши, а для транзакций указаны верные входы и выходы.
  4. Эти блоки становятся главными в блокчейне, а магазин, отправивший товар, остаётся без входящей транзакции.

Как мы уже заметили, вероятность генерации блоков быстрее остальных участников сети соответствует количеству ресурсов Васи относительно всех ресурсов сети. Нужно также понимать, что вероятности работают только на длинной дистанции, так что даже очень маломощная нода может случайно сгенерировать блок первой.

При создании блокчейна Bitcoin были использованы следующие допущения:

  • практически невозможно (и абсолютно точно — экономически невыгодно) собрать более чем 10% мощности сети в руках одного владельца;
  • 0.1% — допустимая для продавца вероятность отмены сделки, если злоумышленник всё-таки смог завладеть 10% мощности.

Расчёт, который можно найти в п. 11 оригинальной whitepaper протокола Bitcoin, показывает, что такая вероятность достигается в том случае, если за блоком с транзакцией последовали ещё как минимум 5 новых блоков. Именно в этом случае вероятность совершения успешной атаки при владении 10% мощности падает ниже 0.1%. Таким образом, для обеспечения достаточной надёжности транзакция должна находиться по меньшей мере в 6 последних блоках.

Именно на этих расчётах основано правило 6 подтверждений, после которых сделку можно считать завершённой. На практике некоторые сервисы используют гораздо меньшее число подтверждений, так как ни один участник сети не обладает мощностью, которая была бы близка к 10 процентам.

Итак, в общем случае сделка в протоколе Bitcoin считается завершённой только после 6 подтверждений. Похожее правило действует во всех блокчейнах, использующих технологию Proof of Work.

Завершая разговор о генерации блоков

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

На самом деле «количество ведущих нулей» — это тоже упрощение. Сложность — это просто число длиной в 64 цифры в 16-ричной системе.

Представим, что у нас есть 64 клеточки, в которые можно вписать число, при этом запись начинается от правого края (это связано с особенностями хранения чисел в памяти компьютера). Например, мы записываем число 123456789, а оставшиеся впереди него клетки просто заполняем нулями.

0000000000000000000000000000000000000000000000000000000123456789

Это и есть наша «сложность». Так как на практике это число никогда не занимает все 64 клетки, а серьёзное изменение сложности обязательно отразится на количестве цифр в числе, наше упрощение с нулями вполне уместно. Более подробную информацию о расчёте сложности можно узнать на Bitcoin wiki.

Сложность подстраивается в системе каждые 2016 блоков таким образом, чтобы среднее время генерации одного блока составляло 10 минут. Изменение сложности позволяет обеспечивать равномерность прохождения транзакций и компенсирует изменение вычислительной мощности в системе.

Кроме того, говоря о транзакциях, мы всё время назначали им некие «номера». На самом деле «номером» транзакции является её хеш. Точно так же, как блок ссылается на предыдущий блок, транзакция ссылается на прошлые транзакции, которые служат в качестве входов.

Связь между транзакциями в блокчейне

Таким образом, любую транзакцию можно быстро найти в блокчейне по её уникальному хешу.

На этом разбор технических принципов работы блокчейна можно считать завершённым. Правда, раз уж мы заговорили именно о блокчейне Bitcoin, для полного счастья стоит уточнить ещё и финансовую сторону вопроса, а именно контроль за эмиссией биткоинов. Так что, если у вас осталось ещё немного чая или кофе…

Подробнее об эмиссии биткоинов и стимулах для майнеров

Как мы уже знаем, создатель верного блока получает награду за свою работу. Примечательно, что со временем эта награда становится меньше.

Каждые 210 тысяч блоков размер вознаграждения уменьшается вдвое. Этот процесс называется халвинг (англ. halve — делить пополам). Так как благодаря изменению сложности мы имеем довольно стабильную скорость генерации новых блоков (примерно раз в 10 минут), можно посчитать, как часто происходит такое «уполовинивание»:

1 блок в 10 минут = 6 блоков в час = 144 блока в сутки = прим. 52 560 блоков в год
210 / 52.560 = 4 года (округлим)

Итак, примерно раз в 4 года размер вознаграждения уменьшается вдвое. На заре существования биткоина оно составляло 50 BTC. В 2017 году — 12.5 BTC.

Получается, что в какой-то момент эмиссия новых биткоинов будет прекращена. Это произойдёт примерно в 2040 году, когда количество биткоинов будет равно 21 миллиону.

Но если майнеры перестанут получать вознаграждение, зачем им продолжать процесс генерации блоков?

Вспомним, что майнер получает не только «эмиссионное» вознаграждение, но и комиссию за включение каждой транзакции в блок. В данный момент это второй по значимости экономический стимул, однако после 2040 года он станет главной движущей силой блокчейна Bitcoin. Таким образом, даже при нулевой комиссии за генерацию блока майнерам будет выгодно поддерживать работу блокчейна.

Вместо заключения

Несмотря на то, что я старался написать эту статью максимально простым языком, её осознание всё же требует некоторых усилий — в первую очередь, из-за непривычности и неочевидности некоторых подходов. Если какие-то моменты остались непонятными, советую прочитать упрощённое объяснение базовых принципов работы блокчейна.

1

Автор публикации

не в сети 2 месяца

zonatex.ru

5
Комментарии: 0Публикации: 5Регистрация: 21-07-2017

Похожие записи

Чем обеспечен bitcoin и другие криптовалюты? Разрушаем мифы об «обеспечении» денег... Правильный ответ на вопрос о том, чем на самом деле подкреплена цена традиционных активов — ключ к пониманию стоимости всех криптовалют....
О блокчейне для самых-самых: что это, зачем это нужно и кто такие майнеры... (Очень) краткое описание технологии для тех, кого не интересуют лишние детали.

Ответить