Witness Data — данные при входах транзакции, позволяющие проверить условия расходования в SegWit. Вход ссылается на ранее полученные монеты, которые теперь тратят. Witness может содержать подписи, открытые ключи или скрипт. Это часть транзакции, а не отдельное место хранения денег.
Анна получила Bitcoin и теперь хочет заплатить Петру. Предыдущий платёж создал выход: запись о сумме и условиях её дальнейшего расходования. Новая транзакция ссылается на него через вход. Но просто заявить, что монеты принадлежат Анне, недостаточно. При обычной оплате кошелёк создаёт подпись, которую можно проверить без раскрытия закрытого ключа. Кошелёк — приложение или устройство для получения и отправки биткоинов. Закрытый ключ — секретное числовое значение, с помощью которого создают такую подпись. В SegWit эти данные передаются в witness соответствующего входа. Наличие подписи ещё не означает, что она верна. [1] [4] [5]
Представьте разницу между требованием «покажите действующий документ» и самим предъявленным документом. В Bitcoin нет человека-арбитра: соответствие проверяется по правилам. Witness program входит в условие, записанное в прежнем выходе; его версия определяет порядок проверки. Witness предоставляет новая расходующая транзакция. Технически это упорядоченный список элементов данных для каждого входа. Он не является автоматически исполняемой программой или копией всех неизрасходованных монет. [1] [7]
Witness может раскрывать подпись, открытый ключ или использованный скрипт — программу, описывающую условия расходования. Открытый ключ используют для проверки подписей; его не требуется хранить в секрете. Это не зашифрованное хранилище. Закрытый ключ остаётся у вас: им подписывают, а не отправляют его в сеть вместо подписи. Ни witness, ни опубликованная подпись не заменяют Seed Phrase, слова для восстановления кошелька. Если потерять и ключи, и резервную копию, одна публичная история платежей не вернёт возможность подписывать новые переводы. [1] [3] [4]
Обозреватель блоков — приложение для поиска транзакций и блоков определённой сети. Обозреватель может показывать wtxid рядом с txid. Оба представляют собой хеши — короткие отпечатки точной записи данных, полученные двойным применением SHA-256. Для txid берут запись без witness, для wtxid — полную запись вместе с ним. Это не адреса получателей и не два разных платежа. Если witness отсутствует, используется исходный формат и идентификаторы совпадают. В Bitcoin Core v29.0 команда decoderawtransaction показывает полный идентификатор в поле hash, а witness входа — в txinwitness. [1] [7] [8]
Другая транзакция может ссылаться на предыдущую ещё до её подтверждения. Если изменить идентификатор предыдущей лишь правкой данных подписи, ссылка перестанет совпадать. Изменение только witness не меняет txid. Это помогает протоколам с зависимыми транзакциями, например Lightning Network. Но вся транзакция от этого не становится неизменной. Другие поля или старые входы без SegWit по-прежнему могут влиять на txid, а изменённый witness должен отвечать применимым правилам проверки. [1] [6]
Witness передаётся вместе с полной записью транзакции и после её включения становится частью данных блока. Это не бесплатное хранилище вне цепочки. Байт, добавленный при сериализации witness, даёт 1 WU веса, а байт базовых данных — 4 WU; WU означает единицу веса. Full Node самостоятельно проверяет правила и нуждается в соответствующих данных для проверки расходования. Меньший вес не разрешает пропускать необходимые проверки и не означает, что данные не занимают место. [1] [7]
В старом формате доказательства права расходования записывались в scriptSig. Нативный SegWit версии 0 требует пустого поля: доказательства находятся в witness. Есть также вариант с оболочкой P2SH — прежним способом оплаты на условие, заданное хешем скрипта. В нём scriptSig должен содержать ровно операцию помещения соответствующего witness program, без произвольных дополнительных команд. Доказательства остаются в witness. Одна задача может иметь разные представления, поэтому одного названия поля недостаточно для понимания. [1] [5]
P2WPKH предоставляет подпись и открытый ключ. Узел проверяет соответствие хеша ключа исходному условию и действительность подписи. P2WSH позволяет задать условие хешем целого скрипта. Последний элемент witness — witnessScript; его хеш должен совпадать с программой в выходе. Предыдущие элементы дают исходные данные для выполнения скрипта, например подписи. BIP 143 задаёт построение подписываемого сообщения для этой версии, включая сумму расходуемого выхода. Возможность прочитать данные ещё не доказывает выполнения условий. [1] [2] [5]
Taproot использует нативный witness версии 1 и различает расходование по пути ключа и по пути скрипта. Перед выбором пути при наличии annex его отделяют, специальное дополнительное поле. Его данные при этом по-прежнему учитываются в весе и охватываются подписью. Если остаётся один элемент, он трактуется как подпись для пути ключа. Путь скрипта раскрывает использованный скрипт и control block: данные, доказывающие его связь с прежним выходом, а не новый блок блокчейна. Предшествующие элементы, если они есть, подают данные скрипту. Правила версии 0 нельзя просто перенести на этот случай. [3] [5]
Криптографическое обязательство (commitment) — отпечаток, связывающий данные с их конкретным содержимым. Когда требуется криптографическое обязательство по данным witness, BIP 141 связывает их с остальным блоком через Coinbase Transaction — первую транзакцию для награды майнеру. Из дерева хешей wtxid получается корень, обобщающий включённые данные. Для транзакции награды в этом дереве используется нулевой wtxid. Корень соединяют с зарезервированным значением длиной 32 байта и дважды хешируют; результат записывают как обязательство в её выходе. Если ни у одной транзакции нет witness, обязательство необязательно. Оно связывает публичные доказательства, но не заменяет резервную копию ключей или саму проверку. [1]
Для полной картины прочитайте эту статью вместе с SegWit, Block Weight, Bitcoin Script, Taproot, Bitcoin, Seed Phrase. На эту статью также ссылаются Block Weight, Miniscript, Compact Block Filters.