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???
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.
Andreas Chow
Timur Panzhiev