0

I've been banging my head on a desk for a few days trying to understand the segwit protocol properly.

Another roadblock has thrown me off-guard and I am struggling to grasp the concept of "scriptCode:" used in the signature examples of bip0143 https://github.com/bitcoin/bips/blob/master/bip-0143.mediawiki#specification

I understand that a scriptPubKey is basically the locking conditions put on an output when spent. And I also understand that scriptSig is to redeem a previously locked output (destined for my pubkey/pubkeyhash).

I had come to pretty good grips with what I have just stated above, with the scriptSig data items being pushed onto the stack then getting evaluated by the pubKeyHash ect. But now there is this weird "scriptCode" field delcared that looks suspiciously identical to a p2pkh pubKeyScript.

So I came to the conclusion that it is just used the same in every hashPreImage:

DUP  HASH160  <keyhash>  EQUALVERIFY  CHECKSIG

But then I started thinking about stack evaluation order and got confused again. What is the order of stack evaluation? Is it: scriptSig data push > pubKeyScript evaluation > scriptCode? What about if there is witness data invloved? When is that pushed onto the stack? Or am I totally missing the point here?

Another thing I am confused about is p2sh-p2wpkh evaluation. I do not understand why the scriptSig has to be a push of the redeemScript:

 0 <20-byte-key-hash>

re-emphasising my main question. I am struggling with the concept of scriptCode and script evaluation order in general. I would like to know if the scriptCode is always the same format if I am only planning to sign p2sh-p2wpkh, pk2pkh, pk2pkh

1

The execution order is:

  • scriptSig/witness to construct the initial stack
  • scriptPubKey (which may invoke redeemScript evaluation in case of P2SH, and witness script invocation in case of P2WSH)

The scriptCode is simply a name for "the code being executed". Inside scriptPubKey evaluation, it is equal to the scriptPubKey. Inside redeemScript evaluation, it is equal to the redeemScript. Inside witness script evaluation, it is equal to the witness script.

  • Okay, I kind of understand the execution order a bit better. But I still don't understand what scriptCode is. Is it just scriptPubKey when signing an input? You might have to break it down for me in simplistic terms of why it is used. I know it checks the signature of the resulting stack containing pubkey and signature but what is the duplication (OP_DUP) and the push of data for? I thought this matching keyhash OP_HASH160 business was already done by the witness + scriptsig + scriptPubKey. – cryptodescriptor Nov 6 '18 at 20:48
  • The reason it is used is historical. It just happens to be there. Yes, when you're signing an input it is it equal to the script which contains the CHECKSIG opcode which is going to verify your signature. – Pieter Wuille Nov 6 '18 at 21:13
  • Understood. Thanks for your fast help always. – cryptodescriptor Nov 6 '18 at 21:26

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.