Transaktion, die als nicht standardmäßige Eingabe gekennzeichnet ist

Vor ein paar Stunden habe ich eine Transaktion gesendet, die nicht zu einem Block hinzugefügt wird, und auf blockchain.info wurde sie als "Nicht-Standard-Eingabe" gekennzeichnet.

Ich habe pybitcointools verwendet , um den TX zu erstellen.

Was ist mit dem TX los?

Wo sehen Sie "Nicht-Standard-Eingabe"?
@amaclin auf dem Bildschirm war ein Ausrufezeichen/Warnzeichen, ich wollte gerade einen Screenshot machen, aber die Transaktion wurde schließlich bestätigt
Schließlich wurde die Transaktion auf blockchain.info/block-index/1114778 bestätigt. Vielen Dank für Ihre Antworten/Kommentare!

Antworten (2)

Ich glaube, es ist kein Standard, weil Sie einen OP-Code in Ihr Eingabeskript aufnehmen, insbesondere OP_FALSE. Es sollte nicht notwendig sein, OP-Codes in Eingabeskripts aufzunehmen; nur wörtlich. Die einzige Möglichkeit, wie Eingabeskripts (scriptSigs) mit den ausgegebenen Ausgabeskripts (scriptPubKeys) interagieren, besteht darin, Werte auf dem Stapel zu platzieren. Daher ist es nie erforderlich, eine Operation auszuführen, da Sie die Werte einfach auf dem Stack platzieren könnten.

Aus den Dokumenten für OP_FALSE:

Ein leeres Array von Bytes wird auf den Stack geschoben. (Dies ist keine No-Op: Ein Gegenstand wird dem Stapel hinzugefügt.)

Da es in Ihrem Skript eine Operation und nicht nur Literale gibt, ist dies kein Standard.

Allerdings bin ich mir nicht sicher, wie ich ein Eingabeskript schreiben soll, das ein leeres Array von Bytes auf dem Stapel ablegt, ohne OP_FALSE. Ich wüsste nicht, warum so etwas zum Einlösen einer Ausgabe notwendig sein sollte.

BEARBEITEN: Ich habe gerade festgestellt, dass Sie ein Standard-Multisig-Eingabeskript verwenden (was ich vergessen habe, ist eine Ausnahme von der Regel "keine Op-Codes in Eingabeskripts"), um ein Standard-P2SH-Ausgabeskript einzulösen. Technisch gesehen ist Ihr Einlöseskript Standard, da es mit einer der Standardtransaktionen übereinstimmt , aber nicht mit dem Ausgabeskript, das es ausgibt. Ihr Einlösungsskript sollte wahrscheinlich die Form haben, <sig> [sig] [sig...] <redeemScript>wenn es ein Ausgabeskript ausgeben wird, das wie folgt aussieht OP_HASH160 <Hash160(redeemScript)> OP_EQUAL.

OP_CHECKMULTISIG entfernt ein Element zu viel vom Stack, sodass die scriptSig einen zusätzlichen Push enthalten muss.
Ja, davon habe ich gerade gelesen. Fühlt sich an wie eine seltsame Macke, aber ich verstehe, dass wir daran festhalten. Gut, dass P2SH dieses Problem weniger relevant macht.

Es gibt 4 mögliche Ursachen für den bad-txns-nonstandard-inputsFehler:

  1. Das Ausgabeskript der vorherigen Transaktion besteht eine Solver()-Prüfung nicht.
  2. Das Einlöseskript, das Sie für dieses Ausgabeskript erstellt haben, besteht eine EvalScript()-Prüfung nicht.
  3. der Stack ist nach dem vorherigen EvalScript()-Lauf leer.
  4. die subscript.GetSigOpCount(true) > MAX_P2SH_SIGOPSPrüfung schlägt fehl.

Sie können die Überprüfungen finden src/policy/policy.cppund die Gründe ausführlicher protokollieren, indem Sie diesen Patch anwenden .

Ich entdeckte dies, als ich versuchte, etwa 0,6 BTC aus den 182 Transaktionen zu ernten, deren Skript, wenn es kompiliert wurde, tatsächlich „Skript“ buchstabiert. hier ist ein Muster . Ich vermute, dass dies ein Programmierfehler seitens des Miners war: ein Fehler von USD6000+, den er jetzt sehr wahrscheinlich bereut.