This modifies the script engine to replace OP_NOP3 with OP_CHECKSEQUENCEVERIFY and adds a flag to selectively enable its enforcement. The new opcode examines the top item on the stack and compares it against the sequence number of the associated transaction input in order to allow scripts to conditionally enforce the inclusion of relative time locks to the transaction. The following is an overview of the changes: - Introduce a new flag named ScriptVerifyCheckSequenceVerify to provide conditional enforcement of the new opcode - Introduce a constant named OP_CHECKSEQUENCEVERIFY which has the same value as OP_NOP3 since it is replacing it - Update opcode to name mappings accordingly - Abstract the logic that deals with time lock verification since it is the same for both the new opcode and OP_CHECKLOCKTIMEVERIFY - Implement the required opcode semantics - Add tests to ensure the opcode works as expected including when used both correctly and incorrectly
160 lines
17 KiB
JSON
160 lines
17 KiB
JSON
[
|
|
["The following are deserialized transactions which are valid."],
|
|
["They are in the form"],
|
|
["[[[prevout hash, prevout index, prevout scriptPubKey], [input 2], ...],"],
|
|
["serializedTransaction, verifyFlags]"],
|
|
["Objects that are only a single string (like this one) are ignored"],
|
|
|
|
["Coinbase of size 2"],
|
|
["Note the input is just required to make the tester happy"],
|
|
[[["0000000000000000000000000000000000000000000000000000000000000000", -1, "1"]],
|
|
"01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff00ffffffff0100000000000000000000015100000000000000000100000000000000000000000000000000025151", "P2SH"],
|
|
|
|
["Coinbase of size 100"],
|
|
["Note the input is just required to make the tester happy"],
|
|
[[["0000000000000000000000000000000000000000000000000000000000000000", -1, "1"]],
|
|
"01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff00ffffffff01000000000000000000000151000000000000000001000000000000000000000000000000006451515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151", "P2SH"],
|
|
|
|
["Empty pubkey"],
|
|
[[["229257c295e7f555421c1bfec8538dd30a4b5c37c1c8810bbe83cafa7811652c", 0, "0x00 CHECKSIG NOT"]],
|
|
"01000000012c651178faca83be0b81c8c1375c4b0ad38d53c8fe1b1c4255f5e795c25792220000000000ffffffff0101000000000000000000232102c2410f8891ae918cab4ffc4bb4a3b0881be67c7a1e7faa8b5acf9ab8932ec30cac0000000000000000010000000000000000000000000000000049483045022100d6044562284ac76c985018fc4a90127847708c9edb280996c507b28babdc4b2a02203d74eca3f1a4d1eea7ff77b528fde6d5dc324ec2dbfdb964ba885f643b9704cd01", "P2SH"],
|
|
|
|
["Empty signature"],
|
|
[[["9ca93cfd8e3806b9d9e2ba1cf64e3cc6946ee0119670b1796a09928d14ea25f7", 0, "0x21 0x028a1d66975dbdf97897e3a4aef450ebeb5b5293e4a0b4a6d3a2daaa0b2b110e02 CHECKSIG NOT"]],
|
|
"0100000001f725ea148d92096a79b1709611e06e94c63c4ef61cbae2d9b906388efd3ca99c0000000000ffffffff01010000000000000000002321028a1d66975dbdf97897e3a4aef450ebeb5b5293e4a0b4a6d3a2daaa0b2b110e02ac000000000000000001000000000000000000000000000000000100", "P2SH"],
|
|
|
|
[[["ebbcf4bfce13292bd791d6a65a2a858d59adbf737e387e40370d4e64cc70efb0", 0, "2 0x21 0x033bcaa0a602f0d44cc9d5637c6e515b0471db514c020883830b7cefd73af04194 0x21 0x03a88b326f8767f4f192ce252afe33c94d25ab1d24f27f159b3cb3aa691ffe1423 2 CHECKMULTISIG NOT"]],
|
|
"0100000001b0ef70cc644e0d37407e387e73bfad598d852a5aa6d691d72b2913cebff4bceb0000000000ffffffff01010000000000000000002321033bcaa0a602f0d44cc9d5637c6e515b0471db514c020883830b7cefd73af04194ac000000000000000001000000000000000000000000000000004a00473044022068cd4851fc7f9a892ab910df7a24e616f293bcb5c5fbdfbc304a194b26b60fba022078e6da13d8cb881a22939b952c24f88b97afd06b4c47a47d7f804c9a352a6d6d0100", "P2SH"],
|
|
|
|
[[["ba4cd7ae2ad4d4d13ebfc8ab1d93a63e4a6563f25089a18bf0fc68f282aa88c1", 0, "2 0x21 0x037c615d761e71d38903609bf4f46847266edc2fb37532047d747ba47eaae5ffe1 0x21 0x02edc823cd634f2c4033d94f5755207cb6b60c4b1f1f056ad7471c47de5f2e4d50 2 CHECKMULTISIG NOT"]],
|
|
"0100000001c188aa82f268fcf08ba18950f263654a3ea6931dabc8bf3ed1d4d42aaed74cba0000000000ffffffff01010000000000000000002321037c615d761e71d38903609bf4f46847266edc2fb37532047d747ba47eaae5ffe1ac000000000000000001000000000000000000000000000000004b0000483045022100940378576e069aca261a6b26fb38344e4497ca6751bb10905c76bb689f4222b002204833806b014c26fd801727b792b1260003c55710f87c5adbd7a9cb57446dbc9801", "P2SH"],
|
|
|
|
["CHECKLOCKTIMEVERIFY tests"],
|
|
|
|
["By-height locks, with argument == 0 and == tx nLockTime"],
|
|
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0 NOP2 1"]],
|
|
"010000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000010000000000000000000000000000000000", "P2SH,CHECKLOCKTIMEVERIFY"],
|
|
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "499999999 NOP2 1"]],
|
|
"01000000010001000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000ff64cd1d00000000010000000000000000000000000000000000", "P2SH,CHECKLOCKTIMEVERIFY"],
|
|
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0 NOP2 1"]],
|
|
"01000000010001000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000ff64cd1d00000000010000000000000000000000000000000000", "P2SH,CHECKLOCKTIMEVERIFY"],
|
|
|
|
["By-time locks, with argument just beyond tx nLockTime (but within numerical boundaries)"],
|
|
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "500000000 NOP2 1"]],
|
|
"010000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000065cd1d00000000010000000000000000000000000000000000", "P2SH,CHECKLOCKTIMEVERIFY"],
|
|
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "4294967295 NOP2 1"]],
|
|
"01000000010001000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000ffffffff00000000010000000000000000000000000000000000", "P2SH,CHECKLOCKTIMEVERIFY"],
|
|
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "500000000 NOP2 1"]],
|
|
"01000000010001000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000ffffffff00000000010000000000000000000000000000000000", "P2SH,CHECKLOCKTIMEVERIFY"],
|
|
|
|
["Any non-maxint nSequence is fine"],
|
|
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0 NOP2 1"]],
|
|
"010000000100010000000000000000000000000000000000000000000000000000000000000000000000feffffff0100000000000000000000000000000000000000010000000000000000000000000000000000", "P2SH,CHECKLOCKTIMEVERIFY"],
|
|
|
|
["The argument can be calculated rather than created directly by a PUSHDATA"],
|
|
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "499999999 1ADD NOP2 1"]],
|
|
"010000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000065cd1d00000000010000000000000000000000000000000000", "P2SH,CHECKLOCKTIMEVERIFY"],
|
|
|
|
["Perhaps even by an ADD producing a 5-byte result that is out of bounds for other opcodes"],
|
|
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "1 2147483646 ADD NOP2 1"]],
|
|
"01000000010001000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000feffffff00000000010000000000000000000000000000000000", "P2SH,CHECKLOCKTIMEVERIFY"],
|
|
|
|
["5 byte non-minimally-encoded arguments are valid"],
|
|
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0x05 0x0000000000 NOP2 1"]],
|
|
"010000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000010000000000000000000000000000000000", "P2SH,CHECKLOCKTIMEVERIFY"],
|
|
|
|
["Valid CHECKLOCKTIMEVERIFY in scriptSig"],
|
|
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "1"]],
|
|
"01000000010001000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000010000000000000001000000000000000000000000000000000251b1", "P2SH,CHECKLOCKTIMEVERIFY"],
|
|
|
|
["Valid CHECKLOCKTIMEVERIFY in redeemScript"],
|
|
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "HASH160 0x14 0x69780eeb90f65bf4cec3c17aeb3d466b88e7be66 EQUAL"]],
|
|
"0100000001000100000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000001000000000000000100000000000000000000000000000000030251b1", "P2SH,CHECKLOCKTIMEVERIFY"],
|
|
|
|
["CHECKSEQUENCEVERIFY tests"],
|
|
|
|
["By-height locks, with argument == 0 and == txin.sequence"],
|
|
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0 CHECKSEQUENCEVERIFY 1"]],
|
|
"020000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000010000000000000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
|
|
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "65535 CHECKSEQUENCEVERIFY 1"]],
|
|
"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffff00000100000000000000000000000000000000000000010000000000000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
|
|
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "65535 CHECKSEQUENCEVERIFY 1"]],
|
|
"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffbf7f0100000000000000000000000000000000000000010000000000000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
|
|
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0 CHECKSEQUENCEVERIFY 1"]],
|
|
"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffbf7f0100000000000000000000000000000000000000010000000000000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
|
|
|
|
["By-time locks, with argument == 0 and == txin.sequence"],
|
|
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "4194304 CHECKSEQUENCEVERIFY 1"]],
|
|
"020000000100010000000000000000000000000000000000000000000000000000000000000000000000000040000100000000000000000000000000000000000000010000000000000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
|
|
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "4259839 CHECKSEQUENCEVERIFY 1"]],
|
|
"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffff40000100000000000000000000000000000000000000010000000000000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
|
|
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "4259839 CHECKSEQUENCEVERIFY 1"]],
|
|
"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffff7f0100000000000000000000000000000000000000010000000000000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
|
|
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "4194304 CHECKSEQUENCEVERIFY 1"]],
|
|
"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffff7f0100000000000000000000000000000000000000010000000000000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
|
|
|
|
["Upper sequence with upper sequence is fine"],
|
|
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "2147483648 CHECKSEQUENCEVERIFY 1"]],
|
|
"020000000100010000000000000000000000000000000000000000000000000000000000000000000000000000800100000000000000000000000000000000000000010000000000000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
|
|
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "4294967295 CHECKSEQUENCEVERIFY 1"]],
|
|
"020000000100010000000000000000000000000000000000000000000000000000000000000000000000000000800100000000000000000000000000000000000000010000000000000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
|
|
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "2147483648 CHECKSEQUENCEVERIFY 1"]],
|
|
"020000000100010000000000000000000000000000000000000000000000000000000000000000000000feffffff0100000000000000000000000000000000000000010000000000000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
|
|
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "4294967295 CHECKSEQUENCEVERIFY 1"]],
|
|
"020000000100010000000000000000000000000000000000000000000000000000000000000000000000feffffff0100000000000000000000000000000000000000010000000000000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
|
|
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "2147483648 CHECKSEQUENCEVERIFY 1"]],
|
|
"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff0100000000000000000000000000000000000000010000000000000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
|
|
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "4294967295 CHECKSEQUENCEVERIFY 1"]],
|
|
"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff0100000000000000000000000000000000000000010000000000000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
|
|
|
|
["Argument 2^31 with various sequence"],
|
|
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "2147483648 CHECKSEQUENCEVERIFY 1"]],
|
|
"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffbf7f0100000000000000000000000000000000000000010000000000000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
|
|
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "2147483648 CHECKSEQUENCEVERIFY 1"]],
|
|
"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffff7f0100000000000000000000000000000000000000010000000000000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
|
|
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "2147483648 CHECKSEQUENCEVERIFY 1"]],
|
|
"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff0100000000000000000000000000000000000000010000000000000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
|
|
|
|
["Argument 2^32-1 with various sequence"],
|
|
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "4294967295 CHECKSEQUENCEVERIFY 1"]],
|
|
"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffbf7f0100000000000000000000000000000000000000010000000000000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
|
|
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "4294967295 CHECKSEQUENCEVERIFY 1"]],
|
|
"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffff7f0100000000000000000000000000000000000000010000000000000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
|
|
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "4294967295 CHECKSEQUENCEVERIFY 1"]],
|
|
"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff0100000000000000000000000000000000000000010000000000000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
|
|
|
|
["Argument 3<<31 with various sequence"],
|
|
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "6442450944 CHECKSEQUENCEVERIFY 1"]],
|
|
"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffbf7f0100000000000000000000000000000000000000010000000000000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
|
|
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "6442450944 CHECKSEQUENCEVERIFY 1"]],
|
|
"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffff7f0100000000000000000000000000000000000000010000000000000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
|
|
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "6442450944 CHECKSEQUENCEVERIFY 1"]],
|
|
"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff0100000000000000000000000000000000000000010000000000000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
|
|
|
|
["5 byte non-minimally-encoded operands are valid"],
|
|
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0x05 0x0000000000 CHECKSEQUENCEVERIFY 1"]],
|
|
"020000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000010000000000000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
|
|
|
|
["The argument can be calculated rather than created directly by a PUSHDATA"],
|
|
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "4194303 1ADD CHECKSEQUENCEVERIFY 1"]],
|
|
"020000000100010000000000000000000000000000000000000000000000000000000000000000000000000040000100000000000000000000000000000000000000010000000000000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
|
|
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "4194304 1SUB CHECKSEQUENCEVERIFY 1"]],
|
|
"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffff00000100000000000000000000000000000000000000010000000000000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
|
|
|
|
["An ADD producing a 5-byte result that sets SequenceLockTimeDisabled flag"],
|
|
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "2147483647 65536 CHECKSEQUENCEVERIFY 1"]],
|
|
"020000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000010000000000000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
|
|
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "2147483647 4259840 ADD CHECKSEQUENCEVERIFY 1"]],
|
|
"020000000100010000000000000000000000000000000000000000000000000000000000000000000000000040000100000000000000000000000000000000000000010000000000000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
|
|
|
|
["Valid CHECKSEQUENCEVERIFY in signature script"],
|
|
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "1"]],
|
|
"02000000010001000000000000000000000000000000000000000000000000000000000000000000000001000000010000000000000000000000000000000000000001000000000000000000000000000000000251b2", "P2SH,CHECKSEQUENCEVERIFY"],
|
|
|
|
["Valid CHECKSEQUENCEVERIFY in redeem script"],
|
|
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "HASH160 0x14 0x2bdb899598acb78ab63c2113434bbda853220b72 EQUAL"]],
|
|
"0200000001000100000000000000000000000000000000000000000000000000000000000000000000000100000001000000000000000000000000000000000000000100000000000000000000000000000000030251b2", "P2SH,CHECKSEQUENCEVERIFY"],
|
|
|
|
["Make diffs cleaner by leaving a comment here without comma at the end"]
|
|
]
|