Главное предназначение Биткоина — независимые платежи. В блокчейне Биткоина нет базы данных, в которой хранится балланс всех кошельков, вместо этого в блокчейн записывают транзакции в хронологическом порядке. Данные в блокчейне невозможно изменить, а значит, для подтверждения перевода монет с кошелька А можно проверить, есть ли на кошельке А достаточное количество битков. Транзакции исполняются после занесения их в блок, а блока — в блокчейн. В среднем, новый блок добавляется каждые 15 минут. В стандартный блок BTC объемом 1 Мб вмещается приблизительно 2000 транзакций, что дает пропускную способность сети 2-3 транзакции в секунду.

Медленно и не всегда безопасно

Во время разработки Биткоина, Сатоши Накамото думал о его безопасности больше, чем о масштабируемости. При небольшом количестве пользователей можно и подождать 15 минут на новый блок, но когда транзакции заполняют «мемпул» — начинается конкуренция и ожидание в несколько часов. Транзакции сортируются по приоритету комиссии: те, что подороже, идут первыми, а дешевые остаются ждать свободного блока. Ситуацию усугубляет маленький объем блока, поэтому практически все форки Биткоина обзаводятся блоками от 2 до 8 Мб. Большой блок — это не всегда хорошо, так как на сеть идет большая нагрузка.

Для занесения транзакции в блок ее нужно подписать приватным ключом, присвоить идентификатор, а затем несколько узлов сети должны подтвердить возможность провести транзакцию. Идентификатор транзакции рассчитывается из ее хеша, то есть, если изменить любой байт транзакции — меняется ее идентификатор. Например, можно добавить служебные константы в подпись, которые не меняют сути транзакции, но изменят ее хеш.

Представим хакера, который ворует Биткоины из биржи. Он регистрирует транзакцию на вывод 1 BTC, которой присваивается идентификатор А, отправляет транзакцию на верификацию в сеть особым способом, чтобы та сначала попала на контролируемый узел хакера. Там к подписи транзакции добавляется лишняя информация, что заставляет узел пересчитать хеш и присвоить транзакции новый идентификатор В. Транзакция В попадает в основную сеть и нормально исполняется — 1 BTC из биржи попадает на кошелек хакера. Фишка в том, что в кошельке биржи зарегистрирована транзакция с идентификатором А, которая так и не попала в сеть, а если попала — будет считаться недействительной, потому что она, фактически, уже выполнена. Служба безопасности будет долго ломать голову, почему это транзакция не исполнена, но монеты ушли. Примерно таким способом обворовали биржу Mt Gox.

Segregated Witness

SegWit — надстройка для ускорения транзакций и решения проблемы «пластичности». Суть SegWit в том, чтобы освободить место в блоке, выведя подписи за пределы блока. Обычный блок с SegWit вмещает примерно в два раза больше транзакций и не требует форков, при этом лишь немного увеличивая нагрузку на сеть. Но для использования SegWit нужны специальные узлы, готовые принимать и подгружать в блокчейн эти расширенные блоки. SegWit работает все время, но с его помощью сжимается не так и много транзакций: в средний блок в сети BTC помещается около 800 Кб обычных транзакций и 300 Кб сжатых с помощью SegWit.

Проблема «пластичности» решилась просто — раз подписи идут отдельно, то добавление служебных констант к подписи не меняет тело транзакции, а значит ее хеш и идентификатор остаются прежними.

Плюсы SegWit:

  • Увеличивает пропускную способность

  • Уменьшает конкуренцию и комиссию

  • Устраняет «пластичность»

Минусы SegWit:

  • Усложняет сеть

  • Усложняет проверку транзакций

Назад