Changeset View
Changeset View
Standalone View
Standalone View
src/avalanche/test/processor_tests.cpp
Show First 20 Lines • Show All 1,127 Lines • ▼ Show 20 Lines | for (size_t i = 0; i < 10; i++) { | ||||
gArgs.ForceSetArg("-enableavalancheproofreplacement", "1"); | gArgs.ForceSetArg("-enableavalancheproofreplacement", "1"); | ||||
BOOST_CHECK(m_processor->addProofToReconcile(proof)); | BOOST_CHECK(m_processor->addProofToReconcile(proof)); | ||||
gArgs.ClearForcedArg("-enableavalancheproofreplacement"); | gArgs.ClearForcedArg("-enableavalancheproofreplacement"); | ||||
} | } | ||||
} | } | ||||
BOOST_AUTO_TEST_CASE(proof_record) { | BOOST_AUTO_TEST_CASE(proof_record) { | ||||
gArgs.ForceSetArg("-avaproofstakeutxoconfirmations", "2"); | |||||
gArgs.ForceSetArg("-avalancheconflictingproofcooldown", "0"); | gArgs.ForceSetArg("-avalancheconflictingproofcooldown", "0"); | ||||
BOOST_CHECK(!m_processor->isAccepted(nullptr)); | BOOST_CHECK(!m_processor->isAccepted(nullptr)); | ||||
BOOST_CHECK_EQUAL(m_processor->getConfidence(nullptr), -1); | BOOST_CHECK_EQUAL(m_processor->getConfidence(nullptr), -1); | ||||
const CKey key = CKey::MakeCompressedKey(); | const CKey key = CKey::MakeCompressedKey(); | ||||
const COutPoint conflictingOutpoint{TxId(GetRandHash()), 0}; | const COutPoint conflictingOutpoint{TxId(GetRandHash()), 0}; | ||||
const COutPoint immatureOutpoint{TxId(GetRandHash()), 0}; | |||||
{ | { | ||||
CScript script = GetScriptForDestination(PKHash(key.GetPubKey())); | CScript script = GetScriptForDestination(PKHash(key.GetPubKey())); | ||||
LOCK(cs_main); | LOCK(cs_main); | ||||
CCoinsViewCache &coins = ::ChainstateActive().CoinsTip(); | CCoinsViewCache &coins = ::ChainstateActive().CoinsTip(); | ||||
coins.AddCoin(conflictingOutpoint, | coins.AddCoin(conflictingOutpoint, | ||||
Coin(CTxOut(10 * COIN, script), 10, false), false); | Coin(CTxOut(10 * COIN, script), 10, false), false); | ||||
coins.AddCoin(immatureOutpoint, | |||||
Coin(CTxOut(10 * COIN, script), 100, false), false); | |||||
} | } | ||||
const COutPoint missingOutpoint{TxId(GetRandHash()), 0}; | |||||
auto buildProof = [&](const COutPoint &outpoint, uint64_t sequence) { | auto buildProof = [&](const COutPoint &outpoint, uint64_t sequence, | ||||
uint32_t height = 10) { | |||||
ProofBuilder pb(sequence, 0, key); | ProofBuilder pb(sequence, 0, key); | ||||
BOOST_CHECK(pb.addUTXO(outpoint, 10 * COIN, 10, false, key)); | BOOST_CHECK(pb.addUTXO(outpoint, 10 * COIN, height, false, key)); | ||||
return pb.build(); | return pb.build(); | ||||
}; | }; | ||||
auto conflictingProof = buildProof(conflictingOutpoint, 1); | auto conflictingProof = buildProof(conflictingOutpoint, 1); | ||||
auto validProof = buildProof(conflictingOutpoint, 2); | auto validProof = buildProof(conflictingOutpoint, 2); | ||||
auto orphanProof = buildProof(missingOutpoint, 3); | auto orphanProof = buildProof(immatureOutpoint, 3, 100); | ||||
BOOST_CHECK(!m_processor->isAccepted(conflictingProof)); | BOOST_CHECK(!m_processor->isAccepted(conflictingProof)); | ||||
BOOST_CHECK(!m_processor->isAccepted(validProof)); | BOOST_CHECK(!m_processor->isAccepted(validProof)); | ||||
BOOST_CHECK(!m_processor->isAccepted(orphanProof)); | BOOST_CHECK(!m_processor->isAccepted(orphanProof)); | ||||
BOOST_CHECK_EQUAL(m_processor->getConfidence(conflictingProof), -1); | BOOST_CHECK_EQUAL(m_processor->getConfidence(conflictingProof), -1); | ||||
BOOST_CHECK_EQUAL(m_processor->getConfidence(validProof), -1); | BOOST_CHECK_EQUAL(m_processor->getConfidence(validProof), -1); | ||||
BOOST_CHECK_EQUAL(m_processor->getConfidence(orphanProof), -1); | BOOST_CHECK_EQUAL(m_processor->getConfidence(orphanProof), -1); | ||||
Show All 31 Lines | BOOST_AUTO_TEST_CASE(proof_record) { | ||||
BOOST_CHECK(!m_processor->addProofToReconcile(orphanProof)); | BOOST_CHECK(!m_processor->addProofToReconcile(orphanProof)); | ||||
BOOST_CHECK(!m_processor->isAccepted(conflictingProof)); | BOOST_CHECK(!m_processor->isAccepted(conflictingProof)); | ||||
BOOST_CHECK(m_processor->isAccepted(validProof)); | BOOST_CHECK(m_processor->isAccepted(validProof)); | ||||
BOOST_CHECK(!m_processor->isAccepted(orphanProof)); | BOOST_CHECK(!m_processor->isAccepted(orphanProof)); | ||||
BOOST_CHECK_EQUAL(m_processor->getConfidence(conflictingProof), 0); | BOOST_CHECK_EQUAL(m_processor->getConfidence(conflictingProof), 0); | ||||
BOOST_CHECK_EQUAL(m_processor->getConfidence(validProof), 0); | BOOST_CHECK_EQUAL(m_processor->getConfidence(validProof), 0); | ||||
BOOST_CHECK_EQUAL(m_processor->getConfidence(orphanProof), -1); | BOOST_CHECK_EQUAL(m_processor->getConfidence(orphanProof), -1); | ||||
gArgs.ClearForcedArg("-avaproofstakeutxoconfirmations"); | |||||
gArgs.ClearForcedArg("-avalancheconflictingproofcooldown"); | gArgs.ClearForcedArg("-avalancheconflictingproofcooldown"); | ||||
} | } | ||||
BOOST_AUTO_TEST_CASE(quorum_detection) { | BOOST_AUTO_TEST_CASE(quorum_detection) { | ||||
// Set min quorum parameters for our test | // Set min quorum parameters for our test | ||||
int minStake = 4'000'000; | int minStake = 4'000'000; | ||||
gArgs.ForceSetArg("-avaminquorumstake", ToString(minStake)); | gArgs.ForceSetArg("-avaminquorumstake", ToString(minStake)); | ||||
gArgs.ForceSetArg("-avaminquorumconnectedstakeratio", "0.5"); | gArgs.ForceSetArg("-avaminquorumconnectedstakeratio", "0.5"); | ||||
▲ Show 20 Lines • Show All 69 Lines • ▼ Show 20 Lines | BOOST_AUTO_TEST_CASE(quorum_detection) { | ||||
// the quorum as established | // the quorum as established | ||||
processor->withPeerManager([&](avalanche::PeerManager &pm) { | processor->withPeerManager([&](avalanche::PeerManager &pm) { | ||||
pm.removeNode(0); | pm.removeNode(0); | ||||
BOOST_CHECK_EQUAL(pm.getTotalPeersScore(), minScore); | BOOST_CHECK_EQUAL(pm.getTotalPeersScore(), minScore); | ||||
BOOST_CHECK_EQUAL(pm.getConnectedPeersScore(), 0); | BOOST_CHECK_EQUAL(pm.getConnectedPeersScore(), 0); | ||||
}); | }); | ||||
BOOST_CHECK(processor->isQuorumEstablished()); | BOOST_CHECK(processor->isQuorumEstablished()); | ||||
// Remove peers one at a time by orphaning their proofs, and ensure the | // Remove peers one at a time and ensure the quorum stays established | ||||
// quorum stays established | auto spendProofUtxo = [&processor](ProofRef proof) { | ||||
auto orphanProof = [&processor](ProofRef proof) { | |||||
{ | { | ||||
LOCK(cs_main); | LOCK(cs_main); | ||||
CCoinsViewCache &coins = ::ChainstateActive().CoinsTip(); | CCoinsViewCache &coins = ::ChainstateActive().CoinsTip(); | ||||
coins.SpendCoin(proof->getStakes()[0].getStake().getUTXO()); | coins.SpendCoin(proof->getStakes()[0].getStake().getUTXO()); | ||||
} | } | ||||
processor->withPeerManager([&proof](avalanche::PeerManager &pm) { | processor->withPeerManager([&proof](avalanche::PeerManager &pm) { | ||||
pm.updatedBlockTip(); | pm.updatedBlockTip(); | ||||
BOOST_CHECK(pm.isOrphan(proof->getId())); | |||||
BOOST_CHECK(!pm.isBoundToPeer(proof->getId())); | BOOST_CHECK(!pm.isBoundToPeer(proof->getId())); | ||||
}); | }); | ||||
}; | }; | ||||
orphanProof(proof2); | spendProofUtxo(proof2); | ||||
processor->withPeerManager([&](avalanche::PeerManager &pm) { | processor->withPeerManager([&](avalanche::PeerManager &pm) { | ||||
BOOST_CHECK_EQUAL(pm.getTotalPeersScore(), 3 * minScore / 4); | BOOST_CHECK_EQUAL(pm.getTotalPeersScore(), 3 * minScore / 4); | ||||
BOOST_CHECK_EQUAL(pm.getConnectedPeersScore(), 0); | BOOST_CHECK_EQUAL(pm.getConnectedPeersScore(), 0); | ||||
}); | }); | ||||
BOOST_CHECK(processor->isQuorumEstablished()); | BOOST_CHECK(processor->isQuorumEstablished()); | ||||
orphanProof(proof1); | spendProofUtxo(proof1); | ||||
processor->withPeerManager([&](avalanche::PeerManager &pm) { | processor->withPeerManager([&](avalanche::PeerManager &pm) { | ||||
BOOST_CHECK_EQUAL(pm.getTotalPeersScore(), minScore / 4); | BOOST_CHECK_EQUAL(pm.getTotalPeersScore(), minScore / 4); | ||||
BOOST_CHECK_EQUAL(pm.getConnectedPeersScore(), 0); | BOOST_CHECK_EQUAL(pm.getConnectedPeersScore(), 0); | ||||
}); | }); | ||||
BOOST_CHECK(processor->isQuorumEstablished()); | BOOST_CHECK(processor->isQuorumEstablished()); | ||||
orphanProof(processor->getLocalProof()); | spendProofUtxo(processor->getLocalProof()); | ||||
processor->withPeerManager([&](avalanche::PeerManager &pm) { | processor->withPeerManager([&](avalanche::PeerManager &pm) { | ||||
BOOST_CHECK_EQUAL(pm.getTotalPeersScore(), 0); | BOOST_CHECK_EQUAL(pm.getTotalPeersScore(), 0); | ||||
BOOST_CHECK_EQUAL(pm.getConnectedPeersScore(), 0); | BOOST_CHECK_EQUAL(pm.getConnectedPeersScore(), 0); | ||||
}); | }); | ||||
BOOST_CHECK(processor->isQuorumEstablished()); | BOOST_CHECK(processor->isQuorumEstablished()); | ||||
gArgs.ClearForcedArg("-avamasterkey"); | gArgs.ClearForcedArg("-avamasterkey"); | ||||
gArgs.ClearForcedArg("-avaproof"); | gArgs.ClearForcedArg("-avaproof"); | ||||
▲ Show 20 Lines • Show All 206 Lines • Show Last 20 Lines |