Skip to content

Commit 7add5db

Browse files
committed
Move sigenr index to SeedInfo struct
1 parent feeae37 commit 7add5db

File tree

9 files changed

+151
-181
lines changed

9 files changed

+151
-181
lines changed

core/src/consensus/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ pub use self::null_engine::NullEngine;
3232
pub use self::simple_poa::SimplePoA;
3333
pub use self::solo::Solo;
3434
pub use self::sortition::vrf_sortition::{Priority, PriorityInfo, VRFSortition};
35+
pub use self::sortition::PriorityMessage;
3536
pub use self::tendermint::{
3637
ConsensusMessage, Height, Step, Tendermint, TendermintParams, TimeGapParams, View, VoteOn, VoteStep,
3738
};

core/src/consensus/sortition/mod.rs

+19-2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ mod draw;
2121
pub mod seed;
2222
pub mod vrf_sortition;
2323

24+
use std::cmp::Ordering;
2425
use std::sync::Arc;
2526

2627
use ckey::Public;
@@ -36,11 +37,27 @@ pub struct PriorityMessage {
3637
pub priority: PriorityInfo,
3738
}
3839

40+
impl Ord for PriorityMessage {
41+
fn cmp(&self, other: &Self) -> Ordering {
42+
self.priority().cmp(&other.priority())
43+
}
44+
}
45+
46+
impl PartialOrd for PriorityMessage {
47+
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
48+
Some(self.cmp(other))
49+
}
50+
}
51+
3952
impl PriorityMessage {
4053
pub fn seed(&self) -> &VRFSeed {
4154
self.seed.seed()
4255
}
4356

57+
pub fn seed_signer_idx(&self) -> usize {
58+
self.seed.signer_idx()
59+
}
60+
4461
pub fn verify_seed(
4562
&self,
4663
height: Height,
@@ -109,7 +126,7 @@ mod priority_message_tests {
109126
sortition_scheme.create_highest_priority_info(seed.into(), &signer, voting_power).unwrap().unwrap();
110127

111128
let priority_message = PriorityMessage {
112-
seed: SeedInfo::from_seed_and_proof(seed.to_vec(), vec![]),
129+
seed: SeedInfo::from_fields(0, seed.to_vec(), vec![]),
113130
priority: priority_info,
114131
};
115132
assert!(priority_message.verify_priority(&pub_key, voting_power, &sortition_scheme).unwrap());
@@ -133,7 +150,7 @@ mod priority_message_tests {
133150
sortition_scheme.create_highest_priority_info(seed.into(), &signer, voting_power).unwrap().unwrap();
134151

135152
let priority_message = PriorityMessage {
136-
seed: SeedInfo::from_seed_and_proof(seed.to_vec(), vec![]),
153+
seed: SeedInfo::from_fields(0, seed.to_vec(), vec![]),
137154
priority: priority_info,
138155
};
139156
rlp_encode_and_decode_test!(priority_message);

core/src/consensus/sortition/seed.rs

+7-1
Original file line numberDiff line numberDiff line change
@@ -75,18 +75,24 @@ impl VRFSeed {
7575

7676
#[derive(Debug, Eq, PartialEq, Clone, RlpEncodable, RlpDecodable)]
7777
pub struct SeedInfo {
78+
seed_signer_idx: usize,
7879
seed: VRFSeed,
7980
proof: Vec<u8>,
8081
}
8182

8283
impl SeedInfo {
83-
pub fn from_seed_and_proof(seed: Vec<u8>, proof: Vec<u8>) -> Self {
84+
pub fn from_fields(seed_signer_idx: usize, seed: Vec<u8>, proof: Vec<u8>) -> Self {
8485
Self {
86+
seed_signer_idx,
8587
seed: H256::from_slice(&seed).into(),
8688
proof,
8789
}
8890
}
8991

92+
pub fn signer_idx(&self) -> usize {
93+
self.seed_signer_idx
94+
}
95+
9096
pub fn seed(&self) -> &VRFSeed {
9197
&self.seed
9298
}

core/src/consensus/tendermint/message.rs

+5-6
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ use snap;
2525

2626
pub use super::super::sortition::PriorityMessage;
2727
use super::super::BitSet;
28-
use super::sortition_info_collector::SortitionInfo;
2928
use super::{Height, Step, View};
3029
use crate::consensus::Priority;
3130

@@ -117,7 +116,7 @@ pub enum TendermintMessage {
117116
ConsensusMessage(Vec<Bytes>),
118117
ProposalBlock {
119118
signature: SchnorrSignature,
120-
sortition_info: SortitionInfo,
119+
priority_message: PriorityMessage,
121120
view: View,
122121
message: Bytes,
123122
},
@@ -154,14 +153,14 @@ impl Encodable for TendermintMessage {
154153
}
155154
TendermintMessage::ProposalBlock {
156155
signature,
157-
sortition_info,
156+
priority_message,
158157
view,
159158
message,
160159
} => {
161160
s.begin_list(5);
162161
s.append(&MESSAGE_ID_PROPOSAL_BLOCK);
163162
s.append(signature);
164-
s.append(sortition_info);
163+
s.append(priority_message);
165164
s.append(view);
166165
// FIXME: Consider compressing
167166

@@ -246,7 +245,7 @@ impl Decodable for TendermintMessage {
246245
})
247246
}
248247
let signature = rlp.at(1)?;
249-
let sortition_info = rlp.at(2)?;
248+
let priority_message = rlp.at(2)?;
250249
let view = rlp.at(3)?;
251250
let compressed_message: Vec<u8> = rlp.val_at(4)?;
252251
let uncompressed_message = {
@@ -260,7 +259,7 @@ impl Decodable for TendermintMessage {
260259

261260
TendermintMessage::ProposalBlock {
262261
signature: signature.as_val()?,
263-
sortition_info: sortition_info.as_val()?,
262+
priority_message: priority_message.as_val()?,
264263
view: view.as_val()?,
265264
message: uncompressed_message,
266265
}

core/src/consensus/tendermint/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ mod tests {
175175
}
176176

177177
fn create_dummy_seed_info() -> SeedInfo {
178-
SeedInfo::from_seed_and_proof(vec![0x0], vec![0x22])
178+
SeedInfo::from_fields(0, vec![0x0], vec![0x22])
179179
}
180180

181181
#[test]

core/src/consensus/tendermint/network.rs

+7-8
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ use rlp::{Encodable, Rlp};
3333
use super::super::BitSet;
3434
use super::message::*;
3535
use super::params::TimeoutParams;
36-
use super::sortition_info_collector::SortitionInfo;
3736
use super::types::{PeerState, Step, View};
3837
use super::worker;
3938
use crate::consensus::{EngineError, Priority};
@@ -141,14 +140,14 @@ impl TendermintExtension {
141140
fn broadcast_proposal_block(
142141
&self,
143142
signature: SchnorrSignature,
144-
sortition_info: SortitionInfo,
143+
priority_message: PriorityMessage,
145144
view: View,
146145
message: Bytes,
147146
) {
148147
let message = Arc::new(
149148
TendermintMessage::ProposalBlock {
150149
signature,
151-
sortition_info,
150+
priority_message,
152151
message,
153152
view,
154153
}
@@ -280,15 +279,15 @@ impl NetworkExtension<Event> for TendermintExtension {
280279
}
281280
Ok(TendermintMessage::ProposalBlock {
282281
signature,
283-
sortition_info,
282+
priority_message,
284283
view,
285284
message,
286285
}) => {
287286
let (result, receiver) = crossbeam::bounded(1);
288287
self.inner
289288
.send(worker::Event::ProposalBlock {
290289
signature,
291-
sortition_info: sortition_info.clone(),
290+
priority_message: priority_message.clone(),
292291
view,
293292
message: message.clone(),
294293
result,
@@ -448,11 +447,11 @@ impl NetworkExtension<Event> for TendermintExtension {
448447
} => self.set_timer_step(step, view, expired_token_nonce),
449448
Event::BroadcastProposalBlock {
450449
signature,
451-
sortition_info,
450+
priority_message,
452451
view,
453452
message,
454453
} => {
455-
self.broadcast_proposal_block(signature, sortition_info, view, message);
454+
self.broadcast_proposal_block(signature, priority_message, view, message);
456455
}
457456
}
458457
}
@@ -483,7 +482,7 @@ pub enum Event {
483482
},
484483
BroadcastProposalBlock {
485484
signature: SchnorrSignature,
486-
sortition_info: SortitionInfo,
485+
priority_message: PriorityMessage,
487486
view: View,
488487
message: Bytes,
489488
},

core/src/consensus/tendermint/sortition_info_collector.rs

+25-72
Original file line numberDiff line numberDiff line change
@@ -14,76 +14,30 @@
1414
// You should have received a copy of the GNU Affero General Public License
1515
// along with this program. If not, see <https://www.gnu.org/licenses/>.
1616

17-
use std::cmp::Ordering;
1817
use std::collections::{BTreeMap, BinaryHeap};
1918

20-
use rug::{integer::Order, Integer};
21-
2219
use super::{PriorityMessage, SortitionRound};
23-
use crate::consensus::Priority;
2420

2521
/// Storing Priorities
2622
#[derive(Default)]
27-
pub struct SortitionInfoCollector {
28-
priorities: BTreeMap<SortitionRound, BinaryHeap<SortitionInfo>>,
29-
}
30-
31-
#[derive(Debug, Eq, Clone, PartialEq, RlpEncodable, RlpDecodable)]
32-
pub struct SortitionInfo {
33-
message: PriorityMessage,
34-
signer_idx: usize,
35-
}
36-
37-
impl Ord for SortitionInfo {
38-
fn cmp(&self, other: &Self) -> Ordering {
39-
let self_as_int = Integer::from_digits(&self.message.priority(), Order::MsfBe);
40-
let other_as_int = Integer::from_digits(&other.message.priority(), Order::MsfBe);
41-
42-
self_as_int.cmp(&other_as_int)
43-
}
44-
}
45-
46-
impl PartialOrd for SortitionInfo {
47-
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
48-
Some(self.cmp(other))
49-
}
50-
}
51-
52-
impl SortitionInfo {
53-
pub fn from_message_and_idx(message: &PriorityMessage, signer_idx: usize) -> Self {
54-
Self {
55-
message: message.clone(),
56-
signer_idx,
57-
}
58-
}
59-
60-
pub fn signer_idx(&self) -> usize {
61-
self.signer_idx
62-
}
63-
64-
pub fn message(&self) -> &PriorityMessage {
65-
&self.message
66-
}
67-
68-
pub fn priority(&self) -> Priority {
69-
self.message.priority()
70-
}
23+
pub struct PriorityMessageCollector {
24+
messages: BTreeMap<SortitionRound, BinaryHeap<PriorityMessage>>,
7125
}
7226

73-
impl SortitionInfoCollector {
74-
pub fn insert(&mut self, info: SortitionInfo, round: SortitionRound) {
75-
self.priorities.entry(round).or_insert_with(Default::default).push(info);
27+
impl PriorityMessageCollector {
28+
pub fn insert(&mut self, info: PriorityMessage, round: SortitionRound) {
29+
self.messages.entry(round).or_insert_with(Default::default).push(info);
7630
}
7731

78-
pub fn get_highest_priority(&self, round: &SortitionRound) -> Option<SortitionInfo> {
79-
self.priorities.get(round).and_then(|heap| heap.peek()).cloned()
32+
pub fn get_highest_priority_message(&self, round: &SortitionRound) -> Option<PriorityMessage> {
33+
self.messages.get(round).and_then(|heap| heap.peek()).cloned()
8034
}
8135

8236
/// Throw away priorities older than the given round.
8337
pub fn throw_away_old(&mut self, round: &SortitionRound) {
84-
let new_collector = self.priorities.split_off(round);
38+
let new_collector = self.messages.split_off(round);
8539
assert!(!new_collector.is_empty());
86-
self.priorities = new_collector;
40+
self.messages = new_collector;
8741
}
8842
}
8943

@@ -92,53 +46,52 @@ mod sortition_info_collector_tests {
9246
use super::*;
9347
use crate::consensus::{Priority, PriorityInfo, SeedInfo};
9448

95-
fn create_sortition_info_with_priority_and_signer_idx(priority: Priority, signer_idx: usize) -> SortitionInfo {
96-
let message = PriorityMessage {
97-
seed: SeedInfo::from_seed_and_proof(vec![0x0], vec![0x22]),
49+
fn create_message_with_priority_and_signer_idx(priority: Priority, signer_idx: usize) -> PriorityMessage {
50+
PriorityMessage {
51+
seed: SeedInfo::from_fields(signer_idx, vec![0x0], vec![0x22]),
9852
priority: PriorityInfo::create_from_members(priority, 0, vec![], vec![]),
99-
};
100-
SortitionInfo::from_message_and_idx(&message, signer_idx)
53+
}
10154
}
10255

10356
#[test]
10457
fn compare_sortition_info() {
105-
let greater_priority_info_summary = create_sortition_info_with_priority_and_signer_idx(0xffu64.into(), 0);
106-
let less_priority_info_summary = create_sortition_info_with_priority_and_signer_idx(0x7fu64.into(), 1);
58+
let greater_priority_info_summary = create_message_with_priority_and_signer_idx(0xffu64.into(), 0);
59+
let less_priority_info_summary = create_message_with_priority_and_signer_idx(0x7fu64.into(), 1);
10760
assert!(greater_priority_info_summary > less_priority_info_summary);
10861
}
10962

11063
#[test]
11164
fn compare_sortition_info2() {
112-
let greater_priority_info_summary = create_sortition_info_with_priority_and_signer_idx(0x55555544u64.into(), 0);
113-
let less_priority_info_summary = create_sortition_info_with_priority_and_signer_idx(0x55555523u64.into(), 22);
65+
let greater_priority_info_summary = create_message_with_priority_and_signer_idx(0x55555544u64.into(), 0);
66+
let less_priority_info_summary = create_message_with_priority_and_signer_idx(0x55555523u64.into(), 22);
11467
assert!(greater_priority_info_summary > less_priority_info_summary);
11568
}
11669

117-
fn add_fixed_priorities(collector: &mut SortitionInfoCollector, round: SortitionRound) {
70+
fn add_fixed_priorities(collector: &mut PriorityMessageCollector, round: SortitionRound) {
11871
[0x55u64, 0xffu64, 0x44u64, 0xeeu64]
11972
.into_iter()
12073
.zip([1, 2, 3, 4].iter())
121-
.map(|(priority, idx)| create_sortition_info_with_priority_and_signer_idx((*priority).into(), *idx))
74+
.map(|(priority, idx)| create_message_with_priority_and_signer_idx((*priority).into(), *idx))
12275
.for_each(|sortition_info| collector.insert(sortition_info, round));
12376
}
12477

12578
#[test]
12679
fn insert_and_get_highest() {
127-
let mut collector: SortitionInfoCollector = Default::default();
80+
let mut collector: PriorityMessageCollector = Default::default();
12881
let round = SortitionRound {
12982
height: 1,
13083
view: 0,
13184
};
13285
add_fixed_priorities(&mut collector, round);
13386
assert_eq!(
134-
collector.get_highest_priority(&round).unwrap(),
135-
create_sortition_info_with_priority_and_signer_idx(0xffu64.into(), 2)
87+
collector.get_highest_priority_message(&round).unwrap(),
88+
create_message_with_priority_and_signer_idx(0xffu64.into(), 2)
13689
);
13790
}
13891

13992
#[test]
14093
fn throw_away_old() {
141-
let mut collector: SortitionInfoCollector = Default::default();
94+
let mut collector: PriorityMessageCollector = Default::default();
14295
let rounds = [(1, 0), (3, 1), (5, 2), (100, 7), (0, 8)].into_iter().map(|(height, view)| SortitionRound {
14396
height: *height,
14497
view: *view,
@@ -152,9 +105,9 @@ mod sortition_info_collector_tests {
152105
rounds
153106
.clone()
154107
.filter(|round| round >= &target_round)
155-
.for_each(|round_gte| assert!(collector.get_highest_priority(&round_gte).is_some()));
108+
.for_each(|round_gte| assert!(collector.get_highest_priority_message(&round_gte).is_some()));
156109
rounds
157110
.filter(|round| round < &target_round)
158-
.for_each(|round_lt| assert!(collector.get_highest_priority(&round_lt).is_none()))
111+
.for_each(|round_lt| assert!(collector.get_highest_priority_message(&round_lt).is_none()))
159112
}
160113
}

0 commit comments

Comments
 (0)