Глоссарий / Протокол и обновления
Данные свидетеля
Другие названия: Свидетель.
- Что такое данные свидетеля?
- Данные свидетеля представляют собой материал подписи, который транзакция 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. Поэтому каждый скрипт свидетеля является данными свидетеля, тогда как большинство данных свидетеля, включая любую обычную трату с одним ключом, вовсе не содержит скрипта свидетеля.