Технологія Segregated Witness (SegWit). Повний огляд із розбором як це все працює

До 2017 року недоліки мережі біткоїна такі, як масштабованість і проблема пластичності транзакцій, ставали більш критичними для подальших перспектив.
Наявність цих двох факторів і відсутність рішення, робили біткоїн тупиковою гілкою розвитку. На тлі нових проектів і технологій, перша криптовалюта виглядала дорогою і безперспективною в технологічному плані розвитку, розробники усвідомлювали це.
Було потрібне рішення, яке зможе змінити «правила гри». Одним із таких рішень став софтфорк біткоїна — Segregated Witness (SegWit), який був активований 24 серпня 2017 року в блоці 481 824. Цього ж дня було відправлено першу транзакцію з використанням SegWit.
Це складна тема і для того, щоб зрозуміти технічний бік SegWit, необхідне глибоке розуміння роботи блокчейна. Зі статті ви дізнаєтеся що таке SwgWit і як він працює, також буде додаткова корисна інформація.
Що таке SegWit
SegWit — це софтфорк ядра блокчейна, необов’язкове і сумісне з попередніми версіями програмне забезпечення, що дасть змогу розв’язати проблеми масштабованості біткоїна і знизить комісії. Воно збільшує ефективний розмір блоку, без фактичної зміни ліміту в 1 Мб.
SegWit змінює структуру зберігання даних про транзакції в блоці, зроблено це з метою не допустити зміни txid (проблема пластичності), але зберегти дані про історію кожної транзакції. При цьому, вивільнити місце в блоці для додаткових транзакцій.
У пропозиції щодо поліпшення біткоїна BIP141, наводиться таке визначення: SegWit формує нову структуру, яка називається «witness», яка фіксується в блоках окремо від дерева Меркла транзакції (txid). Ця структура містить дані, необхідні для перевірки достовірності транзакції, але не потрібні для визначення txid транзакції. Зокрема, скрипти й підписи переміщуються в цю нову структуру. «Свідок» фіксується в дереві, яке вставляється в існуючий Корінь Меркла блоку через транзакцію coinbase для забезпечення сумісності софтфорка SegWit.
Визначення вище складне, але це найбільш стисле визначення для SegWit.
Це оновлення стало компромісним рішенням проблем масштабованості та пластичності від більш радикальних пропозицій, якими є хардфорки.
Bitcoin, який ми знаємо у 2023 році, є таким завдяки активації SegWit. Крім того, без застосованих рішень, неможливим було б впровадження мереж другого рівня поверх біткоїна, на кшталт Lightning Network та деяких інших, вже реалізованих програмних покращень.

Хронологія подій — від ідеї до реалізації SegWit
Дата | Подія |
2012 | Дискусії про необхідність вирішення проблеми пластичності транзакцій. |
2013 | Уперше було запропоновано ідею щодо відокремлення даних про підпис від транзакції в окрему структуру. |
Червень 2015 | Компанія Blockstream розробила сайдчейн Sidechain Elements з відокремленим свідком. Це був прототип SegWit. |
Кінець 2015 року | Сформовано концепцію Lightning Network, яка вимагала вирішення проблеми пластичності. |
Жовтень 2015 року | Прозвучала ідея впровадження SegWit у вигляді софтфорка. |
Грудень 2015 | SegWit презентовано на біткойн-конференції в Гонконзі у вигляді софтфорка. |
21 грудня 2015 року | BIP141. SegWit офіційно оформлено як пропозицію щодо поліпшення біткоїна. |
Січень 2016 | Запущено тестову мережу BTC (SegNet). |
Березень 2016 | SegNet підтримує тестову версію Lightning Network. |
23 серпня 2016 | Реліз Bitcoin Core 0.13.0 — з кодовою базою SegWit. |
27 Жовтня 2016 | Реліз Bitcoin Core 0.13.1 — з розширеним описом SegWit і які він вирішує проблеми. |
15 листопада 2016 | Стартував процес «голосування» майнерами за проведення софтфорка. |
Лютий 2017 | Обговорення ідеї включення SegWit за допомогою UASF — рішення тотальної більшості повних вузлів. |
26 квітня 2017 | SegWit активовано в блокчейні Litecoin. |
23 липня 2017 року | Імплементація BIP91, за тиждень до активації UASF, яка є MASF або софтфорк, що активують майнери. |
1 серпня 2017 року | Активація UASF. |
8 серпня 2017 року | Фіксація (затвердження) протоколу Segregated Witness. |
24 Серпня 2017 | SegWit активовано в блокчейні Bitcoin. |
25 Серпня 2017 | Видобуто перший в історії блок більше 1 Мб. |
Складність прийняття консенсусних рішень у децентралізованих мережах і SegWit як компроміс
Bitcoin — це децентралізована мережа, в якій відсутній центральний орган адміністрування та прийняття рішень. Для оновлення мережі, необхідна згода більшості учасників.
Розробники ще 2012 року виявили проблеми безпеки блокчейну біткоїна, пов’язані з пластичністю транзакцій. Але тоді рішення не було знайдено. Нижче детально розкриємо цю тему, але хочемо звернути увагу на важливість цієї проблеми, бо вона стала каменем спотикання для подальшого розвитку, бо унеможливлювала розробку сайдчейнів і роботу смарт-контрактів поверх основної мережі біткойна, які залежать від непідтверджених транзакцій.
Крім пластичності, проблема полягала в низькій пропускній здатності блокчейна біткоїна. На початку свого розвитку, за невеликої кількості користувачів, мережа справлялася з потоком транзакцій без затримок, але зі зростанням популярності всі розуміли, що потрібне рішення. Проблема полягала в тому, як саме працює мережа біткоїна.
Під час проектування блокчейна біткоїна, щоб система була життєздатною, творцям необхідно було знайти баланс між:
- Децентралізацією — будь-хто може встановити повну ноду, почати майнити, відкритий програмний код. Побічно на цей параметр впливає розмір блоку: блок в 1 Мб малий для оброблення великої кількості транзакцій, але збільшення розміру блоку, за заявами табору «децентралістів», здатне порушити баланс і призвести до централізації мережі, оскільки майнери можуть почати демпінгувати комісії, як наслідок — обвалення хешрейту через недоцільність майнінгу, що катастрофічно позначиться на безпеці мережі. З іншого боку, обмежений розмір блоку в сукупності зі зростанням кількості користувачів, неминуче призведе до черг у мемпулі та збільшення комісій за транзакції, які зможуть платити тільки великі компанії та інвестори — відтік користувачів і потенційний крах системи.
- Пропускною спроможністю мережі — швидкість опрацювання транзакцій залежить від трьох чинників: кількості транзакцій, часового інтервалу між блоками й максимального розміру блоку. Ми вже з’ясували, що зі зростанням популярності, неминуче зростає кількість транзакцій у мережі. Інтервал між створеннями блоку регулюється кожні 2016 блоків ≈ 10 хвилин. Максимально допустимий розмір блоку в мережі біткоїна становить 1Мб, закладено алгоритмічно Сатоши Накамото у 2010 році. Цікаво що до 2010 року, розмір блоку був обмежений 32 Мб. Більший блок — більше транзакцій у нього «поміщається».
- Надійність і безпека — чим більше децентралізованих обчислювальних потужностей працює в мережі біткоїна, тим вищий хешрейт і тим складніше здійснити атаку на мережу.
- Економічною моделлю — вона побудована таким чином, щоб майнери були економічно зацікавлені в підтримці стабільної роботи мережі біткоїна. За рахунок потужності хешрейту зростає безпека і надійність мережі, за це вони отримують винагороди. Зацікавленість має бути в стабільності, але не в підпорядкуванні. І тут також є пряма залежність із розміром блоку. Стабільна робота = стабільний бізнес, підпорядкування блокчейну = крах системи.
Експоненціальне зростання кількості користувачів порушило баланс — зростала тенденція, коли переказ транзакцій від відправника до одержувача займав кілька діб. Цю проблему вирішували збільшенням комісій за транзакцію, але це ситуативне рішення і для окремо взятого користувача, зворотний бік такого підходу — недоцільність використання BTC як засобу платежу, через непомірно високі мережеві комісії. Потреба в ухваленні рішення зростала.
Існує 2 варіанти внесення змін у блокчейн:
- Хардфорк — нове програмне забезпечення, яке несумісне зі старим і вимагає, щоб усі учасники мережі оновили софт. Ті хто не згоден може продовжити роботу на старому ланцюжку блоків за попередніми правилами.
- Сфотфорк — у цьому разі учасники мережі на новому ПЗ можуть взаємодіяти з тими, хто не оновив софт, і навпаки. Поділ ланцюжка на 2 окремі не відбувається.
Впровадженню SegWit передувала низка розбіжностей, як між окремими компаніями, так і між умовними таборами «прогресорів» і «децентралістів». У результаті конфронтацій і відокремлення частини майнерів стався хардфорк біткоїна — BCH (Bitcoin Cash). Відмінністю на початковому етапі стало неприйняття SegWit і збільшення розміру блоку до 8Мб. У цей час, в основній мережі Bitcoin імплементація SegWit була реалізована більшістю майнерів, без обов’язкового порогу в 95%, до цього моменту, близько 80% вузлів мережі були готові підтримати оновлення.
Технічний бік блокчейна і транзакцій, як обґрунтування для впровадження SegWit
Біткоїна як окремої монети в самому блокчейні не існує. У цьому контексті про «монети» заведено говорити для спрощення розуміння процесів і взаємодії з екосистемою. Для розуміння логіки необхідне розуміння, як саме працюють транзакції в мережі біткоїна і що мається на увазі під терміном «Witness»/«Свідок».
З технічного погляду, на гаманцях, пов’язаних із мережею, зберігається інформація про транзакції в блокчейні, або право власності власника конкретної пари ключів. Баланс кожної адреси — це посилання на набір транзакцій, закріплених у блокчейні за цією адресою. Ще точніше — UTXO (невитрачене виведення транзакції) це і є баланси гаманців біткоїна.
Кожен UTXO може бути розділений на більш дрібні або навпаки, кілька UTXO можуть бути об’єднані в один. Найменша можлива транзакція — 1 сатоши або 0,00000001 BTC. Для зручності сприйняття інформації, далі, де це буде доречно, ми називатимемо невитрачений вихід транзакції — монетами біткоїна.
Як передаються «монети» всередині блокчейна біткоїна або як влаштовані транзакції в блокчейні
Неможливо зрозуміти механізм роботи SegWit без розуміння того, як відбуваються транзакції всередині блокчейна біткоїна, причому навіть поверхневого розуміння буде занадто мало, тому доведеться зануритися в тему. Транзакція — це «пакет» з даними, який складається з:
- Входів/вводів (inputs) — ефективно розблоковує монети, які були заблоковані в попередніх транзакціях, використовуючи фрагменти даних, які називаються входами. Вхідні дані включають сценарії про те, як розблокувати введення, звані scriptSigs. У транзакції часто вказується кілька входів. Усі значення входів нової транзакції (тобто загальна вартість монет попередніх виходів, на які посилаються входи нової транзакції) підсумовуються, і ця сума (за вирахуванням комісії за транзакцію) повністю використовується виходами нової транзакції. ScriptSig — це перша половина скрипта (докладніше нижче). Цей скрипт містить два компоненти: підпис і відкритий ключ. Відкритий ключ має збігатися з хешем, зазначеним у скрипті підтвердженого виведення. Відкритий ключ використовується для перевірки підпису одержувача, який є похідним від закритого або приватного ключа.
- Виходів/виводів (outputs) — містить інструкції з відправлення біткоїнів. ScriptPubKey — це друга половина скрипта. Виходів може бути кілька, і вони розділяють загальну вартість входів (визначають, яку саме кількість монет буде відправлено і кому). Оскільки кожен вихід однієї транзакції (UTXO) може бути використаний тільки один раз як посилання на вхід наступної транзакції, всю сукупну вартість входів необхідно відправити у вихід. Якщо вхідна вартість становить 50 BTC, але ви хочете відправити тільки 25 BTC, гаманець створить два виходи вартістю 25 BTC: один у пункт призначення, а інший назад вам («здача»)
Різниця між «вивільненими» і «замкненими» монетами вважається комісіями, які сплачуються майнерам за те, що вони вписують транзакції в новий блок. Транзакція coinbase створюється майнерами під час створення нового блоку і містить фіксовану винагороду за блок + комісії за всі транзакції. Coinbase транзакція відрізняється від звичайної — у неї відсутні входи.
Важливо: Транзакція Coinbase не має нічого спільного з криптовалютною біржею Coinbase.
На скріншоті ви можете бачити схему біткоїн транзакції до впровадження SegWit. Усі дані, нанесені на схему, хешуються і таким чином, транзакції присвоюється ідентифікатор — txid.

Поле транзакції в структурі виходів (зелена) — Pubkey Script (далі scriptPubKey), його ще називають locking script або скрипт, що замикає (для створення нової транзакції), дає мету-вказівки щодо замикання «монет» з прив’язкою до пари ключів (публічний і приватний) адресата. Це уможливлює використання «монет» виключно власником адреси, на яку їх було надіслано.
Поле транзакції в структурі вводів (синє) — Signature Script (далі scriptSig) його ще називають unlocking script (для отриманої транзакції) — містить інформацію про підписи для відкриття locking script, надаючи доказ володіння адресою. «Відкриття» здійснюється за допомогою криптографічного підпису або приватного ключа. Під доказом володіння мається на увазі свідоцтво або інформація про «Свідка» або «Witness».
«Відмикання і замикання монет» проводиться творцями транзакцій, тобто звичайними користувачами, в автоматичному режимі за допомогою програмного забезпечення (гаманці). Далі всі ці дані транслюються в мережу, пакети інформації передаються між вузлами мережі (ноди), які перевіряють валідність процесу розблокування і блокування. Якщо нода є майнером, то вона може записати транзакцію в новий блок.
Важливо, щоб правила перевірки транзакцій, якими користуються всі вузли, були сумісні з правилами, що використовуються майже всіма майнерами. Якщо окремі майнери додаватимуть транзакції до блоків, що відкидаються іншими вузлами, вузли вважатимуть увесь блок недійсним, а якщо нода, яка вважала блок недійсним, є майнером, і додасть транзакцію до іншого нового блоку, то це може призвести до подвійних витрат і поділу мережі. Це один із факторів, який вплинув на впровадження SegWit за допомогою софтфорку.
У ядрі блокчейна біткоїна закладено алгоритми, дотримуючись яких, ноди перевіряють транзакції. Якщо новий спосіб перевірки не суперечить встановленим правилам, ноди можуть здійснювати валідацію різними способами одночасно. При цьому вихідні дані, які «замикають» монети, щонайменше, містять scriptPubKey, приблизно такого змісту: «Доведіть, що ви володієте закритим ключем, який відповідає відкритому ключу, що відповідає цій адресі».
Адреси, публічні та приватні ключі в блокчейні
Публічний ключ, це похідна приватного ключа. Тобто маючи закритий ключ, можна легко відтворити відкритий ключ, але ймовірність зворотного процесу практично неможлива. Так само легко можна відтворити біткойн-адресу з відкритого ключа, але неможливо відтворити відкритий ключ з адреси. Біткоїн адреса — це похідна, хешована версія відкритого ключа, з деякими технічними нюансами у версіях SegWit і Taproot.
Адреса, яка використовується для «замикання» монет у scriptPubKey, надається приймаючою стороною транзакції. Оскільки одержувач створив цю адресу, використовуючи закритий ключ, відомий тільки йому, він єдиний, хто може створити дійсний scriptSig, і, отже, єдиний, хто може створити нову транзакцію і витратити заблокований біткойн.
Підписи
Підпис (signature) у блокчейні — це криптографічний прийом, який використовує приватний ключ, у поєднанні з будь-якими іншими даними для обчислення унікальної послідовності знаків. Ми вже знаємо, що відкритий ключ — це похідна закритого, відповідно публічний ключ можна використовувати для підтвердження того, що підпис було згенеровано за допомогою приватного ключа. Відповідно, підписи доводять володіння приватним ключем, без необхідності його розкриття або пред’явлення кому б то не було.
При створенні нової транзакції, за допомогою цифрового підпису відправника замикаються «монети» скриптом scriptPubKey. Після включення транзакції в блокчейн, підпис і публічний ключ, з якого були витрачені монети, додається в поле введення транзакції. Це підтверджує, що власник закритого ключа дійсно створив транзакцію, і гарантує, що її неможливо підробити.
Хешування транзакцій і блоків
На етапі створення переказу монет, всі дані транзакції хешуються разом, що в підсумку формує ідентифікатор транзакції — txid. П