Segregated Witness

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
Логотип Segregated Witness, разработанный Альбертом Дроссом

Segregated Witness (сокращенно SegWit) — реализованное обновление протокола, призванное решить проблему пластичности транзакций блокчейна Биткойн, а также увеличить её пропускную способность. Аналогичное обновление реализовано и для некоторых других криптовалют, таких как Litecoin, DigiByte, Groestlcoin и Vertcoin.[1]

SegWit является «софт форком» и позволяет сети функционировать в прежнем режиме. Однако изменяется структура хранения данных в блоке и механизм проверки транзакций для полноценных узлов сети. Теперь подписи и сценарии выделяются в обособленную структуру, именуемую отдельным свидетелем (англ. segregated witness). Это позволяет основному блоку вместить больше транзакций, а также исключает вариативность идентификатора одной и той же транзакции.[1]

История[править | править код]

Проблема масштабируемости[править | править код]

Ежемесячное количество транзакций в сети Биткойн

В 2010 Сатоси Накамото ввёл ограничение на размер блока в 1 мегабайт. Ограничение позволило улучшить совместимость узлов сети, а также снизить эффективность DDoS-атак, но снизило максимальную пропускную способность сети до 3-7 транзакций в секунду. Последнее в дальнейшем оказало негативное влияние на способность сети к масштабированию. С ростом пользовательской базы и количества переводов, стали расти и задержки — некоторые транзакции ожидали очереди несколько дней. Это также привело к росту комиссий за переводы, что резко снизило привлекательность Биткойна для мелких платежей.[2]

Предлагалось увеличить размер блока, что было реализовано в таких форках Биткойна, как Bitcoin XT, Bitcoin Classic, Bitcoin Unlimited, Lightning Bitcoin и самом успешном Bitcoin Cash.[3][4]

Пластичность транзакции[править | править код]

Ещё одной острой проблемой сети Биткойн являлась так называемая пластичность транзакции. Обычная структура транзакции Биткойна содержит криптографическую подпись, которая позволяет другим участникам сети проверить, действительно ли владелец биткойнов собрался их так потратить. Подпись рассчитывается на основе приватного ключа для каждой транзакции, что исключает изменение данных самой транзакции. Идентификатором транзакции является её хэш, который вычисляется на основе всего блока транзакции. Малейшее изменение в транзакции изменяет её идентификатор.[5] На самом деле, можно изменить транзакцию, оставив её действительной (например, добавив необязательные служебные константы в подпись, которые существенно не изменяют сценарий).[6] При этом изменится её идентификатор, а значит модифицированная транзакция будет считаться совершенно новой и более того, сможет пройти верификацию у других узлов сети.[5]

Любой узел сети может модифицировать транзакцию и транслировать её остальным. Если модифицированная транзакция будет включена в блок основной ветки раньше оригинальной или в дальнейшем окажется в более длинной ветке, то исходная транзакция будет отвергнута, так как будет ссылаться на использованный выход (так же будут отвергнуты и ссылающиеся на неё).[7] Это создает множество проблем, так как некоторые системы проверяли факт проведения платежа по идентификатору. Также это усложняет реализацию технологий более высокого уровня, которые основываются на блокчейне Биткойна.[5]

Разработчики и раньше пытались решить эту проблему, но она так и не была полностью устранена до обновления SegWit.[8][9]

Предполагается, что с помощью пластичности транзакции было «нелегально» выведено 64 564 BTC из популярной в своё время биржи MtGox[10]. Сеть Bitcoin Cash подверглась масштабной атаке на пластичность транзакций вскоре после «хард-форка».[11]

Атака «дней рождения»[править | править код]

Мультиподписные адреса Биткойна используют P2SH и защищены с помощью HASH160 (160-битная хеш-функция). Если злоумышленник владеет хотя бы 1 ключом из мультиподписного списка, то с учётом коллизии хеша он может снизить количество вариантов перебора до 280, что уже осуществимо для современных вычислительных систем[12].

Segregated Witness[править | править код]

Для решения обеих вышеупомянутых проблем было предложено обновление Segregated Witness. Суть заключается в вынесении подписей транзакций в одноименную структуру вне основного блока, что значительно разгружает последний, так как размер подписи составлял более 50 % от размера всего блока транзакций. Также это решает проблему пластичности транзакций, ведь подписи больше не влияют на хеш-идентификатор.[1][13]

Но теперь, чтобы проверить все транзакции, узлу нужно загружать расширенный блок (основной блок + отделенный свидетель). О готовности принять расширенный блок, узел специально сообщает соседям. Остальные узлы принимают стандартные блоки в 1МБ, считая что транзакции не нуждаются в подписи. Блок подписей связывается с основной цепочкой с помощью дерева Меркла, расположенного в заголовке блока. От всех подписей так же как и от всех транзакций считаются хеши и заносятся в дерево. Суммарный хеш подписей присоединяется к хешу первой транзакции (coinbase-транзакции) в дереве Меркла транзакций.[1][13]

Расширенный блок теоретически ограничен 4 мегабайтами, но фактически максимальный размер блока составляет чуть менее 2 МБ.[14]

В SegWit для защиты MultiSig-кошельков вместо P2SH используется P2WSH, защищенный SHA256. Это усложняет атаку «дней рождения» до 2128.[12]

Активация[править | править код]

Segregated Witness был предложен Питером Вюлле (Pieter Wuille) в конце 2015 года. Выпуск состоялся в октябре 2016 года — на 6 месяцев раньше запланированного срока. Активация должна была произойти после преодоления 95%-порога участников, сигнализирующих о поддержке обновления. Но некоторые участники сети заявили, что поддержат обновление, только если в него будет добавлено увеличение размера основного блока (китайские пулы могли заблокировать введение SegWit.).[1] 23 мая 2017 года майнеры и разработчики подписали Нью-Йоркское соглашение[15], предполагавшее увеличение размера основного блока до 2 МБ в течение 6 месяцев (это обновление назвали SegWit2x). SegWit был активирован 24 августа 2017 года.[1]

Некоторые альткойны тоже решили реализовать SegWit. Так как многие альткойны основаны на коде Биткойна, это не составило для разработчиков особых трудностей. Первым из них активировал обновление Groestlcoin в январе 2017 года.[1]

Преимущества[править | править код]

  • Совместим с предыдущими версиями ПО.[1]
  • Увеличивает количество транзакций в блоке.[12]
  • Снижает комиссионные сборы.[12]
  • За счёт количества транзакций в блоке, общие сборы майнеров могут увеличиться.[12]
  • Уменьшает время ожидания в очереди.[12]
  • Способствует масштабируемости Биткойна.[1]
  • Устраняет пластичность транзакций.[12]
  • Облегчает разработку и увеличивает эффективность и безопасность дополнительных надстроек (смарт-контракты, Lightning Network и т. д.).[12]
  • Устраняет проблему квадратичного роста времени проверки транзакций.[12]
  • Повышает надежность MultiSig-кошельков.[12]

Недостатки[править | править код]

  • Увеличивает использование ресурсов узла сети.[16]
  • Несколько усложняется проверка транзакций.[16]
  • В то же время сборы майнеров могут сократится из-за введения надстроек.[16]
  • Некоторые участники считают SegWit лишь временной мерой и настаивают на увеличении размера основного блока.[1]
  • Дополнительная цепочка тоже требует обслуживания, в чём майнеры не особо заинтересованы. В сети Биткойн нет вознаграждения за проверку транзакций (в отличие от Dash). Майнеров сдерживает только высокая вероятность майнинга ошибочных блоков при высокой концентрации облегчённых клиентов (SPV-нод).[17]

Дальнейшее развитие[править | править код]

8 ноября «хард-форк» SegWit2x был отложен на неопределённое время из-за отсутствия консенсуса.[18]

Благодаря обновлению SegWit существенно облегчается разработка и внедрение надстроек, а также увеличивается их безопасность и эффективность.[1] В ближайшее время планируется запуск Lightning Network.[12] Разрабатывается решение для увеличения гибкости смарт-контрактов Merklized Abstract Syntax Tree (MAST), которое также улучшает масштабируемость и повышает конфиденциальность.[19]

Примечания[править | править код]

Литература[править | править код]

  • Andreas M. Antonopoulos. Mastering Bitcoin.

Ссылки[править | править код]