Глоссарий / Транзакции и комиссии
SIGHASH_NONE
- Что такое SIGHASH_NONE?
- SIGHASH_NONE является флагом, который подписывает входы транзакции, не фиксируя при этом ни одного из ее выходов, из-за чего назначение средств остается открытым для любого, кто имеет дело с этой транзакцией.
Рассматривайте его как незаполненный чек. Вход с SIGHASH_NONE разрешает расходование и ничего не говорит о том, кому платят, поэтому майнер или любой узел, ретранслирующий транзакцию, может переписать все выходы до подтверждения транзакции. Его значение равно 2, ни один потребительский кошелек его не предлагает, и если вы когда-нибудь увидите такой флаг в собственной транзакции, значит, что-то пошло не так.
Как это работает
Построение этого дайджеста означает полный отказ от списка выходов перед вычислением хеша.
То, что сохраняется, все же существенно: версия транзакции, outpoint подписываемого входа, собственный номер последовательности этого входа, скрипт, который он расходует, и locktime. Номера последовательности всех остальных входов обнуляются, это вторая степень свободы, поскольку она позволяет другим подписантам настраивать собственные относительные блокировки по времени после того, как эта подпись уже существует.
Не сохраняется как раз самое главное. Поскольку ни один выход не фиксируется, подпись говорит лишь о том, что эту монету можно израсходовать в транзакции данной версии в указанное время или позже. Тот, у кого окажется недостроенная транзакция, выбирает, куда пойдут средства, и сюда входит любой, кто увидит ее в сети, так как неподтвержденная транзакция является публичной с момента трансляции.
Добавьте модификатор ANYONECANPAY, и байт станет 0x82, слабейшей подписью, которую способен создать биткоин: она покрывает один вход и ровно ничего больше.
Флаг существует с первого выпуска в январе 2009 года и никогда не удалялся, потому что удаление сделало бы недоступными монеты, заблокированные до того, как кто-либо подумал о последствиях. BIP143 и BIP341 оба добросовестно реализовали его заново для segwit и Taproot, а не тихо отказались от него.
Где вы его встретите
SIGHASH_NONE почти нигде не встречается, и это как раз то, чего следует ожидать.
Теоретическое применение представляет собой протокол, в котором одна сторона вносит средства, а контрагент выбирает получателя, причем этот контрагент связан чем-то за пределами подписи. Ни одно широко используемое приложение для биткоина так не работает. Конструкции, которым нужны гибкие входы, обращаются вместо этого к ANYONECANPAY, а конструкции, которым нужны гибкие выходы, используют заранее подписанные альтернативы, где возможные получатели заданы заранее.
Поэтому подпись SIGHASH_NONE в реальных условиях означает ошибку или идущую кражу. Пулы памяти непрерывно просматриваются ботами, ищущими пригодные для траты странности, и транзакция с таким флагом недолго останется незамеченной. Всякий, кто пишет код подписи, должен относиться к флагу как к целому числу, которое он никогда не передает, а всякий, кто проверяет систему хранения, должен убедиться, что флаг является константой, а не параметром, задаваемым вызывающей стороной.
Для того, кто покупает и хранит биткоин, вывод короткий: вы с этим не столкнетесь, ваш кошелек этого не предложит, а от программы, которая просит вас подписать с этим флагом, следует держаться подальше.
SIGHASH_NONE vs SIGHASH_SINGLE
SIGHASH_NONE фиксирует ноль выходов; SIGHASH_SINGLE фиксирует ровно один, тот выход, который находится под тем же индексом, что и подписываемый вход. Этот один фиксируемый выход полностью меняет характер подписи. С SIGHASH_SINGLE подписывающий может гарантировать себе выплату, оставляя остальную часть транзакции открытой, что является пригодным строительным блоком для свопов и торговых площадок. SIGHASH_NONE не гарантирует подписывающему ровно ничего, и поэтому один имеет реальные применения, а другой встречается главным образом в отчетах об инцидентах.