From 8d6f5621816b92d9c5f5dbed3c28b04b4e594ae4 Mon Sep 17 00:00:00 2001 From: Andreas Schildbach Date: Wed, 30 Jan 2019 02:25:08 +0100 Subject: [PATCH] ScriptBuilder: Add createP2WSHOutputScript() helpers. --- .../java/org/bitcoinj/script/ScriptBuilder.java | 17 +++++++++++++++++ .../org/bitcoinj/script/ScriptPatternTest.java | 9 ++------- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/org/bitcoinj/script/ScriptBuilder.java b/core/src/main/java/org/bitcoinj/script/ScriptBuilder.java index eee6a497..733b2924 100644 --- a/core/src/main/java/org/bitcoinj/script/ScriptBuilder.java +++ b/core/src/main/java/org/bitcoinj/script/ScriptBuilder.java @@ -23,6 +23,7 @@ import org.bitcoinj.core.Address; import org.bitcoinj.core.LegacyAddress; import org.bitcoinj.core.ECKey; import org.bitcoinj.core.SegwitAddress; +import org.bitcoinj.core.Sha256Hash; import org.bitcoinj.core.Transaction; import org.bitcoinj.core.Utils; import org.bitcoinj.crypto.TransactionSignature; @@ -485,6 +486,22 @@ public class ScriptBuilder { return ScriptBuilder.createP2SHOutputScript(hash); } + /** + * Creates a segwit scriptPubKey that sends to the given script hash. + */ + public static Script createP2WSHOutputScript(byte[] hash) { + checkArgument(hash.length == SegwitAddress.WITNESS_PROGRAM_LENGTH_SH); + return new ScriptBuilder().smallNum(0).data(hash).build(); + } + + /** + * Creates a segwit scriptPubKey for the given redeem script. + */ + public static Script createP2WSHOutputScript(Script redeemScript) { + byte[] hash = Sha256Hash.hash(redeemScript.getProgram()); + return ScriptBuilder.createP2WSHOutputScript(hash); + } + /** * Creates a P2SH output script with given public keys and threshold. Given public keys will be placed in * redeem script in the lexicographical sorting order. diff --git a/core/src/test/java/org/bitcoinj/script/ScriptPatternTest.java b/core/src/test/java/org/bitcoinj/script/ScriptPatternTest.java index 70c5868a..c78208e6 100644 --- a/core/src/test/java/org/bitcoinj/script/ScriptPatternTest.java +++ b/core/src/test/java/org/bitcoinj/script/ScriptPatternTest.java @@ -19,11 +19,7 @@ package org.bitcoinj.script; import com.google.common.collect.Lists; -import org.bitcoinj.core.NetworkParameters; -import org.bitcoinj.core.SegwitAddress; -import org.bitcoinj.core.Sha256Hash; import org.bitcoinj.core.ECKey; -import org.bitcoinj.params.MainNetParams; import org.junit.Test; import java.math.BigInteger; @@ -33,7 +29,6 @@ import static org.junit.Assert.assertTrue; public class ScriptPatternTest { private List keys = Lists.newArrayList(new ECKey(), new ECKey(), new ECKey()); - private static final NetworkParameters MAINNET = MainNetParams.get(); @Test public void testCommonScripts() { @@ -47,10 +42,10 @@ public class ScriptPatternTest { ScriptBuilder.createOutputScript(keys.get(0)) )); assertTrue(ScriptPattern.isPayToWitnessPubKeyHash( - ScriptBuilder.createOutputScript(SegwitAddress.fromHash(MAINNET, keys.get(0).getPubKeyHash())) + ScriptBuilder.createP2WPKHOutputScript(keys.get(0)) )); assertTrue(ScriptPattern.isPayToWitnessScriptHash( - ScriptBuilder.createOutputScript(SegwitAddress.fromHash(MAINNET, Sha256Hash.hash(new byte[0]))) + ScriptBuilder.createP2WSHOutputScript(new ScriptBuilder().build()) )); assertTrue(ScriptPattern.isSentToMultisig( ScriptBuilder.createMultiSigOutputScript(2, keys)