vrf-pbft 0.1.0

A Rust implementation of VRF-enhanced PBFT consensus protocol
Documentation
use crate::error::{Error, Result};
use crate::types::Stage;

/// Validate that a stage transition is legal in the PBFT protocol.
pub fn validate_transition(from: Stage, to: Stage) -> Result<()> {
    let valid = matches!(
        (from, to),
        (Stage::Idle, Stage::PrePrepare)
            | (Stage::PrePrepare, Stage::Prepare)
            | (Stage::Prepare, Stage::Commit)
            | (Stage::Commit, Stage::Reply)
            | (Stage::Reply, Stage::Done)
    );
    if valid {
        Ok(())
    } else {
        Err(Error::InvalidStage { from, to })
    }
}

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

    #[test]
    fn valid_forward_transitions() {
        assert!(validate_transition(Stage::Idle, Stage::PrePrepare).is_ok());
        assert!(validate_transition(Stage::PrePrepare, Stage::Prepare).is_ok());
        assert!(validate_transition(Stage::Prepare, Stage::Commit).is_ok());
        assert!(validate_transition(Stage::Commit, Stage::Reply).is_ok());
        assert!(validate_transition(Stage::Reply, Stage::Done).is_ok());
    }

    #[test]
    fn invalid_transitions() {
        assert!(validate_transition(Stage::Idle, Stage::Commit).is_err());
        assert!(validate_transition(Stage::Prepare, Stage::PrePrepare).is_err());
        assert!(validate_transition(Stage::Done, Stage::Idle).is_err());
    }
}