diff --git a/ci/matrix.sh b/ci/matrix.sh index 15e918bc53..8eaf3b0e57 100755 --- a/ci/matrix.sh +++ b/ci/matrix.sh @@ -41,7 +41,7 @@ elif [ "$BUILD_TARGET" = "win32" ]; then export DPKG_ADD_ARCH="i386" export DEP_OPTS="NO_QT=1" export PACKAGES="python3 nsis g++-mingw-w64-i686 wine-stable wine32 bc" - export BITCOIN_CONFIG="--enable-gui --enable-reduce-exports" + export BITCOIN_CONFIG="--enable-gui --enable-reduce-exports --disable-miner" export DIRECT_WINE_EXEC_TESTS=true export RUN_TESTS=true elif [ "$BUILD_TARGET" = "win64" ]; then @@ -49,7 +49,7 @@ elif [ "$BUILD_TARGET" = "win64" ]; then export DPKG_ADD_ARCH="i386" export DEP_OPTS="NO_QT=1" export PACKAGES="python3 nsis g++-mingw-w64-x86-64 wine-stable wine64 bc" - export BITCOIN_CONFIG="--enable-gui --enable-reduce-exports" + export BITCOIN_CONFIG="--enable-gui --enable-reduce-exports --disable-miner" export DIRECT_WINE_EXEC_TESTS=true export RUN_TESTS=true elif [ "$BUILD_TARGET" = "linux32" ]; then @@ -82,7 +82,7 @@ elif [ "$BUILD_TARGET" = "linux64_release" ]; then elif [ "$BUILD_TARGET" = "mac" ]; then export HOST=x86_64-apple-darwin11 export PACKAGES="cmake imagemagick libcap-dev librsvg2-bin libz-dev libbz2-dev libtiff-tools" - export BITCOIN_CONFIG="--enable-gui --enable-reduce-exports" + export BITCOIN_CONFIG="--enable-gui --enable-reduce-exports --disable-miner" export OSX_SDK=10.11 export GOAL="deploy" fi diff --git a/configure.ac b/configure.ac index 65d7051337..f669a6421d 100644 --- a/configure.ac +++ b/configure.ac @@ -192,6 +192,17 @@ AC_ARG_ENABLE([debug], [enable_debug=$enableval], [enable_debug=no]) +# Enable in-wallet miner +AC_ARG_ENABLE([miner], + [AS_HELP_STRING([--enable-miner], + [enable in-wallet miner (default is yes)])], + [enable_miner=$enableval], + [enable_miner=yes]) +AM_CONDITIONAL([ENABLE_MINER], [test x$enable_miner = xyes]) +if test "x$enable_miner" = xyes; then + AC_DEFINE(ENABLE_MINER, 1, [Define this symbol if in-wallet miner should be enabled]) +fi + # Turn warnings into errors AC_ARG_ENABLE([werror], [AS_HELP_STRING([--enable-werror], @@ -1181,6 +1192,7 @@ echo " with test = $use_tests" echo " with bench = $use_bench" echo " with upnp = $use_upnp" echo " debug enabled = $enable_debug" +echo " miner enabled = $enable_miner" echo " werror = $enable_werror" echo echo " target os = $TARGET_OS" diff --git a/contrib/gitian-descriptors/gitian-osx.yml b/contrib/gitian-descriptors/gitian-osx.yml index 5c17c5b466..77daa39ce9 100644 --- a/contrib/gitian-descriptors/gitian-osx.yml +++ b/contrib/gitian-descriptors/gitian-osx.yml @@ -37,7 +37,7 @@ files: script: | WRAP_DIR=$HOME/wrapped HOSTS="x86_64-apple-darwin11" - CONFIGFLAGS="--enable-reduce-exports --disable-bench --disable-gui-tests GENISOIMAGE=$WRAP_DIR/genisoimage" + CONFIGFLAGS="--enable-reduce-exports --disable-miner --disable-bench --disable-gui-tests GENISOIMAGE=$WRAP_DIR/genisoimage" FAKETIME_HOST_PROGS="" FAKETIME_PROGS="ar ranlib date dmg genisoimage" diff --git a/contrib/gitian-descriptors/gitian-win.yml b/contrib/gitian-descriptors/gitian-win.yml index 6d1b673a37..b3d1d835c2 100755 --- a/contrib/gitian-descriptors/gitian-win.yml +++ b/contrib/gitian-descriptors/gitian-win.yml @@ -31,7 +31,7 @@ files: [] script: | WRAP_DIR=$HOME/wrapped HOSTS="i686-w64-mingw32 x86_64-w64-mingw32" - CONFIGFLAGS="--enable-reduce-exports --disable-bench --disable-gui-tests" + CONFIGFLAGS="--enable-reduce-exports --disable-miner --disable-bench --disable-gui-tests" FAKETIME_HOST_PROGS="ar ranlib nm windres strip objcopy" FAKETIME_PROGS="date makensis zip" HOST_CFLAGS="-O2 -g" diff --git a/src/governance-object.cpp b/src/governance-object.cpp index 06608d663a..62d4a042af 100644 --- a/src/governance-object.cpp +++ b/src/governance-object.cpp @@ -158,6 +158,21 @@ bool CGovernanceObject::ProcessVote(CNode* pfrom, LogPrint("gobject", "%s\n", ostr.str()); exception = CGovernanceException(ostr.str(), GOVERNANCE_EXCEPTION_NONE); return false; + } else if (vote.GetTimestamp() == voteInstanceRef.nCreationTime) { + // Someone is doing smth fishy, there can be no two votes from the same masternode + // with the same timestamp for the same object and signal and yet different hash/outcome. + std::ostringstream ostr; + ostr << "CGovernanceObject::ProcessVote -- Invalid vote, same timestamp for the different outcome"; + if (vote.GetOutcome() < voteInstanceRef.eOutcome) { + // This is an arbitrary comparison, we have to agree on some way + // to pick the "winning" vote. + ostr << ", rejected"; + LogPrint("gobject", "%s\n", ostr.str()); + exception = CGovernanceException(ostr.str(), GOVERNANCE_EXCEPTION_NONE); + return false; + } + ostr << ", accepted"; + LogPrint("gobject", "%s\n", ostr.str()); } int64_t nNow = GetAdjustedTime(); @@ -172,9 +187,9 @@ bool CGovernanceObject::ProcessVote(CNode* pfrom, << ", time delta = " << nTimeDelta; LogPrint("gobject", "%s\n", ostr.str()); exception = CGovernanceException(ostr.str(), GOVERNANCE_EXCEPTION_TEMPORARY_ERROR); - nVoteTimeUpdate = nNow; return false; } + nVoteTimeUpdate = nNow; } bool onlyVotingKeyAllowed = nObjectType == GOVERNANCE_OBJECT_PROPOSAL && vote.GetSignal() == VOTE_SIGNAL_FUNDING; diff --git a/src/merkleblock.cpp b/src/merkleblock.cpp index d9edd382e3..b2b003f666 100644 --- a/src/merkleblock.cpp +++ b/src/merkleblock.cpp @@ -31,12 +31,10 @@ CMerkleBlock::CMerkleBlock(const CBlock& block, CBloomFilter& filter) for (unsigned int i = 0; i < block.vtx.size(); i++) { const auto& tx = *block.vtx[i]; - if (tx.nVersion == 3 && !allowedTxTypes.count(tx.nType)) { - continue; - } - const uint256& hash = tx.GetHash(); - if (filter.IsRelevantAndUpdate(tx)) + bool isAllowedType = tx.nVersion != 3 || allowedTxTypes.count(tx.nType) != 0; + + if (isAllowedType && filter.IsRelevantAndUpdate(tx)) { vMatch.push_back(true); vMatchedTxn.push_back(std::make_pair(i, hash)); diff --git a/src/rpc/client.cpp b/src/rpc/client.cpp index e949fc9efa..db1ab87b28 100644 --- a/src/rpc/client.cpp +++ b/src/rpc/client.cpp @@ -30,10 +30,12 @@ public: static const CRPCConvertParam vRPCConvertParams[] = { { "setmocktime", 0, "timestamp" }, +#if ENABLE_MINER { "generate", 0, "nblocks" }, { "generate", 1, "maxtries" }, { "generatetoaddress", 0, "nblocks" }, { "generatetoaddress", 2, "maxtries" }, +#endif // ENABLE_MINER { "getnetworkhashps", 0, "nblocks" }, { "getnetworkhashps", 1, "height" }, { "sendtoaddress", 1, "amount" }, diff --git a/src/rpc/mining.cpp b/src/rpc/mining.cpp index 43522360d6..91bf071c40 100644 --- a/src/rpc/mining.cpp +++ b/src/rpc/mining.cpp @@ -104,6 +104,7 @@ UniValue getnetworkhashps(const JSONRPCRequest& request) return GetNetworkHashPS(request.params.size() > 0 ? request.params[0].get_int() : 120, request.params.size() > 1 ? request.params[1].get_int() : -1); } +#if ENABLE_MINER UniValue generateBlocks(boost::shared_ptr coinbaseScript, int nGenerate, uint64_t nMaxTries, bool keepScript) { static const int nInnerLoopCount = 0x10000; @@ -222,6 +223,7 @@ UniValue generatetoaddress(const JSONRPCRequest& request) return generateBlocks(coinbaseScript, nGenerate, nMaxTries, false); } +#endif // ENABLE_MINER UniValue getmininginfo(const JSONRPCRequest& request) { @@ -971,9 +973,10 @@ static const CRPCCommand commands[] = { "mining", "getblocktemplate", &getblocktemplate, true, {"template_request"} }, { "mining", "submitblock", &submitblock, true, {"hexdata","parameters"} }, +#if ENABLE_MINER { "generating", "generate", &generate, true, {"nblocks","maxtries"} }, { "generating", "generatetoaddress", &generatetoaddress, true, {"nblocks","address","maxtries"} }, - +#endif // ENABLE_MINER { "util", "estimatefee", &estimatefee, true, {"nblocks"} }, { "util", "estimatepriority", &estimatepriority, true, {"nblocks"} }, { "util", "estimatesmartfee", &estimatesmartfee, true, {"nblocks"} }, diff --git a/src/rpc/rpcevo.cpp b/src/rpc/rpcevo.cpp index b83c6cea04..0004d146c9 100644 --- a/src/rpc/rpcevo.cpp +++ b/src/rpc/rpcevo.cpp @@ -762,7 +762,7 @@ UniValue protx_revoke(const JSONRPCRequest& request) if (request.params.size() > 3) { int32_t nReason = ParseInt32V(request.params[3], "reason"); - if (nReason < 0 || nReason >= CProUpRevTx::REASON_LAST) { + if (nReason < 0 || nReason > CProUpRevTx::REASON_LAST) { throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("invalid reason %d, must be between 0 and %d", nReason, CProUpRevTx::REASON_LAST)); } ptx.nReason = (uint16_t)nReason; diff --git a/src/test/rpc_tests.cpp b/src/test/rpc_tests.cpp index 5b99cec558..8bcd474cdc 100644 --- a/src/test/rpc_tests.cpp +++ b/src/test/rpc_tests.cpp @@ -320,6 +320,7 @@ BOOST_AUTO_TEST_CASE(rpc_ban) BOOST_CHECK_EQUAL(adr.get_str(), "2001:4d48:ac57:400:cacf:e9ff:fe1d:9c63/128"); } +#if ENABLE_MINER BOOST_AUTO_TEST_CASE(rpc_convert_values_generatetoaddress) { UniValue result; @@ -342,6 +343,7 @@ BOOST_AUTO_TEST_CASE(rpc_convert_values_generatetoaddress) BOOST_CHECK_EQUAL(result[1].get_str(), "yTG8jLL3MvteKXgbEcHyaN7JvTPCejQpSh"); BOOST_CHECK_EQUAL(result[2].get_int(), 9); } +#endif // ENABLE_MINER BOOST_AUTO_TEST_CASE(rpc_sentinel_ping) { diff --git a/src/validation.cpp b/src/validation.cpp index 804b748878..5d707c34c4 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -4504,6 +4504,11 @@ static const uint64_t MEMPOOL_DUMP_VERSION = 1; bool LoadMempool(void) { + if (GetBoolArg("-zapwallettxes", false)) { + LogPrintf("Skipping mempool.dat because of zapwallettxes\n"); + return true; + } + int64_t nExpiryTimeout = GetArg("-mempoolexpiry", DEFAULT_MEMPOOL_EXPIRY) * 60 * 60; FILE* filestr = fopen((GetDataDir() / "mempool.dat").string().c_str(), "rb"); CAutoFile file(filestr, SER_DISK, CLIENT_VERSION);