Неустойчивые разветвления переопределяют коды NOP

В биткойн-системе реализовано несколько вариантов неустойчивых разветвлений на основе альтернативной интерпретации кодов операций NOP. В языке Bitcoin Script для использования в будущем зарезервированы десять кодов операций: от NOP1 до NOP10. По правилам консенсуса наличие этих кодов в скрипте интерпретируется как оператор, не совершающий никаких действий, то есть все эти коды не производят никакого эффекта. После кода NOP выполнение продолжается так, как если бы этого оператора вообще не было.

Таким образом, неустойчивым разветвлениям предоставляется возможность изменить семантику кода NOP, придавая ему новый смысл. Например, документ BIP-65 (CHECKLOCKTIMEVERIFY) определяет альтернативную интерпретацию кода NOP2. Клиенты с реализацией BIP-65 интерпретируют NOP2 как операцию OP_CHECKLOCKTIMEVERIFY и применяют правило консенсуса о безусловной фиксации времени для данных UTXO, которые содержат этот код операции в своем блокирующем скрипте. Это изменение является неустойчивым разветвлением, так как транзакция, корректная по условиям BIP-65, также остается корректной для любого клиента, который не воспользовался реализацией BIP-65 (или проигнорировал ее). Для старых клиентов скрипт содержит код операции NOP, который не производит никаких действий.

Другие способы обновления с использованием неустойчивых разветвлений

Альтернативная интерпретация кодов операций NOP была планируемым и вполне очевидным механизмом обновления правил консенсуса. Но не так давно был введен другой механизм неустойчивых разветвлений, который не использует кодов NOP для особенного типа изменений правил консенсуса. Более подробно этот механизм описан в приложении Г. Segwit — это архитектурное изменение в структуре транзакции, которое перемещает разблокирующий скрипт (доказательство — WITness) из тела транзакции во внешнюю структуру данных (отделяет скрипт от транзакции — SEGregate). Изначально механизм Segwit рассматривался как обновление с устойчивым разветвлением, поскольку он изменяет основополагающую структуру (транзакцию). В ноябре 2015 года один из разработчиков Bitcoin Core предложил механизм, реализующий Segwit как неустойчивое разветвление. Этот механизм представлял собой изменение блокирующего скрипта для данных UTXO, созданных по правилам Segwit, но изменение выполнялось таким образом, что необновленные клиенты интерпретировали этот новый блокирующий скрипт как погашающий (redeemable) скрипт в комбинации с любым возможным разблокирующим скриптом. В результате механизм Segwit может быть введен в эксплуатацию без необходимости обновления каждого узла и без разделения основной цепочки, то есть это типичное неустойчивое разветвление.

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