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

04.01.2023
15 хв
3887
0
Технологія 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 та деяких інших, вже реалізованих програмних покращень.

Что такое Дерево Меркла.
avatar Dmitriy Yurchenko
суперпост

Хронологія подій — від ідеї до реалізації SegWit

ДатаПодія
2012Дискусії про необхідність вирішення проблеми пластичності транзакцій.
2013Уперше було запропоновано ідею щодо відокремлення даних про підпис від транзакції в окрему структуру.
Червень 2015Компанія Blockstream розробила сайдчейн Sidechain Elements з відокремленим свідком. Це був прототип SegWit.
Кінець 2015 рокуСформовано концепцію Lightning Network, яка вимагала вирішення проблеми пластичності.
Жовтень 2015 рокуПрозвучала ідея впровадження SegWit у вигляді софтфорка.
Грудень 2015SegWit презентовано на біткойн-конференції в Гонконзі у вигляді софтфорка.
21 грудня 2015 рокуBIP141. SegWit офіційно оформлено як пропозицію щодо поліпшення біткоїна.
Січень 2016Запущено тестову мережу BTC (SegNet).
Березень 2016SegNet підтримує тестову версію Lightning Network.
23 серпня 2016Реліз Bitcoin Core 0.13.0 — з кодовою базою SegWit.
27 Жовтня 2016Реліз Bitcoin Core 0.13.1 — з розширеним описом SegWit і які він вирішує проблеми.
15 листопада 2016Стартував процес «голосування» майнерами за проведення софтфорка.
Лютий 2017Обговорення ідеї включення SegWit за допомогою UASF — рішення тотальної більшості повних вузлів.
26 квітня 2017SegWit активовано в блокчейні Litecoin.
23 липня 2017 рокуІмплементація BIP91, за тиждень до активації UASF, яка є MASF або софтфорк, що активують майнери.
1 серпня 2017 рокуАктивація UASF.
8 серпня 2017 року Фіксація (затвердження) протоколу Segregated Witness.
24 Серпня 2017SegWit активовано в блокчейні Bitcoin.
25 Серпня 2017Видобуто перший в історії блок більше 1 Мб.

Складність прийняття консенсусних рішень у децентралізованих мережах і SegWit як компроміс

Bitcoin — це децентралізована мережа, в якій відсутній центральний орган адміністрування та прийняття рішень. Для оновлення мережі, необхідна згода більшості учасників.

Розробники ще 2012 року виявили проблеми безпеки блокчейну біткоїна, пов’язані з пластичністю транзакцій. Але тоді рішення не було знайдено. Нижче детально розкриємо цю тему, але хочемо звернути увагу на важливість цієї проблеми, бо вона стала каменем спотикання для подальшого розвитку, бо унеможливлювала розробку сайдчейнів і роботу смарт-контрактів поверх основної мережі біткойна, які залежать від непідтверджених транзакцій.

Крім пластичності, проблема полягала в низькій пропускній здатності блокчейна біткоїна. На початку свого розвитку, за невеликої кількості користувачів, мережа справлялася з потоком транзакцій без затримок, але зі зростанням популярності всі розуміли, що потрібне рішення. Проблема полягала в тому, як саме працює мережа біткоїна.

Під час проектування блокчейна біткоїна, щоб система була життєздатною, творцям необхідно було знайти баланс між:

  • Децентралізацією — будь-хто може встановити повну ноду, почати майнити, відкритий програмний код. Побічно на цей параметр впливає розмір блоку: блок в 1 Мб малий для оброблення великої кількості транзакцій, але збільшення розміру блоку, за заявами табору «децентралістів», здатне порушити баланс і призвести до централізації мережі, оскільки майнери можуть почати демпінгувати комісії, як наслідок — обвалення хешрейту через недоцільність майнінгу, що катастрофічно позначиться на безпеці мережі. З іншого боку, обмежений розмір блоку в сукупності зі зростанням кількості користувачів, неминуче призведе до черг у мемпулі та збільшення комісій за транзакції, які зможуть платити тільки великі компанії та інвестори — відтік користувачів і потенційний крах системи.
  • Пропускною спроможністю мережі — швидкість опрацювання транзакцій залежить від трьох чинників: кількості транзакцій, часового інтервалу між блоками й максимального розміру блоку. Ми вже з’ясували, що зі зростанням популярності, неминуче зростає кількість транзакцій у мережі. Інтервал між створеннями блоку регулюється кожні 2016 блоків ≈ 10 хвилин. Максимально допустимий розмір блоку в мережі біткоїна становить 1Мб, закладено алгоритмічно Сатоши Накамото у 2010 році. Цікаво що до 2010 року, розмір блоку був обмежений 32 Мб. Більший блок — більше транзакцій у нього «поміщається».
  • Надійність і безпека — чим більше децентралізованих обчислювальних потужностей працює в мережі біткоїна, тим вищий хешрейт і тим складніше здійснити атаку на мережу.
  • Економічною моделлю — вона побудована таким чином, щоб майнери були економічно зацікавлені в підтримці стабільної роботи мережі біткоїна. За рахунок потужності хешрейту зростає безпека і надійність мережі, за це вони отримують винагороди. Зацікавленість має бути в стабільності, але не в підпорядкуванні. І тут також є пряма залежність із розміром блоку. Стабільна робота = стабільний бізнес, підпорядкування блокчейну = крах системи.

Експоненціальне зростання кількості користувачів порушило баланс — зростала тенденція, коли переказ транзакцій від відправника до одержувача займав кілька діб. Цю проблему вирішували збільшенням комісій за транзакцію, але це ситуативне рішення і для окремо взятого користувача, зворотний бік такого підходу — недоцільність використання BTC як засобу платежу, через непомірно високі мережеві комісії. Потреба в ухваленні рішення зростала.

Існує 2 варіанти внесення змін у блокчейн:

  1. Хардфорк — нове програмне забезпечення, яке несумісне зі старим і вимагає, щоб усі учасники мережі оновили софт. Ті хто не згоден може продовжити роботу на старому ланцюжку блоків за попередніми правилами.
  2. Сфотфорк у цьому разі учасники мережі на новому ПЗ можуть взаємодіяти з тими, хто не оновив софт, і навпаки. Поділ ланцюжка на 2 окремі не відбувається.

Впровадженню SegWit передувала низка розбіжностей, як між окремими компаніями, так і між умовними таборами «прогресорів» і «децентралістів». У результаті конфронтацій і відокремлення частини майнерів стався хардфорк біткоїна — BCH (Bitcoin Cash). Відмінністю на початковому етапі стало неприйняття SegWit і збільшення розміру блоку до 8Мб. У цей час, в основній мережі Bitcoin імплементація SegWit була реалізована більшістю майнерів, без обов’язкового порогу в 95%, до цього моменту, близько 80% вузлів мережі були готові підтримати оновлення.

Технічний бік блокчейна і транзакцій, як обґрунтування для впровадження SegWit

Біткоїна як окремої монети в самому блокчейні не існує. У цьому контексті про «монети» заведено говорити для спрощення розуміння процесів і взаємодії з екосистемою. Для розуміння логіки необхідне розуміння, як саме працюють транзакції в мережі біткоїна і що мається на увазі під терміном «Witness»/«Свідок».

З технічного погляду, на гаманцях, пов’язаних із мережею, зберігається інформація про транзакції в блокчейні, або право власності власника конкретної пари ключів. Баланс кожної адреси — це посилання на набір транзакцій, закріплених у блокчейні за цією адресою. Ще точніше — UTXO (невитрачене виведення транзакції) це і є баланси гаманців біткоїна.

Кожен UTXO може бути розділений на більш дрібні або навпаки, кілька UTXO можуть бути об’єднані в один. Найменша можлива транзакція — 1 сатоши або 0,00000001 BTC. Для зручності сприйняття інформації, далі, де це буде доречно, ми називатимемо невитрачений вихід транзакції — монетами біткоїна.

Як передаються «монети» всередині блокчейна біткоїна або як влаштовані транзакції в блокчейні

Неможливо зрозуміти механізм роботи SegWit без розуміння того, як відбуваються транзакції всередині блокчейна біткоїна, причому навіть поверхневого розуміння буде занадто мало, тому доведеться зануритися в тему. Транзакція — це «пакет» з даними, який складається з:

  1. Входів/вводів (inputs) — ефективно розблоковує монети, які були заблоковані в попередніх транзакціях, використовуючи фрагменти даних, які називаються входами. Вхідні дані включають сценарії про те, як розблокувати введення, звані scriptSigs. У транзакції часто вказується кілька входів. Усі значення входів нової транзакції (тобто загальна вартість монет попередніх виходів, на які посилаються входи нової транзакції) підсумовуються, і ця сума (за вирахуванням комісії за транзакцію) повністю використовується виходами нової транзакції. ScriptSig — це перша половина скрипта (докладніше нижче). Цей скрипт містить два компоненти: підпис і відкритий ключ. Відкритий ключ має збігатися з хешем, зазначеним у скрипті підтвердженого виведення. Відкритий ключ використовується для перевірки підпису одержувача, який є похідним від закритого або приватного ключа.
  2. Виходів/виводів (outputs) — містить інструкції з відправлення біткоїнів. ScriptPubKey — це друга половина скрипта. Виходів може бути кілька, і вони розділяють загальну вартість входів (визначають, яку саме кількість монет буде відправлено і кому). Оскільки кожен вихід однієї транзакції (UTXO) може бути використаний тільки один раз як посилання на вхід наступної транзакції, всю сукупну вартість входів необхідно відправити у вихід. Якщо вхідна вартість становить 50 BTC, але ви хочете відправити тільки 25 BTC, гаманець створить два виходи вартістю 25 BTC: один у пункт призначення, а інший назад вам («здача»)

Різниця між «вивільненими» і «замкненими» монетами вважається комісіями, які сплачуються майнерам за те, що вони вписують транзакції в новий блок. Транзакція coinbase створюється майнерами під час створення нового блоку і містить фіксовану винагороду за блок + комісії за всі транзакції. Coinbase транзакція відрізняється від звичайної — у неї відсутні входи.

Важливо: Транзакція Coinbase не має нічого спільного з криптовалютною біржею Coinbase.

На скріншоті ви можете бачити схему біткоїн транзакції до впровадження SegWit. Усі дані, нанесені на схему, хешуються і таким чином, транзакції присвоюється ідентифікатор — txid.

Структура біткоїн-транзакцій до SegWit. Джерело.

Поле транзакції в структурі виходів (зелена) — Pubkey Script (далі scriptPubKey), його ще називають locking script або скрипт, що замикає (для створення нової транзакції), дає мету-вказівки щодо замикання «монет» з прив’язкою до пари ключів (публічний і приватний) адресата. Це уможливлює використання «монет» виключно власником адреси, на яку їх було надіслано.

Поле транзакції в структурі вводів (синє) — Signature Script (далі scriptSig) його ще називають unlocking script (для отриманої транзакції) — містить інформацію про підписи для відкриття locking script, надаючи доказ володіння адресою. «Відкриття» здійснюється за допомогою криптографічного підпису або приватного ключа. Під доказом володіння мається на увазі свідоцтво або інформація про «Свідка» або «Witness».

«Відмикання і замикання монет» проводиться творцями транзакцій, тобто звичайними користувачами, в автоматичному режимі за допомогою програмного забезпечення (гаманці). Далі всі ці дані транслюються в мережу, пакети інформації передаються між вузлами мережі (ноди), які перевіряють валідність процесу розблокування і блокування. Якщо нода є майнером, то вона може записати транзакцію в новий блок.

Важливо, щоб правила перевірки транзакцій, якими користуються всі вузли, були сумісні з правилами, що використовуються майже всіма майнерами. Якщо окремі майнери додаватимуть транзакції до блоків, що відкидаються іншими вузлами, вузли вважатимуть увесь блок недійсним, а якщо нода, яка вважала блок недійсним, є майнером, і додасть транзакцію до іншого нового блоку, то це може призвести до подвійних витрат і поділу мережі. Це один із факторів, який вплинув на впровадження SegWit за допомогою софтфорку.

У ядрі блокчейна біткоїна закладено алгоритми, дотримуючись яких, ноди перевіряють транзакції. Якщо новий спосіб перевірки не суперечить встановленим правилам, ноди можуть здійснювати валідацію різними способами одночасно. При цьому вихідні дані, які «замикають» монети, щонайменше, містять scriptPubKey, приблизно такого змісту: «Доведіть, що ви володієте закритим ключем, який відповідає відкритому ключу, що відповідає цій адресі».

Адреси, публічні та приватні ключі в блокчейні

Публічний ключ, це похідна приватного ключа. Тобто маючи закритий ключ, можна легко відтворити відкритий ключ, але ймовірність зворотного процесу практично неможлива. Так само легко можна відтворити біткойн-адресу з відкритого ключа, але неможливо відтворити відкритий ключ з адреси. Біткоїн адреса — це похідна, хешована версія відкритого ключа, з деякими технічними нюансами у версіях SegWit і Taproot.

Адреса, яка використовується для «замикання» монет у scriptPubKey, надається приймаючою стороною транзакції. Оскільки одержувач створив цю адресу, використовуючи закритий ключ, відомий тільки йому, він єдиний, хто може створити дійсний scriptSig, і, отже, єдиний, хто може створити нову транзакцію і витратити заблокований біткойн.

Підписи

Підпис (signature) у блокчейні — це криптографічний прийом, який використовує приватний ключ, у поєднанні з будь-якими іншими даними для обчислення унікальної послідовності знаків. Ми вже знаємо, що відкритий ключ — це похідна закритого, відповідно публічний ключ можна використовувати для підтвердження того, що підпис було згенеровано за допомогою приватного ключа. Відповідно, підписи доводять володіння приватним ключем, без необхідності його розкриття або пред’явлення кому б то не було.

При створенні нової транзакції, за допомогою цифрового підпису відправника замикаються «монети» скриптом scriptPubKey. Після включення транзакції в блокчейн, підпис і публічний ключ, з якого були витрачені монети, додається в поле введення транзакції. Це підтверджує, що власник закритого ключа дійсно створив транзакцію, і гарантує, що її неможливо підробити.

Хешування транзакцій і блоків

На етапі створення переказу монет, всі дані транзакції хешуються разом, що в підсумку формує ідентифікатор транзакції — txid. Під час включення транзакції в блок, майнери хеширують цей txid разом із txid іншої транзакції, для створення нового хешу, потім він хеширується разом із хешем від двох інших txid. Цей процес триватиме доти, доки не залишиться один загальний хеш від усіх транзакцій у блоці.

Така структура називається деревом Меркла, ми писали про це на початку статті у формулюванні того, що таке SegWit. Хеш сформованого блоку має бути включений у заголовок наступного блоку в блокчейні. Саме таким чином і працює блокчейн.

Зміна будь-якої частини даних про транзакцію, яка включена до будь-якого попереднього блоку, змінить txid транзакції, і вона змінить хеш того блоку та хеші всіх наступних блоків. Ноди не приймуть подібні зміни в ідентифікації блоків, оскільки це суперечитиме консенсусу алгоритму існування біткоїна — «доказу роботи» (Proof-оf-Work), на якій працює блокчейн біткоїна. При цьому сутність проблеми пластичності транзакцій полягає саме у зміні txid конкретної транзакції, але про це трохи пізніше.

Технічна частина SegWit

SegWit формує нову структуру даних у блоці під назвою Witness, яка фіксується в блоках окремо від дерева Меркла транзакцій. Ця структура містить дані, необхідні для перевірки валідності транзакцій, але не потрібні для визначення хеша транзакцій. Зокрема, підписи й деякі скрипти переміщуються в цю нову структуру, яка не враховується в традиційному обмеженні розміру блоку в 1 МБ.

Через те, що SegWit був розгорнутий як софтфорк, обов’язковою вимогою є, щоб з новими правилами могли взаємодіяти умовно «старі» ноди, які не оновили програмне забезпечення. Виглядає це приблизно так — нові типи виходів транзакції, які створюються за новими правилами, з «точки зору» «старих» нод можуть мати дивний вигляд через застосування scriptPubKeys з дивним значенням, нагадаємо, що цей скрипт вважається locking script (замикаючий). Дивина полягає в тому, що scriptPubKeys, який зазвичай служить для «замикання» транзакцій, у нових випадках повідомляє про те, що «підпис не потрібен, і хто завгодно може витратити транзакцію».

Для «старих» нод подібні параметри виглядають божевільними, бо в їхньому «розумінні» будь-хто може створити новий scriptSig (unlocking script) і витратити транзакцію на свій розсуд. Транзакція виглядає божевільною, але вона не суперечить правилам, тому «старі» ноди вважатимуть її валідною і перенаправлять до інших вузлів.

Водночас ноди з підтримкою SegWit помітять більше інформації для обробки. Текст, який «старі» ноди вважали безглуздим у scriptPubKey, «нові» ноди сприймуть як чіткі вказівки до конкретних дій. Подібно до звичайних виводів, для цього нового типу виводу знадобиться один або кілька підписів, щоб розблокувати монети. Але на відміну від звичайних вихідних даних, цей новий тип вихідних даних не вимагає включення підпису в scriptSig наступної транзакції. Замість цього потрібно, щоб підпис було включено в абсолютно нову частину структури транзакції — Witness.

Witness являє собою «надбудову», яка містить підписи й деякі додаткові дані. Witness ігноруються старими нодами, але розпізнаються новими. А дані, які вони містять, не хешуються разом з іншими частинами транзакції в txid транзакції.

Старі вузли перевіряють їх, тому що з їхнього погляду, транзакції не потребують підпису, а нові вузли перевіряють їх, тому що необхідний підпис міститься в окремій структурі Witness. Оскільки і старі, і нові вузли хешують дані транзакції в один і той самий txid, усі згодні зі складом блоків і, отже, зі структурою всього ланцюжка блоків — умови зворотної сумісності повністю дотримано.

У цій схемі є важливий нюанс із підписами. За фактом, підписи є, але їх не включають у хеш блоку «за старою схемою», водночас підпис не може бути відсутній у структурі блоку, інакше в блокчейні не буде доказу того, що до транзакції було включено валідні підписи. Вирішення проблеми пластичності, з дотриманням канонів, виглядає наступним чином — майнер, замість того, щоб створювати одне дерево Меркла з усіх транзакцій, він окремо створює дерево Меркла з усіх даних Witness, щоб відобразити дерево транзакцій. Witness Merkle Root (кореневий хеш) включається в поле введення транзакції coinbase і хешується разом з нею. Таким чином, Witness Merkle Root змінює дані транзакції coinbase, її ідентифікатор транзакції, надалі впливає на заголовок блоку і, в кінцевому підсумку, на склад блокчейна. Консенсусу — дотримано.

Схема роботи блокчейна біткоїна до, і після активації SegWit

Тепер для повноти картини, давайте подивимося схему формування блоків з урахуванням нових структур:

Структура біткоїн-транзакцій до SegWit. Джерело.

Інформація про підписи вилучається зі звичайного дерева Меркла. У блоці формується окреме дерево хеша, після чого дані хешуються через додавання в транзакцію coinbase. Обидва корені хешів — транзакцій і даних Witness — хешуються в заголовок, з рештою даних. У такий спосіб унеможливлюється будь-яка можливість внести зміни як у TXID транзакції, так і в хеш заголовка блоку.

Ефективний розмір блоку — збільшення пропускної здатності

Середньоденний розмір блоку в блокчейні біткоїна. Джерело

Середньоденний розмір блоку в блокчейні біткоїна перебуває в діапазоні 1.2 — 1.3 Мб. Вертикальною лінією в центрі графіка відзначено дату впровадження SegWit, після чого обмеження в 1 Мб фактично було пройдено.

Розмір блоку обмежений алгоритмічно в 1 Мб, але цей параметр регулює «стару» структуру зберігання даних, а на новаторську реструктуризацію дане правило не поширюється, так всі вирішили й погодилися, що цей факт не суперечить консенсусу біткоїна. Переміщення підписів з їхнього звичного місця в блоці в окрему структуру Witness, за фактом вивільнило ефективне місце в блоці. Такий фокус означає, що в кожному блоці може бути записано більше транзакцій, що в підсумку збільшує пропускну здатність мережі в цілому.

«Старі» ноди не помічають нову структуру «Witness», відповідно вони не враховують її вагу, тому для них ліміту в 1 Мб, як і раніше, буде дотримано, а для «нових» нод, які бачать істинний розмір, обмеження в 1 Мб замінили новим — 4 Мб (максимально допустимий), а ефективний у межах 1.6 — 2 Мб.

За заявами розробників — якщо всі гаманці перейдуть на використання SegWit, мережа зможе підтримувати приблизно на 70% більше транзакцій.

Проблема та виправлення пластичності транзакцій

Саме проблема пластичності транзакцій стала «каталізатором» розробки та впровадження оновлення SegWit. Проблема не була критичною для роботи блокчейна біткойна, транзакції, як і раніше, створювали й доходили до адресата, але були нюанси, які могли вводити обивателів в оману, унеможливлювали створення мереж, що працювали б поверх блокчейна біткойна, і використовували зловмисники для недобросовісних дій. Розглянемо детально.

Пластичність транзакції — це некритична для безпеки та працездатності, навмисна або випадкова зміна частини вмісту транзакції. А саме дані підпису в scriptSig, після його формування відправником, до етапу запису транзакції в блок, недобросовісними нодами або майнерами, з метою змінити хеш (txid) всієї транзакції. Як наслідок створюється клон транзакції, але з іншим TXID, 2 транзакції конкурують за те, хто перший буде записаний майнерами в новий блок. Така маніпуляція не порушує консенсус мережі, записана буде тільки 1 транзакція, інша буде відхилена. Але вносить плутанину в системі обліку транзакцій, так спочатку сформована транзакція, а точніше її хеш (TXID) відображається як непідтверджена, далі транзакція записується в блок, але вже з іншим TXID, який «мутував», і доходить до одержувача. Але відправник, відстежуючи переказ монет тільки за оригінальним TXID, бачить, що транзакцію не додано до блоку і до одержувача вона не дійшла, хоча фактично монети списалися з його балансу і вже перебувають на іншій адресі, щоб це побачити, достатньо відстежити транзакції за цільовою адресою або подивитися стан адреси відправника і всі створені вихідні перекази.

Як SegWit розв’язує проблему пластичності — всі дані, зміни в яких призводять до зміни хеша транзакції, унаслідок маніпуляцій із підписами, ізолюються в новій структурі транзакції Witness, а потрапляючи в блок, хешуються особливим чином (описано вище). Це унеможливлює несанкціоновану зміну TXID транзакції, що закриває проблему пластичності або податливості транзакцій до змін її ідентифікатора.

Є ще 1 проблема, що випливає з пластичності транзакцій, але вона куди більш серйозна.

На технічному рівні, програмне забезпечення ядра біткоїна дозволяє здійснювати витрати непідтверджених UTXO або off-chain транзакції. Ті монети, які відображаються на балансі адреси (далеко не на всіх гаманцях), але транзакція, що їх містить, ще не включена до блокчейну. Зверніть увагу, що всі кастодіальні гаманці забороняють цю операцію, і більшість некастодіальних також. Для реалізації витрати непідтверджених UTXO необхідно використовувати просунутий рівень взаємодії з ядром біткоїна і спеціальні гаманці або програмний код безпосередньо (умовно назвемо це — трюки). Отже, що відбувається при зміні ідентифікатора транзакції, при витраті непідтверджених на балансі монет:

Адреса «А» відправляє монети в транзакції т1 адресі «Б», монети вже відображені на адресі «Б» і за допомогою «трюків» можуть бути відправлені далі, навіть без підтвердження т1 у блокчейні. Адреса «Б», використовуючи «трюки», відправляє монети в транзакції т2 адресі «В», і якщо гаманцем це передбачено, то вони можуть відображатися на балансі адреси «В», навіть за умови, що т1 ще не підтверджено. У даній ситуації, в ідеальному світі проблеми не виникне, поступово всі транзакції будуть додані в блоки, але в реальному світі трапляються нюанси. А саме — якщо TXID транзакції т1 буде змінено, це означатиме, що адреса «Б» отримає монети в повному обсязі, але створена раніше і відправлена на адресу «В» транзакція т2 не зможе послатися на попередню транзакцію. Простими словами вона не зможе «пояснити своє походження», а блокчейн вимагає, щоб усі транзакції були взаємопов’язані для відстеження та їхньої валідації в блокчейні. Як наслідок т2 буде скасовано і монети зникнуть з адреси «В» і будуть повернуті адресі «Б». Якщо адреса «Б» виявиться сумлінною, вона створить повторно транзакцію з тими самими значеннями, що були в т2, і відправить її на адресу «В», але якщо це не так, адреса «В» стане жертвою шахрайської схеми.

З оновленням SegWit і описана вище ситуація також вирішується, бо оновлення унеможливлює зміни хешів транзакції, що відкриває прямий шлях до реалізації сайдчейнів поверх основної мережі біткойна.

Робота сайдчейнів або мереж другого рівня поверх блокчейна біткоїна. SegWit і Lightning Network

Ситуація описана вище, а саме off-chain транзакції використовуються для роботи сайдчейнів, або мереж другого рівня, для швидкого і недорогого передавання монет усередині основної мережі біткоїна. Відповідно, безпечна робота мереж другого рівня неможлива без вирішення проблеми пластичності.

SegWit зробив будь-яку функцію, яка ґрунтується на непідтверджених транзакціях, безпечною і зручною в проєктуванні. Найвідоміший блокчейн другого рівня, реалізація якого стала можливою після впровадження Segregated Witness — Lightning Network.

Інші нововведення SegWit для нод, майнерів і розробників

Оновлення SegWit свого часу стало наймасштабнішим за всю історію існування біткоїна. Крім перерахованих вище нововведень були ті, які зачіпають роботу вузлів мережі та майнерів:

  • Лінійне масштабування операцій входу — оптимізація хешування підписів, з метою зменшення витрати часових і апаратних ресурсів на операції вузлами мережі.
  • Керування версіями скрипта — SegWit, додає номер версії для скриптів. Мова програмування ядра біткоїна по суті складається з елементарних скриптів. Окремі проблеми та оновлення тепер можуть вирішуватися додаванням нових версій скриптів у ядрі біткоїна. Завдяки цьому, стало можливим впровадити, наприклад, Підписи Шнора в оновленні Taproot.
  • Зниження зростання UTXO або оптимізація апаратних витрат для повних нод і майнерів — база даних невитрачених UTXO зберігається в оперативній пам’яті повних вузлів, це дає змогу не допустити подвійних витрат. Однак кількість UTXO зростає пропорційно популярності проєкту. SegWit зменшує вартість комісій приблизно на 75% тих транзакцій, які не збільшують кількість наявних UTXO, інакше кажучи, вводиться система стимулів.

Більш детальну інформацію щодо цих нововведень можна почитати на офіційному сайті розробників SegWit — BitcoinCore.

Усі типи та формати адрес Bitcoin, включно з новими SegWit і Taproot

У мережі біткоїна існують різні протоколи для передачі транзакцій з однієї адреси до іншої, також є різні формати адрес. SegWit запровадив власний стандарт адреси. Думаємо, що вам буде цікаво дізнатися про всі існуючі типи біткоїн адрес, тому ми коротко опишемо всі існуючі:

P2PK — Pay to Public Key

P2PK Входи й Виходи в мережі Біткоїн. Джерело

Це не зовсім адреса. Pay-to-PubKey — дослівно перекладається як оплата на публічний ключ. Перші біткоїн транзакції використовували як «адресата» повний публічний ключ, без його хешування. Такий формат передачі монет має 3 недоліки:

  1. Знижена безпека.
  2. Некомфортне зберігання і передача інформації.
  3. Високі комісії.

Перекази біткоїнів безпосередньо на публічні ключі займають дуже невеликий відсоток від загальної мережевої активності, але рідкісні перекази фіксуються й у 2022 році.

Legacy — P2PKH (Pay to Public Key Hash)

P2PKH входи й виходи в мережі біткоїн. Джерело.

Найстаріший тип адреси, використовувався практично з початку існування біткоїна. Це вже хеш публічного ключа, як можна зрозуміти з розшифровки абревіатури — Pay-to-PubKey-Hash. Цей формат запровадив Сатоші Накамото. Після 2018 (впровадження софтфорка SegWit) року спостерігається тенденція до зниження використання цього типу адрес.

Формат адреси чутливий до регістру, завжди починається з цифри «1», у цьому форматі адрес не застосовують таких символів: великі літери O, I, малу l і число 0, щоб унеможливити підміну символів і неоднозначність. Має такий вигляд (приклад):

«1Nmmnj9AHi3ngF1DzHUTCb2tBNWxG4cxXd»

Legacy (P2PKH) сумісний з усіма гаманцями в мережі біткоїн. Недоліки — найвищі комісії та низька швидкість хешування даних під час транзакцій.

Script — P2SH (Pay to Script Hash)

P2SH входи й виходи в мережі біткоїн. Джерело.

Запроваджено 2012 року, у BIP16. Pay-to-Script-Hash — оплата на хеш скрипта. Дозволяє прив’язувати монети до хешу скрипта і створювати різні сценарії, що, відповідно, урізноманітнює застосування, наприклад, створення адрес з мультипідписом, перекладання комісії на одержувача.

Формат адреси ідентичний Legacy, але починається з цифри «3». Також чутливий до регістру! Має такий вигляд (приклад):

«3BN8j6i3SfAGuBuQyRACS9ZkWNBu2tKFWG»

Сумісний з усіма гаманцями. Знижена комісія за транзакції, порівняно з адресами Legacy. Також може бути рідною адресою SegWit, але коли говорять про адреси SegWit, мають на увазі адреси — Bech32.

SegWit (Bech32) — P2WPKH (Pay to Witness Public Key Hash)

Графік відсоткового співвідношення використання SegWit транзакцій від усіх інших у системі. Джерело.

Такий формат біткоїн адрес був запропонований у 2016 році, в BIP173, активований наприкінці серпня 2017 року. Pay to Witness Public Key Hash — оплата на хеш скрипта свідка. Адреса повністю реалізує весь потенціал софтфорка SegWit, описаний у цій статті. Як видно з останнього скріншота, транзакції SegWit — тотально домінують в екосистемі.

У форматі адреси використовуються тільки малі літери. Завжди починається з «bc1q». Довжина адреси може варіюватися до 90 символів. Має такий вигляд (приклад):

«bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4»

Сумісний з усіма гаманцями та адресами, винятки тільки дуже старі гаманці. Найменші комісії за транзакцію, серед розглянутих форматів адрес і висока швидкість обробки. Адреса вважається стандартом в екосистемі біткоїна станом на 2023 рік.

Taproot (bech32m) — P2TR (Pay to Taproot)

Графік процентного співвідношення використання Taproot транзакцій від усіх інших у системі Джерело

У листопаді 2021 року, разом із другим за значущістю, після SegWit, оновленням, у мережі Taproot було запроваджено новий формат біткоїн адрес P2TR (Pay to Taproot) або bech32m. Ще більша оптимізація комісій за транзакції.

У форматі адреси використовуються тільки малі літери. Завжди починається з «bc1p». Має такий вигляд (приклад):

«bc1peu5hzzyj8cnqm05le6ag7uwry0ysmtf3v4uuxv3v8hqhvsatca8ss2vuwx»

Зростання за 2022 рік відсоткового співвідношення використання адрес Taproot склало більше 1.5%, з 0,24% на початку року, до 1.84% до кінця року. Не всі гаманці біткоїна підтримують цей тип адреси, але поступово прийняття буде збільшуватися, як це відбувалося з адресами SegWit.

Ще не всі гаманці підтримують створення адреси формату bech32m. Також деякі біржі та сервіси не дозволяють перекази на Taproot адреси.

Адреса типу P2WPKH, вона ж SegWit (Bech32) — найоптимальніший варіант, якщо стоїть вибір, яку адресу біткоїна використовувати. Вона сумісна практично з усіма іншими адресами, гаманцями, біржами й сервісами, виняток — тільки застарілі гаманці.

SegWit і SegWit2x

SegWit2x — це хардфорк, який не відбувся. Він мав стати продовженням впровадження SegWit, з метою максимального збільшення розміру блоку до 2 Мб, але надалі більша частина спільноти відмовилася від цієї ідеї, порахувавши, що в ній немає нагальної потреби, а можливі ризики перевищують потенційні вигоди.

Висновок

З моменту впровадження SegWit минуло понад 5 років, біткоїн «живий» і продовжує розвиватися, попри побоювання і суперечки спільноти напередодні. Софтфорк сприяв зниженню комісій за транзакції, оптимізував роботу вузлів і майнерів і створив заділ для подальших поліпшень у мережі.

Біткоїн свого часу став проривною технологією, але без глобальних поліпшень програмного забезпечення, яким свого часу став «Відокремлений Свідок», не було б того розвитку, і, можливо, не було б того BTC, якого ми знаємо сьогодні.

Деяка частина технічної інформації взята, перекладена та адаптована з сайту bitcoinmagazine.com, де, своєю чергою, під час підготовки матеріалу використовували коментарі співзасновників Blockstream Пітера Вуілле та Марка Фріденбаха, генерального директора Ciphrex Еріка Ломброзо та технічного директора Blocktrail Рубена де Вріса, по суті, це люди, які брали участь у розробці Segregated Witness.

Буде цікаво

Найчастіші запитання

У цьому контексті мається на увазі формат біткоїн адреси. У Native SegWit адреси починаються з «bc1q», це формат (Bech32) або P2WPKH (Pay to Witness Public Key Hash), в той час як під SegWit мають на увазі P2SH (Pay to Script Hash), починається цей формат адрес з цифри «3». А має відношення до SegWit з тієї причини, що для переказів використовуються скрипти.
Це новий тип адрес біткоїна, який був впроваджений для оптимізації роботи з софтфорком SegWit, зокрема оптимізації комісій, більш швидкого опрацювання транзакцій і підвищення безпеки.
Наймасштабніше оновлення програмного коду біткоїна, покликане вирішити проблему пластичності транзакцій і збільшити масштабованість мережі. Однак, дане рішення застосовувалося і на інших проєктах, найбільш відомий — Litecoin.
Це вид голосування в децентралізованій сіті за ту чи іншу пропозицію щодо поліпшення, в даному випадку майнерів, які встановленням або не встановленням оновленого програмного забезпечення сигналізують або не сигналізують про підтримку конкретного оновлення в мережі. Якщо певний відсоток «проголосує за», це означатиме фіксацію пропозиції, а далі йде реалізація, у тому порядку, як це було прописано в документі.

Як вам стаття?

0
0

статті на цю ж тему

Топ-5 безкоштовних способів...
avatar Denis Solomyanyuk
15.04.2024
Рішення другого рівня для біткоїна —...
avatar Nikita Tipikin-Holovko
20.03.2024
Халвінг біткоїну у 2024 році: коли...
avatar Andrew Makarov
06.03.2024