Changeset View
Changeset View
Standalone View
Standalone View
src/test/util/mining.cpp
// Copyright (c) 2019 The Bitcoin Core developers | // Copyright (c) 2019 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 <test/util/mining.h> | #include <test/util/mining.h> | ||||
#include <chainparams.h> | #include <chainparams.h> | ||||
#include <config.h> | #include <config.h> | ||||
#include <consensus/merkle.h> | #include <consensus/merkle.h> | ||||
#include <key_io.h> | #include <key_io.h> | ||||
#include <miner.h> | #include <miner.h> | ||||
#include <node/context.h> | |||||
#include <pow/pow.h> | #include <pow/pow.h> | ||||
#include <script/standard.h> | #include <script/standard.h> | ||||
#include <validation.h> | #include <validation.h> | ||||
const std::string ADDRESS_BCHREG_UNSPENDABLE = | const std::string ADDRESS_BCHREG_UNSPENDABLE = | ||||
"bchreg:qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqha9s37tt"; | "bchreg:qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqha9s37tt"; | ||||
CTxIn generatetoaddress(const Config &config, const std::string &address) { | CTxIn generatetoaddress(const Config &config, const NodeContext &node, | ||||
const std::string &address) { | |||||
const auto dest = DecodeDestination(address, config.GetChainParams()); | const auto dest = DecodeDestination(address, config.GetChainParams()); | ||||
assert(IsValidDestination(dest)); | assert(IsValidDestination(dest)); | ||||
const auto coinbase_script = GetScriptForDestination(dest); | const auto coinbase_script = GetScriptForDestination(dest); | ||||
return MineBlock(config, coinbase_script); | return MineBlock(config, node, coinbase_script); | ||||
} | } | ||||
CTxIn MineBlock(const Config &config, const CScript &coinbase_scriptPubKey) { | CTxIn MineBlock(const Config &config, const NodeContext &node, | ||||
auto block = PrepareBlock(config, coinbase_scriptPubKey); | const CScript &coinbase_scriptPubKey) { | ||||
auto block = PrepareBlock(config, node, coinbase_scriptPubKey); | |||||
while (!CheckProofOfWork(block->GetHash(), block->nBits, | while (!CheckProofOfWork(block->GetHash(), block->nBits, | ||||
config.GetChainParams().GetConsensus())) { | config.GetChainParams().GetConsensus())) { | ||||
++block->nNonce; | ++block->nNonce; | ||||
assert(block->nNonce); | assert(block->nNonce); | ||||
} | } | ||||
bool processed{ProcessNewBlock(config, block, true, nullptr)}; | bool processed{ProcessNewBlock(config, block, true, nullptr)}; | ||||
assert(processed); | assert(processed); | ||||
return CTxIn{block->vtx[0]->GetId(), 0}; | return CTxIn{block->vtx[0]->GetId(), 0}; | ||||
} | } | ||||
std::shared_ptr<CBlock> PrepareBlock(const Config &config, | std::shared_ptr<CBlock> PrepareBlock(const Config &config, | ||||
const NodeContext &node, | |||||
const CScript &coinbase_scriptPubKey) { | const CScript &coinbase_scriptPubKey) { | ||||
assert(node.mempool); | |||||
auto block = | auto block = | ||||
std::make_shared<CBlock>(BlockAssembler{config, ::g_mempool} | std::make_shared<CBlock>(BlockAssembler{config, *node.mempool} | ||||
.CreateNewBlock(coinbase_scriptPubKey) | .CreateNewBlock(coinbase_scriptPubKey) | ||||
->block); | ->block); | ||||
LOCK(cs_main); | LOCK(cs_main); | ||||
block->nTime = ::ChainActive().Tip()->GetMedianTimePast() + 1; | block->nTime = ::ChainActive().Tip()->GetMedianTimePast() + 1; | ||||
block->hashMerkleRoot = BlockMerkleRoot(*block); | block->hashMerkleRoot = BlockMerkleRoot(*block); | ||||
return block; | return block; | ||||
} | } |