Post
Topic
Board Bitcoin Technical Support
Merits 31 from 7 users
Topic OP
Generate P2WSH - redeemScript does not correspond to witnessScript
by
barno
on 31/03/2020, 14:39:51 UTC
⭐ Merited by LoyceV (12) ,ETFbitcoin (6) ,malevolent (5) ,nc50lc (2) ,bones261 (2) ,Heisenberg_Hunter (2) ,o_e_l_e_o (2)
I want to generate P2WSH to study it. I read the spec https://bitcoincore.org/en/segwit_wallet_dev/#creation-of-p2sh-p2wsh-address but I have an error during spend it. (redeemScript does not correspond to witnessScript)

I create a bash script to generate private and public key, and I will report only the part to create redeem script etc.

Witness script
Code:
SCRIPT="76a9"$PBLENGTH$PBH"88AC"
printf $SCRIPT > witness_script.txt
> result: 76a9147ee744d9b09a4042c45f5f33d259d12855bd250188AC

Create Script Hash, use sha256 once
Code:
ADDR_SHA=`printf $SCRIPT | xxd -r -p | openssl sha256| sed 's/^.* //'`
printf $ADDR_SHA > scripthash.txt
> result: 8f80f8328dac332d68d545b5187c6142467ca541f1b108e152d66c7965573a41

Create redeem script  (i.e. 0x0020{32-byte scripthash})
Code:
REDEEMSCRIPT="0020"$ADDR_SHA
printf $REDEEMSCRIPT > redeem_script.txt
> result: 00208f80f8328dac332d68d545b5187c6142467ca541f1b108e152d66c7965573a41

Create SCRIPTPUBKEY (OP_HASH160 hash160(redeemScript) OP_EQUAL) where hash160 is Sha256 and ripemd160
Code:
  ADDR_160=$(printf $(printf $REDEEMSCRIPT | xxd -r -p | openssl sha256| sed 's/^.* //') | xxd -r -p | openssl ripemd160 | sed 's/^.* //')
  SCRIPTPUBKEY="A914"$ADDR_160"87"
  printf $SCRIPTPUBKEY > scriptPubKey.txt
> result: A9147ed644ee46780f7dc74a191368866a7b0e49cf9d87

Create Address (regtest, prefix is C4)
Code:
  ADDR=`printf $VERSION_PREFIX_ADDRESS$ADDR_160 | xxd -p -r | base58 -c`
  printf $ADDR > address_p2sh-p2wsh.txt
> result: 2N4osp9J5PywDDvSuTqN3vxxiQZ25jQo4fY

Then I create a transaction from this address to anther address. I have 50 bitcoin available.
Code:

REDEEMSCRIPT=`cat redeem_script.txt`
SCRIPTPUBKEY=`cat scriptPubKey.txt`
WITNESSCRIPT=`cat witness_script.txt`

TX_DATA=$(bitcoin-cli createrawtransaction '[{"txid":"'$TXID'","vout":'$VOUT'}]' '[{"'$ADDR_DEST'":'$AMOUNT'}]')

TX_SIGNED=$(bitcoin-cli signrawtransactionwithkey $TX_DATA '["'$PK'"]' '[{"txid":"'$TXID'","vout":'$VOUT',"scriptPubKey":"'$SCRIPTPUBKEY'","redeemScript":"'$REDEEMSCRIPT'","witnessScript":"'$WITNESSCRIPT'","amount":"'$TOTAL_UTXO_AMOUNT'"}]'  | jq -r '.hex')

At that moment I have this error
redeemScript does not correspond to witnessScript