Към съдържанието
ДаретеEN

Ъпгрейди

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, чете маркера като трансакция с нула входа и затова не приема трансакцията като нормална.

Старата трансакция държи всеки подпис във входа. SegWit трансакцията добавя маркер, флаг и отделна witness секция. Стара (legacy) трансакция version (4 байта) входове, всеки със scriptSig изходи locktime (4 байта) SegWit трансакция version (4 байта) 00 01 маркер и флаг входове, празен scriptSig (native SegWit) изходи witness: подписи за всеки вход locktime (4 байта)
Witness секцията има по един стек за всеки вход. Стекът е празен за legacy вход.

Witness секцията е списък от стекове, по един за всеки вход. Всеки стек започва с брой, след който идват елементите му, а всеки елемент е дължина, последвана от байтовете му. Legacy входовете нямат witness стек, така че секцията за тях е празна.

Как се брои размерът на трансакцията?

SegWit замени стария лимит на размер с лимит на тегло. Базовите данни се броят четири пъти, а witness данните веднъж. Така подписите получават отстъпка.

Базовите данни се броят четири пъти, witness данните веднъж, а лимитът на блока е 4,000,000 единици тегло. Базови данни, без witness версия, входове, изходи, locktime тегло = байтове x 4 Witness данни подписи и скриптове за всеки вход тегло = байтове x 1 Лимит на блока: 4,000,000 единици тегло Блоковете се пълнят по тегло, не по байтове. Виртуални байтове = тегло / 4 Таксите се изразяват във виртуални байтове.
Теглото е това, което брои лимитът на блока. Виртуалните байтове са мярката, в която се изразяват таксите.

Блокът може да носи до 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 формата, който описва тази страница.

В този раздел: Ъпгрейди

Целият курс „Биткойн от нулата“

Нещо не изглежда наред? Кажете ни