Page MenuHomePhabricator

D17607.id52684.diff
No OneTemporary

D17607.id52684.diff

diff --git a/src/avalanche/processor.h b/src/avalanche/processor.h
--- a/src/avalanche/processor.h
+++ b/src/avalanche/processor.h
@@ -346,12 +346,12 @@
}
bool isQuorumEstablished() LOCKS_EXCLUDED(cs_main)
EXCLUSIVE_LOCKS_REQUIRED(!cs_peerManager, !cs_stakingRewards,
- !cs_stakeContenderCache);
+ !cs_stakeContenderCache, !cs_finalizedItems);
bool canShareLocalProof();
bool computeStakingReward(const CBlockIndex *pindex)
EXCLUSIVE_LOCKS_REQUIRED(!cs_peerManager, !cs_stakingRewards,
- !cs_stakeContenderCache);
+ !cs_stakeContenderCache, !cs_finalizedItems);
bool eraseStakingRewardWinner(const BlockHash &prevBlockHash)
EXCLUSIVE_LOCKS_REQUIRED(!cs_stakingRewards);
void cleanupStakingRewards(const int minHeight)
@@ -396,7 +396,8 @@
/** Promote stake contender cache entries to the latest chain tip */
void promoteStakeContendersToTip()
EXCLUSIVE_LOCKS_REQUIRED(!cs_stakeContenderCache, !cs_stakingRewards,
- !cs_peerManager, !cs_finalizationTip);
+ !cs_peerManager, !cs_finalizationTip,
+ !cs_finalizedItems);
private:
void updatedBlockTip()
@@ -425,8 +426,6 @@
const CBlockIndex *pindex,
std::vector<StakeContenderId> &pollableContenders)
EXCLUSIVE_LOCKS_REQUIRED(!cs_stakeContenderCache, !cs_stakingRewards);
- bool setContenderStatusForLocalWinners(const CBlockIndex *pindex)
- EXCLUSIVE_LOCKS_REQUIRED(!cs_stakeContenderCache, !cs_stakingRewards);
/**
* We don't need many blocks but a low false positive rate.
diff --git a/src/avalanche/processor.cpp b/src/avalanche/processor.cpp
--- a/src/avalanche/processor.cpp
+++ b/src/avalanche/processor.cpp
@@ -922,7 +922,12 @@
if (m_stakingPreConsensus) {
// If pindex has not been promoted in the contender cache yet, this will
// be a no-op.
- setContenderStatusForLocalWinners(pindex);
+ std::vector<StakeContenderId> pollableContenders;
+ if (setContenderStatusForLocalWinners(pindex, pollableContenders)) {
+ for (const StakeContenderId &contender : pollableContenders) {
+ addToReconcile(contender);
+ }
+ }
}
return rewardsInserted;
@@ -1069,9 +1074,12 @@
// If staking rewards have not been computed yet, we will try again when
// they have been.
- setContenderStatusForLocalWinners(activeTip);
-
- // TODO reconcile remoteProofs contenders
+ std::vector<StakeContenderId> pollableContenders;
+ if (setContenderStatusForLocalWinners(activeTip, pollableContenders)) {
+ for (const StakeContenderId &contender : pollableContenders) {
+ addToReconcile(contender);
+ }
+ }
}
bool Processor::setContenderStatusForLocalWinners(
@@ -1107,11 +1115,6 @@
return false;
}
-bool Processor::setContenderStatusForLocalWinners(const CBlockIndex *pindex) {
- std::vector<StakeContenderId> dummy;
- return setContenderStatusForLocalWinners(pindex, dummy);
-}
-
void Processor::updatedBlockTip() {
const bool registerLocalProof = canShareLocalProof();
auto registerProofs = [&]() {
diff --git a/test/functional/abc_p2p_avalanche_contender_voting.py b/test/functional/abc_p2p_avalanche_contender_voting.py
--- a/test/functional/abc_p2p_avalanche_contender_voting.py
+++ b/test/functional/abc_p2p_avalanche_contender_voting.py
@@ -13,6 +13,7 @@
hash256,
ser_uint256,
)
+from test_framework.p2p import p2p_lock
from test_framework.test_framework import BitcoinTestFramework
from test_framework.util import assert_equal, uint256_hex
@@ -166,13 +167,46 @@
contender_id = make_contender_id(tip, manual_winner.proofid)
poll_node.send_poll([contender_id], inv_type=MSG_AVA_STAKE_CONTENDER)
expectedVote = AvalancheContenderVoteError.INVALID
- if node.getstakingreward(tip)[0]["proofid"] == uint256_hex(
- manual_winner.proofid
- ):
+ local_winner_proofid = int(node.getstakingreward(tip)[0]["proofid"], 16)
+ if local_winner_proofid == manual_winner.proofid:
# If manual_winner happens to be selected as the winner, it will be accepted
expectedVote = AvalancheContenderVoteError.ACCEPTED
assert_response([AvalancheVote(expectedVote, contender_id)])
+ # Answer polls until the chain tip (and contenders) start polling
+ can_find_inv_in_poll(quorum, int(tip, 16))
+
+ # Pop a poll from any peer
+ def wait_for_poll():
+ self.wait_until(lambda: any(len(peer.avapolls) > 0 for peer in quorum))
+ with p2p_lock:
+ for peer in quorum:
+ if len(peer.avapolls) > 0:
+ return peer.avapolls.pop(0)
+ return None
+
+ poll = wait_for_poll()
+ assert poll is not None
+
+ # Count contenders being polled for
+ count = 0
+ found_local_winner = False
+ local_winner_contender_id = make_contender_id(tip, local_winner_proofid)
+ quorum_contenders = [
+ make_contender_id(tip, peer.proof.proofid) for peer in quorum
+ ]
+ for inv in poll.invs:
+ if inv.hash in quorum_contenders:
+ count += 1
+ if local_winner_contender_id == inv.hash:
+ found_local_winner = True
+
+ # Check that the local winner was polled
+ assert found_local_winner
+
+ # Check that the max number of contenders were polled
+ assert_equal(count, 12)
+
# Manually set this contender as a winner
node.setstakingreward(tip, manual_winner.payout_script.hex())
poll_node.send_poll([contender_id], inv_type=MSG_AVA_STAKE_CONTENDER)

File Metadata

Mime Type
text/plain
Expires
Sat, Mar 1, 10:51 (11 h, 26 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
5187407
Default Alt Text
D17607.id52684.diff (5 KB)

Event Timeline