Перейти к содержимому
buybitcoinsmart

Глоссарий / Протокол и обновления

Данные свидетеля

Другие названия: Свидетель.

Что такое данные свидетеля?
Данные свидетеля представляют собой материал подписи, который транзакция SegWit несет в отдельном разделе; он учитывается по одной весовой единице на байт и полностью исключен из txid.

Определено в BIP-144.

Каждый вход получает собственный свидетель: стек элементов, чаще всего подпись и публичный ключ. Раздел идет после выходов, за двухбайтовым маркером и флагом, которые сообщают программе, что транзакция записана в более новом формате. Узел, на котором работает программное обеспечение, выпущенное до обновления 2017 года, никогда не запрашивает этот раздел и никогда его не видит.

Как это работает

Данные свидетеля занимают собственное место в байтовой структуре транзакции, определенной в BIP-144.

Сериализованная транзакция в более новом формате читается так: версия, байт маркера 0x00, байт флага 0x01, входы, выходы, затем по одному стеку свидетеля на каждый вход в том же порядке и затем locktime. Маркер обеспечивает совместимость: при старом разборе значение ноль означало бы ноль входов, что бессмысленно, поэтому старое программное обеспечение, получившее новый формат, сразу понимает, что он не для него, а устаревшим узлам этот формат просто никогда не передается.

Отсюда возникают два идентификатора. txid представляет собой двойной SHA-256 транзакции с удаленными маркером, флагом и свидетелями, поэтому ничто внутри свидетеля не может его изменить. wtxid хеширует полную сериализацию. Каждый блок фиксирует корень Меркла своих wtxid в выходе coinbase, в выходе OP_RETURN, скрипт которого насчитывает не менее 38 байт и начинается с четырехбайтового тега 0xaa21a9ed, так что данные защищены, хотя и находятся вне более старого обязательства.

Скидка проявляется в стоимости. Все, что находится вне свидетеля, считается по четыре весовые единицы за байт, а все, что внутри, по одной, при пределе 4 000 000 весовых единиц на блок. Если разделить вес на четыре, получаются виртуальные байты, то есть единица, в которой указывают размер комиссии.

Где это видно

Откройте любую транзакцию в обозревателе блоков, и размер, виртуальный размер и вес будут показаны рядом. Если они расходятся, разница приходится на свидетеля. У платежа без свидетеля размер равен его vsize; у платежа Taproot vsize может составлять лишь четверть его необработанного размера.

Если развернуть отдельный вход в современном обозревателе, виден сам стек. Для платежа с адреса bc1q это два элемента: подпись размером около 71 или 72 байт и сжатый публичный ключ размером 33 байта, а для траты по ключевому пути Taproot это один элемент ровно из 64 байт. Именно из-за этого количества новые типы выходов дешевле в трате.

Это поле встречается и в файлах, с которыми работает ваш аппаратный кошелек. Частично подписанная транзакция биткоина содержит для каждого входа запись UTXO свидетеля и запись итогового свидетеля, и именно их координаторное приложение передает туда и обратно, пока транзакция с мультиподписью собирает подписи.

Данные свидетеля vs скрипт свидетеля

Данные свидетеля представляют собой весь стек; скрипт свидетеля является одним элементом внутри него. При трате P2WSH последний элемент стека является скриптом, хеш которого зафиксировал выход, а все, что стоит перед ним, существует для удовлетворения этого скрипта. Эта связь в точности повторяет более старый шаблон, где скрипт погашения является последним элементом скрипта подписи P2SH. Поэтому каждый скрипт свидетеля является данными свидетеля, тогда как большинство данных свидетеля, включая любую обычную трату с одним ключом, вовсе не содержит скрипта свидетеля.

Не путать с

Часто задаваемые вопросы

Почему размер моей транзакции отличается от ее виртуального размера?

Разница приходится на данные свидетеля. Виртуальный размер представляет собой вес, разделенный на четыре, а байты свидетеля считаются по одной весовой единице вместо четырех, поэтому у любой транзакции, тратящей входы SegWit, виртуальный размер меньше ее необработанного числа байт.

Можно ли отбросить данные свидетеля после подтверждения транзакции?

Нет, если узел намерен самостоятельно проверять историю, потому что каждый блок фиксирует корень Меркла идентификаторов свидетелей. Урезанный узел отбрасывает старые данные блоков любого рода, но перед этим он проверил свидетелей.

Связанные термины

Еще в разделе «Протокол и обновления»

Читать эту страницу на английском