19 std::set<BlockHash> hashesToErase;
21 for (
auto it = mwHeightView.begin();
22 it != mwHeightView.lower_bound(minHeight); it++) {
23 hashesToErase.insert(it->prevblockhash);
26 auto &cHeightView =
contenders.get<by_blockheight>();
27 for (
auto it = cHeightView.begin();
28 it != cHeightView.lower_bound(minHeight); it++) {
29 hashesToErase.insert(it->prevblockhash);
32 for (
const auto &blockhash : hashesToErase) {
34 auto [mwHashBegin, mwHashEnd] = mwHashView.equal_range(blockhash);
35 mwHashView.erase(mwHashBegin, mwHashEnd);
37 auto &cHashView =
contenders.get<by_prevblockhash>();
38 auto [cHashBegin, cHashEnd] = cHashView.equal_range(blockhash);
39 cHashView.erase(cHashBegin, cHashEnd);
47 status, proof->getPayoutScript(), proof->getScore())
59 const int height = activeTip->
nHeight;
62 const ProofId &proofid = contender.proofid;
67 contender.payoutScriptPubkey, contender.score);
73 const CBlockIndex *pindex,
const std::vector<CScript> &payoutScripts) {
76 auto it = view.find(prevblockhash);
77 if (it == view.end()) {
79 .emplace(prevblockhash, pindex->
nHeight, payoutScripts)
87 auto &view =
contenders.get<by_stakecontenderid>();
88 auto it = view.find(contenderId);
89 if (it == view.end()) {
99 auto &view =
contenders.get<by_stakecontenderid>();
100 auto it = view.find(contenderId);
101 if (it == view.end()) {
112 auto &view =
contenders.get<by_stakecontenderid>();
113 auto it = view.find(contenderId);
114 if (it == view.end()) {
124 auto &view =
contenders.get<by_stakecontenderid>();
125 auto it = view.find(contenderId);
126 if (it == view.end()) {
138 auto &view =
contenders.get<by_stakecontenderid>();
139 auto it = view.find(contenderId);
140 if (it == view.end()) {
144 prevblockhashout = it->prevblockhash;
147 if (it->isAccepted()) {
152 auto &manualWinnersView =
manualWinners.get<by_prevblockhash>();
153 auto manualWinnerIt = manualWinnersView.find(it->prevblockhash);
155 for (
auto &payoutScript : manualWinnerIt->payoutScripts) {
156 if (payoutScript == it->payoutScriptPubkey) {
167 const BlockHash &prevblockhash,
size_t maxPollable,
168 std::vector<StakeContenderId> &pollableContenders)
const {
169 std::vector<const StakeContenderCacheEntry *> rankedContenders;
170 auto &view =
contenders.get<by_prevblockhash>();
171 auto [begin, end] = view.equal_range(prevblockhash);
172 for (
auto it = begin; it != end; it++) {
173 rankedContenders.push_back(&(*it));
177 std::sort(rankedContenders.begin(), rankedContenders.end(),
180 if (left->isAccepted() != right->isAccepted()) {
182 return left->isAccepted();
192 left->
proofid, rightContenderId,
198 size_t numPollable = std::min(rankedContenders.size(), maxPollable);
199 std::sort(rankedContenders.begin(), rankedContenders.begin() + numPollable,
202 double leftRank = left->computeRewardRank();
203 double rightRank = right->computeRewardRank();
204 const StakeContenderId &leftContenderId =
205 left->getStakeContenderId();
206 const StakeContenderId &rightContenderId =
207 right->getStakeContenderId();
208 return RewardRankComparator()(leftContenderId, leftRank,
209 left->proofid, rightContenderId,
210 rightRank, right->proofid);
214 pollableContenders.clear();
215 pollableContenders.reserve(numPollable);
216 for (
size_t i = 0; i < numPollable; i++) {
217 pollableContenders.push_back(
218 rankedContenders[i]->getStakeContenderId());
221 return pollableContenders.size();
224bool StakeContenderCache::getWinners(
const BlockHash &prevblockhash,
225 std::vector<CScript> &payouts)
const {
227 std::vector<const StakeContenderCacheEntry *> rankedWinners;
228 auto &view = contenders.get<by_prevblockhash>();
229 auto [begin, end] = view.equal_range(prevblockhash);
230 for (
auto it = begin; it != end; it++) {
231 if (it->isInWinnerSet()) {
232 rankedWinners.push_back(&(*it));
236 std::sort(rankedWinners.begin(), rankedWinners.end(),
239 return left->computeRewardRank() < right->computeRewardRank();
245 auto &manualWinnersView = manualWinners.get<by_prevblockhash>();
246 auto manualWinnerIt = manualWinnersView.find(prevblockhash);
247 if (manualWinnerIt != manualWinners.end()) {
248 payouts.reserve(manualWinnerIt->payoutScripts.size() +
249 rankedWinners.size());
251 payouts.insert(payouts.begin(), manualWinnerIt->payoutScripts.begin(),
252 manualWinnerIt->payoutScripts.end());
254 payouts.reserve(rankedWinners.size());
258 for (
const auto &rankedWinner : rankedWinners) {
259 payouts.push_back(rankedWinner->payoutScriptPubkey);
262 return payouts.size() > 0;
The block chain is a tree shaped structure starting with the genesis block at the root,...
BlockHash GetBlockHash() const
int nHeight
height of the entry in the chain. The genesis block has height 0
bool isDangling(const ProofId &proofid) const
bool isRemoteProof(const ProofId &proofid) const
bool isBoundToPeer(const ProofId &proofid) const
bool invalidate(const StakeContenderId &contenderId)
ManualWinnersSet manualWinners
bool accept(const StakeContenderId &contenderId)
Helpers to set avalanche state of a contender.
void cleanup(const int requestedMinHeight)
size_t getPollableContenders(const BlockHash &prevblockhash, size_t maxPollable, std::vector< StakeContenderId > &pollableContenders) const
Get the best ranking contenders, accepted contenders ranking first.
bool reject(const StakeContenderId &contenderId)
bool setWinners(const CBlockIndex *pindex, const std::vector< CScript > &payoutScripts)
Set proof(s) that should be treated as winners (already finalized).
bool add(const CBlockIndex *pindex, const ProofRef &proof, uint8_t status=StakeContenderStatus::UNKNOWN)
Add a proof to consider in staking rewards pre-consensus.
int getVoteStatus(const StakeContenderId &contenderId, BlockHash &prevblockhashout) const
Get contender acceptance state for avalanche voting.
bool finalize(const StakeContenderId &contenderId)
void promoteToBlock(const CBlockIndex *activeTip, PeerManager &pm)
Promote cache entries to a the active chain tip.
A BlockHash is a unqiue identifier for a block.
double computeRewardRank() const
StakeContenderId getStakeContenderId() const
StakeContenderIds are unique for each block to ensure that the peer polling for their acceptance has ...