von p2sh mit bitcoinj ausgeben

Ich versuche, die Münzen für einen p2sh auszugeben

Zuerst generiere ich p2sh und sende Coins an dieses p2sh

ECKey clientKey = new ECKey();
ECKey serverKey = new ECKey();
ECKey thirdPartyKey = new ECKey();
List<ECKey> keys = ImmutableList.of(clientKey, serverKey,thirdPartyKey);
Script multisigScript = ScriptBuilder.createP2SHOutputScript(2, keys);
String address = multisigScript.getToAddress(params).toString();

dann sende ich Münzen an die "Adresse" auf testnet3

Zweitens benutze ich die Brieftasche in Bitcoinj, um die "Adresse" zu sehen und den TX zu erhalten

WalletAppKit walletAppKit = new WalletAppKit(params, new File("./btcWallet"), "test");
walletAppKit.startAsync();
walletAppKit.awaitRunning();
Wallet walletTemp = walletAppKit.wallet();
Address watchAddress = Address.fromString(params, "2NGY4n3Wc2iftWufhUg2MzZtccbkQWgdUiz");
walletTemp.addWatchedAddress(watchAddress,1576573079);
 Set<Transaction> transSet = walletTemp.getTransactions(false);

drittens, nachdem ich den tx und die Ausgabe erhalten habe, möchte ich es ausgeben

TransactionOutput out = ...//output that the second step i get from the tx
Script scriptOut = out.getScriptPubKey()
Coin outValue = Coin.valueOf(10000);
Script redeemScript = ScriptBuilder.createRedeemScript(2, keys);
Address sendAddress = LegacyAddress.fromBase58(params, "2N6846hvswyZEdJ5DuEcjQZPaT5Xwb6PdGT");
Transaction spendTx = new Transaction(params);
spendTx.addOutput(outValue, sendAddress);
TransactionInput input = spendTx.addInput(out);

Sha256Hash sighash = spendTx.hashForSignature(0, redeemScript, Transaction.SigHash.ALL,
                        false);
ECKey.ECDSASignature cSignature = clientKey.sign(sighash);
ECKey.ECDSASignature sSignature = serverKey.sign(sighash);
TransactionSignature cTransactionSignature = new TransactionSignature(cSignature, Transaction.SigHash.ALL,
                        false);
TransactionSignature sTransactionSignature = new TransactionSignature(sSignature, Transaction.SigHash.ALL,
                        false);

Script inputScript = ScriptBuilder.createP2SHMultiSigInputScript(ImmutableList.of(cTransactionSignature, sTransactionSignature), scriptOut);
input.setScriptSig(inputScript);
input.verify(out);

es hat einen Fehler bei "input.verify(out);",Script resulted in a non-true stack: [] [3044022043d0cdddb087c4db2937a3b656c37bf240fd95e16714125c0672875bb18b4c1902200f96e1ec0adc2258e324cbacba598cb72d502a4e3185212dea40c50b365d3fb901] []

Ich weiß nicht, wo mein Code falsch ist und wie ich ihn lösen kann.

finden ein ähnliches Problem, aber nicht dasselbe [1]: Fehler beim Erstellen/Senden von Multisig-Transaktionen

Ihre zweite Signatur in einem 2 von 3 Multisig sollte das resultierende TX-Hex aus der ersten Signatur signieren. Basierend auf einem kurzen Blick auf Ihr Beispiel sieht es so aus, als würden Sie dasselbe sighashzweimal signieren, also sieht es so aus, als ob nur ein Schlüssel signiert wäre.
Wie kann ich ab der ersten Signatur unterschreiben? Ich ändere den Code wie folgt: Sha256Hash sighash1 = spendTx.hashForSignature (0, resolveScript, Transaction.SigHash.ALL, false); ECKey.ECDSASignature cSignature = clientKey.sign (sighash1); Sha256Hash sighash2 = spendTx.hashForSignature(0, resolveScript, Transaction.SigHash.ALL, false); ECKey.ECDSASignature sSignature = serverKey.sign (sighash2);

Antworten (1)

Basierend auf Ihrem Beispiel sieht es so aus, als würden Sie denselben Seufzer zweimal signieren, sodass es nur so aussieht, als würde ein Schlüssel signiert.

Dieses Beispiel könnte helfen: https://github.com/magmahindenburg/MultisigExamples/blob/master/src/se/moar/bitcoin/multisig/MultisigPresentation.java

    // Sign the first part of the transaction using private key #1
    Sha256Hash sighash = spendTx.hashForSignature(0, redeemScript, Transaction.SigHash.ALL, false);
    ECKey.ECDSASignature ecdsaSignature = key1.sign(sighash);
    TransactionSignature transactionSignarture = new TransactionSignature(ecdsaSignature, Transaction.SigHash.ALL, false);

    // Create the sighash2 using the redeem script
    Sha256Hash sighash2 = spendTx.hashForSignature(0, redeemScript, Transaction.sighash2.ALL, false);
    ECKey.ECDSASignature secondSignature;

    // Take out the key and sign the signhash
    ECKey key2 = createKeyFromSha256Passphrase("Super secret key 2");
    secondSignature = key2.sign(sighash2);

    // Add the second signature to the signature list
    TransactionSignature transactionSignarture = new TransactionSignature(secondSignature, Transaction.sighash2.ALL, false);
    signatureList.add(transactionSignarture);

    // Rebuild p2sh multisig input script
    inputScript = ScriptBuilder.createP2SHMultiSigInputScript(signatureList, redeemScript);
    spendTx.getInput(0).setScriptSig(inputScript);

    System.out.println(byteArrayToHex(spendTx.bitcoinSerialize()));
Vielen Dank, dass Sie sich die Zeit genommen haben, über mein Problem nachzudenken. Das Beispiel, das Sie geben, bezieht sich auf meinen Code, und ich vereinfache den Code auf eine Funktion. Sie geben mir eine Richtung, um das Problem zu lösen. Das Schlüsselproblem ist vielleicht, dass Sie gesagt haben: "Zweimal mit dem gleichen Seufzer unterschreiben", ich werde es später versuchen. Danke nochmal.
Tut mir leid, dass ich wegen meines schlechten Rufs nicht auf die nützliche Schaltfläche klicken kann