P2SH-P2WSH address creation

141 views
Skip to first unread message

KG

unread,
Nov 14, 2017, 5:17:02 AM11/14/17
to bitcoinj
Hi I was attempting to create a 2of2 P2SH-P2WSH address using bitcoinj. Since I couldn't properly sign(invalid private key from bitcoind) received output I wanted verify that I am correctly creating this address.

Here is the code used. Library used is 0.14.5. with some inspiration taken from segwit branch on github.

            final List<String> privKeys = Arrays.asList("c3accc350d70d1981c4366fd6fd86d9cc311048ae8620dac0b3dc9d18ce415fa",
                "1093e97f3c01bd766473cc51441d443e9325a59387421a9e2fb69b7f9587d915");

        List<ECKey> ecKeys = new ArrayList<>();
        final SecureRandom secureRandom = getSecureRandom();
        privKeys.forEach(privKey -> {
            try {
                final ECKey ecKey = ECKey.fromPrivate(Hex.decodeHex(privKey.toCharArray()));
                ecKeys.add(ecKey);
                System.out.println(String.format("Private Key %s", ecKey.getPrivateKeyAsHex()));
                System.out.println(String.format("Public Key %s", ecKey.getPublicKeyAsHex()));
                System.out.println("--------------------------------------------------------");
            }
            catch (DecoderException e) {
                throw new RuntimeException(e);
            }
        });
        System.out.println();

        final Script witnessProgram = ScriptBuilder.createRedeemScript(2, ecKeys);
        System.out.println("Witness program=" + witnessProgram);
        System.out.println("Witness hex=" + Hex.encodeHexString(witnessProgram.getProgram()) + "\n");

        byte[] hash = Sha256Hash.hash(witnessProgram.getProgram());
        final Script redeemScript = new ScriptBuilder().smallNum(0).data(hash).build();
        System.out.println("redeemScript program=" + redeemScript);
        System.out.println("redeemScript hex=" + Hex.encodeHexString(redeemScript.getProgram()) + "\n");

        final Script scriptPubKey = ScriptBuilder.createP2SHOutputScript(redeemScript);
        System.out.println("scriptPubKey program=" + scriptPubKey);
        System.out.println("scriptPubKey hex=" + Hex.encodeHexString(scriptPubKey.getProgram())  + "\n");

        final org.bitcoinj.core.Address addressT = scriptPubKey.getToAddress(TestNet3Params.get());
        System.out.println(String.format("TestNetAddress=%s", addressT));

Program output:
Private Key c3accc350d70d1981c4366fd6fd86d9cc311048ae8620dac0b3dc9d18ce415fa
Public Key 0320ce424c6d61f352ccfea60d209651672cfb03b2dc77d1d64d3ba519aec756ae
--------------------------------------------------------
Private Key 1093e97f3c01bd766473cc51441d443e9325a59387421a9e2fb69b7f9587d915
Public Key 020b020e27e49f049eac10010506499a84e1d59a500cd3680e9ded580df9a107b0
--------------------------------------------------------

Witness program=2 PUSHDATA(33)[020b020e27e49f049eac10010506499a84e1d59a500cd3680e9ded580df9a107b0] PUSHDATA(33)[0320ce424c6d61f352ccfea60d209651672cfb03b2dc77d1d64d3ba519aec756ae] 2 CHECKMULTISIG
Witness hex=5221020b020e27e49f049eac10010506499a84e1d59a500cd3680e9ded580df9a107b0210320ce424c6d61f352ccfea60d209651672cfb03b2dc77d1d64d3ba519aec756ae52ae

redeemScript program=0 PUSHDATA(32)[16a91e58e02069f95ea6defba7436199658573c34d384c69779779f4500d7cac]
redeemScript hex=002016a91e58e02069f95ea6defba7436199658573c34d384c69779779f4500d7cac

scriptPubKey program=HASH160 PUSHDATA(20)[035e0a0739eec3c195f9dc0d8b85e6e3f6ae1ece] EQUAL
scriptPubKey hex=a914035e0a0739eec3c195f9dc0d8b85e6e3f6ae1ece87

TestNetAddress=2MsZ2fpGKUydzY62v6trPHR8eCx5JTy1Dpa

KG

unread,
Nov 15, 2017, 1:01:42 PM11/15/17
to bitcoinj
I double checked everything address was generated successfully.
Reply all
Reply to author
Forward
0 new messages