Signieren Sie eine Bitcoin-Transaktion mit mehreren Eingaben mit bitcoinj. Übertragung der Transaktion fehlgeschlagen

Guten Tag! Ich arbeite mit Low-Level-API, um tx zu erstellen und offline zu signieren. Aber nach allen Vorbereitungen versuche ich, es zu übertragen, und dann erhalte ich eine Fehlermeldung vom Netzwerk:

16: mandatory-script-verify-flag-failed (signature must be zero for failed check(multi)sig operation)

Zuerst erstelle ich tx, ohne Eingaben zu signieren, und danach versuche ich, jede Eingabe mit meinen Privatschlüsseln zu signieren.

Hier ist Roh-TX vor der Unterzeichnung:

01000000028bcf82619e93eb92cc78d5bb0b7b22d6ee419820428402e721fbac1386c9673f0000000000ffffffffd50ea1cd97af5295cddcd4f0c7c0d531fed5683bde80af45ede25a0571c31add0100000000ffffffff02087f0300000000001976a9146fb643fe63bcc6c352899298d6072cc5d4178c0f88acfa6b0100000000001976a914196e59ee4c151e742af69bca308fc1b4445c577288ac00000000

Analysieren von tx von https://live.blockcypher.com/btc/decodetx/ :

{
    "addresses": [
        "16Yb7QP5jVmjXvHawH2ZA66k1b46FmtmE3", 
        "13KU69194fJj13G1SajUWokudsuekhT1kw", 
        "1BBgML68FuyRwU8RzwYn1FvqAXDDSgjVKC"
    ], 
    "block_height": -1, 
    "block_index": -1, 
    "confirmations": 0, 
    "double_spend": false, 
    "fees": 55194, 
    "hash": "2010928be1525a89aae1e0ece367757f6deb3754bfc4c891ffddbad403ecc3c9", 
    "inputs": [
        {
            "addresses": [
                "16Yb7QP5jVmjXvHawH2ZA66k1b46FmtmE3"
            ], 
            "age": 534819, 
            "output_index": 0, 
            "output_value": 251628, 
            "prev_hash": "3f67c98613acfb21e7028442209841eed6227b0bbbd578cc92eb939e6182cf8b", 
            "script_type": "pay-to-pubkey-hash", 
            "sequence": 4294967295
        }, 
        {
            "addresses": [
                "13KU69194fJj13G1SajUWokudsuekhT1kw"
            ], 
            "age": 534818, 
            "output_index": 1, 
            "output_value": 125872, 
            "prev_hash": "dd1ac371055ae2ed45af80de3b68d5fe31d5c0c7f0d4dccd9552af97cda10ed5", 
            "script_type": "pay-to-pubkey-hash", 
            "sequence": 4294967295
        }
    ], 
    "outputs": [
        {
            "addresses": [
                "1BBgML68FuyRwU8RzwYn1FvqAXDDSgjVKC"
            ], 
            "script": "76a9146fb643fe63bcc6c352899298d6072cc5d4178c0f88ac", 
            "script_type": "pay-to-pubkey-hash", 
            "value": 229128
        }, 
        {
            "addresses": [
                "13KU69194fJj13G1SajUWokudsuekhT1kw"
            ], 
            "script": "76a914196e59ee4c151e742af69bca308fc1b4445c577288ac", 
            "script_type": "pay-to-pubkey-hash", 
            "value": 93178
        }
    ], 
    "preference": "high", 
    "received": "2018-08-05T18:04:52.877018121Z", 
    "relayed_by": "54.162.141.93", 
    "size": 160, 
    "total": 322306, 
    "ver": 1, 
    "vin_sz": 2, 
    "vout_sz": 2
}

Hier ist mein Code zum Signieren jeder Eingabe:

for (int i = 0; i < transaction.getInputs().size(); i++) {

    TransactionInput transactionInput = transaction.getInput(i);
    String addressFromUtxo = mUTXOs.get(i).getAddress();
    byte[] privKeyBytes = getPrivKeyBitesForAddress(addressFromUtxo);
    ECKey ecKey = ECKey.fromPrivate(privKeyBytes);

    Script scriptPubKey = ScriptBuilder.createOutputScript(Address.fromBase58(params, mUTXOs.get(i).getAddress()));

    Sha256Hash hash = transaction.hashForSignature(i, scriptPubKey, Transaction.SigHash.ALL, false);
    ECKey.ECDSASignature ecSig = ecKey.sign(hash);   
    TransactionSignature txSig = new TransactionSignature(ecSig, Transaction.SigHash.ALL, false);
    transactionInput.setScriptSig(ScriptBuilder.createInputScript(txSig, ecKey));
}

//serialization and broadcasting
byte[] bytesRawTransaction = transaction.bitcoinSerialize();
String rawTransaction = HEX.encode(bytesRawTransaction);
broadcastTx(rawTransaction);

Und so sieht mein Raw-Tx nach der Signierung aus:

01000000028bcf82619e93eb92cc78d5bb0b7b22d6ee419820428402e721fbac1386c9673f000000006a473044022054720cc14562000ed1a6fa7952d2343bef48e2fa4fd0f1c1894579026ae83692022042735beb03c4d53c8d72126e1e4e8bee7acd5530284b05d6707a4e71cc891e9a01210312e1997fc0cb4c037c94885e7e4a8d0eca9d5cff8628cc3d870e5c158c9b0901ffffffffd50ea1cd97af5295cddcd4f0c7c0d531fed5683bde80af45ede25a0571c31add010000006a47304402206a70b6dacea9e9435c21fe920471daccf2edb636592b9d9163b1f5d740e582e102203416f80e9859fcfacc9f41ea3e04774ef47c9b0b9fa5a61f2b77dffee4c2710e012103522a472dd00a929e0f0980b98eb6a0d10a6e5a6ff7d45709cdb9f022b881ca66ffffffff02087f0300000000001976a9146fb643fe63bcc6c352899298d6072cc5d4178c0f88acfa6b0100000000001976a914196e59ee4c151e742af69bca308fc1b4445c577288ac00000000

Analysieren von tx von https://live.blockcypher.com/btc/decodetx/ :

{
    "addresses": [
        "16Yb7QP5jVmjXvHawH2ZA66k1b46FmtmE3", 
        "13KU69194fJj13G1SajUWokudsuekhT1kw", 
        "1BBgML68FuyRwU8RzwYn1FvqAXDDSgjVKC"
    ], 
    "block_height": -1, 
    "block_index": -1, 
    "confirmations": 0, 
    "double_spend": false, 
    "fees": 55194, 
    "hash": "26859671de7bd5f0ab758517d90dcb2ef7c8a8a331a2d4fc59c7d98e07857d09", 
    "inputs": [
        {
            "addresses": [
                "16Yb7QP5jVmjXvHawH2ZA66k1b46FmtmE3"
            ], 
            "age": 534819, 
            "output_index": 0, 
            "output_value": 251628, 
            "prev_hash": "3f67c98613acfb21e7028442209841eed6227b0bbbd578cc92eb939e6182cf8b", 
            "script": "473044022054720cc14562000ed1a6fa7952d2343bef48e2fa4fd0f1c1894579026ae83692022042735beb03c4d53c8d72126e1e4e8bee7acd5530284b05d6707a4e71cc891e9a01210312e1997fc0cb4c037c94885e7e4a8d0eca9d5cff8628cc3d870e5c158c9b0901", 
            "script_type": "pay-to-pubkey-hash", 
            "sequence": 4294967295
        }, 
        {
            "addresses": [
                "13KU69194fJj13G1SajUWokudsuekhT1kw"
            ], 
            "age": 534818, 
            "output_index": 1, 
            "output_value": 125872, 
            "prev_hash": "dd1ac371055ae2ed45af80de3b68d5fe31d5c0c7f0d4dccd9552af97cda10ed5", 
            "script": "47304402206a70b6dacea9e9435c21fe920471daccf2edb636592b9d9163b1f5d740e582e102203416f80e9859fcfacc9f41ea3e04774ef47c9b0b9fa5a61f2b77dffee4c2710e012103522a472dd00a929e0f0980b98eb6a0d10a6e5a6ff7d45709cdb9f022b881ca66", 
            "script_type": "pay-to-pubkey-hash", 
            "sequence": 4294967295
        }
    ], 
    "outputs": [
        {
            "addresses": [
                "1BBgML68FuyRwU8RzwYn1FvqAXDDSgjVKC"
            ], 
            "script": "76a9146fb643fe63bcc6c352899298d6072cc5d4178c0f88ac", 
            "script_type": "pay-to-pubkey-hash", 
            "value": 229128
        }, 
        {
            "addresses": [
                "13KU69194fJj13G1SajUWokudsuekhT1kw"
            ], 
            "script": "76a914196e59ee4c151e742af69bca308fc1b4445c577288ac", 
            "script_type": "pay-to-pubkey-hash", 
            "value": 93178
        }
    ], 
    "preference": "high", 
    "received": "2018-08-05T10:44:42.584042561Z", 
    "relayed_by": "54.162.141.93", 
    "size": 372, 
    "total": 322306, 
    "ver": 1, 
    "vin_sz": 2, 
    "vout_sz": 2
}

Und schließlich habe ich oben bekommen:

16: mandatory-script-verify-flag-failed (signature must be zero for failed check(multi)sig operation)

Bitte helft mir, was mache ich falsch???

Dieser Fehler bedeutet, dass die Signatur ungültig ist. Stellen Sie sicher, dass Sie die richtigen privaten Schlüssel verwenden und das Richtige signieren.
Ich verstehe, dass Signaturen ungültig sind, aber wie soll ich TX mit mehreren Eingaben signieren?

Antworten (1)

Endlich habe ich eine Lösung gefunden und was ich falsch gemacht habe. Die Art und Weise, tx zu signieren, ist völlig korrekt, das Problem ist bei der anderen Sache aufgetreten. Bevor ich senden möchte, berechne ich eine Gebühr pro kb (keine feste Gebühr). Nach der Unterzeichnung von tx erhöht sich die Größe des Roh-Tx und der Gebührenbetrag entsprechend. Danach sollte ich eine neue Änderung für die Adresse für die Änderung bereitstellen (Wert der zweiten Ausgabe von tx). Und danach sollte ich die Eingaben noch einmal signieren, weil der Wert der Ausgabe für Änderung geändert wurde. Leider habe ich das vorher nicht gemacht. Vielleicht ist es für jemanden nützlich.