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

53
ПОДЕЛИТЬСЯ

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

53 КОММЕНТАРИИ

  1. Объясните мне кто нибудь. Технология сайдчейн, это так же параллельно разрабатываемая и ожидаемая для внедрения? Или же с выходом segwit все, сайдчейн тех. более не нужна?
    Как я вижу, со своей ограниченной призмы, то сайдчейн было бы отличным дополнение, и совершенно не противоречащим segwit. Хотя слышал мнение, что разрабы решили оставить эту затею. При этом знаю, что уже реализован первый проект по этой технологии. В общем, не могу понять, что происходит. И вроде бы разрабы одна и та же контора…

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

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

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

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

    • Нет, не верно. Хардфорка не будет. Этот хак позволяет новым узлам более эффективно использовать блокчейн. Сами выходы используемые в скрытых транзакциях в блокчейне биткойна будут заблокированы. “Кто угодно может потратить”, но чтобы потратить их нужно разлочить. Сигнатуры для разлочки? – голь на выдумки хитра. Ни новые, ни старые узлы транзакцию отвергать не будут, просто старые не будут понимать части содержания транзакции, но будут пропускать ее. Обособленный свидетель будет регулировать двойную трату имея во внеблокчейновой распределенной одноранговой БД инфу о “скрытых транзакциях”.

      У меня следующий вопрос – Чем эта конструкция отличается от сайдчейна?

      • Кто вам рассказал эту чушь о “внеблокчейновой распределенной одноранговой БД”?

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

  3. Заявка редакции, сделайте сравнительный анализ всех технологий и методов позволяющий приблизиться по количеству транзакций к безналу. Размер блока, скорость блоков, мастерноды, сайдчейны, ветвистые блокчейны или как их там ….

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

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

      Однако, это далеко не панацея. При текущем темпе роста транзакций, созданного запаса хватит ненадолго, даже если SegWit реализуют и внедрят быстро (что вряд ли). Переход к ситуации “полных блоков”, которой так панически боятся Андресен и Гарзик, все равно произойдет – просто, немного позже.

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

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

      • Стоп-стоп-стоп… Как это проапгрэйдить скрипт на тюринг-полный?
        А как же тогда юное дарование со своим эфиром?
        Оно же обидется и будет плакать что никому его эфир не нужен…

        • ну если биток будет блок каждые 5 секунд делать,а не 10 минут ,тогда обидится )

        • Ооо! Так там еще и блок выскакивает каждые 5 секунд!

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

          Не, совсем ненадежен этот эфир, и с таким-то поделием это юное дарование хочет завоевать мир???

          Это-ж какие сети надо иметь чтобы за 5 секунд распространить блок по всему миру…
          Абсолютно нереально и непрактично…

          10 минут тоже не с потолка, однако, взято…

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

      • Segwit – не просто хак, который сокращает размер транзакций. Он решает многие проблемы с transaction malleability, которые мешали реализации Lightning. Надеюсь, в следующих частях статьи об этом упомянут.

ОСТАВЬТЕ ОТВЕТ

Please enter your comment!
Please enter your name here