Segregated Witness
Segregated Witness биткойн (SegWit) премества подписите в отделно witness поле, за да поправи transaction malleability. Вижте BIP-овете и теглото.
От Dimitar Zurnov · Обновено на 4 ноември 2026
Адаптирано от Learn Me a Bitcoin на Greg Walker.
Segregated Witness, или SegWit, е ъпгрейд на биткойн, което е било активирано на блок 481,824 на 24 август 2017 г. То е преместило подписите и данните за отключване на всяка трансакция в отделно witness поле. Промяната засяга начина, по който трансакциите получават ID-тата си, как се брои размерът им и как се пълнят блоковете. Тази страница описва техническите промени. Причините с прости думи са на страницата SegWit, а за начинаещи има ръководство.
Ъпгрейдът е дефиниран с три BIP-а. BIP 141 задава правилата за консенсус. BIP 143 дефинира хеша за подписване на новите скриптове. BIP 144 описва как нодовете обменят witness данни.
Защо биткойн е имал нужда от SegWit?
Основната причина е transaction malleability: възможността TXID-ът на трансакция да се променя. Преди SegWit TXID-ът е бил хеш на цялото съдържание, включително подписите. Подпис може да се промени така, че да остане валиден, а това променя TXID-а. Всяка непотвърдена трансакция, която харчи един от нейните изходи, сочи към стария TXID и става невалидна. Майнър би могъл да ползва това, за да отмени верига от непотвърдени трансакции.
SegWit оправя това, като оставя witness-а извън TXID-а. TXID-ът обхваща тогава само базовите данни, а подписът вече не може да го промени. Трансакция, която харчи непотвърдена трансакция, може да разчита на нейния TXID.
Същата промяна е освободила място за по-голям блок, затова SegWit е дошъл като един пакет от промени.
Как SegWit се активира?
SegWit използва сигнализиране с version bits, същия механизъм, който по-късно ползва и Taproot. Майнърите са сигнализирали във version полето на блоковете си. Сигнализирането е можело да продължи от 15 ноември 2016 г. до крайния срок 15 ноември 2017 г. За да се заключи правилото, е трябвало 95% от блоковете в един период за корекция на трудността (1,916 от 2,016) да сигнализират.
Всеки блок в периода, завършващ на блок 479,807, е сигнализирал подкрепа. Правилото затова се е заключило на блок 479,808 на 9 август 2017 г. и е влязло в сила 2,016 блока по-късно, на блок 481,824.
Какво се промени във формата на трансакцията?
Старата (legacy) трансакция държи подписите на всеки вход в неговия scriptSig. SegWit трансакцията ги премества в witness секция в края на трансакцията. Тя добавя и два байта след версията: маркер 00 и флаг 01. Софтуерът, написан преди SegWit, чете маркера като трансакция с нула входа и затова не приема трансакцията като нормална.
Witness секцията е списък от стекове, по един за всеки вход. Всеки стек започва с брой, след който идват елементите му, а всеки елемент е дължина, последвана от байтовете му. Legacy входовете нямат witness стек, така че секцията за тях е празна.
Как се брои размерът на трансакцията?
SegWit замени стария лимит на размер с лимит на тегло. Базовите данни се броят четири пъти, а witness данните веднъж. Така подписите получават отстъпка.
Блокът може да носи до 4,000,000 единици тегло. Виртуалните байтове (vB) са теглото, разделено на четири и закръглено нагоре.
Старият лимит е бил 1,000,000 байта данни в блока. Блокът вече може да достигне близо 4 MB само ако повечето от байтовете му са witness данни, защото те се броят веднъж. Таксите се изразяват във виртуални байтове, затова witness данните струват по-малко на байт от базовите.
Операциите за подписи също имат лимит на цена. Старите операции за подписи се броят четири пъти, а блокът може да носи най-много 80,000 единици цена за подписи.
Кои са новите заключващи скриптове?
SegWit добави два заключващи скрипта. И двата ползват witness-а за данните си за отключване.
- P2WPKH заключва изход към хеш на публичен ключ. Неговият scriptPubKey е
OP_0, следван от 20-байтов push, общо 22 байта. Witness-ът съдържа подпис и публичния ключ. Вижте P2WPKH. - P2WSH заключва изход към хеш на скрипт. Неговият scriptPubKey е
OP_0, следван от 32-байтов push, общо 34 байта. Witness-ът съдържа входовете на скрипта и самия скрипт. Вижте P2WSH.
Тези скриптове не се изпълняват по обичайния начин. Имат фиксирана структура, а правилата им за отключване са вградени. Адресите им ползват bech32, дефиниран в BIP 173. Адресите от версия 0 започват с bc1q.
BIP 143 дефинира хеша за подписване за тези скриптове. Той включва сумата на входа, който се подписва, и хешира споделените части на трансакцията веднъж, а не по веднъж за всеки вход. Старият софтуер за подписване е можел да хешира голяма трансакция много дълго, затова това е било истинско подобрение.
Какво е witness commitment?
Witness данните са извън TXID-а, затова нещо друго трябва да ги обвърже. Всяка трансакция има и wTXID, хеш на цялата ѝ сериализация, включително witness-а. Legacy трансакцията няма witness, затова нейният wTXID е равен на TXID-а. wTXID-ът на coinbase трансакцията се приема за нули.
Майнърите слагат merkle root на всички wTXID-и в блока като witness commitment. Той стои в допълнителен изход на coinbase трансакцията. Изходът е OP_RETURN с 36-байтов push, който започва с байтите aa21a9ed, следвани от 32-байтовото обвързване (commitment).
Тъй като обвързването е в блока, никой не може да промени witness данните на потвърдена трансакция, без да наруши блока. Coinbase трансакцията е удобно място за него, защото merkle root в заглавката на блока вече обхваща coinbase трансакцията.
Два идентификатора могат да объркат. TXID-ът не включва witness-а и е ID-то, което показват повечето инструменти. wTXID-ът го включва. Командата getrawtransaction показва wTXID-а в полето hash.
Какво се промени в мрежата?
Нодовете искат трансакции и блокове с getdata, а всяка заявка назовава вида им. Нод, който иска подписите, пита с witness типа, така че другият нод изпраща и witness-а. Без него другият изпраща трансакцията без witness-а.
| Тип | Стойност | Значение |
|---|---|---|
MSG_TX |
01000000 |
трансакция, без witness |
MSG_BLOCK |
02000000 |
блок, без witness |
MSG_WITNESS_TX |
01000040 |
трансакция с witness |
MSG_WITNESS_BLOCK |
02000040 |
блок с witness |
Witness типовете прибавят 0x40000000 към стария тип, което е бит 30. Нод, който поддържа witness данни, ги обявява и в своите service bits, както е описано на страницата за мрежата.
Къде можете да го видите?
Блокът за активация на SegWit е 481,824. Хешът му е 0000000000000000001c8018d9cb3b742ef25114f27563e3fc4a1902167f9893, а времето на блока е 24 август 2017 г., 01:57 UTC. Блоковете от тази височина нагоре могат да носят трансакции с witness данни.
Следващият ъпгрейд, Taproot, ползва witness формата, който описва тази страница.
В този раздел: Ъпгрейди
Целият курс „Биткойн от нулата“
Нещо не изглежда наред? Кажете ни