TradeWalletService: adapt to segwit wallet

This commit is contained in:
Oscar Guindzberg 2020-09-28 21:05:24 -03:00
parent 0f4c66f43d
commit 25515710ab
No known key found for this signature in database
GPG key ID: 209796BF2E1D4F75

View file

@ -36,6 +36,7 @@ import org.bitcoinj.core.AddressFormatException;
import org.bitcoinj.core.Coin; import org.bitcoinj.core.Coin;
import org.bitcoinj.core.ECKey; import org.bitcoinj.core.ECKey;
import org.bitcoinj.core.InsufficientMoneyException; import org.bitcoinj.core.InsufficientMoneyException;
import org.bitcoinj.core.LegacyAddress;
import org.bitcoinj.core.NetworkParameters; import org.bitcoinj.core.NetworkParameters;
import org.bitcoinj.core.SegwitAddress; import org.bitcoinj.core.SegwitAddress;
import org.bitcoinj.core.Sha256Hash; import org.bitcoinj.core.Sha256Hash;
@ -44,6 +45,7 @@ import org.bitcoinj.core.Transaction;
import org.bitcoinj.core.TransactionInput; import org.bitcoinj.core.TransactionInput;
import org.bitcoinj.core.TransactionOutPoint; import org.bitcoinj.core.TransactionOutPoint;
import org.bitcoinj.core.TransactionOutput; import org.bitcoinj.core.TransactionOutput;
import org.bitcoinj.core.TransactionWitness;
import org.bitcoinj.core.Utils; import org.bitcoinj.core.Utils;
import org.bitcoinj.crypto.DeterministicKey; import org.bitcoinj.crypto.DeterministicKey;
import org.bitcoinj.crypto.TransactionSignature; import org.bitcoinj.crypto.TransactionSignature;
@ -601,6 +603,9 @@ public class TradeWalletService {
for (int i = 0; i < buyerInputs.size(); i++) { for (int i = 0; i < buyerInputs.size(); i++) {
TransactionInput transactionInput = makersDepositTx.getInputs().get(i); TransactionInput transactionInput = makersDepositTx.getInputs().get(i);
depositTx.addInput(getTransactionInput(depositTx, getMakersScriptSigProgram(transactionInput), buyerInputs.get(i))); depositTx.addInput(getTransactionInput(depositTx, getMakersScriptSigProgram(transactionInput), buyerInputs.get(i)));
if (!TransactionWitness.EMPTY.equals(transactionInput.getWitness())) {
depositTx.getInput(depositTx.getInputs().size()-1).setWitness(transactionInput.getWitness());
}
} }
// Add seller inputs // Add seller inputs
@ -665,6 +670,10 @@ public class TradeWalletService {
TransactionInput input = takersDepositTx.getInput(i); TransactionInput input = takersDepositTx.getInput(i);
Script scriptSig = input.getScriptSig(); Script scriptSig = input.getScriptSig();
myDepositTx.getInput(i).setScriptSig(scriptSig); myDepositTx.getInput(i).setScriptSig(scriptSig);
TransactionWitness witness = input.getWitness();
if (!TransactionWitness.EMPTY.equals(witness)) {
myDepositTx.getInput(i).setWitness(witness);
}
} }
WalletService.printTx("sellerAsMakerFinalizesDepositTx", myDepositTx); WalletService.printTx("sellerAsMakerFinalizesDepositTx", myDepositTx);
@ -1165,13 +1174,27 @@ public class TradeWalletService {
if (sigKey.isEncrypted()) { if (sigKey.isEncrypted()) {
checkNotNull(aesKey); checkNotNull(aesKey);
} }
Sha256Hash hash = transaction.hashForSignature(inputIndex, scriptPubKey, Transaction.SigHash.ALL, false);
ECKey.ECDSASignature signature = sigKey.sign(hash, aesKey); if (ScriptPattern.isP2PK(scriptPubKey) || ScriptPattern.isP2PKH(scriptPubKey)) {
TransactionSignature txSig = new TransactionSignature(signature, Transaction.SigHash.ALL, false); Sha256Hash hash = transaction.hashForSignature(inputIndex, scriptPubKey, Transaction.SigHash.ALL, false);
if (ScriptPattern.isP2PK(scriptPubKey)) { ECKey.ECDSASignature signature = sigKey.sign(hash, aesKey);
input.setScriptSig(ScriptBuilder.createInputScript(txSig)); TransactionSignature txSig = new TransactionSignature(signature, Transaction.SigHash.ALL, false);
} else if (ScriptPattern.isP2PKH(scriptPubKey)) { if (ScriptPattern.isP2PK(scriptPubKey)) {
input.setScriptSig(ScriptBuilder.createInputScript(txSig, sigKey)); input.setScriptSig(ScriptBuilder.createInputScript(txSig));
} else if (ScriptPattern.isP2PKH(scriptPubKey)) {
input.setScriptSig(ScriptBuilder.createInputScript(txSig, sigKey));
}
} else if (ScriptPattern.isP2WPKH(scriptPubKey)) {
// TODO: Consider using this alternative way to build the scriptCode (taken from bitcoinj master)
// Script scriptCode = ScriptBuilder.createP2PKHOutputScript(sigKey)
Script scriptCode = new ScriptBuilder().data(
ScriptBuilder.createOutputScript(LegacyAddress.fromKey(transaction.getParams(), sigKey)).getProgram())
.build();
Coin value = input.getValue();
TransactionSignature txSig = transaction.calculateWitnessSignature(inputIndex, sigKey, scriptCode, value,
Transaction.SigHash.ALL, false);
input.setScriptSig(ScriptBuilder.createEmpty());
input.setWitness(TransactionWitness.redeemP2WPKH(txSig, sigKey));
} else { } else {
throw new SigningException("Don't know how to sign for this kind of scriptPubKey: " + scriptPubKey); throw new SigningException("Don't know how to sign for this kind of scriptPubKey: " + scriptPubKey);
} }