
OP_CODESEPARATOR最初被设计用来插入在ScriptPubKey和ScriptSig之间,由脚本评估引擎实现。当在ScriptPubKey中调用OP_CHECKSIG时,OP_CODESEPARATOR将删除在它之前的所有内容。在默认情况下, ScriptSig将被完整地删除掉,因为包含签名的ScriptSig不能被签名签署。
没有任何规则阻止用户将OP_CODESEPARATOR插入到ScriptPubKey中,但是OP_CODESEPARATOR只有在同一个ScriptPubKey中被OP_CHECKSIG读取时才会生效OP_CHECKSIG 将向前读取至最接近它的之前的OP_CODESEPARATOR,并删除在它之前的所有消息内容。
一个例子
基于以上的了解,我们可以构造如下ScriptPubKey:
OP_CODESEPARATOR OP_CHECKSIGVERIFY OP_CODESEPARATOR OP_CHECKSIGVERIFY OP_CODESEPARATOR OP_CHECKSIG
要解锁此ScriptPubKey,我们可以使用以下ScriptSig:
<Sig A> <PK A> <Sig B> <PK B> <Sig C> <PK C>
请注意,第一个OP_CHECKSIG将在以下消息中验证 <Sig C> <PK C>:
OP_CHECKSIGVERIFY OP_CODESEPARATOR OP_CHECKSIGVERIFY OP_CODESEPARATOR OP_CHECKSIG
第二个OP_CHECKSIG将在以下消息中验证 <Sig B> <PK B>:
OP_CHECKSIGVERIFY OP_CODESEPARATOR OP_CHECKSIG
即用于创建签名的消息哈希不包括脚本评估引擎插入的第一个OP_CHECKSIGVERIFY和OP_CODESEPARATOR。
第三个OP_CHECKSIG将在以下消息中验证 <Sig A> <PK A>:
OP_CHECKSIG
即用于创建签名的消息哈希不包括OP_CHECKSIGVERIFY和OP_CODESEPARATOR的第一个和第二个实例。
如果有人改变了ScriptSig中签名的顺序,签名验证就会失败。