Senden einer P2SH-Transaktion mit einem nicht standardmäßigen Skript

Ich versuche, die Transaktion mit dem Skript zu senden:

ScriptSig :OP_PUSHDATA<Sig> OP_PUSHDATA<Data1> OP_PUSHDATA<Data2> OP_PUSHDATA<Data3> OP_PUSHDATA<RedeemScript>

Da die Daten in der Rohtransaktion weniger als 75 Bytes betragen, werden direkte Pushs durchgeführt.

RedeemScript:2OP_DROP OP_2DROP OP_PUSHDATA<PubKey> OP_CHECKSIG

RedeemScriptHash160 von 6d6d2202ada9884dbd1e8bd90968ba66256f017cd77d83595027f7929ae3537f98c92d4aac=738292fc46dd7af803bd56035d0988af96a31681

ScriptPubKey :OP_HASH160 <redeemScriptHash> OP_EQUAL

Aber ich erhalte eine Fehlermeldung beim Senden einer Rohtransaktion:

Code = -26, Nachricht = 16: Mandatory-Script-Verify-Flag-Failed (Skript ohne Fehler ausgewertet, aber mit einem falschen/leeren obersten Stack-Element beendet)

Könnte jemand helfen zu verstehen, was mit diesem Skript falsch ist? Dies ist meine Transaktion:

020000000001012f15356f4dfb7f48a91a72f5ff1071f72cb5fe4acc29e98ff5ae17a008a01dba000000007C160014ac09dd336a6fc10034fc44dcb706855668921ce7141f8b0800ffc1765400038d78055c545df3ff5d4a141f8b0800ffc1765400038d78055c545df3ff5d4a141f8b0800ffc1765400038d78055c545df3ff5d4a246d6d2202ada9884dbd1e8bd90968ba66246f017cd77d83595027f7929ae3537f98c92d4aacffffffff01c005d9010000000017a914738292fc46dd7af803bd56035d0988af96a3168187024830450221009108d4e65a34fb50cd3283b6386a679f0dfc2b5fe97e3b3c3f6b8320814b3a2902204631daf2bb93605c9e079750092f304966b69fe28ce7701f4bc677714bca23af012102ada9884dbd1e8bd90968ba66256f017cd77d83595027f7929ae3537f98c92d4a00000000

{
  "result": {
    "txid": "441cf52028ee0acc8b4076681c7fd46dad03501be62c6b0050ca59090fa52973",
    "hash": "dad2b4c56556b74d87243149ca3384ce04584d3bd8d21d80e291c4f9eed7e3f8",
    "version": 2,
    "size": 317,
    "vsize": 235,
    "locktime": 0,
    "vin": [
      {
        "txid": "ba1da008a017aef58fe929cc4afeb52cf77110fff5721aa9487ffb4d6f35152f",
        "vout": 0,
        "scriptSig": {
          "asm": "0014ac09dd336a6fc10034fc44dcb706855668921ce7 1f8b0800ffc1765400038d78055c545df3ff5d4a 1f8b0800ffc1765400038d78055c545df3ff5d4a 1f8b0800ffc1765400038d78055c545df3ff5d4a 6d6d2202ada9884dbd1e8bd90968ba66246f017cd77d83595027f7929ae3537f98c92d4a OP_CHECKSIG",
          "hex": "160014ac09dd336a6fc10034fc44dcb706855668921ce7141f8b0800ffc1765400038d78055c545df3ff5d4a141f8b0800ffc1765400038d78055c545df3ff5d4a141f8b0800ffc1765400038d78055c545df3ff5d4a246d6d2202ada9884dbd1e8bd90968ba66246f017cd77d83595027f7929ae3537f98c92d4aac"
        },
        "txinwitness": [
          "30450221009108d4e65a34fb50cd3283b6386a679f0dfc2b5fe97e3b3c3f6b8320814b3a2902204631daf2bb93605c9e079750092f304966b69fe28ce7701f4bc677714bca23af01",
          "02ada9884dbd1e8bd90968ba66256f017cd77d83595027f7929ae3537f98c92d4a"
        ],
        "sequence": 4294967295
      }
    ],
    "vout": [
      {
        "value": 0.31,
        "n": 0,
        "scriptPubKey": {
          "asm": "OP_HASH160 738292fc46dd7af803bd56035d0988af96a31681 OP_EQUAL",
          "hex": "a914738292fc46dd7af803bd56035d0988af96a3168187",
          "reqSigs": 1,
          "type": "scripthash",
          "addresses": [
            "2N3mz7o8v3YT4arXdQ5p8So6q3FUGjhUpEE"
          ]
        }
      }
    ]
  },
  "error": null,
  "id": "curltext"
}

Antworten (1)

Bevor das Einlöseskript ausgeführt wird, sieht der Stack so aus (von oben nach unten): TRUE, Data3, Data2, Data1, Sig. Das TRUEoben auf dem Stapel kommt von OP_EQUAL.

Jetzt wird das Einlöseskript ausgeführt und Sie lassen die obersten drei Elemente aus dem Stapel fallen und fügen dann hinzu PubKey, sodass Sie übrig bleiben PubKey, Data1, Sig. Wenn OP_CHECKSIGes jetzt läuft, wird es Data1als Signatur verwendet, anstatt Sigdass es fehlschlägt. Am Ende ist der Stapel FALSE, Sig. Das oberste Element des Stacks FALSElässt die Transaktion fehlschlagen.

Vielen Dank für Ihre Antwort. Wenn ich auf dieser Grundlage ändere, OP_DROPsollte OP_2DROPdies mein Problem lösen, aber nicht.
Haben Sie eine komplett neue Transaktion getätigt? Denn wenn Sie den Hash des Einlöseskripts ändern, OP_DROPwird OP_2DROPes anders sein und OP_EQUALwird daher zurückkehren FALSE, wenn Sie Ihr altes scriptPubKeymit dem aktualisierten Einlöseskript wiederverwenden.
Ja, ich habe es aktualisiert, aber nachdem ich deinen Kommentar gelesen habe =). Außerdem habe ich den Beitrag mit einer neuen Rohtransaktion aktualisiert.
Ich habe einen weiteren Fehler in meiner Rohtransaktion gefunden. Es gab OP_PUSHDATA<PubKey>zusammen mit OP_CHECKSIG. Sie haben mir geholfen, mein Problem zu lösen, aber ich habe neue. Wenn ich das Raw sende, bekomme ich eine Fehlermeldung mandatory-script-verify-flag-failed (Signature is found in scriptCode). Vielleicht weißt du, was los ist?
Entschuldigung, ich weiß auch nicht, was das bedeutet :( Ich schlage vor, Sie stellen eine neue Frage mit dem neuen Problem, vielleicht weiß jemand anderes, was falsch ist.