TransactionWitness: Add redeemP2WSH() to create the stack pushes necessary to redeem a P2WSH output.

This commit is contained in:
Oscar Guindzberg 2020-10-06 20:15:28 -03:00 committed by Andreas Schildbach
parent 4663cd9dea
commit f92124d750
2 changed files with 36 additions and 0 deletions

View file

@ -25,6 +25,7 @@ import java.util.List;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import org.bitcoinj.crypto.TransactionSignature; import org.bitcoinj.crypto.TransactionSignature;
import org.bitcoinj.script.Script;
public class TransactionWitness { public class TransactionWitness {
public static final TransactionWitness EMPTY = new TransactionWitness(0); public static final TransactionWitness EMPTY = new TransactionWitness(0);
@ -41,6 +42,20 @@ public class TransactionWitness {
return witness; return witness;
} }
/**
* Creates the stack pushes necessary to redeem a P2WSH output.
*/
public static TransactionWitness redeemP2WSH(Script witnessScript, TransactionSignature... signatures) {
TransactionWitness witness = new TransactionWitness(signatures.length + 2);
witness.setPush(0, new byte[]{});
int i;
for (i = 0; i < signatures.length; i++) {
witness.setPush(i + 1, signatures[i].encodeToBitcoin());
}
witness.setPush(i + 1, witnessScript.getProgram());
return witness;
}
private final List<byte[]> pushes; private final List<byte[]> pushes;
public TransactionWitness(int pushCount) { public TransactionWitness(int pushCount) {

View file

@ -15,6 +15,10 @@
package org.bitcoinj.core; package org.bitcoinj.core;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import org.bitcoinj.crypto.TransactionSignature;
import org.bitcoinj.script.Script;
import org.bouncycastle.util.encoders.Hex;
import org.junit.Test; import org.junit.Test;
public class TransactionWitnessTest { public class TransactionWitnessTest {
@ -33,4 +37,21 @@ public class TransactionWitnessTest {
w3.setPush(3, Utils.HEX.decode("123ccc")); w3.setPush(3, Utils.HEX.decode("123ccc"));
assertEquals("123aaa 123bbb EMPTY 123ccc", w3.toString()); assertEquals("123aaa 123bbb EMPTY 123ccc", w3.toString());
} }
@Test
public void testRedeemP2WSH() throws SignatureDecodeException {
ECKey.ECDSASignature ecdsaSignature1 = TransactionSignature.decodeFromDER(Hex.decode("3045022100c3d84f7bf41c7eda3b23bbbccebde842a451c1a0aca39df706a3ff2fe78b1e0a02206e2e3c23559798b02302ad6fa5ddbbe87af5cc7d3b9f86b88588253770ab9f79"));
TransactionSignature signature1 = new TransactionSignature(ecdsaSignature1, Transaction.SigHash.ALL, false);
ECKey.ECDSASignature ecdsaSignature2 = TransactionSignature.decodeFromDER(Hex.decode("3045022100fcfe4a58f2878047ef7c5889fc52a3816ad2dd218807daa3c3eafd4841ffac4d022073454df7e212742f0fee20416b418a2c1340a33eebed5583d19a61088b112832"));
TransactionSignature signature2 = new TransactionSignature(ecdsaSignature2, Transaction.SigHash.ALL, false);
Script witnessScript = new Script(Hex.decode("522102bb65b325a986c5b15bd75e0d81cf149219597617a70995efedec6309b4600fa02103c54f073f5db9f68915019801435058c9232cb72c6528a2ca15af48eb74ca8b9a52ae"));
TransactionWitness witness = TransactionWitness.redeemP2WSH(witnessScript, signature1, signature2);
assertEquals(4, witness.getPushCount());
assertArrayEquals(new byte[]{}, witness.getPush(0));
assertArrayEquals(signature1.encodeToBitcoin(), witness.getPush(1));
assertArrayEquals(signature2.encodeToBitcoin(), witness.getPush(2));
assertArrayEquals(witnessScript.getProgram(), witness.getPush(3));
}
} }