Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F13115329
D17607.id52684.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
5 KB
Subscribers
None
D17607.id52684.diff
View Options
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
Details
Attached
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)
Attached To
D17607: [avalanche] Poll for stake contenders
Event Timeline
Log In to Comment