Changeset View
Changeset View
Standalone View
Standalone View
src/test/sigopcount_tests.cpp
// Copyright (c) 2012-2016 The Bitcoin Core developers | // Copyright (c) 2012-2016 The Bitcoin Core developers | ||||
// Distributed under the MIT software license, see the accompanying | // Distributed under the MIT software license, see the accompanying | ||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php. | // file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||||
#include <consensus/consensus.h> | #include <consensus/consensus.h> | ||||
#include <consensus/tx_verify.h> | #include <consensus/tx_verify.h> | ||||
#include <consensus/validation.h> | #include <consensus/validation.h> | ||||
#include <key.h> | #include <key.h> | ||||
#include <policy/policy.h> // For STANDARD_CHECKDATASIG_VERIFY_FLAGS. | #include <policy/policy.h> // For STANDARD_SCRIPT_VERIFY_FLAGS. | ||||
#include <pubkey.h> | #include <pubkey.h> | ||||
#include <script/interpreter.h> | #include <script/interpreter.h> | ||||
#include <script/script.h> | #include <script/script.h> | ||||
#include <script/standard.h> | #include <script/standard.h> | ||||
#include <uint256.h> | #include <uint256.h> | ||||
#include <test/test_bitcoin.h> | #include <test/test_bitcoin.h> | ||||
#include <boost/test/unit_test.hpp> | #include <boost/test/unit_test.hpp> | ||||
#include <limits> | #include <limits> | ||||
#include <vector> | #include <vector> | ||||
// Helpers: | // Helpers: | ||||
static std::vector<uint8_t> Serialize(const CScript &s) { | static std::vector<uint8_t> Serialize(const CScript &s) { | ||||
std::vector<uint8_t> sSerialized(s.begin(), s.end()); | std::vector<uint8_t> sSerialized(s.begin(), s.end()); | ||||
return sSerialized; | return sSerialized; | ||||
} | } | ||||
BOOST_FIXTURE_TEST_SUITE(sigopcount_tests, BasicTestingSetup) | BOOST_FIXTURE_TEST_SUITE(sigopcount_tests, BasicTestingSetup) | ||||
void CheckScriptSigOps(const CScript &script, uint32_t accurate_sigops, | void CheckScriptSigOps(const CScript &script, uint32_t accurate_sigops, | ||||
uint32_t inaccurate_sigops, uint32_t datasigops) { | uint32_t inaccurate_sigops, uint32_t datasigops) { | ||||
const uint32_t nodatasigflags = | |||||
STANDARD_SCRIPT_VERIFY_FLAGS & ~SCRIPT_ENABLE_CHECKDATASIG; | |||||
const uint32_t stdflags = STANDARD_SCRIPT_VERIFY_FLAGS; | const uint32_t stdflags = STANDARD_SCRIPT_VERIFY_FLAGS; | ||||
deadalnix: Keep the datasigflags name. | |||||
const uint32_t datasigflags = STANDARD_CHECKDATASIG_VERIFY_FLAGS; | |||||
BOOST_CHECK_EQUAL(script.GetSigOpCount(stdflags, false), inaccurate_sigops); | BOOST_CHECK_EQUAL(script.GetSigOpCount(nodatasigflags, false), | ||||
BOOST_CHECK_EQUAL(script.GetSigOpCount(datasigflags, false), | inaccurate_sigops); | ||||
BOOST_CHECK_EQUAL(script.GetSigOpCount(stdflags, false), | |||||
inaccurate_sigops + datasigops); | inaccurate_sigops + datasigops); | ||||
BOOST_CHECK_EQUAL(script.GetSigOpCount(stdflags, true), accurate_sigops); | BOOST_CHECK_EQUAL(script.GetSigOpCount(nodatasigflags, true), | ||||
BOOST_CHECK_EQUAL(script.GetSigOpCount(datasigflags, true), | accurate_sigops); | ||||
BOOST_CHECK_EQUAL(script.GetSigOpCount(stdflags, true), | |||||
accurate_sigops + datasigops); | accurate_sigops + datasigops); | ||||
const CScript p2sh = GetScriptForDestination(CScriptID(script)); | const CScript p2sh = GetScriptForDestination(CScriptID(script)); | ||||
const CScript scriptSig = CScript() << OP_0 << Serialize(script); | const CScript scriptSig = CScript() << OP_0 << Serialize(script); | ||||
BOOST_CHECK_EQUAL(p2sh.GetSigOpCount(stdflags, scriptSig), accurate_sigops); | BOOST_CHECK_EQUAL(p2sh.GetSigOpCount(nodatasigflags, scriptSig), | ||||
BOOST_CHECK_EQUAL(p2sh.GetSigOpCount(datasigflags, scriptSig), | accurate_sigops); | ||||
BOOST_CHECK_EQUAL(p2sh.GetSigOpCount(stdflags, scriptSig), | |||||
accurate_sigops + datasigops); | accurate_sigops + datasigops); | ||||
// Check that GetSigOpCount do not report sigops in the P2SH script when the | // Check that GetSigOpCount do not report sigops in the P2SH script when the | ||||
// P2SH flags isn't passed in. | // P2SH flags isn't passed in. | ||||
BOOST_CHECK_EQUAL(p2sh.GetSigOpCount(SCRIPT_VERIFY_NONE, scriptSig), 0U); | BOOST_CHECK_EQUAL(p2sh.GetSigOpCount(SCRIPT_VERIFY_NONE, scriptSig), 0U); | ||||
// Check that GetSigOpCount report the exact count when not passed a P2SH. | // Check that GetSigOpCount report the exact count when not passed a P2SH. | ||||
BOOST_CHECK_EQUAL(script.GetSigOpCount(stdflags, p2sh), accurate_sigops); | BOOST_CHECK_EQUAL(script.GetSigOpCount(nodatasigflags, p2sh), | ||||
BOOST_CHECK_EQUAL(script.GetSigOpCount(datasigflags, p2sh), | accurate_sigops); | ||||
BOOST_CHECK_EQUAL(script.GetSigOpCount(stdflags, p2sh), | |||||
accurate_sigops + datasigops); | accurate_sigops + datasigops); | ||||
BOOST_CHECK_EQUAL(script.GetSigOpCount(SCRIPT_VERIFY_NONE, p2sh), | BOOST_CHECK_EQUAL(script.GetSigOpCount(SCRIPT_VERIFY_NONE, p2sh), | ||||
accurate_sigops); | accurate_sigops); | ||||
} | } | ||||
BOOST_AUTO_TEST_CASE(GetSigOpCount) { | BOOST_AUTO_TEST_CASE(GetSigOpCount) { | ||||
// Test CScript::GetSigOpCount() | // Test CScript::GetSigOpCount() | ||||
CheckScriptSigOps(CScript(), 0, 0, 0); | CheckScriptSigOps(CScript(), 0, 0, 0); | ||||
Show All 18 Lines | BOOST_AUTO_TEST_CASE(GetSigOpCount) { | ||||
CheckScriptSigOps(s3, 3, 20, 0); | CheckScriptSigOps(s3, 3, 20, 0); | ||||
const CScript p2sh = GetScriptForDestination(CScriptID(s3)); | const CScript p2sh = GetScriptForDestination(CScriptID(s3)); | ||||
CheckScriptSigOps(p2sh, 0, 0, 0); | CheckScriptSigOps(p2sh, 0, 0, 0); | ||||
CScript scriptSig2; | CScript scriptSig2; | ||||
scriptSig2 << OP_1 << ToByteVector(dummy) << ToByteVector(dummy) | scriptSig2 << OP_1 << ToByteVector(dummy) << ToByteVector(dummy) | ||||
<< Serialize(s3); | << Serialize(s3); | ||||
BOOST_CHECK_EQUAL(p2sh.GetSigOpCount((STANDARD_SCRIPT_VERIFY_FLAGS & | |||||
~SCRIPT_ENABLE_CHECKDATASIG), | |||||
scriptSig2), | |||||
3U); | |||||
BOOST_CHECK_EQUAL( | BOOST_CHECK_EQUAL( | ||||
p2sh.GetSigOpCount(STANDARD_SCRIPT_VERIFY_FLAGS, scriptSig2), 3U); | p2sh.GetSigOpCount(STANDARD_SCRIPT_VERIFY_FLAGS, scriptSig2), 3U); | ||||
BOOST_CHECK_EQUAL( | |||||
p2sh.GetSigOpCount(STANDARD_CHECKDATASIG_VERIFY_FLAGS, scriptSig2), 3U); | |||||
BOOST_CHECK_EQUAL(p2sh.GetSigOpCount(SCRIPT_VERIFY_NONE, scriptSig2), 0U); | BOOST_CHECK_EQUAL(p2sh.GetSigOpCount(SCRIPT_VERIFY_NONE, scriptSig2), 0U); | ||||
const CScript s4 = CScript(s1) << OP_IF << OP_CHECKDATASIG << OP_ENDIF; | const CScript s4 = CScript(s1) << OP_IF << OP_CHECKDATASIG << OP_ENDIF; | ||||
CheckScriptSigOps(s4, 2, 20, 1); | CheckScriptSigOps(s4, 2, 20, 1); | ||||
const CScript s5 = CScript(s4) << OP_CHECKDATASIGVERIFY; | const CScript s5 = CScript(s4) << OP_CHECKDATASIGVERIFY; | ||||
CheckScriptSigOps(s5, 2, 20, 2); | CheckScriptSigOps(s5, 2, 20, 2); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 179 Lines • Show Last 20 Lines |
Keep the datasigflags name.