Глоссарий / Протокол и обновления
OP_CAT
- Что такое OP_CAT?
- OP_CAT объединяет два верхних элемента стека скрипта в один; эту операцию Satoshi отключил в 2010 году, а BIP-347 предлагает восстановить ее внутри tapscript.
Определено в BIP-347.
Конкатенация звучит тривиально, но таковой не является. С ее помощью скрипт может собрать хеш подписи транзакции из частей, помещенных в стек, кусками не более 520 байт, а затем проверить этот хеш обычной проверкой подписи. Так код операции, отключенный из-за опасности, стал самым обсуждаемым пунктом в списке ковенантов.
Как это работает
Статус: отключен с августа 2010 года, когда в рамках защитной ревизии движка скриптов была отключена целая группа строковых и арифметических кодов операций. BIP-347 предлагает включить его только в tapscript. В mainnet он не активен.
Сама операция укладывается в одну строку: снять два элемента и поместить в стек их байты, соединенные подряд. Опасной в 2010 году она была потому, что ничто не ограничивало, насколько большим может вырасти элемент стека. Конкатенация элемента с самим собой удваивает его, поэтому короткий цикл из помещений в стек и объединений мог раздуть несколько байт до гигабайт и унести с собой память узла. В современном движке действует жесткий предел 520 байт на любой отдельный элемент стека, поэтому BIP-347 просто объявляет операцию неудачной, когда результат превысил бы его, и старая атака исчезает.
Есть особенность нумерации, которая делает возврат операции необычно чистым. OP_CAT имеет номер кода операции 126. Когда BIP-342 определял tapscript, он объявил коды операций с 126 по 129, среди прочих, кодами OP_SUCCESS: при встрече с таким кодом скрипт сразу завершается успешно. Поэтому старые узлы уже принимают любой tapscript, содержащий байт 126, не исполняя его. Новое определение, по которому он выполняет конкатенацию, только сужает то, что эти узлы и так допускали, поэтому изменение является мягким форком, а не расколом цепи.
То, что открывает конкатенация, несоразмерно ее размеру. Скрипт, умеющий строить байтовые строки, может проверять доказательство Merkle, проверять подпись Lamport или Winternitz, построенную из хешей, а не из эллиптических кривых, и заставлять подпись использовать фиксированный nonce, чтобы само уравнение подписи раскрывало скрипту расходующую транзакцию. Именно последний прием превращает OP_CAT в универсальный инструмент для ковенантов без какого-либо отдельного кода операции для них.
Где это встречается
На биткоине OP_CAT не выполняется вовсе. Он выполняется в сайдчейнах и тестовых сетях, которые скопировали движок скриптов биткоина, а затем отменили решение 2010 года.
В Elements, а значит и в Liquid, код операции включен, поэтому большинство опубликованных демонстраций ковенантов написаны для Liquid, а не для биткоина. Пользовательские signet с правилами BIP-347 являются второй площадкой, и они существуют, чтобы разработчики могли построить эту вещь, прежде чем просить кого-либо изменить консенсус.
Для того, кто покупает или хранит биткоины, практическая часть коротка: ни ваш кошелек, ни ваши адреса, ни ваши резервные копии не меняются, активируется OP_CAT или нет. Название стоит знать, потому что оно находится в центре реального спора о том, сколько программируемости должно быть у биткоина, и потому что предложения добавить подписи на основе хешей на случай будущего с квантовыми компьютерами обычно проходят через него.