Перейти к содержимому
buybitcoinsmart

Глоссарий / Протокол и обновления

SIGHASH_ANYPREVOUT

Другие названия: APO.

Что такое SIGHASH_ANYPREVOUT?
SIGHASH_ANYPREVOUT представляет собой предложенный режим подписи для скриптов Taproot, который позволяет одной подписью потратить любую монету, заблокированную на совпадающем скрипте, вместо единственной монеты, для которой эта подпись была создана.

Определено в BIP-118.

BIP-118 определяет новый тип публичного ключа для tapscript, 33 байта, начинающихся с 0x01, а не флаг, добавленный к обычным ключам. Назначен в феврале 2017 года, он так и не был активирован и работает только в расходах по пути скрипта, никогда в расходах по пути ключа. Ничто в вашем кошельке не может подписывать таким образом, поэтому любой продукт, обещающий каналы eltoo в основной сети, описывает будущее.

Как это работает

Статус: BIP-118 является черновиком (Draft), назначен 2017-02-28, требует BIP-340, BIP-341 и BIP-342, а его собственный раздел Deployment гласит TODO. Ничего не было заменено, потому что ничего не запустилось.

Подпись Taproot фиксирует outpoint монеты, которую тратят, 36 байт txid и индекса в дайджесте ANYONECANPAY, который BIP-118 изменяет, приваривая подпись к одной монете навсегда. Уберите outpoint из подписываемого сообщения, и подпись перестанет называть монету и начнет называть форму, так что любой UTXO такой формы можно будет привязать к ней позже. BIP называет это динамической перепривязкой (dynamic rebinding).

Определены два варианта, и разница между ними в том, что по-прежнему фиксируется.

  • SIGHASH_ANYPREVOUT, значение бита 0x40, отбрасывает outpoint, но сохраняет сумму входа (8 байт), его scriptPubKey (здесь всегда 35 байт) и хеш tapleaf. Тогда подпись подходит к любой монете с той же суммой под тем же скриптом.
  • SIGHASH_ANYPREVOUTANYSCRIPT, значение бита 0xc0, отбрасывает также сумму, scriptPubKey и хеш tapleaf. Этот вариант подходит к любой монете, чей скрипт этот ключ может удовлетворить.

Выбор делается при создании адреса, а не в момент подписания. Эти ключи работают только через лист tapscript, поэтому адрес должен нести такой лист в своем дереве Меркла, и до момента траты он неотличим от любого другого адреса Taproot. Их разделяет одна константа: key_version равен 0x01 для ключа BIP-118 против 0x00 для обычного ключа tapscript, так что один приватный ключ не может создать подпись, действительную по обоим правилам. Шесть новых байт hash_type становятся допустимыми: 0x41, 0x42, 0x43, 0xc1, 0xc2 и 0xc3.

Где это встречается

SIGHASH_ANYPREVOUT не встречается ни в одной транзакции основной сети, и BIP-118 ожидает, что даже когда этот режим появится, он будет "only be rarely used in practice" (на практике использоваться лишь редко), поскольку расходы по пути скрипта тяжелее и легче опознаются.

Схема, для которой это было написано, представляет собой eltoo, схему обновления вне сети. Протоколам вне сети приходится отвечать на любое старое состояние, которое опубликует контрагент, а поскольку обычная подпись фиксирует точную транзакцию, на которую отвечает, для каждого состояния, которое может появиться, нужна новая подпись. Eltoo вместо этого использует скрипт и nLockTime, чтобы сделать подписи асимметричными: транзакция с более поздней подписью может потратить транзакцию с более ранней подписью, но никогда наоборот, и одна подпись обновления может быть применена поверх любого более раннего обновления, опубликованного вашим контрагентом.

Название отражает исправление. Joseph Poon предложил эту идею как SIGHASH_NOINPUT в феврале 2016 года, после того как ее подняла оригинальная статья о Lightning, и переименование говорит, что вход на самом деле не игнорируется: nSequence подписывается всегда, а при SIGHASH_ANYPREVOUT подписываются также скрипт и сумма.

Раздел безопасности BIP называет цену: повторное воспроизведение. Подпись ANYPREVOUT можно повторно использовать против любого другого UTXO с тем же скриптом и той же суммой, а подпись ANYPREVOUTANYSCRIPT против любого UTXO, где этот ключ повторно используется в одном из его скриптов, так что повторное использование ключей превращается из неудобства для конфиденциальности в способ потерять деньги. Эти транзакции также подвержены изменению посторонними: любой, кто способен предоставить подходящий вход, может изменить txid без приватного ключа.

SIGHASH_ANYPREVOUT vs SIGHASH_ANYONECANPAY

SIGHASH_ANYONECANPAY существует в сети уже сегодня и удаляет все входы, кроме подписываемого; SIGHASH_ANYPREVOUT удаляет также часть этого оставшегося входа. BIP-118 описывает свой дайджест как дайджест ANYONECANPAY без outpoint, различие в одну строку с большим последствием. Подпись ANYONECANPAY нельзя воспроизвести повторно, потому что названный в ней outpoint можно потратить только один раз. Откажитесь от этой фиксации, и защита от повторного воспроизведения должна исходить от протокола, построенного поверх, а не от подписи.

Не путать с

Часто задаваемые вопросы

Можно ли использовать SIGHASH_ANYPREVOUT сегодня?

Нет. BIP-118 всё еще является черновиком, его раздел Deployment гласит TODO, и ни один узел основной сети не применяет эти правила, поэтому ничто, подписанное таким образом, нельзя потратить в основной сети.

Означают ли SIGHASH_ANYPREVOUT и SIGHASH_NOINPUT одно и то же?

Да, это переименованная и переработанная версия той же идеи. Joseph Poon предложил SIGHASH_NOINPUT в феврале 2016 года; черновик ANYPREVOUT нацелен только на расходы по пути скрипта Taproot и по-прежнему фиксирует nSequence, а по выбору также скрипт и сумму, что и отражает новое название.

Почему BIP-118 определяет новый тип публичного ключа, а не просто новый флаг?

Потому что эту возможность нужно выбрать при создании адреса. Такие подписи работают только с публичным ключом BIP-118 внутри листа tapscript, поэтому адрес без такого листа никогда не может быть потрачен этим способом, и до момента траты он остается неотличимым от любого другого адреса Taproot.

Читайте далее

Источники

Последняя проверка: 6 сентября 2026 г.

Связанные термины

Еще в разделе «Протокол и обновления»

Читать эту страницу на английском