Опубликован: 12.08.2019 | Уровень: для всех | Доступ: платный
Лекция 6:

Майнинг как основа консенсуса платформы Биткоин

< Лекция 5 || Лекция 6
Аннотация: Данный раздел посвящен изучению самой известной и обсуждаемой составляющей любой криптоплатформы - майнингу. Приводятся определения основных терминов и понятий данной сферы, таких как майнинг, форжинг, хешрейт и др. Подробно рассматриваются наиболее популярные алгоритмы достижения консенсуса, включая Proof of Work, Proof of Stake, Delegated proof of stake, Leased Proof Of Stake, Proof of Importance, Proof of Activity, Proof of Capacity. Однако основное внимание уделяется алгоритму Proof of Work, используемому в платформе Биткоин. Формулируется знаменитая задача византийских генералов, имеющая практическое и историческое значение. Разбирается автономная верификация транзакций, включая регламент, по которому тестируется каждая доставленная на узел транзакция. Подробно рассматривается процедура создания новых блоков майнерами. Приводится структура базовой транзакции. Особое внимание уделяется процессу конструирования заголовка блока. Изучается процедура независимой верификации новых блоков полными нодами сети. Проводится описание основных атак на консенсус. Цель: Сформировать комплекс знаний в области майнинга - деятельности специализированных узлов сети по поддержанию распределенного реестра, нахождению консенсуса, созданию новых блоков, эмиссии новых монет.

Основные аспекты добычи в криптоплатформах

Цель: Сформировать общее представление об экономике и технологических аспектах майнинга, сформулировать основные понятия в сфере криптодобычи.

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

Майнинг (от англ. mining — добыча полезных ископаемых) — деятельность специализированных узлов сети по поддержанию распределенного реестра, обеспечению безопасности, нахождению консенсуса и созданию новых блоков, предусматривающая возможность получения вознаграждения в форме новых монет (эмиссия) за создание нового блока и комиссионных сборов за проверку и подтверждение транзакций. Майнинг характерен для большого числа криптовалют, в том числе, для платформы Биткоин. Сложная система вычислений, сопровождающая майнинг, требуется для обеспечения консенсуса и защиты от двойных трат, а вознаграждение стимулирует участников сети использовать свои вычислительные мощности в целях поддержания работы платформы. Кроме майнинга имеются и другие технологии создания новых блоков, например, форжинг (минтинг). Большинство платежных систем придерживается только одной технологии, но некоторые используют сразу несколько (например, EmerCoin, YaCoin, NovaCoin, PeerCoin и Reddcoin).

Форжинг (минтинг) (от англ. forging — ковка) — альтернативный метод добычи криптовалюты, не требующий громоздких вычислений. Форджинг реализует алгоритм Proof of Stake (доказательство доли). Форжинг предусматривает получение монет за создание новых блоков так же как и майнинг. Однако бенефициар определяется исходя из иных соображений. В случае майнинга потенциальным победителем является майнер с наибольшим объемом вычислительных мощностей. В ситуации с форжингом основным ресурсом, за который конкурируют участники и на основе которого определяется победитель (обладатель вознаграждения за создание нового блока) является доля участника (Stake) в общем объеме выпущенных коинов данной криптовалюты. Основным условием вхождения в форжинг считается фиксация определенной суммы монет в кошельке в течение определенного периода времени, установленного правилами консенсуса платформы. Величина выплат майнеру прямо пропорциональна сумме коинов, которыми он владеет. Примеры криптовалют, использующие доказательство владения: STRAT; Nxt; BlackCoin; OKCash; Hyper и др.

Майнеры обеспечивают работу платформы Биткоин своими вычислительными ресурсами, формируя, так называемый, хешрейт. Хешрейт определяется целым рядом ключевых параметров. Главным являются особенности реализации конкретного алгоритма добычи криптовалюты. Например, некоторые устройства достигают максимальных показателей в сетях с алгоритмом хеширования SHA (Биткоин, Namecoin, Peercoin и др.), но их эффективность резко снижается в криптоплатформах, основанных на алгоритме Scrypt (Litecoin, Dogecoin, Gridcoin и др). Важным также является вопрос спецификации оборудования, его производителя и даже локализации. Всем кто всерьез планирует заняться майнингом, следует проработать информацию о мощности и особенностях эксплуатации того или иного устройства для того чтобы выбрать наиболее оптимальный вариант. Также имеет значение популярность самой криптовалюты: раскрученные бренды привлекают большее число майнеров. Подключаясь к сети, они увеличивают ее хешрейт за счет дополнительных вычислительных мощностей, что, естественным образом, повышает сложность майнинга.

Хешрейт - суммарная вычислительная мощность задействованного в сети майнингового оборудования, используемого в процессе добычи коинов. Единицы измерения хешрейта: Хеш/сек (H/s); Килохеш/сек (KH/s); Мегахеш/сек (MH/s); Гигахеш/сек (GH/s); Терахеш/сек (TH/s); Петахеш/сек (PH/s); Экзахеш/сек (EH/s). Увидеть сегодня производительность платформ в "хеш в секунду" просто невероятно. Мощность майнинговых систем постоянно растет и даже в добычу новых криптовалют заходят майнеры с устройствами мощностью, превышающей десятки Мегахеш/сек. Например, мощность вычислительной системы в 10 MH/s означает, что за одну секунду она может сгенерировать 10 млн различных комбинаций дайджестов для подбора того единственного значения, которое будет соответствовать всем заданным для данной платформы параметрам.

Эмиссия и дефляционный характер биткоинов

Майнеры верифицируют транзакции, объединяют их в блоки и стараются добавить новый блок в блокчейн – важно сделать это первым. Каждый новый блок включается в блокчейн с интервалом в среднем в 10 минут. Майнер, сумевший добавить новый блок в блокчейн, получает вознаграждение двух видов: монеты за счет эмиссии (сейчас эта сумма составляет 12,5 BTC, в 2020 году награда уменьшится в два раза и так каждые четыре года, пока сумма вознаграждения не станет равной нулю) и комиссионные за верификацию транзакций, входящих в блок.

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

Доказательство выполненной работы (от англ. Proof of Work, PoW – дословно: доказательство работы) — алгоритм обеспечения безопасности распределенных реестров, защищающий от таких угроз как двойные траты, DoS-атаки, спам-рассылки и т.д. Сущность алгоритма определяется двумя положениями:

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

В наиболее общем случае доказательство выполненной работы - это некоторая информация (состав или формат которой ограничены заранее известными условиями), которую достаточно сложно (существенные временные издержки, дорогостоящая процедура) произвести. Проверка же этой информации должна быть максимально проста. Нахождение консенсуса Proof of work можно описать как случайный процесс с низкой вероятностью успеха, поэтому требуется множество пробных и ошибочных опытов прежде чем будет найдена подходящая величина.

Впервые концепция Proof-of- Work была опубликована в 1993 году в работе "Pricing via Processing, Or, Combatting Junk Mail, Advances in Cryptology" (авторы – Синтия Дворк и Мони Наор). При этом сам термин авторами еще не использовался, но была представлена следующая идея:

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

В 1997 году Адам Бэк представил стартап Hashcash, целью которого была защита от спама. Задача формулировалась следующим образом: "Для создания заголовка электронного письма найти такое значение x, что хеш SHA(x) содержал бы N старших нулевых битов".

В 1999 году в статье "Proofs of Work and Bread Pudding Protocols" (авторы – Маркус Якобссон и Ари Джуелс) в журнале Communications and Multimedia Security появляется термин Proof of Work.

В платформе Биткоин инструмент Proof of Work использован в качестве средства достижения консенсуса (единого мнения для выбора верной версии блокчейна). Причем за основу Сатоши Накамото взял идею проекта Hashcash, дополнив ее механизмом самонастраивающейся сложности — изменения требуемого числа нулей, исходя из суммарной вычислительной мощности участников сети. Вычисляемым значением стала хеш-функция SHA-256.

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

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

Вспомним еще одну причину, по которой метафора добычи полезных ископаемых органично отражает не только суть, но и некоторые детали майнинга криптовалют. Просматривается явная аналогия в том, что добывать криптоценности и полезные ископаемые с течением времени становится все труднее и труднее. Первоначально эмиссия, сопровождающая каждый новый блок, составляла 50 BTC. В ноябре 2012 года эта сумма уменьшилось в два раза до 25 BTC. Вознаграждение за майнинг будет экспоненциально убывать до 2140 года, когда будут достигнут нулевой предел. Всего будет выпущено около 21 000 000 BTC (если быть точным – 2 099 999 997 690 000 сатоши). После 2140 года новые биткоины создаваться не будут. Для большинства майнеров добыча закончится в 2036 году. К этому моменту времени будет добыто уже 99.2%. Оставшиеся 0,8%, видимо, возьмут на себя самые преданные делу Сатоши Накамото энтузиасты. Отметим, что к 8 марта 2019 года было выпущено более 17 579 300 BTC. На рисунке 32 представлена динамика роста общего числа выпущенных монет вплоть до 2140 года. Последний результативный блок, который принесет добывшему его майнеру вознаграждение 0,00000001 BTC, будет иметь номер 6929999. По крайней мере, так запланировано в действующих редакциях протоколов сети Биткоин.

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

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

Сумма выпущенных биткоинов в разрезе времени

Рис. 6.1. Сумма выпущенных биткоинов в разрезе времени

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

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

Византийские генералы и децентрализованный консенсус

Цель: сформулировать задачу византийских генералов, имеющую практическое и историческое значение, рассмотреть наиболее популярные алгоритмы достижения консенсуса, включая Proof of Work, Proof of Stake, Delegated proof of stake, Leased Proof Of Stake, Proof of Importance, Proof of Activity, Proof of Capacity.

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

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

Механизм консенсуса - алгоритм принятия решения в интересах группы. Преследуют следующие цели:

  • согласование — максимизация уровня согласия всех участников группы;
  • групповая работа — совместный труд объединяет (это известно даже коту Федору из Простоквашино);
  • кооперирование — позиционирование общих интересов выше собственных;
  • эгалитаризм — в противоположность элитаризму декларирует равенство всех участников группы;
  • инклюзивность — максимально большее число участников должно быть вовлечено в процесс достижения консенсуса.

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

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

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

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

Как же связаны BFT и сеть Биткоин? Представьте теперь, что число абонентов намного превышает 2. Причем люди в этой единой сети самые разные. Если вы отправляете кому-то деньги, необходимо иметь механизм, гарантирующий, что никто другой не поменяет указанную Вами сумму. Т.е., нас в этом примере интересует система верификации транзакций (сообщений), способная обнаруживать и исключать как ошибки, так и злонамеренное поведение. И участникам сети Биткоин, и византийским генералам по сути нужно одно и тоже - механизм консенсуса, гарантирующий истину передаваемых сообщений, несмотря на помехи.

Так что же у нас такого особенного имеется в платформе Биткоин? Это – блокчейн. Распределенные реестры не создаются централизованно. Более того каждый участник сети в любой момент времени может собрать собственную копию блокчейна. При этом протокол платформы Биткоин учитывает, что абоненты взаимодействуют, используя небезопасные сетевые соединения.

Биткион – это не просто разновидность пиринговых сетей, которые прекрасно работали и до 2009 года. Распределенные таблицы хешей (Distributed hash table, DHT), например, BitTorrent, появились задолго до первой криптовалюты. На основе DHT можно построить замечательные системы хранения и передачи децентрализованных данных. Но для структурирования данных уровня приложений (имена пользователей, статусы, счета и т.д.), требующих согласия всех участников сети, их возможностей недостаточно. Для такого рода децентрализации уже нужны распределенные реестры. Блокчейн не подменяет DHT, а существенно расширяет функционал. К тому же блокчейн эффективно решает проблему безопасности DHT.

Использование PoW для консенсуса — пожалуй, самая большая инновация оригинальной статьи о Биткоине3. Соответствующий алгоритм консенсуса получил вполне академическое название — консенсус Накамото. Сатоши (автор или авторы статьи) предложил "подписывать" каждый создаваемый блок доказательством работы, сложность которого зависит от общей вычислительной сложности сети биткойна. Такой подход дает несколько преимуществ.

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

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

Доказательство выполненной работы является "честным" по своей природе. В принципе, вознаграждение каждого майнера пропорционально выдаваемому им хешрейту. Если майнер обладает 10% суммарной вычислительной мощности сети, то он будет в среднем создавать 10% блоков и получать 10% вознаграждения.

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

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

Консенсус Накамото совершенно естественным образом обеспечивает два ключевых требования к распределенным приложениям:

  • Устойчивость к цензуре ввиду отсутствия привязки доказательства работы к личностям майнеров, что характерно для электронных подписей или сертификатов.
  • Объективность протокола, так как проверка доказательства работы: а) реализуется просто и быстро; б) ничего кроме блокчейна не требует.

Консенсус платформы Биткоин устойчив к типовым атакам на блокчейн, причем эта устойчивость достаточно полно исследована в теории. В своей первой статье Сатоши Накамото определил предел его прочности. Он утверждал, что сеть Биткоин продолжит нормально работать, даже если половина майнеров начнет мошенничать. Если же злонамеренные майнеры получат большинство (так называемая атака 51%), они смогут продвигать только свои блоки, игнорируя остальных майнеров, и прикарманивать все вознаграждение в сети, или проводить повторные траты средств посредством намеренных форков блокчейна. Но даже в этом случае злоумышленники не смогут преодолеть базовый механизм безопасности блокчейна и похитить биткоины пользователей.

Децентрализованный консенсус платформы Биткоин рождается во взаимодействии четырех независимых процессов, реализуемых нодами сети:

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

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

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

Доказательство доли (от англ. Proof of Stake, PoS – дословно: доказательство доли) - альтернативный механизм консенсуса, основанный на использовании "доли" (stake) в качестве ресурса, определяющего, какая именно нода получает право добычи следующего блока. Метод впервые реализован в 2012 году в криптовалюте PPCoin (ныне PeerCoin). Как и в случае Proof of Work ноды также пытаются хешировать данные в поисках результата меньше определенного значения, но сложность распределяется пропорционально балансам конкурирующих узлов, т.е., в соответствии с объемом средств (коинов) на счетах пользователей. Таким образом, более высокие шансы сгенерировать следующий блок получает узел с большим балансом. Преимущества PoS по отношению к PoW: намного более скромные требования к вычислительным ресурсам, а также отсутствие нареканий по поводу "потраченных впустую" мощностей. Для активации PoS-майнинга необходимо определенное количество коинов положить на депозит. после чего необходимо держать локальный кошелек активным, то есть стать нодой сети. Использование депозитов характерно для всех поздних вариаций этой разновидности консенсуса. Депозит выполняет роль залога, который мошенник потеряет при попытке реализации повторной траты.

Делегированное подтверждение доли (от англ. Delegated proof of stake, DPoS – дословно: делегированное доказательство доли) - альтернативный механизм консенсуса, разработанный Дэниелом Ларимером в 2014 году, существенно отличается от Proof-of-stake. В DPoS верификацию выполняют особые валидаторы транзакций, которых посредством голосования выбирают держатели альткоинов. Эти валидаторы в итоге формируют блоки. Удельный вес голоса каждого участника голосования определяется суммой его активов. Если возникают сомнения, назначаются новые выборы. Если значительная часть валидаторов выходит из строя, их перевыбирают. Данный подход обеспечивает высокую устойчивость сети. С одной стороны, DPoS является децентрализованным механизмом, поскольку все пользователи в сети участвуют в выборах валидаторов. Однако, тот факт, что все решения принимает небольшая группа, говорит о его централизованном характере. В целях усиления децентрализации практические реализации DPoS поддерживают постоянный процесс голосования и систему микширования, с помощью которой выбираются случайные валидаторы. Эффективность алгоритма увеличивается в результате выбора ценных для сети участников и в удалении бесполезных, поэтому важен высокий уровень активности избирателей. DPoS используется такими альткоинами, как Lisk, Steemit, Minter, EOS, RaiBlock, Cardano, и BitShares.

Арендованное подтверждение доли (от англ. Leased Proof Of Stake, LPoS – дословно: арендованное доказательство доли владения) - альтернативный механизм консенсуса, основанный на аренде собственных средств более крупным узлам, которые, в свою очередь, делятся с их владельцем вознаграждением. Является улучшенной версией алгоритма консенсуса Proof of Stake. Например, в LPoS-платформе Waves Platform участники могут сдавать свои альткоины в лизинг полным нодам. Чем больше баланс, сдаваемый в аренду, тем выше вероятность того, что узел-арендополучатель будет выбран для создания нового блока. Если это происходит, лизингодатель получит процент от вознаграждения, полученного полной нодой. В Leased Proof-of-Stake среде, участники для получения награды могут выбрать либо активацию полной ноды, либо передачу своих коинов в лизинг другим полным нодам. Этот алгоритм позволяет каждому пользователю поучаствовать в поддержке сети.

Подтверждение важности (от англ. Proof of Importance, PoI – дословно: доказательство важности) - альтернативный механизм консенсуса, являющийся еще одной разновидностью механизма консенсуса PoS. Метод proof of importance отличается от классического метода PoS тем, что учитывается не только баланс, но и репутация участника, включая его активность. Такой подход мотивирует участников проявлять активность, выполняя транзакции. Примером альткоина, эксплуатирующего данный принцип, является криптовалюта Nem.

Доказательство активности (от англ. Proof of Activity, PoA – дословно: доказательство активности) - гибридный механизм консенсуса, сочетающий доказательство выполненной работы и доказательство доли. В этом варианте консенсуса PoW используется в целях эмиссии, а PoS служит для обеспечения дохода от депозита. С помощью PoA можно повысить безопасность системы. Даже участник, владеющий 50% хешрейта не сможет злоупотребить генерацией новых блоков, так как теперь ему еще понадобится обладание 50%-ной долей коинов. Алгоритм PoA применяется в криптовалютах Oracles Network, Nxt.

Доказательство вместимости (от англ. Proof of Capacity, PoC – дословно: доказательство ресурсов) - популярный механизм консенсуса, основанный на предоставлении дискового пространства – ресурса, которым в той или иной сфере обладают практически все. Разновидностями Proof of Capacity является алгоритм Proof of Space и Proof of Storage. PoC — это буквальная реализация концепции "гигабайты как ресурсы". Для получения награды, нужно поделиться ресурсами накопителя на жестких магнитных дисках. Децентрализованное использование мощностей вычислительных систем сулит очень большие перспективы. Подобные методы позволяют решить проблему "бессмысленного" потребления энергии, характерной для PoW. Proof of Storage — это родственный алгоритм с той лишь разницей, что гигабайты используются в качестве облачного хранилища данных. Майнинг на постоянных носителях используется в блокчейне криптовалюты BurstCoin.

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

Сегодня наиболее успешным представляется механизм консенсуса в виде доказательства работы (во многом благодаря тому, что большая часть криптовалют является по сути форками Биткоина), однако уже в обозримом будущем на первое место могут выйти гибридные варианты PoW + PoS.

Автономная верификация транзакций

Цель: Сформировать общее представление об автономной верификации транзакций, рассмотреть регламент, согласно которому тестируется каждая доставленная на узел транзакция.

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

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

  • Корректность структуры данных, контрольных сумм, синтаксиса всех элементов транзакции.
  • Списки входов и списки выходов должны содержать корректные данные.
  • Размер транзакции в байтах не должен превышать установленного значения параметра MAX_BLOCK_SIZE (в байтах).
  • Баланс каждого выхода, а также суммарное значение по всем выходам, должны находиться в пределах допустимого диапазона значений (меньше 21 000 000 и больше 0 BTC).
  • Каждый вход должен иметь значение хеш отличное от нуля.
  • Сoinbase-транзакции не ретранслируются.
  • Значение поля nLockTime должно быть меньше или равно установленного значения параметра INT_MAX.
  • Размер транзакции должен быть больше или равен 100 байт.
  • Число подписей, содержащихся в транзакции, не должно превышать соответствующего лимита для данного типа сделки.
  • Разблокирующий сценарий (scriptSig) может только помещать числа в стек, а блокирующий сценарий (scriptPubkey) должен соответствовать ограничениям функции isStandard().
  • Соответствующая транзакция размещается в пуле или в блоке основной ветви.
  • Транзакция признается недействительной, если хотя бы для одного входа соответствующий выход упомянут в любой другой транзакции пула.
  • Циклически проверяются все входы транзакции. На каждой итерации анализируется растрачиваемый выход, если указанная во входе транзакция отсутствует и в блокчейне, и в пуле транзакций, тогда полученная узлом транзакция признается бесхозной и помещается в сиротский пул.
  • Циклически проверяются все входы транзакции. На каждой итерации анализируется растрачиваемый выход, если указанная во входе транзакция является coinbase-транзакцией, отдельно проверяется число ее подтверждений. Оно должно быть не меньше чем установленное значение параметра COINBASE_MATURITY (100 блоков в настоящее время).
  • В каждом входе транзакции должен фигурировать реально существующий выход, и этот выход не должен быть растрачен.
  • Баланс каждого входа, а также суммарное значение по всем входам, должны находиться в пределах допустимого диапазона значений (меньше 21 000 000 и больше 0 BTC).
  • Транзакция признается недействительной, если сумма входов меньше суммы выходов.
  • Транзакция отклоняется, если комиссионные, предусмотренные за транзакцию (разница между суммами входов и выходов), окажутся слишком маленькими, даже чтобы попасть в пустой блок.
  • Разблокирующий сценарий для каждого входа должен верифицироваться относительно соответствующего блокирующего сценария, расположенного в выходе растрачиваемой транзакции. Если возникают нестыковки, транзакция признается недействительной.

Для верификации предусмотрены следующие функции, прошитые в исходном коде эталонного клиента Bitcoin Core: AcceptToMemoryPool, CheckTransaction, и CheckInputs.

Разумеется, условия проверки и параметры критериев отнюдь не являются догмами. Появляются новые виды угроз, в систему вводятся новые типы транзакций – все эти изменения находят свое отражение в процедуре верификации.

Автономно проверяя каждую полученную по сети транзакцию (вплоть до ее дальнейшей ретрансляции), каждая нода строит пул действительных (но пока еще неподтвержденных) транзакций. Этот пул часто называют пулом транзакций (transaction pool), пулом памяти (memory pool) или просто - mempool.

Узлы для майнинга

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

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

Создание блоков

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

После проверки нода добавляет транзакцию к пулу транзакций, в котором последняя будет дожидаться своей очереди на включение в формируемый блок. Вернемся к нашему примеру с покупкой Мариной чашки кофе у Сергея за биткоины и проследим как эта сделка была отражена в блокчейне. Транзакция Марины была включена в блок высотой 566 017. Предположим, что именно мы оказались теми счастливчиками, которым удалось первыми найти решение задачи обеспечения консенсуса для данного блока, т.е., этот блок был найден на нашем майнинговом узле. Каким образом транзакция Марины оказалась в блокчейне? Постараемся проиллюстрировать изменения состояния реестра, несколько упрощая действительность за счет незначительных допущений. Во-первых, отметим, что контролируемый нами майнинговый узел поддерживает собственную локальную копию блокчейна. В тот момент, когда Марина оплатила биткоинами свой напиток, общая высота блокчейна равнялась 566 015 (такой же высоты была и наша локальная версия). Конкурируя с другими майнерами, мы напряженно трудились над созданием кандидата на блок с высотой 566 016. Для этого наша нода прослушивает сеть, собирает распространяемые от узла к узлу транзакции, пытается из них построить новый блок и следит за появлением новых блоков, сформированных иными майнерами. Получение блока 566 016 для нас означает, что мы проиграли текущий раунд и надо начинать новый. Все предыдущие 10 минут (примерно), в течение которых программное обеспечение нашей ноды искало доказательство выполненной работы для блока 566 016, параллельно в пуле памяти накапливались успешно прошедшие верификацию транзакции. Их число может варьироваться от нескольких сотен до нескольких тысяч. После получения блока 566 016 и его верификации (проверки найденного доказательства работы) наша нода инспектирует все транзакции в пуле памяти и удаляет из него дубликаты транзакций, попавших в новый блок. Оставшиеся после удаления транзакции остаются пока еще неподтвержденными, стоящими в виртуальной очереди на включение в следующий блок. Наша нода автоматически создает заготовку под новый блок. Накопленных в пуле транзакций вполне хватает на его заполнение, кроме этого рассчитываются все обязательные параметры блока, включая его заголовок. Пока статус сформированной структуры данных - всего лишь кандидат на блок. И таким он будет оставаться до тех пор, пока не будет найдено действительное доказательство выполненной работы. Причем сделать это нам нужно обязательно самыми первыми.

Приоритет транзакций и комиссионные

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

Приоритет транзакции рассчитывается как сумма стоимости и давности входов, отнесенная к общему размеру транзакции:

приоритет = ∑(стоимость на входе x возраст входа) размер транзакции

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

Приоритет транзакции считается высоким, если его значение превышает 57 600 000.

Что эквивалентно приоритету одного BTC (100 000 000 сатоши), возрастом в один день (144 блока или подтверждения), с итоговым размером транзакции равным 250 байт:

Высокий приоритет ≥ 100 000 000 сатоши x 144 блока 250 байт = 57 600 000

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

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

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

Все не попавшие в блок транзакции остаются в пуле памяти до начала следующего цикла создания нового блока.

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

Возвратимся к нашей майнерской ноде, успевшей к этому моменту времени выполнить практически весь объем работы. Программное обеспечение узла подготовило кандидата на роль нового блока с высотой 566 017. Блок-кандидат вобрал в себя данные 379 транзакций, сумма комиссионных составила 0,06609689 BTC (подробную информацию о блоке можно увидеть, воспользовавшись любым обозревателем блокчейна сети Биткоин, например, https://www.blockchain.com/ru/btc/block-height/566017).

Базовая транзакция

Цель: Сформировать общее представление о структуре базовой транзакции блока.

Немногим ранее мы упомянули, что блок с высотой 566 017 содержит 379 транзакций. На самом деле это не совсем так. В нем действительно 379 транзакций, фиксирующих сделки с BTC и полученных по сети Биткоин, но есть еще одна – базовая или coinbase-транзакция. Именно она автоматически создается программным обеспечением для каждого нового блока и добавляется в него первой. Кроме того, с ее помощью происходит эмиссия новых биткоинов. И, разумеется, нельзя забывать про награду, которая полагается майнеру. С помощью coinbase-транзакции ровно 12,56609689 BTC отправляются на биткоин-адрес майнера. 12,5 BTC – вознаграждение за новый блок и 0,06609689 BTC – общая сумма комиссионных за обработку транзакций, вошедших в блок. Упрощенная структура базовой транзакции продемонстрирована на рисунке 34.

Структура базовой транзакции

Рис. 6.2. Структура базовой транзакции

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

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

Сумма комиссионных= ∑Входов - ∑Выходов

Затем программное обеспечение вычисляет размер выплаты за создание нового блока. Как известно, вознаграждение майнерам уменьшается ровно в два раза через каждые 210 000 блоков (раз в четыре года). Для расчета корректной величины в эталонном клиенте Bitcoin Core предусмотрена функция GetBlockSubsidy().

И, наконец, вознаграждение за блок суммируется с комиссионными за транзакции.

Структура базовой транзакции

Структура входа coinbase-транзакции представлена в таблице ниже.

Структура входа coinbase-транзакции
Размер Поле Описание
32 байта Хеш-дайджест более ранней транзакции Все биты равны нулю. Не является ссылкой, поскольку ссылаться не на что
4 байта Номер выхода Все биты равны единице. 0xFFFFFFFF.
От 1 до 9 байт Размер данных Coinbase Длина данных coinbase: от 2 до 100 байт
От 2 до 100 байт Данные Coinbase Произвольные данные, используемые для дополнительного одноразового числа и тегов майнеров в версии №2 блоки должны начинаться с высоты блока
4 байта Номер последовательности Все биты равны единице. 0xFFFFFFFF.

Инициализация первых двух полей представляется совершенно естественной, поскольку никакие нерастраченные выходы в coinbase-транзакции не используются. Поэтому вместо хеша несуществующей транзакции используются нули, а вместо номера выхода – десятичное число 255.

Вместо поля "Разблокирующий сценарий" (не имеющего никакого смысла в случае порождающей транзакции) появляется поле, содержащее данные, используемые майнерами. Например, в блоке генезиса в этом поле находится фраза "The Times 03/Jan/2009 Chancellor on brink of second bailout for banks". Обычно, майнеры помещают в него собственное имя, имя майнинг пула или что-то еще.

Данные Coinbase

В отличие от обычных транзакций базовые не содержат разблокирующих скриптов (scriptSig). Однако это место в структуре транзакции не пропадает даром. Оно предоставлено для хранения почти произвольных данных размером от 2 до 100 байт. За исключением нескольких первых байтов, остальная часть данных coinbase может использоваться майнерами по их усмотрению. В настоящее время майнеры чаще всего записывают в это поле расширение значения параметра Nonce или идентификатор майнинг пула.

Проблема состоит в том, что в некоторых случаях подходящее значение параметра Nonce (при котором хеш блока меньше величины target) просто не находится. Фактически единственное поле, в котором майнер может что-то добавить произвольно – это Данные Coinbase. Для решения задачи поиска доказательства работы в этом случае ему достаточно дописать какое-то число в это поле и менять его, если для сложившегося заголовка не удается подобрать подходящее значение Nonce.

В соответствии с BIP0034 блоки второй версии должны содержать идентификатор высоты блока в начале поля с данными Coinbase. Пусть записанное там значение равняется 0x03113с3807858407067f503253482f (в шестнадцатеричном формате). Разберемся, что именно это означает.

Первый байт 03 специальная команда, которая помещает следующие три байта в программный стек. Эти байты представляют собой высоту текущего блока, представленную в порядке от младшего байта к старшему (little-endian)

Следующие три байта, 113с38, если переписать их в обратном порядке составят шестнадцатеричное число 0x383с11, в десятичной системе счисления равное 566 017 (высота блока). Следующая группа шестнадцатеричных цифр (07858407067) послужила расширением параметра Nonce при решении задачи поиска консенсуса. Оставшаяся часть данных отражает тот факт, что наша нода, сумевшая найти решение задачи доказательство выполненной работы, поддерживает транзакции типа pay-to-script-hash (P2SH). В кодировке ASCII код 2f503253482f соответствует строке /P2SH/. Делать последнее в настоящее время совсем необязательно, но программное обеспечение многих нод продолжает наследовать этот анахронизм времен междоусобной борьбы двух конкурирующих предложений по улучшению Биткоина: BIP0016 и BIP0017.

Конструирование заголовка блока

Цель: Сформировать общее представление о процессе конструирования заголовка блока.

Мы уже отчасти касались вопросов строения заголовка блока (Таблица 5.2). Пришла пора разобраться подробнее с тем как указанная структура заполняется данными.

Как только наша нода закончила с транзакциями в блоке-кандидате 566 017, начинается процесс формирования его заголовка. В соответствующее поле записывается номер версии блока – 2. Непосредственно в структуре данных версия хранится как четырех байтовое значение в фомате little-endian, т.е. 0x02000000. Затем заполняется поле "Хеш предыдущего блока" (т.е., блока с индексом высоты = 566 016). В нашем примере это - 0000000000000000001ce2dbd9013f0fbe8a2c44574efe56712e6f9a4205c69e.

Важнейшей составляющей следующего шага является построение дерева Меркла. Базовая транзакция учитывается в иерархии как первая вершина-лист. После нее добавляются еще 379 транзакций. Мы получаем четное общее число транзакций, следовательно, беспокоиться о сбалансированности дерева в нашем случае не приходится. Согласно ранее рассмотренной процедуре мы строим дерево Меркла, а значение его корня заносится в соответствующее поле заголовка. Для блока 566 017 хеш корня дерева Меркла равен e7dfbbad942b4f2dfa78363950f47a618f0e56e976c4fb107b35bfe56d322c7d (размер ровно 32 байта).

Затем наша майнинг нода задает дату и время создания блока (в формате ОС Unix) в поле временная метка (4 байта). Кстати, это очень удобный формат для хранения больших массивов временных отметок, требующий очень мало места (4 или 8 байт, в зависимости от размера машинного слова). Это время также называют "эрой Unix".

Эра UNIX – временная отметка, отсчитываемая, начиная с полночи (по UTC) 31 декабря 1969 года на 1 января 1970 года.

В нашем случае это будет 1551941962 секунды.

После этого определяется целевое значение (вычислительная сложность) алгоритма доказательства работы для данного блока (target). Для блока с индексом высоты 566017 целевое значение (Bits) = 38891400010. На самом деле сложность хранится в формате битовой экспоненциальной записи, причем сначала идет однобайтный порядок, а затем располагается трехбайтная мантисса (коэффициент). Сложность в платформе Биткоин меняется через каждые 2016 блоков (2 недели).

Для нашего примера 38891400010 = 0x172e5b50. Первый байт (порядок) = 0x17, коэффициент = 0x2e5b50. Пока ограничимся этим набором сведений. Чуть позже обязательно вернемся к этому важнейшему вопросу.

Последнее оставшееся незаполненным поле случайного счетчика Nonce устанавливаем в ноль.

Сформированная "заготовка" для нового блока представлена на рисунке 6.3. Теперь мы готовы приступить непосредственно к майнингу.

Блок-кандидат на этапе готовности к майнингу

увеличить изображение
Рис. 6.3. Блок-кандидат на этапе готовности к майнингу

Майнинг блока

Цель: Сформировать полное понимание сути и механизма поиска доказательства работы в сети Биткоин, сформулировать основные параметры майнинга - целевая сложность и сложность майнинга.

Как нам уже известно, майнинг позволяет решить две основные задачи:

  • В конкурентной борьбе определяется майнинг нода, которой в текущий момент (т.е., временно) платформой Биткоин делегируется право добавления очередного блока в блокчейн. Так реализуется механизм достижения консенсуса в одноранговой сети.
  • Осуществляется эмиссия новых биткоинов, судьбой которых распоряжается майнер, сгенерировавший новый блок. Так осуществляется стимулирование активности пользователей, обеспечивающих работу внутренних механизмов самой платежной системы.

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

Для решения первой задачи применяется хорошо известный нам механизм под названием Proof of Work - доказательство выполненной работы.

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

С точки зрения обычного майнера майнинг - это процесс многократного хеширования заголовка блока до тех пор, пока полученный дайджест не примет определенный вид. Невозможно рассчитать нужный дайджест заранее (пока не будет собран предыдущий блок). Так же, благодаря односторонности хеш-функций, нельзя под желаемый дайджест рассчитать значения полей заголовка. В результате, единственным способом нахождения хеша, отвечающего заданной цели, является изнурительный перебор единственного варьируемого параметра заголовка блока - Nonce. При этом, по мере уменьшения целевого значения, вычислять "правильный" хеш становится все труднее и труднее. Увеличение длины нулевой последовательности в начале записи хеша всего на 1 бит приведет к экспоненциальному росту времени на решение задачи. Фиксация всего лишь одного разряда в 256-битном пространстве хешей приводит к сокращению числа возможных решений ровно в два раза.

Nonce – случайное число, записываемое в заголовок блока. Собственно, сугубо практическим результатом майнинга, как состязательного процесса в среде майнеров за право включить новый блок транзакций в блокчейн, и является подбор такого значения в поле Nonce, что рассчитанный по заголовку блока хеш окажется меньше определенной величины Target. Говоря иначе, мы должны получить хеш блока, начинающегося с заданного числа нулей. Значение Nonce изменяется простым увеличением текущего значения (все начинается с 0) на 1 при каждой новой итерации поиска.

Целевая сложность (от англ. Difficulty Target, также используются термины difficulty Bits или просто Bits) - максимально возможное значение хеш блока. Фактически задает число нулевых битов в двоичной записи рассчитываемого хеша.

Целевую сложность довольно часто называют Target. Здесь важно не запутаться. Собственно Target - это числовая величина, значение параметра, в то время как Bits – принятый в протоколе Биткоин формат хранения этого числа в заголовке блока (первый байт - порядок (order), cледующие три байта - мантисса (mantissa)). Получить Target из Bits можно воспользовавшись формулой:

Target= mantissa * 2(8 * (order - 3))

Сложность майнинга или просто сложность (от англ. Bitcoin Difficulty – сложность сети Биткоин, также используется сокращение Difficulty) - характеристика сложности решения задачи доказательства выполненной работы (майнинга).

Сложность майнинга вычисляется как отношение максимально возможного значения Target (Max_Target), использованного при создании блока генезиса в январе 2009 года, к актуальной в текущий момент времени величине Target (Current_Target).

Difficulty = Max_Target/Current_Target
 
Max_Target = 0x00000000ffff00000000000000000000000000000000000000000000000 
00000 (или 0x1d00ffff в формате bits).  

Для нашего примера получаем такие значения:

Current_Targe = 0x0000000000000000002e5b5000000006e4a2dd31200ae139ae7ac000 
00000000; 

Difficulty = 6 071 846 049 920,75. 

Т.е., мы видим, что найденный майнером хеш блока должен начинаться минимум с 18 нулей в шестнадцатеричном формате.

Параметры Difficulty и Target связаны обратной связью - чем выше сложность (Difficulty), тем меньше Target (больше нулей в начале искомого хеша).

Мы немного нарушили последовательность шагов. В реальных системах, сначала рассчитывается Bitcoin Difficulty (сложность майнинга), а затем, исходя из сложности, вычисляется текущее значение Target.

Начальная сложность (Difficulty) в момент начала работы сети Биткоин равнялась 1. Однако, одновременно с увеличением хешрейта сети требуется увеличивать и сложность майнинга, таким образом, чтобы создание нового валидного блока происходило в среднем один раз в 10 минут.

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

Отношение запланированных 20 160 минут к реально затраченному на майнинг времени и является корректирующим коэффициентом, изменяющим сложность майнинга. Т.е., новое значение сложности (New Difficulty) вычисляется по следующей формуле:

New Difficulty = Old Difficulty * (20160 / Actual Time)

Где Actual Time – время (в минутах), потраченное на добавление в блокчейн последних 2 016 блоков.

Затем, исходя из рассчитанного значения New Difficulty, вычисляется новая величина Target по формуле:

Target = Max_TargetNew_Difficulty 

Рисунок 6.4 позволяет наглядно представить динамику изменения сложности майнинга в течении всего времени работы сети Биткоин.

Сложность Майнинга

увеличить изображение
Рис. 6.4. Сложность Майнинга

На сегодняшний день Биткоин является наиболее вычислительно мощной сетью, использующей доказательство выполнения работы. В течение одной секунды майнеры этой платформы вычисляют более двадцати квинтиллионов криптографических функций. 30-битные доказательства, соответствующие минимальной сложности, наблюдались только на заре становления сети. Одновременно с ростом хешрейта сети увеличивалась и сложность — на начало марта месяца 2019 года сложность одного доказательства составляла порядка 74 бит. Соответственно, хеши новых блоков должны начинаться с 18 нулей в шестнадцатеричном представлении.

Но вернемся к нашей работающей майнинг ноды. Пусть нам повезло и через некоторое время (кстати, довольно любопытный момент, поскольку на самом деле блок #566017 в реальной сети Биткоин был найден в течение всего лишь 67 секунд) после начала майнинга, удалось подобрать подходящее значение Nonce, при котором хеш блока-кандидата с индексом высоты равным 566 017 оказался меньше Target. Мы нашли правильное решение задачи поиска консенсуса и сделали на данном этапе это первыми. Найденное значение параметра Nonce = 1 864 204 227 (см. Рисунок 6.5).

Новый блок, полностью готовый к отправке в сеть

увеличить изображение
Рис. 6.5. Новый блок, полностью готовый к отправке в сеть

Рассмотрим, как процесс изменения состояния блокчейна протекает далее. Нода, верно решившая задачу поиска доказательства выполненной работы, должна предъявить его всем остальным участникам сети. Механизм трансляции найденного блока напоминает процедуру распространения транзакций. Нода отправляет его по списку IP-адресов своих контрагентов. Узлы сети Биткоин, получив блок, верифицируют его и в случае положительного результата проверки ретранслируют его далее по адресам из своих списков. По мере распространения нового блока по сети каждый узел добавляет его в собственную локальную копию блокчейна. Разумеется, высота локальных блокчейнов достаточно быстро выравнивается и становится такой же, как и у нашей ноды - 566 017. Если получателем оказывается майнинговая нода, то убедившись в валидности нового блока, она заканчивает текущий цикл поиска доказательства выполнения работы и активирует новый.

Решение Extra Nonce

Разработчики протокола Биткоин безусловно проявили чрезвычайно высокий уровень проработки технический решений. Однако и им не удалось избежать ряда недочетов, которые пришлось исправлять уже после ввода системы в действие. Одно из таких фундаментальных ограничений исходной архитектуры в полной мере проявило себя к 2012 году.

До этой временной вехи майнеры всегда находили нужный хеш, используя 32-битное пространство параметра Nonce. Однако, с ростом сложности майнинга все чаще и чаще стали возникать ситуации, когда перебор всех 4 294 967 296 возможных значений Nonce не приводил к положительному результату. Для решения проблемы майнеры прибегали к обновлению временной метки блока с учетом затраченного на поиск времени. Менялся еще один параметр заголовока блока, следовательно, появлялась возможность заново запустить цикл поиска хеша заданного вида, варьируя параметром Nonce.

Все понимали, что это временная мера и вззможности данного подхода были практически исчерпаны к моменту, когда мощность майнингового оборудования превысила 4 GH/сек. Такая вычислительная мощность позволяет перебрать все пространство значений Nonce за секунду. Возможности современных ASIC-микросхем покрывают диапазон 8–14 GH/сек. Работоспосбность платформы оказалась под угрозой, ее восстановление потребовало расширения пространства Nonce. Благо соответствующая возможность для этого нашлась в традиционной структуре блока, а, именно, в сoinbase-транзакции, позволяющей хранить до 100 байт данных. Именно, поле Данные Coinbase майнеры стали использовать для дополнения Nonce. Поскольку базовая транзакция фигурирует в дереве Меркла, любое ее изменение приводит к изменению хеша корня дерева Меркла, являющегося частью заголовка. Расширенный Extra Nonce включает 8 байт из сoinbase-транзакции в дополнение к 4 байтам стандартного Nonce. В результате майнеры получают возможность работать с пространством в 296 значений, при этом больше нет необходимости манипулировать временной меткой блока.

На будущее отметим, что в coinbase-транзакции осталось еще достаточно места для расширения Nonce.

Независимая верификация новых блоков

Цель: Сформировать общее представление о независимой верификации новых блоков, рассмотреть регламент, согласно которому тестируется новый блок.

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

Такая проверка гарантирует:

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

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

Получившая новый блок, полная нода выполняет его тщательную многокритериальную проверку. В эталонном клиенте Bitcoin Core для этих целей предусмотрены следующие функции: CheckBlock() и CheckBlockHeader(). Обратите внимание, что проверить найденное доказательство выполненной работы не представляет никакой сложности.

Основные критерии верификации нового блока:

  • Структура блока является стандартной (соответствует зафиксированной в протоколе Биткоин).
  • Хеш заголовка блока меньше, чем целевая сложность Target.
  • Временная метка блока попадает в определенный временной диапазон – окно допуска.

Поясним данное требование чуть подробнее (см. Рисунок 6.6). У окна допуска имеются две границы:

нижняя tmin равная медиане временных меток одиннадцати блоков, непосредственно предшествующих проверяемому;

верхняя tmax равная значению времени сети t0 смещенному на 2 часа (t0 + 120 минут).

Временной диапазон для проверки временной метки блока

Рис. 6.6. Временной диапазон для проверки временной метки блока

Значение временной метки блока сравнивается со временем сети t0 - медианным временем соседей узла (а не с его системным временем). Точнее, время сети t0 вычисляется следующим образом:

Время сети t0 = Собственное системное время + медианное отклонение 

где медианное отклонение есть медиана отклонений собственного системного времени узла от системного времени каждого его соседа.

  • Размер блока не превышает допустимые пределы.
  • Первая транзакция (и только она одна) является coinbase-транзакцией.
  • Вход coinbase-транзакции является корректным и имеет стандартную структуру.
  • Каждая транзакция внутри блока проверяется в соответствии с процедурой, описанной в параграфе "Автономная верификация транзакций".

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

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

Включение блока в бокчейн, ветвление цепочек

Цель: Сформировать общее представление о решении проблемы случайных форков путем выбора цепочки с наиболее убедительным доказательством выполненной работы.

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

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

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

Случайные форки, отличающиеся всего лишь одним блоком, являются довольно распространенным явлением. Они образуются, если несколько майнинг нод создают валидные блоки практически одновременно. Остальные узлы расширяют свои локальные копии блокчейна за счет блока, полученного первым. Обычно на уровне уже следующего блока одна из цепочек становится длиннее и признается всей сетью в качестве основной. За блоки, не являющиеся частью основной цепочки, награда майнерам не назначается. Их называют "orphan-блоки" или "орфаны" (от англ. orphan - сирота). Поскольку у каждого блока может быть только один родитель, возможности объединить две различные цепочки не существует.

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

Предположим, что два майнера находят решение блока 562 630 примерно в одно и то же время. Около 60% узлов сети получили новый блок от первого майнера (назовем этот форк М1), а оставшиеся – от второго (М2). Сложившаяся ситуация не является критичной, поскольку механизм децентрализованного консенсуса поможет нам ее благополучно разрешить. Если кто-то и пострадает в итоге, то только один-два майнера, которые не получат вознаграждения за созданные блоки, и, возможно, чья-то транзакция будет проведена с небольшой задержкой. Мы имеем дело с типичным случайным форком. Оба найденных блока являются абсолютно честными, валидными и легальными. В течение получаса майнеры, продолжающие форк М1, сумели добавить в свою цепочку еще 2 блока, а майнерам, работающим с ответвлением М2, повезло больше – им удалось найти целых 3 блока. Ситуация с форками визуализирована на рисунке 6.7.

Конкуренция случайных форков

увеличить изображение
Рис. 6.7. Конкуренция случайных форков

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

Блок, найденный первым майнером, в блокчейн в итоге не попал. Он остался без родителя, ему оборвали его родственные связи, поэтому такой блок называют сиротским. Два следующих блока тоже становятся абсолютно бесполезными. Их называют "Stale blocks" - брошенные (отцепленные) блоки. Это плохая новость для нашедших их майнеров. Orphan и Stale-блоки часто путают, даже в серьезной литературе.

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

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

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

Orphan (сиротский блок) - блок, у которого в основной цепочке блокчейна Биткоина отсутствует родитель. Создавший Orphan-блок майнер вознаграждение не получает.

Stale (потомок сироты) - блок, не включенный в основную цепочку блокчейна Биткоина в виду того, что его родителем (или предком) является Orphan-блок. Т.е., любой блок в форке, расположенный после сиротского. Создавший Stale-блок майнер вознаграждение не получает.

В обозревателе сети Биткоин https://www.blockchain.com/ru/btc имеется специальный инструмент, позволяющий отслеживать появление сиротских блоков - https://www.blockchain.com/ru/btc/orphaned-blocks:

Отслеживание сиротских блоков с помощью https://www.blockchain.com/ru/btc/orphaned-blocks

Рис. 6.8. Отслеживание сиротских блоков с помощью https://www.blockchain.com/ru/btc/orphaned-blocks

Кстати, в платформе Ethereum вместо Orphan и Stale-блоков используется понятие Uncle-блока. Так вот за создание Uncle-блока майнеру выплачивается вознаграждение, хотя сумма будет несколько меньше, по сравнению с наградой за нормальный блок.

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

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

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

Майнинговые пулы

Цель: Сформировать общее представление о видах и принципах работы майнинговых пулов.

Экспоненциальный рост числа людей, занимающихся майнингом, привел к тому, что одиночная добыча (solo mining), в том числе, с использованием мощных видеокарт и специальных процессоров ASIC постепенно становится все менее эффективной. Даже обладатели огромных ферм, оснащенных топовым оборудованием, убеждаются в том, что майнинг вне пула вынуждает их постоянно обновлять вычислительные устройства, выбирая каждый раз все более и более мощные. Причем внезапное изменение алгоритма вычисления доказательства мгновенно сделает очень значительные вложения просто бессмысленными. Вероятность получения вознаграждения для компенсации затрат на электроэнергию и оборудование для майнера-одиночки настолько мала, что соло майнинг в какой-то момент уподобился игре в лотерею. Если попытаться рассчитать вероятность успеха для соло майнинга, результаты будут просто плачевными. Суммарная мощность платформы Биткоин в первом квартале 2019 года балансирует в диапазоне 40-50 эксахэш в секунду. Даже если Вы обладаете самым мощным устройством для соло-майнинга — ASIC-майнер Antminer S9j от Bitmain (выдает порядка 14.5 TH/s хешей в секунду), Ваша доля в сети окажется меньше 0,00001%. С таким хэшрейтом поиск всего лишь одного блока может занять несколько тысяч лет. В результате осмысления современных трендов в добыче криптовалюты появились специальные объединения майнеров, получившие название пулов. Вычислительные мощности участников пула аккумулируются, что значительно повышает шансы на создание очередного блока. Каждый участник в рамках выделенного ему фронта работы способствует скорейшему решению общей задачи. Когда пулу, благодаря совместным усилиям его участников, удается найти новый блок, он получает вознаграждение, которое впоследствии распределяется между всеми участниками пула пропорционально их вкладу в общее решение. Регулярные выплаты, получаемые майнером от пула, помогают ему растянуть фактические сроки амортизации оборудования и установить достаточно комфортный (прогнозируемый) режим компенсации расходов на электроэнергию. Даже в этом случае аппаратура для майнинга скорее всего устареет в течение полугода. Однако, все это время майнер будет получать регулярный и стабильный доход. Разумеется, успешный майнинг возможен только в пуле с весьма внушительным хешрейтом, поскольку только в этом случае шансы опередить других участников сети в борьбе за право добавить блок будут высокими.

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

Майнинговые пулы, используя специализированные протоколы (такие как Stratum, GetBlockTemplate, BetterHash), способны координировать деятельность сотен и даже тысяч майнеров. Создав учетную запись, майнер настраивает свое оборудование под специфику конкретного сервера пула. Вклад каждого майнера оценивается с учетом произведенных "долей" (share). Как только какая-либо из долей достигнет цели, пул формирует блок и в дальнейшем действует уже от своего имени. Если новый блок будет принят сетью, участники пула получат вознаграждение, рассчитанное, исходя из действующей системы распределения награды. При определении размеров выплат учитываются все сгенерированные хеши, соответствующие установленной для каждого майнера целевой сложности. Этот внутренний показатель сложности существенно проще (как правило, не менее чем в 1000 раз) сложившейся на данный момент сложности майнинга сети Биткоин. Благодаря этому даже майнеры, обладающие слабым оборудованием и в принципе не способные в одиночку добыть ни одного блока, работая в пуле имеют возможность получать доход.

Устанавливая достаточно низкую сложность для добывания доли, пул получает возможность измерять объем работы, реально проделанной каждым майнером и на основе этого справедливо распределять, если кому-то из участников удастся создать блок. Т.е., по сути майнинг пул строится на тех же принципе консенсуса что и сама сеть Биткоин. Генерируя более простые решения, каждый майнер доказывает, что им была проделана определенная работа по нахождению внутренних хешей. Более того, статистически обоснованно эта работа способствует достижению обшей цели пула – нахождению хеша, значение которого окажется ниже целевого показателя уровня всей сети Биткоин. Если тысяча майнеров пытается решить локальную задачу (причем решение формируется случайным образом), то в какой-то момент времени один из них наверняка решит заодно и глобальную.

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

Как правило, владелец (оператор) пула взимает комиссионные за предоставление своего сервера в общее пользование.

Технологически пулы могут быть реализованы по двум схемам. Первая реализует концепцию сильного центра (по сути – архитектура клиент-сервер ). Протоколы Stratum и GetBlockTemplate по своей природе довольно сильно централизованы, как бы странно это не звучало в отношении майнинга – воплощения децентрализации. В таких пулах используются специальные шаблоны блоков, создаваемые сервером. Причем сервер сам собирает транзакции (включая coinbase), вычисляет хеш корня дерева Меркла, добавляет ссылку на предыдущий блок. Полученный заголовок блока-кандидата отправляется всем участникам пула для работы, которые тут же включаются в борьбу за доли. Вычисленные майнерами хеши отправляются серверу пула.

Приведенная выше схема обладает рядом недостатков. В первую очередь создается определенная угроза базовому принципу платформы – децентрализации. Сосредоточение вычислительных мощностей под контролем одного оператора чревато целым рядом проблем, включая возможности злоупотребления на уровне пула в плане распределения вознаграждения, атака 51%, предоставляющая возможность злонамеренному пулу проводить двойные траты и корректировать транзакции и даже, так называемый, эгоистичный майнинг. Кроме того, в системах с центральным сервером всегда имеется единая точка отказа. А как мы уже знаем, без координации со стороны пула майнеры работать не смогут.

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

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

Альтернативная технология развивается в рамках проекта P2Pool - децентрализованного майнинг пула, развернутого на базе специализированной одноранговой сети узлов - добытчиков криптовалюты (кстати, не только биткоинов, но и таких популярных монет как DASH, Ethereum, Litecoin и др.). P2Pool поддерживает собственную параллельную цепочку блоков (share chain), сложность майнинга которой может подстраиваться так, чтобы новый блок создавался каждые 20-30 секунд.

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

Участники P2Pool должны работать в режиме полной ноды сети Биткоин, чтобы иметь возможность самостоятельно верифицировать транзакции и блоки.

Можно ли майнить вообще не имея собственного оборудования? Оказывается, легко. Для этого существует облачный майнинг.

Облачный майнинг (от англ. Cloud Mining) – это привлечение к добыче криптовалюты вычислительных мощностей специализированных центров обработки данных (облачных технологий). Пользователь арендует часть мощности оборудования и программного обеспечения, установленного в удаленном дата центре.

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

По типу модели обслуживания можно выделить три основных формы облачного майнинга:

  • Программное обеспечение как услуга – аренда прикладного программного обеспечения провайдера, работающего в среде, формируемой облачной инфраструктурой. Такой сервис доступен с помощью различных клиентских устройств или посредством обычного браузера. Администрирование и техническая поддержка основной физической и виртуальной инфраструктуры облака, включая телекоммуникационные сети, серверы, операционные системы и платформы для майнинга, входят в зону ответственности облачного провайдера.
  • Платформа как услуга – аренда виртуального сервера и установка собственных прикладных систем. Обеспечивает более высокий уровень управления ресурсами, телекоммуникационным оборудованием и прикладным программным обеспечением.

Атаки на консенсус

Цель: Сформировать общее представление о возможных атаках на консенсус.

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

Сразу отметим, что все реальные атаки потенциально угрожают только будущему состоянию консенсуса или, в крайнем случае, последнему десятку блоков. Каждый новый блок своим присутствием в блокчейне увеличивает достоверность (неизменяемость) всей предыдущей цепочки. Для организации достаточно "глубокого" форка потребуется такая колоссальная вычислительная мощность, что вероятность его возникновения асимптотически стремится к нулю. Эти соображения позволяют не беспокоиться о целостности и безопасности блоков, давно включенных в блокчейн.

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

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

Самым известным сценарием, угрожающим механизму консенсуса, является "Атака 51%". В сетях, реализующих алгоритм консенсуса Proof of Work именно ключевая роль вычислительной мощности, сосредоточенной на поиске доказательства работы, обуславливает возможность атаки 51%. Если майнеру или пулу майнеров удастся получить контроль над более чем половиной хэшрейта, то они смогут полностью контролировать сеть: добавлять блоки, манипулировать двусторонними операциями, игнорировать новые транзакции, блокировать определенные адреса, выполнять двойные траты.

Отметим, что повторное расходование коинов может быть осуществлено только в рамках собственных транзакций злоумышленника. Если Марина в нашем примере с чашкой кофе решит обмануть Сергея, ей придется сосредоточить более 50% вычислительных мощностей сети в структуре одного пула. Как только в блокчейне появится новый блок, включающий транзакцию Марины с выходом, адресованным Сергею, в дело вступает нечестный пул. Его задача – сначала создать блок на той же высоте, что и блок с транзакцией Марины (начало форка), а затем постараться быстрее остальной сети сгенерировать следующий блок, поверх поддельного, в котором упомянутой транзакции уже не будет, либо те же самые средства будут направлены другому адресату. Если в итоге сеть выберет форк, лоббируемый нечестным пулом, записи о переводе средств за чашечку кофе Сергею от Марины в блокчейне уже не будет. Сергей, не имевший возможности ждать достаточного числа подтверждений платежа (рекомендуется 6 следующих блоков, генерация которых займет около часа), потерял свой товар, а Марина бесплатно им воспользовалась. Интересной особенностью данной схемы является то, что в случае централизованного пула его участники могут даже не подозревать о том, как на самом деле используются их мощности. Описанный пример атаки в виду ничтожности суммы платежа конечно же не имеет никакого экономического смысла. Реализация атаки обойдется гораздо дороже и рассчитывать злоумышленники во главе с Мариной скорее будут на вознаграждение за нахождение новых блоков. Но картина резко меняется, когда речь идет о сделках с большим бюджетом.

Можно выделить два основных способа нивелирования подобных проблем при осуществлении крупных сделок. Во-первых, продавцу рекомендуется дождаться как минимум шести подтверждений прежде чем выполнить свою часть договора. Во-вторых, продавец может прибегнуть к схеме с несколькими подписями, позволяющей реализовать механизм, подобный условному депонированию (ЭСКРОУ).

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

Название "Атака 51%" отражает наличие порогового значения хешрейта, превышение которого означает в теории почти гарантированный успех атаки на консенсус. Однако, на самом деле такого рода атаки проводятся злоумышленниками, обладающими гораздо меньшей вычислительной мощностью. В этом случае вероятность успеха злоумышленных действий, безусловно, снижается, но все равно остается большей нуля. Моделирование показывает, что возможны успешные атаки на консенсус даже, если под контролем злоумышленника находится всего лишь одна треть хешрейта.

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

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

Однако даже лидеры крипторынка не должны расслабляться и надеяться на сосредоточенный в рамках их эко-систем колоссальный хешрейт. В июле 2014 года майнинговый пул Ghash.io в течение некоторого времени обладал контролем над 55% вычислительной мощности платформы Биткоин. Следует отметить, что данный пул добровольно согласился немедленно снизить объем контролируемого хешрейта и в будущем ограничиться пороговым значением в 40%. Кстати, именно в этот период курс биткоина упал на 25%. В августе 2016 года блокчейны сразу двух криптовалют (Krypton и Shift), работающих на основе Ethereum, подверглись атаке 51%. Ответственность за нападение взяла на себя группа хакеров, именующаяся как "Команда 51" ("51 Crew"). Результатом атаки явилась кража 22 000 коинов путем совершения двойных трат.

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

Краткие итоги

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

  • В конкурентной борьбе определяется майнинг нода, которой в текущий момент (т.е., временно) платформой Биткоин делегируется право добавления очередного блока в блокчейн. Так реализуется механизм достижения консенсуса в одноранговой сети.
  • Осуществляется эмиссия новых биткоинов, судьбой которых распоряжается майнер, сгенерировавший новый блок. Так осуществляется стимулирование активности пользователей, обеспечивающих работу внутренних механизмов самой платежной системы.

Форжинг — альтернативный метод добычи криптовалюты, реализующий алгоритм Proof of Stake (доказательство доли).

Хешрейт - суммарная вычислительная мощность задействованного в сети майнингового оборудования. Единицы измерения хешрейта: Хеш/сек (H/s); Килохеш/сек (KH/s); Мегахеш/сек (MH/s); Гигахеш/сек (GH/s); Терахеш/сек (TH/s); Петахеш/сек (PH/s); Экзахеш/сек (EH/s).

Доказательство выполненной работы (Proof of Work) – дословно: доказательство работы) — алгоритм обеспечения безопасности распределенных реестров, защищающий от таких угроз как двойные траты, DoS-атаки, спам-рассылки и т.д. Сущность алгоритма определяется двумя положениями: обязательное решение некоторой вычислительно сложной и длительной по времени задачи; наличие возможности быстрой и легкой проверки результата.

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

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

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

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

Orphan (сиротский блок) - блок, у которого в основной цепочке блокчейна Биткоина отсутствует родитель. Создавший Orphan-блок майнер вознаграждение не получает.

Stale (потомок сироты) - блок, не включенный в основную цепочку блокчейна Биткоина в виду того, что его родителем (или предком) является Orphan-блок. Создавший Stale-блок майнер вознаграждение не получает.

< Лекция 5 || Лекция 6
Вячеслав Конов
Вячеслав Конов

Курс Технология блокчейн и Биткоин

Лекция 1. Раздел: Сравнение процедуры традиционной банковской онлайн транзакции и транзакции в сети Биткоин.

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

Чем в приведенном примере для участников транзакции использование блок-чейн отличается от использования простых электронных кошельков?

Не могу отделаться от ощущения, что блк-чейн - очередная "мода", позвляющая ИТшникам полчать финансирование.

 

Дмитрий Жерлицын
Дмитрий Жерлицын
Украина, г. Донецк, Донецкий национальный университет, 2012
Юрий Игнатов
Юрий Игнатов
Россия, Саратов, Саратовский государственный социально-экономический университет, 2003