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

Pay-to-Script-Hash

Pay-to-Script-Hash (P2SH) — это тип адреса и формат транзакции в сети Биткойн, позволяющий отправителю переводить средства не на традиционный публичный ключ (адрес), а на хеш (криптографический отпечаток) скрипта (программы). Получатель средств может потратить эти средства, только предоставив исходный скрипт и данные, которые делают его выполнение успешным. P2SH был введён в 2012 году с целью упрощения сложных транзакций, таких как мультиподпись, и снижения комиссионных сборов для отправителя.

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

До появления P2SH все транзакции в сети Биткойн использовали формат Pay-to-Public-Key-Hash (P2PKH), где адрес представлял собой хеш публичного ключа. Для реализации сложных сценариев, таких как мультиподпись (требование подписей нескольких сторон), отправитель должен был включать в транзакцию полный скрипт (например, список публичных ключей и количество требуемых подписей). Это приводило к двум проблемам:

  1. Высокие комиссии для отправителя: размер транзакции увеличивался пропорционально сложности скрипта, а комиссия рассчитывалась исходя из размера транзакции в байтах.
  2. Сложность адресов: адреса для мультиподписных схем были длинными и неудобными для использования.

В 2011 году разработчик Гэвин Андресен предложил идею Pay-to-Script-Hash в рамках Bitcoin Improvement Proposal (BIP) 16. Предложение было принято и активировано в сети Биткойн 1 апреля 2012 года (блок 173805). P2SH стал первым крупным изменением протокола, не являющимся хардфорком, а софтфорком — обратно совместимым обновлением.

Принцип работы

Структура адреса P2SH

Адрес P2SH начинается с цифры «3» (в отличие от адресов P2PKH, начинающихся с «1»). Он генерируется следующим образом:

  1. Создаётся скрипт (программа), определяющий условия траты средств (например, «требуется 2 подписи из 3 возможных»).
  2. Скрипт хешируется с помощью алгоритмов SHA-256 и RIPEMD-160, получая 20-байтовый хеш.
  3. К хешу добавляется байт версии (0x05 для основной сети) и контрольная сумма (первые 4 байта двойного SHA-256).
  4. Полученная строка кодируется в Base58Check, что даёт адрес, начинающийся с «3».

Процесс транзакции

  1. Отправка: отправитель создаёт транзакцию, указывая в качестве получателя адрес P2SH. В выходе транзакции записывается скрипт, который проверяет, что предоставленный хеш совпадает с хешем скрипта (скрипт типа OP_HASH160 <хеш> OP_EQUAL). Отправитель не знает и не должен знать исходный скрипт.
  2. Трата: получатель (или любое лицо, знающее скрипт и данные для его выполнения) создаёт транзакцию траты. Вход транзакции содержит:
  • Исходный скрипт (redeem script) в полном виде.
  • Данные, необходимые для выполнения скрипта (например, подписи).
  1. Верификация: узлы сети проверяют, что хеш предоставленного скрипта совпадает с хешем, указанным в выходе предыдущей транзакции. Затем скрипт выполняется: если он завершается успешно (например, подписи валидны), средства считаются потраченными.

Преимущества

  • Снижение комиссий для отправителя: отправитель платит комиссию только за небольшой выход транзакции (около 32 байт), независимо от сложности скрипта. Получатель, тратящий средства, оплачивает комиссию за включение полного скрипта.
  • Упрощение адресов: сложные мультиподписные схемы представляются одним коротким адресом, начинающимся с «3».
  • Гибкость: отправитель может переводить средства на любой скрипт, даже не зная его деталей. Это позволяет создавать различные сценарии: мультиподпись, временные блокировки (timelocks), оракулы и другие.
  • Обратная совместимость: P2SH является софтфорком — старые узлы сети могут принимать и передавать такие транзакции, хотя не могут их тратить.

Недостатки и критика

  • Безопасность: если получатель потеряет исходный скрипт (redeem script), средства станут недоступными навсегда. В отличие от P2PKH, где достаточно приватного ключа, здесь требуется и скрипт, и данные для его выполнения.
  • Сложность для кошельков: не все биткойн-кошельки поддерживают создание и трату P2SH-транзакций, особенно для нестандартных скриптов.
  • Возможность злоупотреблений: злоумышленник может создать адрес P2SH, хеш которого соответствует вредоносному скрипту (например, требующему подписи самого злоумышленника), и обманом заставить отправителя перевести средства, которые затем будет невозможно потратить без участия злоумышленника.

Применение

Мультиподпись

Наиболее распространённое применение P2SH — мультиподписные схемы (multisig). Например, адрес типа 2-of-3 требует подписей двух из трёх указанных сторон. Это используется для:

  • Холодного хранения: средства хранятся на адресе, требующем подписей нескольких устройств или лиц.
  • Корпоративных казначейств: несколько сотрудников должны подтвердить транзакцию.
  • Эскроу-сервисов: третья сторона может разрешить спор, подписав транзакцию совместно с одной из сторон.

Временные блокировки (Timelocks)

P2SH позволяет создавать скрипты, которые запрещают трату средств до определённого времени или высоты блока. Например, можно создать адрес, средства с которого можно потратить только после достижения блока 800 000.

Оракулы и смарт-контракты

Хотя Биткойн не является полноценной платформой для смарт-контрактов, P2SH позволяет реализовывать простые логические условия, включая проверку подписей от оракулов (доверенных сторон, предоставляющих данные).

Влияние на развитие Биткойна

P2SH стал важным шагом в эволюции Биткойна, продемонстрировав возможность добавления новых функций без нарушения обратной совместимости. Он заложил основу для более сложных скриптовых возможностей, таких как Segregated Witness (SegWit), который был активирован в 2017 году. SegWit, в свою очередь, ввёл новый формат адреса — Bech32 (начинается с «bc1»), который также использует принцип хеширования скриптов, но с улучшенной эффективностью и поддержкой более сложных сценариев.

Безопасность и риски

При использовании P2SH необходимо учитывать следующие риски:

  • Потеря скрипта: без redeem script средства невозможно потратить, даже если известны все приватные ключи.
  • Атаки на основе социальной инженерии: злоумышленник может убедить отправителя перевести средства на адрес P2SH, который контролируется только злоумышленником.
  • Ошибки в скриптах: неправильно составленный скрипт может сделать средства недоступными или, наоборот, доступными для любого, кто знает скрипт.

Примеры

Пример 1: Мультиподпись 2-of-3

Скрипт (redeem script): `` OP_2 <pubkey1> <pubkey2> <pubkey3> OP_3 OP_CHECKMULTISIG `` Хеш этого скрипта даёт адрес P2SH. Для траты средств необходимо предоставить две подписи из трёх.

Пример 2: Временная блокировка

Скрипт: `` OP_IF <pubkey> OP_CHECKSIG OP_ELSE <блок> OP_CHECKLOCKTIMEVERIFY OP_DROP <pubkey2> OP_CHECKSIG OP_ENDIF `` Этот скрипт позволяет потратить средства либо с подписью первого ключа в любое время, либо с подписью второго ключа только после достижения указанного блока.

Источники

  • Bitcoin Improvement Proposal 16 (BIP 16): Pay-to-Script-Hash
  • Bitcoin Improvement Proposal 13 (BIP 13): Address Format for Pay-to-Script-Hash
  • «Mastering Bitcoin» by Andreas M. Antonopoulos, 2nd Edition, Chapter 5: Transactions
  • Bitcoin Wiki: Pay-to-Script-Hash
  • Официальная документация Bitcoin Core

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →