Отделенный Свидетель: как удачный хак может существенно увеличить потенциал Биткойна

segregated-witness-part-how-a-clever-hack-could-significantly-increase-bitcoin-s-potentialНа недавнем семинаре по масштабированию Биткойна в Гонконге, было высказано предложение, которое приковало к себе всеобщее внимание. Предложение об “Отделенных Свидетелях” (Segregated Witness) внес разработчик Bitcoin Core Питер Вyйлe (Pieter Wuille). Многие в техническом сообществе ожидают, что “Отделенный Свидетель” позволит в ряде случаев повысить производительность Биткойна, а некоторые даже надеются, что это будет решением проблемы масштабирования, которое поможет вернуть мир в сообщество Биткойна.

Еще раз о том, что такое Биткойн транзакции

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

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

Эти Биткойн транзакции, в некотором смысле, наборы “блокировок”. Более конкретно, каждая транзакция содержит две основных компоненты. Одна эффективно разблокирует биткоины, заблокированные в предыдущих сделках, используя фрагменты данных, называемые входами. Входы включают сценарии – инструкции по разблокировке входов, называемые scriptSigs. Другая состоит из одной или нескольких новых блокировок, называемых выходами, которые вновь блокируют такое же или меньшее количество биткойнов. Выходы включают сценарии, называемые scriptPubKeys. Таким образом, биткойны движутся от входов к выходам в пределах транзакции, в то же время перемещаясь от одной транзакции к другой.

Из этого правила есть одно важное исключение. Coinbase-транзакция (не путать с одноименной компанией провайдером онлайн-кошелька) является транзакцией, созданная майнером, когда он находит новый блок. Она содержит награду майнеру за блок: в настоящее время 25 биткойнов. Вдобавок к этому, майнер может дополнить coinbase-награду любым количеством биткойнов, которые были разблокированы в транзакцииях блока, но не заблокированы вновь: разницей между входами и выходами. Это и есть комиссия за проведение транзакций.

Все эти “разблокировки” и “блокировки” в Биткойне делаются отправителями транзакций, а затем передается по сети Биткойна в качестве пакетов информации. Затем все узлы в сети проверяют, был ли процесс разблокировки и блокировки проведен правильно. Если все было сделано верно, они отправляют транзакции другим узлам. И если узел также является майнером, он может включить транзакцию в блок. Но на самом деле, включение или не включение транзакции в блок – решение, принимаемое майнером. Вот почему имеет смысл добавлять плату за транзакцию, хотя это и не обязательно.

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

Такие правила консенсуса – с которыми соглашаются все узлы – позволяют блокировать (и разблокировать) Биткойн транзакции сразу несколькими различными способами. Но выходы, которые обычно блокируют биткойны, включают scriptPubKey примерно следующего содержания: “Докажите, что вы владеете (или знаете) закрытый ключ, который соответствует открытому ключу, который соответствует вот этому Биткойн адресу“.

Легко воспроизвести открытый ключ, имея закрытый ключ, но практически невозможно воспроизвести закрытый ключ из открытого ключа. Аналогично, Биткойн адрес легко воспроизводится на основе открытого ключа, но невозможно создать открытый ключ имея Биткойн адрес. Точно так же, легко получить Биткойн адрес из закрытого ключа, но невозможно получить закрытый ключ из Биткойн адреса. Это “улица с односторонним движением”.

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

В какой момент появляются сигнатуры?

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

Следовательно, вместо этого, scriptPubKeys обычно требует, чтобы scriptSig включал одну или несколько сигнатур для разблокировки биткойнов.

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

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

Затем, все эти данные транзакции – в том числе, на этот раз, входов – хэшируется вместе, что создает идентификатор транзакции (transaction ID) для конкретной транзакции. Если впоследствии транзакция включается в блок, майнер хэширует идентификатор транзакции вместе с другим идентификаторам транзакции, чтобы произвести новый хэш. И это хэш опять хэшируется, на сей раз вместе с хэшами от двух других идентификаторов транзакций. Процесс продолжается, пока не останется единственный хэш. Такая структура хэшей называется Деревом Меркла, а получившийся единственный хэш Корнем Меркла. Корень Меркла сочетается с дополнительными данными блока для формирования заголовка блока, который используется для идентификации определенного блока. Хэш заголовка блока, в конце концов должен быть включен в заголовок следующего блока. Так создается цепочка блоков, или блокчейн.

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

Что же такое Отделенный Свидетель?

Предложение “Отделенного Свидетеля”, представленное Питером Вуйле в Гонкоге, основывается на концепции, используемой в сайдчейне Elements, разработанном Blockstream, и дополняет идею Сore девелопера Люка Дашжра (Luke Dashjr). Концепция была разработана за предыдущие пару месяцев в сотрудничестве с Грегори Максвелом (Gregory Maxwell) и Эриком Ломброзо (Eric Lombrozo), и может быть реализована в 2016.

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

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

Тем не менее, узлы с поддержкой Отделенного Свидетеля (давайте назовем их “новые узлы”) кое-что заметят. Они увидят как бы бессмысленный текст в scriptPubKey, но не посчитают его совсем уж бессмысленным. Вместо этого, новые узлы признают в таком тексте другой – особенный – тип выхода.

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

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

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

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

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

Чтобы удостовериться, что правильные сигнатуры все-таки встраиваются в блокчейн, майнеры с поддержкой Отделенного Свидетеля должны пойти на уловку. Помимо создания Дерева Меркла из всех транзакций, они также создадут Дерево Меркла из всех Отделенных Свидетелей, параллельное дереву транзакций. А Корень для дерева Отделенного Свидетеля будет включаться в поле ввода транзакции coinbase. А следовательно, Корень Меркла для Отделенного Свидетеля будет изменять транзакционные данные транзакции coinbase, идентификатор транзакции, и, следовательно, оказывать влияние на заголовок блока, а в конечном итоге и на состав блокчейна. Это нужно для того, чтобы состав Отделенного Свидетеля был зафиксирован на блокчейне, и его нельзя было “подменить”.

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

Во второй части обзора мы исследуем, чем же так полезен Отделенный Свидетель. Спасибо со-основателям Blockstream Питеру Вуйле и Марку Фриденбаху (Mark Friedenbach), исполнительному директору Ciphrex Эрику Ломброзо (Eric Lombrozo) и техническому директору Blocktrail Рубену де Врайесу (Ruben de Vries) за предоставленную информацию и дополнительную обратную связь.

Источник: Bitcoinmagazine



Categories: Безопасность, Майнинг, Разработчикам, Стандарты, Теория, Технологии

Tags: ,

53 replies

Trackbacks

  1. Lightning Network: уже скоро? – Bit•Новости
  2. Разработчики биткойн-кошельков готовятся к принятию СегВит – Bit•Новости
  3. Разработчики биткойн-кошельков готовятся к принятию СегВит | Заработок онлайн доступный каждому
  4. Шесть главных технологий 2016 по версии Bitcoin Magazine – Bit•Новости
  5. Шесть главных технологий 2016 по версии Bitcoin Magazine | Заработок онлайн доступный каждому
  6. UASF: Очередной поворот в дебатах о размере блока – Bit•Новости
  7. UASF: Очередной поворот в дебатах о размере блока | Заработок онлайн доступный каждому
  8. Как подготовиться к хард-форку Биткойна – Bit•Новости
  9. Как подготовиться к хард-форку Биткойна | Заработок онлайн доступный каждому

Поделитесь своими мыслями

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s