Skip to content

Commit 76509d5

Browse files
committed
feat(federate): add bitcoin utils from rskj to powpeg node
1 parent 0805468 commit 76509d5

File tree

2 files changed

+38
-4
lines changed

2 files changed

+38
-4
lines changed

src/test/java/co/rsk/federate/bitcoin/BitcoinTestUtils.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
package co.rsk.federate.bitcoin;
22

3+
import static co.rsk.bitcoinj.script.ScriptBuilder.createP2SHOutputScript;
4+
import static co.rsk.peg.bitcoin.BitcoinUtils.*;
5+
36
import co.rsk.bitcoinj.core.Address;
47
import co.rsk.bitcoinj.core.BtcECKey;
8+
import co.rsk.bitcoinj.core.BtcTransaction;
59
import co.rsk.bitcoinj.core.Coin;
610
import co.rsk.bitcoinj.core.NetworkParameters;
711
import co.rsk.bitcoinj.core.Sha256Hash;
12+
import co.rsk.bitcoinj.core.TransactionInput;
13+
import co.rsk.bitcoinj.crypto.TransactionSignature;
814
import co.rsk.bitcoinj.script.Script;
915
import co.rsk.bitcoinj.script.ScriptBuilder;
1016
import java.nio.charset.StandardCharsets;
@@ -66,4 +72,31 @@ public static Address createP2SHMultisigAddress(NetworkParameters networkParamet
6672
Script outputScript = ScriptBuilder.createP2SHOutputScript(redeemScript);
6773
return Address.fromP2SHScript(networkParameters, outputScript);
6874
}
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+
}
69102
}

src/test/java/co/rsk/federate/btcreleaseclient/BtcReleaseClientTest.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
import co.rsk.bitcoinj.script.Script;
3434
import co.rsk.bitcoinj.script.ScriptBuilder;
3535
import co.rsk.bitcoinj.script.ScriptChunk;
36-
import co.rsk.peg.bitcoin.BitcoinTestUtils;
36+
import co.rsk.federate.bitcoin.BitcoinTestUtils;
3737
import co.rsk.peg.bitcoin.BitcoinUtils;
3838
import co.rsk.peg.bitcoin.FlyoverRedeemScriptBuilderImpl;
3939
import co.rsk.peg.constants.BridgeConstants;
@@ -771,7 +771,8 @@ void onBestBlock_whenOnlySvpSpendTxWaitingForSignaturesIsAvailable_shouldAddSign
771771
@Test
772772
void onBestBlock_whenSvpSpendTxWaitingForSignaturesIsAvailableWithSignatureFromAnotherFederationMember_shouldSendAddSignature() throws Exception {
773773
// Arrange
774-
Federation proposedFederation = TestUtils.createFederation(params, 9);
774+
List<BtcECKey> federationPrivateKeys = TestUtils.getFederationPrivateKeys(9);
775+
Federation proposedFederation = TestUtils.createFederation(bridgeConstants.getBtcParams(), federationPrivateKeys);
775776
FederationMember federationMember = proposedFederation.getMembers().get(0);
776777
Script scriptSig = proposedFederation.getP2SHScript().createEmptyInputScript(null, proposedFederation.getRedeemScript());
777778

@@ -787,7 +788,7 @@ void onBestBlock_whenSvpSpendTxWaitingForSignaturesIsAvailableWithSignatureFromA
787788
BitcoinTestUtils.signTransactionInputFromP2shMultiSig(
788789
svpSpendTx,
789790
inputs.indexOf(input),
790-
List.of(new BtcECKey())
791+
List.of(federationPrivateKeys.get(0))
791792
);
792793
}
793794

@@ -879,7 +880,7 @@ void onBestBlock_whenSvpSpendTxWaitingForSignaturesIsAvailableWithSignatureFromA
879880
BitcoinUtils.removeSignaturesFromTransactionWithP2shMultiSigInputs(svpSpendTx);
880881
assertEquals(svpSpendTxHashBeforeSigning, svpSpendTx.getHash());
881882
verify(releaseCreationInformationGetter).getTxInfoToSign(
882-
any(),
883+
anyInt(),
883884
eq(svpSpendCreationRskTxHash),
884885
eq(svpSpendTx));
885886

0 commit comments

Comments
 (0)