Открыть сервисСервис

BIP-16

BIP-16 — это предложение по улучшению биткойна (Bitcoin Improvement Proposal), зарегистрированное под номером 16 в соответствующем реестре. Оно было представлено разработчиком Гэвином Андресеном (Gavin Andresen) в январе 2012 года и описывает модификацию механизма проверки транзакций, известную как «Pay-to-Script-Hash» (P2SH). Основная цель BIP-16 заключалась в упрощении создания и использования сложных сценариев расходования средств в сети Биткойн, путём переноса ответственности за предоставление полного скрипта с отправителя на получателя.

История и предпосылки

До внедрения BIP-16 все транзакции в сети Биткойн использовали формат «Pay-to-Pubkey-Hash» (P2PKH) или «Pay-to-Pubkey» (P2PK). Для отправки средств на адрес, требующий выполнения сложных условий (например, мультиподпись или временная блокировка), отправитель должен был включить полный скрипт (ScriptPubKey) непосредственно в выход транзакции. Это приводило к нескольким проблемам.

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

BIP-16 был предложен как решение, позволяющее заменить полный скрипт в выходе транзакции на его криптографический хеш (дайджест). Получатель, в свою очередь, при трате средств должен был предоставить сам скрипт и данные, необходимые для его выполнения (например, подписи). Такой подход переносил сложность с этапа отправки на этап траты, делая адреса короче и стандартизируя процесс.

Технические детали

Механизм P2SH

BIP-16 вводит новый тип стандартного скрипта, который идентифицируется по шаблону: OP_HASH160 <20-байтовый хеш> OP_EQUAL. В этом скрипте:

  • OP_HASH160 — операция, вычисляющая хеш (сначала SHA-256, затем RIPEMD-160) от данных, расположенных на стеке.
  • <20-байтовый хеш> — это хеш (дайджест) от redeem-скрипта (скрипта выкупа), который будет предоставлен позже.
  • OP_EQUAL — операция, проверяющая равенство двух верхних элементов стека.

При создании выхода транзакции (TXO) отправитель помещает в поле scriptPubKey именно этот шаблон с хешем redeem-скрипта. Сам redeem-скрипт не раскрывается на этом этапе.

При трате средств (создании входа транзакции) получатель должен предоставить в поле scriptSig последовательность данных, которая при выполнении приведёт к успешной проверке. Эта последовательность включает:

  1. Данные, необходимые для выполнения redeem-скрипта (например, подписи).
  2. Сам redeem-скрипт (в виде байтовой строки).

Верифицирующий узел сначала выполняет скрипт из scriptPubKey (хеш redeem-скрипта) и проверяет, что он совпадает с хешем предоставленного redeem-скрипта. Затем он выполняет redeem-скрипт с предоставленными данными. Если оба этапа успешны, транзакция считается действительной.

Отличие от P2PKH

Основное отличие P2SH от P2PKH заключается в том, что в P2SH адрес (хеш) не является прямым хешем публичного ключа, а является хешем произвольного скрипта. Это позволяет использовать один и тот же формат адреса (начинающийся с цифры 3, в отличие от 1 для P2PKH) для самых разных сценариев, включая мультиподпись, временные блокировки, оракулы и другие.

Критика и обсуждение

Внедрение BIP-16 вызвало значительные споры в сообществе разработчиков Биткойна. Основные возражения касались безопасности и сложности реализации.

Проблема «hash-collision»

Критики, в частности разработчик Люк Дэшджр (Luke Dashjr), указывали на теоретическую возможность коллизии хешей: злоумышленник мог бы создать redeem-скрипт, хеш которого совпадает с хешем легитимного скрипта, но при этом выполняет иные действия. Однако на практике, учитывая криптографическую стойкость SHA-256 и RIPEMD-160, вероятность такой коллизии ничтожно мала. Тем не менее, для снижения рисков в BIP-16 было введено требование, что redeem-скрипт не может быть короче определённой длины и не может содержать определённые небезопасные шаблоны.

Сложность реализации

Некоторые разработчики считали, что P2SH усложняет код клиента и увеличивает нагрузку на верификацию, поскольку теперь требуется выполнять два скрипта вместо одного. Также высказывались опасения, что пользователи могут случайно отправить средства на адрес P2SH, не понимая, что для их траты потребуется предоставить redeem-скрипт, который может быть утерян.

Конкурирующие предложения

Существовали альтернативные предложения, такие как BIP-17 (также от Гэвина Андресена) и BIP-12 (от Люка Дэшджа). BIP-17 предлагал аналогичный механизм, но с использованием операций OP_CHECKMULTISIG и OP_EVAL. BIP-12 предлагал более общий подход с использованием операций OP_EVAL и OP_CODESEPARATOR. В итоге, после длительных обсуждений и голосования среди разработчиков, BIP-16 был принят как стандарт.

Внедрение и активация

BIP-16 был активирован в сети Биткойн 1 апреля 2012 года на высоте блока 173805. Это было первое крупное изменение протокола, требующее мягкой вилки (soft fork). Для активации требовалось, чтобы более 55% майнеров сигнализировали о готовности поддержать новое правило. После достижения этого порога все узлы, не обновившиеся до новой версии, начали бы отвергать блоки, содержащие транзакции P2SH, что привело бы к их отключению от основной сети.

Значение и влияние

BIP-16 стал важной вехой в развитии Биткойна. Он:

  • Упростил создание сложных сценариев: Позволил использовать мультиподпись, временные блокировки и другие продвинутые функции без необходимости для отправителя знать детали реализации.
  • Сократил размер транзакций: Выходы P2SH занимают всего 25 байт (20 байт хеша + 5 байт на шаблон), что значительно меньше, чем полные скрипты.
  • Стандартизировал адреса: Адреса P2SH (начинающиеся с 3) стали стандартом для многих сервисов, включая биржи, кошельки и платёжные системы.
  • Заложил основу для будущих улучшений: P2SH стал предшественником более сложных механизмов, таких как Segregated Witness (SegWit, BIP-141), который также использует хеширование скриптов, но в более гибкой форме.

Примеры использования

Наиболее распространённым применением P2SH является реализация мультиподписных (multisig) адресов. Например, адрес, требующий подписей 2 из 3 участников (2-of-3 multisig), может быть представлен как P2SH-адрес. Redeem-скрипт в этом случае будет содержать три публичных ключа и условие OP_CHECKMULTISIG. Пользователь, отправляющий средства на такой адрес, просто видит короткий адрес, начинающийся с 3, и не знает, сколько подписей потребуется для их траты.

Интересные факты

  • Номер BIP-16 был выбран не случайно, а по порядку регистрации в реестре.
  • Гэвин Андресен, автор BIP-16, был одним из ведущих разработчиков Биткойна в ранние годы и занимал должность главного научного сотрудника Фонда Биткойн.
  • Активация BIP-16 произошла 1 апреля, что вызвало шутки о том, что это первоапрельская шутка, хотя на самом деле это было серьёзное обновление.

Источники

  • Bitcoin Improvement Proposal 16: Pay to Script Hash (BIP-16)
  • Bitcoin Wiki: Pay to script hash
  • Gavin Andresen, «BIP 16: Pay to Script Hash (P2SH)», 2012
  • Andreas M. Antonopoulos, «Mastering Bitcoin: Unlocking Digital Cryptocurrencies», 2nd Edition, O'Reilly Media, 2017
Заметили ошибку или не согласны с информацией в статье? Напишите нам support@bfometr.ru