mirror of
https://github.com/dashpay/dash.git
synced 2024-12-25 03:52:49 +01:00
Merge #17720: test: add unit test for non-standard "scriptsig-not-pushonly" txs
5aab011805ceb12801644170700b1a62e0bf4a5d test: add unit test for non-standard "scriptsig-not-pushonly" txs (Sebastian Falbesoner) Pull request description: Approaches another missing unit test of issue #17394: Checks that the function `IsStandardTx()` returns rejection reason "scriptsig-not-pushonly" if any one of the input's scriptSig consists of any other ops than just PUSHs. ACKs for top commit: MarcoFalke: ACK 5aab011805ceb12801644170700b1a62e0bf4a5d 🍟 practicalswift: ACK 5aab011805ceb12801644170700b1a62e0bf4a5d -- patch looks correct Tree-SHA512: fbe25bcf57e5f0c8d2397eb67e61fe8d9145ba83032789adb2b67d6fcbcd87e6427e9d965e8cd7bbaaea482e39ec2f110f71ef2de079c7d1fba2712848caa9ba
This commit is contained in:
parent
fc930dc0f4
commit
66d5d5a798
@ -426,6 +426,40 @@ BOOST_AUTO_TEST_CASE(test_IsStandard)
|
||||
BOOST_CHECK(!IsStandardTx(CTransaction(t), reason));
|
||||
BOOST_CHECK_EQUAL(reason, "scriptsig-size");
|
||||
|
||||
// Check scriptSig format (non-standard if there are any other ops than just PUSHs)
|
||||
t.vin[0].scriptSig = CScript()
|
||||
<< OP_TRUE << OP_0 << OP_1NEGATE << OP_16 // OP_n (single byte pushes: n = 1, 0, -1, 16)
|
||||
<< std::vector<unsigned char>(75, 0) // OP_PUSHx [...x bytes...]
|
||||
<< std::vector<unsigned char>(235, 0) // OP_PUSHDATA1 x [...x bytes...]
|
||||
<< std::vector<unsigned char>(1234, 0) // OP_PUSHDATA2 x [...x bytes...]
|
||||
<< OP_9;
|
||||
BOOST_CHECK(IsStandardTx(CTransaction(t), reason));
|
||||
|
||||
const std::vector<unsigned char> non_push_ops = { // arbitrary set of non-push operations
|
||||
OP_NOP, OP_VERIFY, OP_IF, OP_ROT, OP_3DUP, OP_SIZE, OP_EQUAL, OP_ADD, OP_SUB,
|
||||
OP_HASH256, OP_CODESEPARATOR, OP_CHECKSIG, OP_CHECKLOCKTIMEVERIFY };
|
||||
|
||||
CScript::const_iterator pc = t.vin[0].scriptSig.begin();
|
||||
while (pc < t.vin[0].scriptSig.end()) {
|
||||
opcodetype opcode;
|
||||
CScript::const_iterator prev_pc = pc;
|
||||
t.vin[0].scriptSig.GetOp(pc, opcode); // advance to next op
|
||||
// for the sake of simplicity, we only replace single-byte push operations
|
||||
if (opcode >= 1 && opcode <= OP_PUSHDATA4)
|
||||
continue;
|
||||
|
||||
int index = prev_pc - t.vin[0].scriptSig.begin();
|
||||
unsigned char orig_op = *prev_pc; // save op
|
||||
// replace current push-op with each non-push-op
|
||||
for (auto op : non_push_ops) {
|
||||
t.vin[0].scriptSig[index] = op;
|
||||
BOOST_CHECK(!IsStandardTx(CTransaction(t), reason));
|
||||
BOOST_CHECK_EQUAL(reason, "scriptsig-not-pushonly");
|
||||
}
|
||||
t.vin[0].scriptSig[index] = orig_op; // restore op
|
||||
BOOST_CHECK(IsStandardTx(CTransaction(t), reason));
|
||||
}
|
||||
|
||||
// Check bare multisig (standard if policy flag fIsBareMultisigStd is set)
|
||||
fIsBareMultisigStd = true;
|
||||
t.vout[0].scriptPubKey = GetScriptForMultisig(1, {key.GetPubKey()}); // simple 1-of-1
|
||||
|
Loading…
Reference in New Issue
Block a user