SegWit (Segregated Witness – отдельный свидетель) – это реализованное обновление протокола, призванное решить проблему пластичности транзакций блокчейна биткоина, а также увеличить пропускную способность сети биткоина.
SegWit является «софт форком» и позволяет сети функционировать в прежнем режиме. Однако изменяется структура хранения данных в блоке и механизм проверки транзакций для полноценных узлов сети. Подписи и сценарии выделяются в обособленную структуру, именуемую отдельным свидетелем (segregated witness). Это позволяет основному блоку вместить большее количество транзакций, а также исключает вариативность идентификатора одной и той же транзакции.
Проблема масштабируемости
В 2010 Сатоши Накамото ввёл ограничение на размер блока в 1 МБ. Ограничение позволило улучшить совместимость узлов сети, а также снизить эффективность DDoS-атак, но снизило максимальную пропускную способность сети до 3-7 транзакций в секунду. Последнее в дальнейшем оказало негативное влияние на способность сети к масштабированию. С ростом пользовательской базы и количества переводов, стали расти и задержки — некоторые транзакции ожидали очереди несколько дней. Это также привело к росту комиссий за переводы.
Пластичность транзакции
Ещё одной проблемой сети биткоина являлась так называемая пластичность транзакции. Обычная структура транзакции биткоина содержит криптографическую подпись, которая позволяет другим участникам сети проверить, действительно ли владелец биткоинов собрался их потратить таким образом. Подпись рассчитывается на основе приватного ключа для каждой транзакции, что исключает изменение данных самой транзакции. Идентификатором транзакции является её хэш, который вычисляется на основе всего блока транзакции. Малейшее изменение в транзакции изменяет её идентификатор. На самом деле, можно изменить транзакцию, оставив её действительной (к примеру, добавив необязательные служебные константы в подпись, которые существенно не изменяют сценарий). При этом изменится её идентификатор, а значит модифицированная транзакция будет считаться совершенно новой и более того, сможет пройти верификацию у других узлов сети.
Любой узел сети может модифицировать транзакцию и транслировать её остальным. Если модифицированная транзакция будет включена в блок основной ветки раньше оригинальной или в дальнейшем окажется в более длинной ветке, то исходная транзакция будет отвергнута, так как будет ссылаться на использованный выход (так же будут отвергнуты и ссылающиеся на неё). Это создает множество проблем, так как некоторые системы проверяли факт проведения платежа по идентификатору. Также это усложняет реализацию технологий более высокого уровня, которые основываются на блокчейне биткоина.
Атака «дней рождения» (используемое в криптоанализе название для метода взлома шифров или поиска коллизий хеш-функций на основе парадокса дней рождения).
Multisig-адреса (с мульти-подписями) биткоина используют P2SH и защищены с помощью HASH160 (160-битная хеш-функция). Если злоумышленник владеет хотя бы 1 ключом из мультиподписного списка, то с учётом коллизии хеша он может снизить количество вариантов перебора до 280.
Решение – SegWit
Для решения обеих вышеупомянутых проблем было предложено обновление Segregated Witness (SegWit). Смысл состоит в вынесении подписей транзакций в одноименную структуру вне основного блока, что значительно разгружает последний, так как размер подписи составлет более 50 % от размера всего блока транзакций. Это также решает проблему пластичности транзакций, ведь подписи больше не влияют на хеш-идентификатор.
Однако теперь, чтобы проверить все транзакции, узлу нужно загружать расширенный блок (основной блок + SegWit). О готовности принять расширенный блок, узел специально сообщает соседям. Остальные узлы принимают стандартные блоки в 1МБ, считая что транзакции не нуждаются в подписи. Блок подписей связывается с основной цепочкой с помощью дерева Меркла, расположенного в заголовке блока. От всех подписей, так же как и от всех транзакций, считаются хеши и заносятся в дерево. Суммарный хеш подписей присоединяется к хешу первой транзакции в дереве Меркла транзакций.
В SegWit для защиты MultiSig-кошельков вместо P2SH используется P2WSH, защищенный SHA256. Это усложняет атаку «дней рождения» до 2128.
Для активации SegWit требуется одобрение 95% майнеров, сигнализирующих о поддержке обновления. Порог 95% основан на методе активации софт форка BIP 34, который предусматривает необходимые 95%. Хотя это и не является строго необходимым условием, оно уменьшает риск будущих форков или двойных трат после активации SegWit.