Segregated Witness (сокращенно SegWit) — реализованное обновление протокола, призванное решить проблему пластичности транзакций блокчейна Биткойн, а также увеличить её пропускную способность. Аналогичное обновление реализовано и для некоторых других криптовалют, таких как Litecoin, DigiByte, Groestlcoin и Vertcoin.
SegWit является «софт форком» и позволяет сети функционировать в прежнем режиме. Однако изменяется структура хранения данных в блоке и механизм проверки транзакций для полноценных узлов сети. Теперь подписи и сценарии выделяются в обособленную структуру, именуемую отдельным свидетелем (англ. segregated witness). Это позволяет основному блоку вместить больше транзакций, а также исключает вариативность идентификатора одной и той же транзакции.
В 2010 Сатоси Накамото ввёл ограничение на размер блока в 1 мегабайт. Ограничение позволило улучшить совместимость узлов сети, а также снизить эффективность DDoS-атак, но снизило максимальную пропускную способность сети до 3-7 транзакций в секунду. Последнее в дальнейшем оказало негативное влияние на способность сети к масштабированию. С ростом пользовательской базы и количества переводов стали расти и задержки — некоторые транзакции ожидали очереди несколько дней. Это также привело к росту комиссий за переводы, что резко снизило привлекательность Биткойна для мелких платежей.
Предлагалось увеличить размер блока, что было реализовано в таких форках Биткойна, как Bitcoin XT, Bitcoin Classic, Bitcoin Unlimited, Lightning Bitcoin и самом успешном Bitcoin Cash.
Ещё одной острой проблемой сети Биткойн являлась так называемая пластичность транзакции. Обычная структура транзакции Биткойна содержит криптографическую подпись, которая позволяет другим участникам сети проверить, действительно ли владелец биткойнов собрался их так потратить. Подпись рассчитывается на основе приватного ключа для каждой транзакции, что исключает изменение данных самой транзакции. Идентификатором транзакции является её хеш, который вычисляется на основе всего блока транзакции. Малейшее изменение в транзакции изменяет её идентификатор. На самом деле, можно изменить транзакцию, оставив её действительной (например, добавив необязательные служебные константы в подпись, которые существенно не изменяют сценарий). При этом изменится её идентификатор, а значит модифицированная транзакция будет считаться совершенно новой и более того, сможет пройти верификацию у других узлов сети.
Любой узел сети может модифицировать транзакцию и транслировать её остальным. Если модифицированная транзакция будет включена в блок основной ветки раньше оригинальной или в дальнейшем окажется в более длинной ветке, то исходная транзакция будет отвергнута, так как будет ссылаться на использованный выход (так же будут отвергнуты и ссылающиеся на неё). Это создает множество проблем, так как некоторые системы проверяли факт проведения платежа по идентификатору. Также это усложняет реализацию технологий более высокого уровня, которые основываются на блокчейне Биткойна.
Разработчики и раньше пытались решить эту проблему, но она так и не была полностью устранена до обновления SegWit.
Предполагается, что с помощью пластичности транзакции было «нелегально» выведено 64 564 BTC из популярной в своё время площадки MtGox. Сеть Bitcoin Cash подверглась масштабной атаке на пластичность транзакций вскоре после «хард-форка».
Мультиподписные адреса Биткойна используют P2SH и защищены с помощью HASH160 (Хеш SHA-256 внутри RIPEMD-160). Если злоумышленник владеет хотя бы 1 ключом из мультиподписного списка, то с учётом коллизии хеша он может снизить количество вариантов перебора до 280, что уже осуществимо для современных вычислительных систем.
Для решения обеих вышеупомянутых проблем было предложено обновление Segregated Witness. Суть заключается в вынесении подписей транзакций в одноименную структуру вне основного блока, что значительно разгружает последний, так как размер подписи составлял более 50 % от размера всего блока транзакций. Также это решает проблему пластичности транзакций, ведь подписи больше не влияют на хеш-идентификатор.
Но теперь, чтобы проверить все транзакции, узлу нужно загружать расширенный блок (основной блок + отделенный свидетель). О готовности принять расширенный блок узел специально сообщает соседям. Остальные узлы принимают стандартные блоки в 1МБ, считая что транзакции не нуждаются в подписи. Блок подписей связывается с основной цепочкой с помощью дерева Меркла, расположенного в заголовке блока. От всех подписей так же как и от всех транзакций считаются хеши и заносятся в дерево. Суммарный хеш подписей присоединяется к хешу первой транзакции (coinbase-транзакции) в дереве Меркла транзакций.
Расширенный блок теоретически ограничен 4 мегабайтами, но фактически максимальный размер блока составляет чуть менее 2 МБ.
В SegWit для защиты MultiSig-кошельков вместо P2SH используется P2WSH, защищенный SHA256. Это усложняет атаку «дней рождения» до 2128.
Segregated Witness был предложен Питером Вюлле (Pieter Wuille) в конце 2015 года. Выпуск состоялся в октябре 2016 года — на 6 месяцев раньше запланированного срока. Активация должна была произойти после преодоления 95%-порога участников, сигнализирующих о поддержке обновления. Но некоторые участники сети заявили, что поддержат обновление, только если в него будет добавлено увеличение размера основного блока (китайские пулы могли заблокировать введение SegWit.). 23 мая 2017 года майнеры и разработчики подписали Нью-Йоркское соглашение, предполагавшее увеличение размера основного блока до 2 МБ в течение 6 месяцев (это обновление назвали SegWit2x). SegWit был активирован 24 августа 2017 года.
Некоторые альткойны тоже решили реализовать SegWit. Так как многие альткойны основаны на коде Биткойна, это не составило для разработчиков особых трудностей. Первым из них активировал обновление Groestlcoin в январе 2017 года.
8 ноября «хард-форк» SegWit2x был отложен на неопределённое время из-за отсутствия консенсуса.
Благодаря обновлению SegWit существенно облегчается разработка и внедрение надстроек, а также увеличивается их безопасность и эффективность. В ближайшее время планируется запуск Lightning Network. Разрабатывается решение для увеличения гибкости смарт-контрактов Merklized Abstract Syntax Tree (MAST), которое также улучшает масштабируемость и повышает конфиденциальность.