Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 19 additions & 3 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ thiserror = "1.0"
tokio = { version = "1.36", features = ["full"] }
tokio-stream = "0.1"
tracing = "0.1"
bit-set = "0.5.3"


# precompiles deps
Expand Down
49 changes: 48 additions & 1 deletion src/consensus/parlia/consensus.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
use super::{ParliaHeaderValidator, SnapshotProvider, BscConsensusValidator, Snapshot, TransactionSplitter, SplitTransactions, constants::{DIFF_INTURN, DIFF_NOTURN, EXTRA_VANITY, EXTRA_SEAL, VALIDATOR_NUMBER_SIZE, VALIDATOR_BYTES_LEN_AFTER_LUBAN, VALIDATOR_BYTES_LEN_BEFORE_LUBAN, TURN_LENGTH_SIZE}};
use super::{ParliaHeaderValidator, SnapshotProvider, BscConsensusValidator, Snapshot, TransactionSplitter, SplitTransactions, VoteAttestation, constants::{DIFF_INTURN, DIFF_NOTURN, EXTRA_VANITY, EXTRA_SEAL, VALIDATOR_NUMBER_SIZE, VALIDATOR_BYTES_LEN_AFTER_LUBAN, VALIDATOR_BYTES_LEN_BEFORE_LUBAN, TURN_LENGTH_SIZE}};
use super::error::ParliaConsensusError;
use alloy_rlp::Decodable;
use alloy_consensus::{Header, TxReceipt, Transaction, BlockHeader};
use reth_primitives_traits::{GotExpected, SignerRecoverable};
use crate::{
Expand Down Expand Up @@ -514,13 +515,18 @@ where
fn get_epoch_length(&self, header: &alloy_consensus::Header) -> u64 {
self.get_epoch_length(header)
}

fn get_validator_bytes_from_header(&self, header: &alloy_consensus::Header) -> Option<Vec<u8>> {
self.get_validator_bytes_from_header(header)
}

fn get_turn_length_from_header(&self, header: &alloy_consensus::Header) -> Result<Option<u8>, ParliaConsensusError> {
self.get_turn_length_from_header(header)
}

fn get_vote_attestation_from_header(&self, header: &alloy_consensus::Header) -> Result<Option<VoteAttestation>, ParliaConsensusError> {
self.get_vote_attestation_from_header(header)
}
}

impl<ChainSpec, P> HeaderValidator<Header> for ParliaConsensus<ChainSpec, P>
Expand Down Expand Up @@ -768,4 +774,45 @@ where
Ok(Some(turn_length))
}

pub fn get_vote_attestation_from_header(
&self,
header: &Header,
) -> Result<Option<VoteAttestation>, ParliaConsensusError> {
let extra_len = header.extra_data.len();

if extra_len <= EXTRA_VANITY + EXTRA_SEAL {
return Ok(None);
}

if !self.chain_spec.is_luban_active_at_block(header.number) {
return Ok(None);
}

let mut raw_attestation_data = if header.number % self.get_epoch_length(header) != 0 {
&header.extra_data[EXTRA_VANITY..extra_len - EXTRA_SEAL]
} else {
let validator_count =
header.extra_data[EXTRA_VANITY + VALIDATOR_NUMBER_SIZE - 1] as usize;
let mut start =
EXTRA_VANITY + VALIDATOR_NUMBER_SIZE + validator_count * VALIDATOR_BYTES_LEN_AFTER_LUBAN;
let is_bohr_active = self.chain_spec.is_bohr_active_at_timestamp(header.timestamp);
if is_bohr_active {
start += TURN_LENGTH_SIZE;
}
let end = extra_len - EXTRA_SEAL;
if end <= start {
return Ok(None)
}
&header.extra_data[start..end]
};
if raw_attestation_data.is_empty() {
return Ok(None);
}

Ok(Some(
Decodable::decode(&mut raw_attestation_data)
.map_err(|_| ParliaConsensusError::ABIDecodeInnerError)?,
))
}

}
4 changes: 3 additions & 1 deletion src/consensus/parlia/constants.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,6 @@ pub const TURN_LENGTH_SIZE: usize = 1;
/// Difficulty for in-turn block (when it's the proposer's turn)
pub const DIFF_INTURN: U256 = U256::from_limbs([2, 0, 0, 0]);
/// Difficulty for out-of-turn block (when it's not the proposer's turn)
pub const DIFF_NOTURN: U256 = U256::from_limbs([1, 0, 0, 0]);
pub const DIFF_NOTURN: U256 = U256::from_limbs([1, 0, 0, 0]);

pub const COLLECT_ADDITIONAL_VOTES_REWARD_RATIO: usize = 100;
1 change: 1 addition & 0 deletions src/consensus/parlia/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ pub trait ParliaConsensusObject:
fn get_epoch_length(&self, header: &alloy_consensus::Header) -> u64;
fn get_validator_bytes_from_header(&self, header: &alloy_consensus::Header) -> Option<Vec<u8>>;
fn get_turn_length_from_header(&self, header: &alloy_consensus::Header) -> Result<Option<u8>, ParliaConsensusError>;
fn get_vote_attestation_from_header(&self, header: &alloy_consensus::Header) -> Result<Option<VoteAttestation>, ParliaConsensusError>;
}

// Note: concrete implementation is provided for `ParliaConsensus` in `consensus.rs`
Expand Down
Loading