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
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()));
m1xolyd1an
sighash
zweimal signieren, also sieht es so aus, als ob nur ein Schlüssel signiert wäre.kleiner Fisch