Forgive me but I have to expand this out because it doesn’t make sense to me:
Witness:
- delegate signature is pushed onto the stack:
<delegate_sig>
- the signature authorizing the delegate is pushed:
<delegate_sig> <authorizing_sig>
- the delegate pubkey is pushed:
<delegate_sig> <authorizing_sig> <delegate_pubkey>
- locktime is pushed:
<delegate_sig> <authorizing_sig> <delegate_pubkey> <locktime>
Script:
5. locktime is checked: <delegate_sig> <authorizing_sig> <delegate_pubkey> <locktime>
6. locktime is hashed: <delegate_sig> <authorizing_sig> <delegate_pubkey> <locktime_hash>
7. locktime hash combined with delegate pubkey: <delegate_sig> <authorizing_sig> <delegate_pubkey || locktime_hash>
8. authorizing pubkey is pushed: <delegate_sig> <authorizing_sig> <delegate_pubkey || locktime_hash> <authorizing_pubkey>
9. CSFS(V) operation(s) checks that the delegate pubkey is authorized after the locktime by checking the key || locktime
message was signed by authorizing_sig
: <delegate_sig>
10. CHECKSIG operation fails because we don’t have a key? Maybe you forgot a dup somewhere? Maybe I don’t understand script as well as I thought? idk.
Assuming this is roughly what you meant, then I’d imagine in this case the authorizing signature would be pre-signed and distributed. Then at transaction time the delegate presents the authorizing signature along with their key and assigned locktime.
Assuming all of this is a fair reading, then I think I get what you mean with <msg>
having an interesting use case wherein it could be:
- provided by the script
- provided by the witness
- collaboratively derived from witness and script participation.
… which seems pretty cool. I’d love if you can correct either my understanding or your example for completeness, but otherwise I’m satisfied with this and this thread can be resolved.