40 std::vector<std::pair<ProofId, CScript>> winners;
42 manualWinners.size() + acceptedWinners.size() + rejectedWinners.size();
46 !acceptedWinners.empty());
48 if (expectedSize == 0) {
49 BOOST_CHECK(!cache.getWinners(prevblockhash, winners));
53 BOOST_CHECK(cache.getWinners(prevblockhash, winners));
57 for (
size_t i = 0; i < manualWinners.size(); i++) {
62 for (
auto &proof : acceptedWinners) {
64 std::find_if(std::next(winners.begin(), manualWinners.size()),
65 std::next(winners.begin(), manualWinners.size() +
66 acceptedWinners.size()),
67 [&](std::pair<ProofId, CScript> &p) {
68 return p.first == proof->getId();
71 for (
auto &proof : rejectedWinners) {
73 std::find_if(std::next(winners.begin(), manualWinners.size() +
74 acceptedWinners.size()),
75 winners.end(), [&](std::pair<ProofId, CScript> &p) {
76 return p.first == proof->getId();
83 double previousRank = 0;
84 for (
auto it = std::next(winners.begin(), manualWinners.size());
85 it != std::next(winners.begin(),
86 manualWinners.size() + acceptedWinners.size());
91 previousRank = proofRank;
94 for (
auto it = std::next(winners.begin(),
95 manualWinners.size() + acceptedWinners.size());
96 it != winners.end(); it++) {
100 previousRank = proofRank;
124 std::vector<int> initialStatuses = {
125 StakeContenderStatus::UNKNOWN, StakeContenderStatus::ACCEPTED,
126 StakeContenderStatus::IN_WINNER_SET,
127 StakeContenderStatus::ACCEPTED | StakeContenderStatus::IN_WINNER_SET};
128 for (uint8_t initialStatus : initialStatuses) {
137 !(initialStatus & StakeContenderStatus::ACCEPTED));
206 std::vector<CScript> manualWinners = {
211 std::vector<ProofRef> proofs;
213 for (
int i = 0; i < 4; i++) {
221 for (
int i = 0; i < 5; i++) {
227 CheckWinners(cache, blockhash, {manualWinners[0]}, {}, {});
230 for (
int p = 0; p < 4; p++) {
237 StakeContenderStatus::ACCEPTED |
238 StakeContenderStatus::IN_WINNER_SET));
243 cache.
add(pindex, proofs[1], StakeContenderStatus::ACCEPTED));
248 cache.
add(pindex, proofs[2], StakeContenderStatus::IN_WINNER_SET));
257 for (
const auto &proof : proofs) {
260 !cache.
add(pindex, proof, StakeContenderStatus::ACCEPTED));
262 StakeContenderStatus::ACCEPTED |
263 StakeContenderStatus::IN_WINNER_SET));
265 !cache.
add(pindex, proof, StakeContenderStatus::IN_WINNER_SET));
268 CheckWinners(cache, blockhash, {manualWinners[0]}, {proofs[0]},
274 CheckWinners(cache, blockhash, manualWinners, {proofs[0]}, {proofs[2]});
278 std::vector<CScript> moreManualWinners = manualWinners;
279 for (
const auto &proof : proofs) {
280 moreManualWinners.push_back(proof->getPayoutScript());
283 CheckWinners(cache, blockhash, moreManualWinners, {proofs[0]},
286 CheckWinners(cache, blockhash, moreManualWinners, {proofs[0]},
291 for (
const auto &proof : proofs) {
295 {proofs[0], proofs[2]}, {});
299 for (
const auto &proof : proofs) {
303 {proofs[0], proofs[2]});
308 CheckWinners(cache, blockhash, moreManualWinners, {proofs[0]},
315 {proofs[0], proofs[1]}, {proofs[2]});
320 CheckWinners(cache, blockhash, moreManualWinners, {proofs[0]},
321 {proofs[1], proofs[2]});
323 pindex = pindex->
pprev;
328 for (
const auto &proof : proofs) {
329 manualWinners.push_back(proof->getPayoutScript());
334 for (
int i = 0; i < 5; i++) {
336 {proofs[1], proofs[2]});
337 for (
int p = 0; p < 4; p++) {
340 pindex = pindex->
pprev;
348 std::vector<ProofRef> proofs;
350 for (
int i = 0; i < 10; i++) {
356 std::vector<BlockHash> blockhashes{pindex->
GetBlockHash()};
357 pindex = pindex->
pprev;
358 for (
int i = 0; i < 3; i++) {
360 blockhashes.push_back(blockhash);
361 for (
const auto &proof : proofs) {
362 cache.
add(pindex, proof, StakeContenderStatus::IN_WINNER_SET);
365 pindex = pindex->
pprev;
376 for (
int height : {0, 10, 50, 90, 97}) {
394 [](
const ProofId &proofid) { return false; });
427 [](
const ProofId &proofid) { return false; });
436 [](
const ProofId &proofid) { return false; });
454 for (
int height : {102, 200, 1000, 1000000}) {
456 for (
size_t i = 1; i < 3; i++) {
457 for (
const auto &proof : proofs) {
458 cache.
add(pindex, proof, m_rng.randbits(2));
463 std::vector<std::pair<ProofId, CScript>> winners;
466 pindex = pindex->
pprev;
482 StakeContenderStatus::IN_WINNER_SET);
483 for (
int height : {102, 200, 1000, 1000000}) {
485 CheckWinners(cache, blockhashes[0], {}, {}, {proofs[0]});
496 std::vector<ProofRef> proofs;
498 for (
size_t i = 0; i < 3; i++) {
505 std::vector<BlockHash> blockhashes;
506 for (
size_t i = 0; i < 3; i++) {
508 pindex = pindex->
pprev;
512 for (
size_t i = 0; i < 3; i++) {
514 blockhashes.push_back(blockhash);
515 cache.
add(pindex, proofs[i], StakeContenderStatus::IN_WINNER_SET);
517 pindex = pindex->
pprev;
522 for (
int height = 95; height <= 100; height++) {
527 CheckWinners(cache, blockhashes[3], {}, {}, {proofs[0]});
528 CheckWinners(cache, blockhashes[4], {}, {}, {proofs[1]});
529 CheckWinners(cache, blockhashes[5], {}, {}, {proofs[2]});
534 [](
const ProofId &proofid) { return true; });
538 for (
auto &proof : proofs) {
547 CheckWinners(cache, blockhashes[3], {}, {}, {proofs[0]});
548 CheckWinners(cache, blockhashes[4], {}, {}, {proofs[1]});
549 CheckWinners(cache, blockhashes[5], {}, {}, {proofs[2]});
556 for (
auto &proof : proofs) {
568 for (
auto &proof : proofs) {
583 [](
const ProofId &proofid) { return true; });
584 for (
auto &proof : proofs) {
597 return proofid != proofs[2]->getId();
599 for (
auto &proof : proofs) {