Segregated Witness — это предложение (BIP-141), разработанное для решения проблемы гибкости транзакций в блокчейне Биткойн.
1. Что такое гибкость транзакций?
То есть содержимое транзакции не изменилось, но изменился идентификатор транзакции. Благодаря симметрии эллиптической кривой в алгоритме подписи ECDSA, используемом в сети Биткойн, для подписания транзакции всегда можно рассчитать две действительные подписи, и эти две действительные подписи также могут быть рассчитаны друг из друга. После трансляции транзакции опубликуйте транзакцию с одинаковым содержимым, используя разные подписи. Две транзакции имеют одинаковый контент, но разные идентификаторы транзакций, что введет в заблуждение участников сети.
2. Расширение транзакции изменяет подпись, но содержание транзакции не меняется. В конечном итоге сеть все равно подтвердит содержание транзакции. Вторая транзакция с другой подписью, но тем же содержанием транзакции также будет признана недействительной. Это не повлияет на безопасность транзакций, и в сети фактически не возникнет проблемы двойной траты (одни и те же деньги тратятся дважды). Так на что же на самом деле повлияет продление транзакции?
На самом деле это происходит в основном потому, что многие биткойн-сервисы (такие как биржи и сторонние службы автоматизации на блокчейне) используют идентификаторы транзакций в качестве идентификаторов транзакций. Примером может служить ситуация, когда Сяо А инициирует вывод средств с биржи, а затем его транзакция вывода транслируется. Прежде чем узел проверит его транзакцию, Сяо А проводит атаку пластичности, и новая транзакция, сгенерированная в результате атаки, сначала подтверждается. Новая транзакция позволит ему получить валюту, а старая транзакция будет отклонена сетью. Однако Сяо А пожаловался на биржу, что не получил монеты. Биржа увидела, что предыдущая транзакция по переводу монет Сяо А действительно была отклонена, поэтому она перевела ему еще одну сумму монет.
3. Похоже, проблема на самом деле вызвана тем, что в качестве идентификатора транзакции используется идентификатор транзакции. Можно ли не использовать идентификатор транзакции в качестве идентификатора транзакции?
Анализировать содержимое блока BTC, например, используя высоту блока + позицию транзакции для определения идентификатора? Или определить личность самостоятельно на основе хеша ввода+вывода транзакции? Их действительно можно использовать в качестве уникальных идентификаторов, но на практике они либо неэффективны, либо не так удобны и безопасны, как идентификаторы транзакций (идентификаторы транзакций записываются непосредственно в содержимое блока и никогда не могут быть изменены после загрузки в цепочку).
4. Как segwit решает проблему масштабируемости транзакций?
Segwit эффективно решает эту проблему, отделяя данные подписи транзакции (свидетеля) от блока, так что изменение подписи больше не повлияет на идентификатор транзакции. В то же время Segwit также в определенной степени уменьшает размер блока и улучшает возможности обработки транзакций (например, SPV может обрабатывать больше содержимого транзакций при той же пропускной способности).

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