Глоссарий / Протокол и обновления
SegWit
Другие названия: Segregated Witness, BIP141, Сегвит.
- Что такое SegWit?
- SegWit вынес данные подписей за пределы той части транзакции, которую фиксирует txid, устранив изменяемость транзакций и увеличив вместимость блока без изменения базового лимита в один мегабайт.
Определено в BIP-141.
Изменение было структурным, а не косметическим. Подписи перешли в раздел свидетеля, который старые узлы никогда не загружают, что позволило провести увеличение емкости как мягкий форк, а байты свидетеля стоят одну единицу веса каждый вместо четырех. Поэтому трата с адреса bc1q обходится примерно вдвое дешевле, чем трата устаревшего входа.
Как это работает
Segregated Witness делит транзакцию на две части и хеширует их отдельно.
Базовая часть содержит версию, входы, выходы и locktime. Часть свидетеля содержит для каждого входа стек элементов, которые его авторизуют, обычно подпись и публичный ключ. Идентификатор транзакции вычисляется только по базовой части, поэтому ничто в свидетеле не может его изменить. Второй идентификатор, wtxid, охватывает обе части, а корень Меркла всех wtxid в блоке фиксируется внутри транзакции coinbase, так что данные свидетеля тоже нельзя подделать.
Емкость следует из изменения учета, а не из изменения лимита. Каждый байт вне свидетеля стоит четыре единицы веса, каждый байт внутри стоит одну, и блок может вмещать 4 000 000 единиц веса. Поэтому данные вне свидетеля по-прежнему не могут превышать 1 000 000 байт, точно как раньше, а подписи идут в свободном бюджете. Узел до 2017 года, измеряющий по-старому, видит допустимый блок и не возражает, и именно поэтому обновлению не понадобился жесткий форк.
BIP-143 переписал то, как подписывается вход свидетеля, и практическая выгода больше, чем кажется. Старый алгоритм хеша подписи заново хешировал части транзакции по одному разу на вход, поэтому подпись транзакции с множеством входов росла квадратично. Новый использует заранее вычисленные хеши и, что критически важно, фиксирует сумму, которая тратится. До этого аппаратному кошельку можно было солгать о том, сколько стоит вход, и заставить его авторизовать огромную комиссию.
SegWit также пронумеровал типы выходов. Версия свидетеля 0 охватывает P2WPKH и P2WSH; версия свидетеля 1 осталась пустой и позже была занята Taproot. Теперь новые типы выходов можно добавлять, не заново обсуждая формат адреса каждый раз.
Почему это важно при покупке биткоина
Три вещи в вашем собственном использовании биткоина напрямую восходят к этому обновлению.
Первое касается того, что вы платите за перемещение биткоинов. Нативный вход SegWit занимает около 68 vbytes против примерно 148 у устаревшего, поэтому кошелек, тратящий три входа при ставке комиссии 20 sat/vB, экономит несколько тысяч сатоши на одной транзакции. Эта экономия возникает при трате, а не при получении, поэтому важен тип адреса, который использует ваш собственный кошелек, а не тот, с которого выводит ваша биржа.
Второе касается того, что ваш аппаратный кошелек может безопасно вам сообщить. Поскольку BIP-143 фиксирует сумму входа, комиссия, показанная на экране Trezor или Ledger, выводится из данных, которые устройство может проверить, а не из данных, которые утверждает подключенный компьютер. Это закрыло реальную атаку, и поэтому подпись устаревшего входа по-прежнему требует передать устройству всю предыдущую транзакцию, чтобы оно само проверило сумму.
Третье касается Lightning и, следовательно, любая биржа, построенная на нем. Strike по умолчанию перемещает стоимость через Lightning, а каналы Lightning пополняются в выходы SegWit, потому что протокол не может работать без стабильного txid. Нет SegWit, нет каналов, нет продукта мгновенных расчетов поверх них.
Ошибка изменяемости, которая должна была умереть первой
Изменяемость транзакций звучит как крайний случай и была единственным крупнейшим препятствием для создания чего-либо поверх биткоина.
Подпись ECDSA имеет более одной допустимой кодировки. До SegWit третья сторона, наблюдавшая за пулом памяти, могла взять неподтвержденную транзакцию, заново закодировать подпись, не делая ее недействительной, и повторно разослать ее. Биткоины все равно уходили в то же место в той же сумме. Менялся только идентификатор транзакции, и любое программное обеспечение, записавшее исходный идентификатор, теперь считало, что платеж исчез. Mt. Gox публично обвинила изменяемость в приостановке выводов в феврале 2014 года, утверждение, которое другие разработчики тогда оспаривали, но лежащий в основе изъян был реальным.
Платежные каналы сделали его фатальным, а не просто досадным. Канал работает, сохраняя подписанную транзакцию возврата, которая тратит финансирующий выход, идентифицируемый по его txid, еще до того, как эта финансирующая транзакция вообще разослана. Измените txid, и возврат становится неисполнимым, оставляя одну сторону способной удерживать деньги другой в заложниках. Статья 2015 года о сети Lightning от Джозефа Пуна и Таддеуса Драйи называла исправление изменяемости обязательным условием в собственном тексте.
SegWit устранил проблему в корне, убрав подписи из прообраза идентификатора. Любой вход, тратящий выход свидетеля, имеет txid, который никакая третья сторона не может изменить, и протоколы каналов наконец можно было строить как задумано.
SegWit vs данные свидетеля
SegWit является обновлением; данные свидетеля представляют собой созданную им структура. Одно является событием с датой, 24 августа 2017 года, и спецификацией, BIP-141. Другое является полем, которое существует в большинстве транзакций в сети сегодня, несет подписи и скрипты и имеет свою собственную сериализацию и свой собственный дисконтированный вес. Сказать, что транзакция «использует SegWit», значит сокращенно сказать, что она тратит входы, авторизация которых находится в этом поле.
SegWit vs Taproot
Два мягких форка с разницей в четыре года, оба о свидетелях. SegWit создал структуру свидетеля и определил типы выходов версии 0, те, чьи адреса начинаются с bc1q. Taproot занял версию 1, добавил подписи Schnorr и изменил то, как вычисляются скрипты внутри свидетеля, породив адреса, начинающиеся с bc1p. Taproot можно было развернуть так дешево только потому, что SegWit уже построил схему версий, и поэтому эти два обновления лучше читать как один замысел, осуществленный поэтапно.