|
1 | 1 | package co.rsk.federate.bitcoin; |
2 | 2 |
|
| 3 | +import static co.rsk.bitcoinj.script.ScriptBuilder.createP2SHOutputScript; |
| 4 | +import static co.rsk.peg.bitcoin.BitcoinUtils.*; |
| 5 | + |
3 | 6 | import co.rsk.bitcoinj.core.Address; |
4 | 7 | import co.rsk.bitcoinj.core.BtcECKey; |
| 8 | +import co.rsk.bitcoinj.core.BtcTransaction; |
5 | 9 | import co.rsk.bitcoinj.core.Coin; |
6 | 10 | import co.rsk.bitcoinj.core.NetworkParameters; |
7 | 11 | import co.rsk.bitcoinj.core.Sha256Hash; |
| 12 | +import co.rsk.bitcoinj.core.TransactionInput; |
| 13 | +import co.rsk.bitcoinj.crypto.TransactionSignature; |
8 | 14 | import co.rsk.bitcoinj.script.Script; |
9 | 15 | import co.rsk.bitcoinj.script.ScriptBuilder; |
10 | 16 | import java.nio.charset.StandardCharsets; |
@@ -66,4 +72,31 @@ public static Address createP2SHMultisigAddress(NetworkParameters networkParamet |
66 | 72 | Script outputScript = ScriptBuilder.createP2SHOutputScript(redeemScript); |
67 | 73 | return Address.fromP2SHScript(networkParameters, outputScript); |
68 | 74 | } |
| 75 | + |
| 76 | + public static void signTransactionInputFromP2shMultiSig(BtcTransaction transaction, int inputIndex, List<BtcECKey> keys) { |
| 77 | + if (transaction.getWitness(inputIndex).getPushCount() == 0) { |
| 78 | + signLegacyTransactionInputFromP2shMultiSig(transaction, inputIndex, keys); |
| 79 | + } |
| 80 | + } |
| 81 | + |
| 82 | + private static void signLegacyTransactionInputFromP2shMultiSig(BtcTransaction transaction, int inputIndex, List<BtcECKey> keys) { |
| 83 | + TransactionInput input = transaction.getInput(inputIndex); |
| 84 | + |
| 85 | + Script inputRedeemScript = extractRedeemScriptFromInput(input) |
| 86 | + .orElseThrow(() -> new IllegalArgumentException("Cannot sign inputs that are not from a p2sh multisig")); |
| 87 | + |
| 88 | + Script outputScript = createP2SHOutputScript(inputRedeemScript); |
| 89 | + Sha256Hash sigHash = transaction.hashForSignature(inputIndex, inputRedeemScript, BtcTransaction.SigHash.ALL, false); |
| 90 | + Script inputScriptSig = input.getScriptSig(); |
| 91 | + |
| 92 | + for (BtcECKey key : keys) { |
| 93 | + BtcECKey.ECDSASignature sig = key.sign(sigHash); |
| 94 | + TransactionSignature txSig = new TransactionSignature(sig, BtcTransaction.SigHash.ALL, false); |
| 95 | + byte[] txSigEncoded = txSig.encodeToBitcoin(); |
| 96 | + |
| 97 | + int keyIndex = inputScriptSig.getSigInsertionIndex(sigHash, key); |
| 98 | + inputScriptSig = outputScript.getScriptSigWithSignature(inputScriptSig, txSigEncoded, keyIndex); |
| 99 | + input.setScriptSig(inputScriptSig); |
| 100 | + } |
| 101 | + } |
69 | 102 | } |
0 commit comments