Найти тему
Про Крипто

Segregated Witness. Часть 1. Native Segwit

Оглавление

Мотивация введения протокола Segwit

В одной из предыдущих статей я рассказывал о классических типах адресов сети Bitcoin, и читатель имел возможность познакомится с P2PKH и P2SH адресами. На протяжении долгого времени именно эти типы адресов активно применялись как обычными пользователями, так и сервисами. Однако их использование несёт в себе ряд недостатков, самым большим из которых является вес, который они привносят в транзакции.

Напомню, что главной проблемой Биткоина была и остаётся проблема масштабируемости. Именно она не позволяет Биткоину полноценно заменить существующие платёжные системы. В чём же суть этой проблемы?

Существуют два важных параметра сети Биткоин, которые были прописаны Сатоши Накамото в whitepaper и коде Биткоина.

  • Время генерации блока. В среднем каждый новый блок генерируется раз в 10 минут.
  • Максимальный вес блока - 1 Мб.

В следствие этого каждые 10 минут подтверждается лишь то количество транзакций, которое майнер может поместить в 1 Мб. пространства. Однако с развитием сети Биткоин выросло и число пользователей, которые отправляют в сеть всё больше и больше транзакций. Из-за этого возникает большое количество транзакций, ожидающих подтверждений в мемпулах майнеров. Это, в свою очередь, приводит к гонке комиссий, так как майнеры обычно отдают предпочтение транзакциям с более высокой комиссией, стараясь получить максимальную прибыль с блока(награда за блок + сумма комиссий всех транзакций блока).

Такая ограниченность пропускной способности сети, приводящая к достаточно дорогим транзакциям, несёт негативный эффект для дальнейшего развития Биткоина и его принятия и интеграции в финансовую сферу жизни человека. Никто просто не будет пользоваться медленной и дорогой системой платежей. Поэтому Биткоин разработчики работали и продолжают работать над созданием решений данной проблемы. Одним из них является введение протокола Segregated Witness(Segwit)

Segregated Witness(Segwit)

Протокол Sehregated Witness, или просто Segwit, был впервые представлен Питером Вулле в 2015 году. Внедрение протокола было направлено на решение двух проблем: проблемы масштабируемости и проблемы пластичности транзакций. Посмотрим, как Segwit решает каждую из проблем.

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

Основная идея Segwit заключается в разделении транзакции на две части: witness и не-witness данные. Witness данные - это отпирающий скрипт, содержащий в себе подписи. В транзакциях, использующих старые типы адресов, отпирающий скрипт находится в поле ScriptSig.

Схема 1: Структура транзакции, не использующую протокол Segwit
Схема 1: Структура транзакции, не использующую протокол Segwit

В транзакциях с использованием Segwit адресов отпирающий скрипт выносится в конец данных транзакции, при этом поля ScriptSig становится пустыми.

Схема 2: Структура транзакции, использующую протокол Segwit
Схема 2: Структура транзакции, использующую протокол Segwit

Кроме того, вычисление идентификатора транзакции(TXID) исключает использование witness данных. Таким образом, подписи, содержащиеся в отпирающем скрипте, больше не влияют на создание TXID. А значит, пластичность подписи ECDSA не будет приводить к пластичности транзакции.

Проблема масштабируемости

До введения протокола Segwit размер блока вычислялся в байтах и не мог превосходит 1 Мб, что приводило к ограничению на количество транзакций, которые можно было в него поместить. Отсюда возникает проблема масштабируемости сети, фактически являющаяся главным узким местом Биткоина. С ростом количества пользователей сети Биткоина и, соответственно, транзакций очередь на подтверждение в мемпулах майнеров росла, что, в свою очередь, приводило к гонке комиссий. Поэтому одной из главных тем исследований потенциального развития первой криптовалюты и её блокчейна всегда был поиска увеличения пропускной способности сети.

Одной из задач протокола Segwit было решить или, по крайней мере, сгладить эту проблему. Для этого было решено изменить метрику величины блока и вместо размера блока использовать понятие веса блока.

Максимальная величина блока после введения протокола Segwit ограничена теперь не 1 Мб, а 4,000,000 весовых единиц.

Напомню, что данные транзакций теперь делятся на witness и не-witness. Поэтому для расчёта величины блока в весовых единицах суммируются веса каждой транзакции блока. Вес транзакции, в свою очередь, высчитывается по формуле:

-3

где n - количество байт не-witness данных в транзакции, а m - количество witness данных в транзакции.

Рассмотрим, как это работает на реальном примере. Возьмём транзакцию bdd67cf55340d03963b5c9e90074457be5c0954ea82e1875f417210a5a1f023e:

  • Размер транзакции равен 1089 байтам.
  • Вес транзакции равен 2415 весовым единицам.

Таким образом, если рассматривать размер транзакции, то в блок величиной 1 Мб.=1048576 байт поместится 962.88 таких транзакций. Однако если мы рассматриваем размер, то в блок величиной 4,000,000 весовых единиц поместится 1656.3147 таких транзакций, т.е. в 1.72 раза больше.

Стоит отметить, что при введении Segwit блок фактически может достигать размера в 4 Мб(в случае, если в блоке не используются Segwit адреса). На 8 января 2024 года средний размер блока достигает 1.65 Mb.

Таким образом, мы получаем больше места в блоке для транзакций причём чем больше адресов Segwit задействуется в транзакциях блока, тем больше транзакций в него можно поместить.

Замечу, что это не решает полностью проблему масштабируемости, но немного улучшает ситуацию.

Segwit адреса

Для использования Segwit существуют две опции:

  • native segwit - bech 32 адреса;
  • обёртка - p2sh адреса.

Про второй вариант мы поговорим в одной из следующих статей, а сегодня сосредоточимся на bech32 адресах.

Одним из важных отличий является использование кодировки base32 вместо base58, использовавшейся для получения адресов старого типа(P2PKH,P2SH).

В BIP-0173 авторы Питер Вулле и Грег Максвел выделяют несколько недостатков адресов старых типов, связанных с использованием base58:

  • Base58 требует много места в QR-коде, поскольку он не может использовать буквенно-цифровой режим.
  • Смешанный регистр в base58 делает неудобным записывание, ввод текста на мобильных клавиатурах или чтение вслух.
  • Контрольная сумма на базе двойного хэширования SHA256 работает медленно и не дает никаких гарантий обнаружения ошибок.
  • Большая часть исследований кодов обнаружения ошибок применима только к размерам наборов символов, которые являются простой степенью, а 58 - нет.
  • Декодирование Base58 сложное и относительно медленное.

Выделяют два основных типа bech32 адресов:

  • P2WPKH(Pay-to-Witness-Public-Key-Hash)
  • P2WSH(Pay-to-Witness-Script-Hash)

P2WPKH

P2WPKH - это Segwit аналог P2PKH адреса.

Адреса типа P2WPKH генерируются согласно следующей схеме.

Схема 3  Схема генерации P2WPKH адресов.
Схема 3 Схема генерации P2WPKH адресов.

P2WSH

P2WSH - это Segwit аналог P2SH адреса.

Адреса типа P2WSH генерируются согласно следующей схеме.

Схема 3  Схема генерации P2WSH адресов.
Схема 3 Схема генерации P2WSH адресов.

Результаты введения SegWit

Подводя итоги, можно выделить несколько главных преимуществ введения протокола Segwit:

  • Увеличение пропускной способности. Стоит отметить, что хотя увеличение пропускной способности и произошло, это не привело к полноценному решению этой проблемы масштабируемости. Если до введения протокола Segwit пропускная способность была на уровне 3 tps(транзакций в секунду), то после введения выросло до 4 tps. Однако затем значение tps вернулось к 3, а иногда опускаясь ниже 3. Это связано с тем, что сеть Биткоина развивается и привлекает новых пользователей, что приводит к росту общего числа транзакций, который пользователи хотят подтвердить в сети Биткоина при постоянном значение максимального веса блока.
  • Транзакции с использованием Segwit адресов легче, из-за чего и транзакционная комиссия у таких транзакций ниже.
  • Одним из главных результатов введения протокола Segwit являлось появление возможности реализации таких протоколов второго слоя, как Lightning Network. Lightning Network - протокол оффчейн платежей, реализуемых через платёжные каналы в сети Биткоин. Именно он может стать в долгосрочной перспективе спасителем первой криптовалюты, обеспечив необходимую пропускную способность. В одной из следующих статей мы ещё вернёмся к этому протоколу.
  • Разделение Биткоина. Введение протокола Segwit не нашло в сообществе первой криптовалюты единую позицию. Пользователи и разработчики разделились на два лагеря: первые поддерживал введение протокола Segwit, вторые же выступал за альтернативной решение проблемы масштабируемости - увеличение блока до 8 Мб(до 32 Мб в 2018 году). Это привело к разделению Биткоина на две отдельные монеты(форк): Bitcoin Core, являющийся тем самым Bitcoin, про который обычно говорят люди и который стоит сегодня около 47,000 $, и Bitcoin Cash, стоимость которого значительно ниже(248 $).

Таким образом, протокол Segwit хоть и не является панацеей от проблемы масштабируемости, тем не менее стал важнейшим шагом в процессе развития первой криптовалюты. Следующее аналогичное по важности нововведения в сети Биткоин произошло уже 14 ноября 2021 года, когда был активирован протокол Taproot. Однако о нём мы поговорим уже в одной из следующих статей.

Надеюсь, эта статья была Вам полезна. Если у Вас остались вопросы, буду рад на них ответить. А пока будьте на позитиве и как говориться: Don't worry, be happy!)