Транзакция помечена как имеющая нестандартный ввод

Несколько часов назад я отправил транзакцию, которая не добавляется в блок, и на blockchain.info она помечена как «нестандартный ввод».

Я использовал pybitcointools для создания TX.

Что не так с ТХ?

Где вы видите "нестандартный ввод"?
@amaclin на экране был восклицательный/предупреждающий знак, я собирался сделать снимок экрана, но транзакция наконец была подтверждена
Наконец транзакция была подтверждена на блоке blockchain.info/block-index/1114778 Спасибо за ваши ответы/комментарии!

Ответы (2)

Я считаю, что это нестандартно, потому что вы включаете код OP в свой входной скрипт, в частности, OP_FALSE. Нет необходимости включать коды OP во входные скрипты; только литералы. Единственный способ, которым входные сценарии (scriptSig) взаимодействуют с выходными сценариями, которые они тратят (scriptPubKey), — это размещение значений в стеке. Следовательно, нет необходимости запускать операцию, поскольку вы можете просто поместить значения в стек.

Из документов для OP_FALSE:

Пустой массив байтов помещается в стек. (Это не пустая операция: элемент добавляется в стек.)

Потому что в вашем скрипте есть операция, а не просто литералы, она нестандартна.

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

РЕДАКТИРОВАТЬ: я только что понял, что вы используете стандартный сценарий ввода Multisig (который, как я забыл, является исключением из правила «нет кодов операций во входных сценариях»), чтобы выкупить стандартный сценарий вывода P2SH. Технически ваш сценарий погашения является стандартным, поскольку он соответствует одной из стандартных транзакций , но не соответствует сценарию вывода, который он тратит. Ваш сценарий погашения, вероятно, должен быть в форме, <sig> [sig] [sig...] <redeemScript>если он собирается потратить выходной сценарий, который выглядит как OP_HASH160 <Hash160(redeemScript)> OP_EQUAL.

OP_CHECKMULTISIG извлекает слишком много элементов из стека, требуя, чтобы scriptSig содержал дополнительное нажатие.
Да, я только что прочитал об этом. Похоже на странную причуду, но я понимаю, как мы с ней застряли. Хорошо, что P2SH делает эту проблему менее актуальной.

возможны 4 причины bad-txns-nonstandard-inputsошибки:

  1. сценарий вывода предыдущей транзакции не проходит проверку Solver().
  2. сценарий погашения, который вы создали для этого выходного сценария, не прошел проверку EvalScript().
  3. стек пуст после предыдущего запуска EvalScript().
  4. subscript.GetSigOpCount(true) > MAX_P2SH_SIGOPSтест не проходит .

Вы можете найти проверки src/policy/policy.cppи сделать журнал более подробным, применив этот патч .

Я обнаружил это, пытаясь собрать около 0,6 BTC из 182 транзакций, чей скрипт при компиляции на самом деле пишется как «сценарий». вот образец . Я подозреваю, что это была программная ошибка со стороны майнера: ошибка в размере 6000 долларов США+, о которой он сейчас, скорее всего, сожалеет.