13#include <validation.h>
16#include <test/util/random.h>
17#include <test/util/setup_common.h>
19#include <boost/test/unit_test.hpp>
23BOOST_FIXTURE_TEST_SUITE(proofpool_tests, TestChain100Setup)
32 for (
size_t i = 0; i < 10; i++) {
35 ProofPool::AddProofStatus::SUCCEED);
36 proofIds.insert(proof->getId());
42 for (
auto proofid : proofIds) {
52 std::vector<ProofRef> proofs;
53 for (
size_t i = 0; i < 10; i++) {
57 ProofPool::AddProofStatus::SUCCEED);
62 for (
size_t j = 0; j < 10; j++) {
64 ProofPool::AddProofStatus::DUPLICATED);
68 proofs.push_back(std::move(proof));
74 auto buildProofWithSequence = [&](uint64_t sequence) {
77 pb.
addUTXO(conflictingOutpoint, 10 *
COIN, 123456,
false, key));
81 auto proof_seq10 = buildProofWithSequence(10);
83 ProofPool::AddProofStatus::SUCCEED);
86 proofs.push_back(std::move(proof_seq10));
88 auto proof_seq20 = buildProofWithSequence(20);
90 ProofPool::AddProofStatus::REJECTED);
95 for (
size_t i = 0; i < 10; i++) {
101 for (
auto proof : proofs) {
120 bool hasPeer =
false;
126 std::set<ProofRef, ProofRefComparatorByAddress> poolProofs;
127 for (
size_t i = 0; i < 10; i++) {
130 ProofPool::AddProofStatus::SUCCEED);
131 poolProofs.insert(std::move(proof));
139 std::set<ProofRef, ProofRefComparatorByAddress> pmProofs;
141 BOOST_CHECK_EQUAL_COLLECTIONS(poolProofs.begin(), poolProofs.end(),
142 pmProofs.begin(), pmProofs.end());
155 auto buildProofWithSequenceAndOutpoints =
156 [&](uint64_t sequence,
const std::vector<COutPoint> &outpoints) {
158 for (
const COutPoint &outpoint : outpoints) {
160 pb.
addUTXO(outpoint, 10 *
COIN, 123456,
false, key));
170 auto proof_seq10 = buildProofWithSequenceAndOutpoints(10, {outpoint1});
171 auto proof_seq20 = buildProofWithSequenceAndOutpoints(20, {outpoint2});
172 auto proof_seq30 = buildProofWithSequenceAndOutpoints(30, {outpoint3});
175 ProofPool::AddProofStatus::SUCCEED);
181 ProofPool::AddProofStatus::SUCCEED);
187 ProofPool::AddProofStatus::SUCCEED);
193 auto proof_seq123 = buildProofWithSequenceAndOutpoints(
194 123, {outpoint1, outpoint2, outpoint3});
196 proof_seq10, proof_seq20, proof_seq30};
203 ProofPool::AddProofStatus::REJECTED);
204 BOOST_CHECK_EQUAL_COLLECTIONS(
205 conflictingProofs.begin(), conflictingProofs.end(),
206 expectedConflictingProofs.begin(), expectedConflictingProofs.end());
215 conflictingProofs.clear();
218 ProofPool::AddProofStatus::SUCCEED);
219 BOOST_CHECK_EQUAL_COLLECTIONS(
220 conflictingProofs.begin(), conflictingProofs.end(),
221 expectedConflictingProofs.begin(), expectedConflictingProofs.end());
236 auto buildProofWithSequence = [&](uint64_t sequence) {
239 pb.
addUTXO(conflictingOutpoint, 10 *
COIN, 123456,
false, key));
243 auto proofSeq10 = buildProofWithSequence(10);
244 auto proofSeq20 = buildProofWithSequence(20);
245 auto proofSeq30 = buildProofWithSequence(30);
248 ProofPool::AddProofStatus::SUCCEED);
252 auto getRandomConflictingProofSet = [&active_chainstate]() {
260 auto checkConflictingProofs =
263 BOOST_CHECK_EQUAL_COLLECTIONS(conflictingProofs.begin(),
264 conflictingProofs.end(),
265 expectedConflictingProofs.begin(),
266 expectedConflictingProofs.end());
271 auto conflictingProofs = getRandomConflictingProofSet();
274 ProofPool::AddProofStatus::DUPLICATED);
275 checkConflictingProofs(conflictingProofs, {});
280 auto conflictingProofs = getRandomConflictingProofSet();
283 ProofPool::AddProofStatus::DUPLICATED);
284 checkConflictingProofs(conflictingProofs, {});
289 auto conflictingProofs = getRandomConflictingProofSet();
292 ProofPool::AddProofStatus::REJECTED);
293 checkConflictingProofs(conflictingProofs, {proofSeq20});
298 auto conflictingProofs = getRandomConflictingProofSet();
301 ProofPool::AddProofStatus::REJECTED);
302 checkConflictingProofs(conflictingProofs, {proofSeq20});
307 auto conflictingProofs = getRandomConflictingProofSet();
310 ProofPool::AddProofStatus::REJECTED);
311 checkConflictingProofs(conflictingProofs, {proofSeq20});
316 auto conflictingProofs = getRandomConflictingProofSet();
319 ProofPool::AddProofStatus::SUCCEED);
320 checkConflictingProofs(conflictingProofs, {proofSeq20});
327 for (
size_t i = 0; i < 10; i++) {
333 for (
size_t i = 0; i < 10; i++) {
336 ProofPool::AddProofStatus::SUCCEED);
338 auto retrievedProof = testPool.
getProof(proof->getId());
339 BOOST_CHECK_NE(retrievedProof,
nullptr);
349 auto buildProofWithRandomOutpoints = [&](uint32_t score) {
350 int numOutpoints = InsecureRand32() % 10 + 1;
352 for (
int i = 0; i < numOutpoints; i++) {
354 if (i == numOutpoints - 1) {
357 (int64_t(score) *
COIN) / 100 - (numOutpoints - 1) *
COIN;
366 for (
int i = 9; i >= 0; i--) {
369 ProofPool::AddProofStatus::SUCCEED);
381 for (
size_t i = 1; i < 10; i++) {
384 ProofPool::AddProofStatus::SUCCEED);
389 lowestScoreProof->getId());
395 for (
int scoreCount = 1; scoreCount < 10; scoreCount++) {
396 for (
size_t i = 0; i < 2; i++) {
411BOOST_AUTO_TEST_SUITE_END()
static constexpr Amount COIN
#define Assert(val)
Identity function.
void ForceSetArg(const std::string &strArg, const std::string &strValue)
void ClearForcedArg(const std::string &strArg)
Remove a forced arg setting, used only in testing.
An encapsulated secp256k1 private key.
static CKey MakeCompressedKey()
Produce a valid compressed key.
Chainstate stores and provides an API to update our local knowledge of the current best chain.
void forEachPeer(Callable &&func) const
bool addUTXO(COutPoint utxo, Amount amount, uint32_t height, bool is_coinbase, CKey key)
uint32_t getScore() const
const ProofId & getId() const
Map a proof to each utxo.
AddProofStatus addProofIfPreferred(const ProofRef &proof, ConflictingProofSet &conflictingProofs)
Attempt to add a proof to the pool.
AddProofStatus addProofIfNoConflict(const ProofRef &proof, ConflictingProofSet &conflictingProofs)
Attempt to add a proof to the pool, and fail if there is a conflict on any UTXO.
size_t countProofs() const
bool removeProof(ProofId proofid)
ProofRef getProof(const ProofId &proofid) const
std::set< ProofRef, ConflictingProofComparator > ConflictingProofSet
ProofRef getLowestScoreProof() const
std::unordered_set< ProofRef, SaltedProofHasher > rescan(PeerManager &peerManager)
ProofIdSet getProofIds() const
static constexpr Amount PROOF_DUST_THRESHOLD
Minimum amount per utxo.
const CScript UNSPENDABLE_ECREG_PAYOUT_SCRIPT
ProofRef buildRandomProof(Chainstate &active_chainstate, uint32_t score, int height, const CKey &masterKey)
constexpr uint32_t MIN_VALID_PROOF_SCORE
std::unordered_set< ProofId, SaltedProofIdHasher > ProofIdSet
#define BOOST_CHECK_EQUAL(v1, v2)
#define BOOST_CHECK(expr)
BOOST_AUTO_TEST_CASE(get_proof_ids)
uint256 GetRandHash() noexcept
A TxId is the identifier of a transaction.