Skip to content

Commit

Permalink
Move common code to common crate
Browse files Browse the repository at this point in the history
  • Loading branch information
romac committed Oct 19, 2023
1 parent 383d5de commit 0a16726
Show file tree
Hide file tree
Showing 6 changed files with 158 additions and 116 deletions.
Empty file removed Code/.gitkeep
Empty file.
5 changes: 4 additions & 1 deletion Code/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
[workspace]
resolver = "2"

members = []
members = [
"common",
"round-sm"
]
8 changes: 8 additions & 0 deletions Code/common/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
[package]
name = "common"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
143 changes: 143 additions & 0 deletions Code/common/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
/// A blockchain height
#[derive(Copy, Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord)]
pub struct Height(u64);

impl Height {
pub fn as_u64(&self) -> u64 {
self.0
}
}

/// A round number, ie. a natural number
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub enum Round {
/// No round
None,

/// Some round
Some(i64),
}

impl Round {
pub fn new(round: i64) -> Self {
if round < 0 {
Self::None
} else {
Self::Some(round)
}
}

pub fn as_i64(&self) -> i64 {
match self {
Round::None => -1,
Round::Some(r) => *r,
}
}

pub fn is_defined(&self) -> bool {
matches!(self, Round::Some(_))
}

pub fn increment(&self) -> Round {
match self {
Round::None => Round::new(0),
Round::Some(r) => Round::new(r + 1),
}
}
}

impl PartialOrd for Round {
fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
self.as_i64().partial_cmp(&other.as_i64())
}
}

/// The value to decide on
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct Value(u64);

impl Value {
pub fn as_u64(&self) -> u64 {
self.0
}
}

/// A proposal for a value in a round
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Proposal {
pub round: Round,
pub value: Value,
pub polka_round: Round,
}

#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub enum VoteType {
Prevote,
Precommit,
}

/// A vote for a value in a round
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Vote {
pub typ: VoteType,
pub round: Round,
pub value: Option<Value>,
}

impl Vote {
pub fn new_prevote(round: Round, value: Option<Value>) -> Self {
Self {
typ: VoteType::Prevote,
round,
value,
}
}

pub fn new_precommit(round: Round, value: Option<Value>) -> Self {
Self {
typ: VoteType::Precommit,
round,
value,
}
}
}

#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub enum TimeoutStep {
Propose,
Prevote,
Precommit,
}

#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Timeout {
pub round: Round,
pub step: TimeoutStep,
}

#[cfg(test)]
mod tests {
use super::*;

#[test]
fn test_round() {
// Test Round::new()
assert_eq!(Round::new(-42), Round::None);
assert_eq!(Round::new(-1), Round::None);
assert_eq!(Round::new(0), Round::Some(0));
assert_eq!(Round::new(1), Round::Some(1));
assert_eq!(Round::new(2), Round::Some(2));

// Test Round::as_i64()
assert_eq!(Round::None.as_i64(), -1);
assert_eq!(Round::Some(0).as_i64(), 0);
assert_eq!(Round::Some(1).as_i64(), 1);
assert_eq!(Round::Some(2).as_i64(), 2);

// Test Round::is_defined()
assert!(!Round::None.is_defined());
assert!(Round::Some(0).is_defined());
assert!(Round::Some(1).is_defined());
assert!(Round::Some(2).is_defined());
}
}
1 change: 1 addition & 0 deletions Code/round-sm/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,4 @@ edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
common = { version = "0.1.0", path = "../common" }
117 changes: 2 additions & 115 deletions Code/round-sm/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,119 +1,6 @@
pub use common::*;

pub mod events;
pub mod message;
pub mod state;
pub mod state_machine;

/// A blockchain height
#[derive(Copy, Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord)]
pub struct Height(u64);

impl Height {
pub fn as_u64(&self) -> u64 {
self.0
}
}

/// A round number, ie. a natural number
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub enum Round {
/// No round
None,

/// Some round
Some(i64),
}

impl Round {
pub fn new(round: i64) -> Self {
assert!(round >= 0);

Round::Some(round)
}

pub fn as_i64(&self) -> i64 {
match self {
Round::None => -1,
Round::Some(r) => *r,
}
}

pub fn is_defined(&self) -> bool {
matches!(self, Round::Some(_))
}

pub fn increment(&self) -> Round {
match self {
Round::None => Round::new(0),
Round::Some(r) => Round::new(r + 1),
}
}
}

impl PartialOrd for Round {
fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
self.as_i64().partial_cmp(&other.as_i64())
}
}

/// The value to decide on
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct Value(u64);

impl Value {
pub fn as_u64(&self) -> u64 {
self.0
}
}

/// A proposal for a value in a round
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Proposal {
pub round: Round,
pub value: Value,
pub polka_round: Round,
}

#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub enum VoteType {
Prevote,
Precommit,
}

/// A vote for a value in a round
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Vote {
pub typ: VoteType,
pub round: Round,
pub value: Option<Value>,
}

impl Vote {
pub fn new_prevote(round: Round, value: Option<Value>) -> Self {
Self {
typ: VoteType::Prevote,
round,
value,
}
}

pub fn new_precommit(round: Round, value: Option<Value>) -> Self {
Self {
typ: VoteType::Precommit,
round,
value,
}
}
}

#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub enum TimeoutStep {
Propose,
Prevote,
Precommit,
}

#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Timeout {
pub round: Round,
pub step: TimeoutStep,
}

0 comments on commit 0a16726

Please sign in to comment.