Skip to content
This repository was archived by the owner on Nov 15, 2023. It is now read-only.
Draft
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
79 commits
Select commit Hold shift + click to select a range
387c6ed
Sassafras consensus - Prototype 1 (#11678)
davxy Jul 21, 2022
b8cea2f
Sassafras consensus - Prototype 2.1 (#11889)
davxy Aug 23, 2022
098af4c
Merge branch 'master' into davxy-sassafras-protocol
davxy Aug 23, 2022
a7fa940
Fix obsolete dependencies
davxy Aug 23, 2022
38035f6
Merge branch 'master' into davxy-sassafras-protocol
davxy Sep 2, 2022
b0a218c
Fix slot to epoch index conversion
davxy Sep 2, 2022
2d55cc0
Further refactory
davxy Sep 2, 2022
fcf1ffe
Merge branch 'master' into davxy-sassafras-protocol
davxy Sep 24, 2022
ac2fc9c
Fix after merge
davxy Sep 24, 2022
8f43727
Pick some runtime cleanup from Prototype 2.2
davxy Sep 24, 2022
2b51690
Sassafras Prototype 2.2 (#12314)
davxy Oct 29, 2022
e690654
Merge branch 'master' into davxy-sassafras-protocol
davxy Oct 29, 2022
fa72e51
Fixes after master merge
davxy Oct 29, 2022
7d8f5c3
Fixes in the sassafras demo after master merge
davxy Oct 29, 2022
1be8a84
TEMPORARY
davxy Nov 3, 2022
0fc4a98
Refactory of block-import method
davxy Nov 15, 2022
6389416
Merge branch 'master' into davxy-sassafras-protocol
davxy Nov 15, 2022
a02143c
Fixes after master merge
davxy Nov 15, 2022
924c51a
Bump Sassafras crates versions to 0.3.0
davxy Nov 15, 2022
5b21f45
Sassafras Iteration 3.1 (#12713)
davxy Jan 24, 2023
086630c
Introduce TicketEnvelope
davxy Jan 24, 2023
baf8736
Merge branch 'master' into davxy-sassafras-protocol
davxy Jan 24, 2023
a358c9f
Fix after master merge
davxy Jan 24, 2023
60410fb
Pick warp sync fix from babe
davxy Jan 24, 2023
95ba593
Fix sassafras node binary after master merge
davxy Jan 24, 2023
dc29ddf
Merge branch 'master' into davxy-sassafras-protocol
davxy Feb 22, 2023
7f224ff
Fix after master merge
davxy Feb 22, 2023
7c80f85
Merge branch 'master' into davxy-sassafras-protocol
davxy Mar 27, 2023
be6974b
Fix after master merge
davxy Mar 27, 2023
356f3d0
Small refactory
davxy Mar 27, 2023
8d9b228
Define log target
davxy Mar 28, 2023
913e652
Merge branch 'master' into davxy-sassafras-protocol
davxy May 1, 2023
fff4224
Introduce better ticket related structures
davxy May 3, 2023
80bb0a4
Frame tests overhaul
davxy May 8, 2023
20fe451
Fix client tests
davxy May 10, 2023
cb4c30e
Merge branch 'master' into davxy-sassafras-protocol
davxy May 11, 2023
bc05e9f
Fix after master merge
davxy May 11, 2023
1906ce9
Seal should be removed
davxy May 12, 2023
9354204
Isolate ticketing structs and functions in separate module
davxy May 12, 2023
8aa8eaf
Use 'make_bytes' to generate randomness and ticket-id
davxy May 12, 2023
9bb209e
Merge branch 'master' into davxy-sassafras-protocol
davxy May 15, 2023
5e7d6c5
Sassafras Protocol v0.3.2 (#14139)
davxy May 18, 2023
f7bb072
rustfmt
davxy May 19, 2023
fb4a841
Fix bench releated stuff
davxy May 19, 2023
f8003bd
Bump ring-vrf related crates versions
davxy Jun 12, 2023
8c51487
Merge branch 'master' into davxy-sassafras-protocol
davxy Jun 12, 2023
afe252e
Fix after master merge
davxy Jun 12, 2023
dec7fd4
Sassafras key is SW format can't be used as AccountId32
davxy Jun 13, 2023
5e360f9
Set ring-vrf related refs to a working repo and branch
davxy Jun 13, 2023
23e150e
Clippy fix
davxy Jun 13, 2023
1ae6d37
Removed try-runtime option from node-sassafras bin
davxy Jun 13, 2023
fdb746e
Fix one more clippy error
davxy Jun 13, 2023
1074d37
Fix cargo doc
davxy Jun 13, 2023
0f148d7
Sassafras protocol v0.3.3 (#14362)
davxy Jun 16, 2023
695fa7e
Dummy implementations for RuntimePublic
davxy Jun 18, 2023
b92c080
Merge branch 'master' into davxy-sassafras-protocol
davxy Jun 22, 2023
1bc33af
Use upstream ring-vrf
davxy Jun 22, 2023
6f48ec1
Merge branch 'master' into davxy-sassafras-protocol
davxy Aug 9, 2023
68222f7
Fixed sassafras primitives after master merge
davxy Aug 9, 2023
060e401
Improve sassafras pallet logic and cleanup stale data
davxy Aug 11, 2023
677a095
Begin fix of client
davxy Aug 11, 2023
049ac84
Substrate fix test utils
davxy Aug 11, 2023
50ab0d0
Fix sassafras node
davxy Aug 12, 2023
2aec295
Improve pallet test wrt body equality assertions
davxy Aug 12, 2023
15002c1
Build ring context in pallet genesis build
davxy Aug 12, 2023
3245310
Added transaction pool factory to submit tickets
davxy Aug 12, 2023
064dff0
Fix. Native vs wasm usize lengths
davxy Aug 12, 2023
998db32
Bump sassafras version to 0.3.4
davxy Aug 12, 2023
6e23f68
Sassafras structures overhaul
davxy Aug 14, 2023
9329314
Tickets were not saved
davxy Aug 14, 2023
f9cdfc1
Small note
davxy Aug 14, 2023
85a89da
Move sassafras inherents to client. Not reason to have it as a primitive
davxy Aug 14, 2023
3eb0d42
Improve ticket claiming mechanism
davxy Aug 16, 2023
6c8b3d2
Merge branch 'master' into davxy-sassafras-protocol
davxy Aug 18, 2023
4ff7164
Fix after master merge
davxy Aug 18, 2023
fb501eb
Nitpicks
davxy Aug 18, 2023
ab5a31a
Improvements to the digest log management
davxy Aug 24, 2023
cd8b681
Merge branch 'davxy-sassafras-protocol' of github.com:paritytech/subs…
davxy Aug 24, 2023
b700fa4
Merge branch 'master' into davxy-sassafras-protocol
davxy Aug 24, 2023
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
Prev Previous commit
Next Next commit
Further refactory
  • Loading branch information
davxy committed Sep 2, 2022
commit 2d55cc0fecc8c6c7bc16aa69235f348ecc9d1be4
47 changes: 23 additions & 24 deletions client/consensus/sassafras/src/authorship.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,17 @@ use super::*;
use sp_consensus_sassafras::{
digests::PreDigest,
vrf::{make_slot_transcript_data, make_ticket_transcript_data},
AuthorityId, Slot, Ticket, TicketInfo,
AuthorityId, Slot, Ticket, TicketAux,
};
use sp_core::{twox_64, ByteArray};

/// Get secondary authority index for the given epoch and slot.
pub(crate) fn secondary_authority_index(slot: Slot, config: &SassafrasConfiguration) -> u64 {
u64::from_le_bytes((config.randomness, slot).using_encoded(twox_64)) %
config.authorities.len() as u64
pub(crate) fn secondary_authority_index(
slot: Slot,
config: &SassafrasConfiguration,
) -> AuthorityIndex {
u64::from_le_bytes((config.randomness, slot).using_encoded(twox_64)) as AuthorityIndex %
config.authorities.len() as AuthorityIndex
}

/// Try to claim an epoch slot.
Expand All @@ -42,22 +45,21 @@ fn claim_slot(
keystore: &SyncCryptoStorePtr,
) -> Option<(PreDigest, AuthorityId)> {
let config = &epoch.config;
let (authority_index, ticket_info) = match ticket {
let (authority_idx, ticket_aux) = match ticket {
Some(ticket) => {
log::debug!(target: "sassafras", "🌳 [TRY PRIMARY]");
let ticket_info = epoch.tickets_info.get(&ticket)?.clone();
let (authority_idx, ticket_aux) = epoch.tickets_aux.get(&ticket)?.clone();
log::debug!(target: "sassafras", "🌳 Ticket = [ticket: {:02x?}, auth: {}, attempt: {}]",
&ticket.as_bytes()[0..8], ticket_info.authority_index, ticket_info.attempt);
let idx = ticket_info.authority_index as u64;
(idx, Some(ticket_info))
&ticket.as_bytes()[0..8], authority_idx, ticket_aux.attempt);
(authority_idx, Some(ticket_aux))
},
None => {
log::debug!(target: "sassafras", "🌳 [TRY SECONDARY]");
(secondary_authority_index(slot, config), None)
},
};

let authority_id = config.authorities.get(authority_index as usize).map(|auth| &auth.0)?;
let authority_id = config.authorities.get(authority_idx as usize).map(|auth| &auth.0)?;

let transcript_data = make_slot_transcript_data(&config.randomness, slot, epoch.epoch_index);
let signature = SyncCryptoStore::sr25519_vrf_sign(
Expand All @@ -70,19 +72,19 @@ fn claim_slot(
.flatten()?;

let pre_digest = PreDigest {
authority_index: authority_index as u32,
authority_idx,
slot,
vrf_output: VRFOutput(signature.output),
vrf_proof: VRFProof(signature.proof.clone()),
ticket_info,
ticket_aux,
};

Some((pre_digest, authority_id.clone()))
}

/// Generate the tickets for the given epoch.
/// Tickets additional information (i.e. `TicketInfo`) will be stored within the `Epoch`
/// structure. The additional information will be used during epoch to claim slots.
/// Tickets additional information will be stored within the `Epoch` structure.
/// The additional information will be used later during session to claim slots.
pub fn generate_epoch_tickets(epoch: &mut Epoch, keystore: &SyncCryptoStorePtr) -> Vec<Ticket> {
let config = &epoch.config;
let max_attempts = config.threshold_params.attempts_number;
Expand All @@ -99,7 +101,7 @@ pub fn generate_epoch_tickets(epoch: &mut Epoch, keystore: &SyncCryptoStorePtr)
log::debug!(target: "sassafras", "🌳 Tickets threshold: {:032x}", threshold);

let authorities = config.authorities.iter().enumerate().map(|(index, a)| (index, &a.0));
for (authority_index, authority_id) in authorities {
for (authority_idx, authority_id) in authorities {
if !SyncCryptoStore::has_keys(&**keystore, &[(authority_id.to_raw_vec(), AuthorityId::ID)])
{
continue
Expand All @@ -124,19 +126,16 @@ pub fn generate_epoch_tickets(epoch: &mut Epoch, keystore: &SyncCryptoStorePtr)
return None
}

let ticket_info = TicketInfo {
attempt: attempt as u32,
authority_index: authority_index as u32,
proof: VRFProof(signature.proof),
};
let ticket_aux =
TicketAux { attempt: attempt as u32, proof: VRFProof(signature.proof) };

Some((ticket, ticket_info))
Some((ticket, ticket_aux))
};

for attempt in 0..max_attempts {
if let Some((ticket, ticket_info)) = make_ticket(attempt) {
if let Some((ticket, ticket_aux)) = make_ticket(attempt) {
tickets.push(ticket);
epoch.tickets_info.insert(ticket, ticket_info);
epoch.tickets_aux.insert(ticket, (authority_idx as AuthorityIndex, ticket_aux));
}
}
}
Expand Down Expand Up @@ -420,7 +419,7 @@ async fn tickets_worker<B, C, SC>(
epoch_changes
.shared_data()
.epoch_mut(&epoch_identifier)
.map(|epoch| epoch.tickets_info.clear());
.map(|epoch| epoch.tickets_aux.clear());
}
}
}
Expand Down
3 changes: 1 addition & 2 deletions client/consensus/sassafras/src/block_import.rs
Original file line number Diff line number Diff line change
Expand Up @@ -143,8 +143,7 @@ where
let epoch_descriptor = intermediate.epoch_descriptor;
let first_in_epoch = parent_slot < epoch_descriptor.start_slot();

let added_weight = pre_digest.ticket_info.is_some() as u32;
let total_weight = parent_weight + added_weight;
let total_weight = parent_weight + pre_digest.ticket_aux.is_some() as u32;

// Search for this all the time so we can reject unexpected announcements.
let next_epoch_digest = find_next_epoch_digest::<Block>(&block.header)
Expand Down
18 changes: 9 additions & 9 deletions client/consensus/sassafras/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -85,9 +85,9 @@ pub use sp_consensus_sassafras::{
digests::{CompatibleDigestItem, ConsensusLog, NextEpochDescriptor, PreDigest},
inherents::SassafrasInherentData,
vrf::{make_slot_transcript, make_ticket_transcript},
AuthorityId, AuthorityPair, AuthoritySignature, SassafrasApi, SassafrasAuthorityWeight,
SassafrasConfiguration, SassafrasEpochConfiguration, Ticket, TicketInfo, VRFOutput, VRFProof,
SASSAFRAS_ENGINE_ID, VRF_OUTPUT_LENGTH, VRF_PROOF_LENGTH,
AuthorityId, AuthorityIndex, AuthorityPair, AuthoritySignature, SassafrasApi,
SassafrasAuthorityWeight, SassafrasConfiguration, SassafrasEpochConfiguration, Ticket,
TicketAux, VRFOutput, VRFProof, SASSAFRAS_ENGINE_ID, VRF_OUTPUT_LENGTH, VRF_PROOF_LENGTH,
};

mod authorship;
Expand Down Expand Up @@ -194,8 +194,8 @@ pub struct Epoch {
pub start_slot: Slot,
/// Epoch configuration
pub config: SassafrasConfiguration,
/// Tickets metadata.
pub tickets_info: BTreeMap<Ticket, TicketInfo>,
/// Tickets auxiliary data.
pub tickets_aux: BTreeMap<Ticket, (AuthorityIndex, TicketAux)>,
}

impl EpochT for Epoch {
Expand All @@ -214,7 +214,7 @@ impl EpochT for Epoch {
epoch_index: self.epoch_index + 1,
start_slot: self.start_slot + config.epoch_duration,
config,
tickets_info: BTreeMap::new(),
tickets_aux: BTreeMap::new(),
}
}

Expand All @@ -235,7 +235,7 @@ impl Epoch {
epoch_index: 0,
start_slot: slot,
config: config.clone(),
tickets_info: BTreeMap::new(),
tickets_aux: BTreeMap::new(),
}
}
}
Expand Down Expand Up @@ -276,11 +276,11 @@ fn find_pre_digest<B: BlockT>(header: &B::Header) -> Result<PreDigest, Error<B>>
let vrf_output = VRFOutput::try_from([0; VRF_OUTPUT_LENGTH]).expect(PROOF);
let vrf_proof = VRFProof::try_from([0; VRF_PROOF_LENGTH]).expect(PROOF);
return Ok(PreDigest {
authority_index: 0,
authority_idx: 0,
slot: 0.into(),
vrf_output,
vrf_proof,
ticket_info: None,
ticket_aux: None,
})
}

Expand Down
35 changes: 15 additions & 20 deletions client/consensus/sassafras/src/verification.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,9 @@ pub struct VerificationParams<'a, B: 'a + BlockT> {
}

pub struct VerifiedHeaderInfo {
pub authority_id: AuthorityId,
pub pre_digest: DigestItem,
pub seal: DigestItem,
pub author: AuthorityId,
}

/// Check a header has been signed by the right key. If the slot is too far in
Expand All @@ -63,8 +63,8 @@ pub fn check_header<B: BlockT + Sized>(
return Ok(CheckedHeader::Deferred(header, pre_digest.slot))
}

let author = match config.authorities.get(pre_digest.authority_index as usize) {
Some(author) => author.0.clone(),
let authority_id = match config.authorities.get(pre_digest.authority_idx as usize) {
Some(authority_id) => authority_id.0.clone(),
None => return Err(sassafras_err(Error::SlotAuthorNotFound)),
};

Expand All @@ -80,55 +80,50 @@ pub fn check_header<B: BlockT + Sized>(
.ok_or_else(|| sassafras_err(Error::HeaderBadSeal(header.hash())))?;

let pre_hash = header.hash();
if !AuthorityPair::verify(&signature, &pre_hash, &author) {
if !AuthorityPair::verify(&signature, &pre_hash, &authority_id) {
return Err(sassafras_err(Error::BadSignature(pre_hash)))
}

// Check authorship method and claim

match (&ticket, &pre_digest.ticket_info) {
(Some(ticket), Some(ticket_info)) => {
match (&ticket, &pre_digest.ticket_aux) {
(Some(ticket), Some(ticket_aux)) => {
log::debug!(target: "sassafras", "🌳 checking primary");
if ticket_info.authority_index != pre_digest.authority_index {
// TODO-SASS-P2 ... we can eventually remove auth index from ticket info
log::error!(target: "sassafras", "🌳 Wrong primary authority index");
}
let transcript =
make_ticket_transcript(&config.randomness, ticket_info.attempt, epoch.epoch_index);
schnorrkel::PublicKey::from_bytes(author.as_slice())
.and_then(|p| p.vrf_verify(transcript, &ticket, &ticket_info.proof))
make_ticket_transcript(&config.randomness, ticket_aux.attempt, epoch.epoch_index);
schnorrkel::PublicKey::from_bytes(authority_id.as_slice())
.and_then(|p| p.vrf_verify(transcript, &ticket, &ticket_aux.proof))
.map_err(|s| sassafras_err(Error::VRFVerificationFailed(s)))?;
},
(None, None) => {
log::debug!(target: "sassafras", "🌳 checking secondary");
let idx = authorship::secondary_authority_index(pre_digest.slot, config);
if idx != pre_digest.authority_index as u64 {
log::error!(target: "sassafras", "🌳 Wrong secondary authority index");
if idx != pre_digest.authority_idx {
log::error!(target: "sassafras", "🌳 Bad secondary authority index");
return Err(Error::SlotAuthorNotFound)
}
},
(Some(_), None) => {
log::warn!(target: "sassafras", "🌳 Unexpected secondary authoring mechanism");
// TODO-SASS-P2: maybe we can use a different error variant
return Err(Error::UnexpectedAuthoringMechanism)
},
(None, Some(_)) => {
log::warn!(target: "sassafras", "🌳 Unexpected primary authoring mechanism");
// TODO-SASS-P2: maybe we will use a different error variant
return Err(Error::UnexpectedAuthoringMechanism)
},
}

// Check slot-vrf proof

let transcript = make_slot_transcript(&config.randomness, pre_digest.slot, epoch.epoch_index);
schnorrkel::PublicKey::from_bytes(author.as_slice())
schnorrkel::PublicKey::from_bytes(authority_id.as_slice())
.and_then(|p| p.vrf_verify(transcript, &pre_digest.vrf_output, &pre_digest.vrf_proof))
.map_err(|s| sassafras_err(Error::VRFVerificationFailed(s)))?;

let info = VerifiedHeaderInfo {
authority_id,
pre_digest: CompatibleDigestItem::sassafras_pre_digest(pre_digest),
seal,
author,
};

Ok(CheckedHeader::Checked(header, info))
Expand Down Expand Up @@ -368,7 +363,7 @@ where
slot_now,
slot,
&block.header,
&verified_info.author,
&verified_info.authority_id,
&block.origin,
)
.await
Expand Down
14 changes: 8 additions & 6 deletions frame/sassafras/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -375,7 +375,7 @@ pub mod pallet {
// Current slot should be less than half of epoch duration.
let epoch_duration = T::EpochDuration::get();

if Self::current_slot_epoch_index() >= epoch_duration / 2 {
if Self::current_slot_index() >= epoch_duration / 2 {
log::warn!(
target: "sassafras::runtime",
"🌳 Timeout to propose tickets, bailing out.",
Expand Down Expand Up @@ -443,14 +443,16 @@ impl<T: Config> Pallet<T> {
// The exception is for block 1: the genesis has slot 0, so we treat epoch 0 as having
// started at the slot of block 1. We want to use the same randomness and validator set as
// signalled in the genesis, so we don't rotate the epoch.
now != One::one() && Self::current_slot_epoch_index() >= T::EpochDuration::get()
now != One::one() && Self::current_slot_index() >= T::EpochDuration::get()
}

fn current_slot_epoch_index() -> u64 {
Self::slot_epoch_index(CurrentSlot::<T>::get())
/// Current slot index with respect to current epoch.
fn current_slot_index() -> u64 {
Self::slot_index(CurrentSlot::<T>::get())
}

fn slot_epoch_index(slot: Slot) -> u64 {
/// Slot index with respect to current epoch.
fn slot_index(slot: Slot) -> u64 {
if *GenesisSlot::<T>::get() == 0 {
return 0
}
Expand Down Expand Up @@ -638,7 +640,7 @@ impl<T: Config> Pallet<T> {
pub fn slot_ticket(slot: Slot) -> Option<Ticket> {
let epoch_idx = EpochIndex::<T>::get();
let duration = T::EpochDuration::get();
let mut slot_idx = Self::slot_epoch_index(slot);
let mut slot_idx = Self::slot_index(slot);
let mut tickets_meta = TicketsMeta::<T>::get();

let get_ticket_idx = |slot_idx| {
Expand Down
14 changes: 7 additions & 7 deletions frame/sassafras/src/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ fn on_first_block_after_genesis() {
assert_eq!(Sassafras::current_slot(), start_slot);
assert_eq!(Sassafras::epoch_index(), 0);
assert_eq!(Sassafras::current_epoch_start(), start_slot);
assert_eq!(Sassafras::current_slot_epoch_index(), 0);
assert_eq!(Sassafras::current_slot_index(), 0);
assert_eq!(Sassafras::randomness(), [0; 32]);
assert_eq!(NextRandomness::<Test>::get(), [0; 32]);
assert_eq!(RandomnessAccumulator::<Test>::get(), [0; 32]);
Expand All @@ -138,7 +138,7 @@ fn on_first_block_after_genesis() {
assert_eq!(Sassafras::current_slot(), start_slot);
assert_eq!(Sassafras::epoch_index(), 0);
assert_eq!(Sassafras::current_epoch_start(), start_slot);
assert_eq!(Sassafras::current_slot_epoch_index(), 0);
assert_eq!(Sassafras::current_slot_index(), 0);
assert_eq!(Sassafras::randomness(), [0; 32]);
assert_eq!(NextRandomness::<Test>::get(), [0; 32]);
assert_eq!(
Expand Down Expand Up @@ -188,7 +188,7 @@ fn on_normal_block() {
assert_eq!(Sassafras::current_slot(), start_slot + 1);
assert_eq!(Sassafras::epoch_index(), 0);
assert_eq!(Sassafras::current_epoch_start(), start_slot);
assert_eq!(Sassafras::current_slot_epoch_index(), 1);
assert_eq!(Sassafras::current_slot_index(), 1);
assert_eq!(Sassafras::randomness(), [0; 32]);
assert_eq!(NextRandomness::<Test>::get(), [0; 32]);
assert_eq!(
Expand All @@ -206,7 +206,7 @@ fn on_normal_block() {
assert_eq!(Sassafras::current_slot(), start_slot + 1);
assert_eq!(Sassafras::epoch_index(), 0);
assert_eq!(Sassafras::current_epoch_start(), start_slot);
assert_eq!(Sassafras::current_slot_epoch_index(), 1);
assert_eq!(Sassafras::current_slot_index(), 1);
assert_eq!(Sassafras::randomness(), [0; 32]);
assert_eq!(NextRandomness::<Test>::get(), [0; 32]);
assert_eq!(
Expand Down Expand Up @@ -244,7 +244,7 @@ fn epoch_change_block() {
assert_eq!(Sassafras::current_slot(), start_slot + epoch_duration);
assert_eq!(Sassafras::epoch_index(), 1);
assert_eq!(Sassafras::current_epoch_start(), start_slot + epoch_duration);
assert_eq!(Sassafras::current_slot_epoch_index(), 0);
assert_eq!(Sassafras::current_slot_index(), 0);
assert_eq!(Sassafras::randomness(), [0; 32],);
assert_eq!(
NextRandomness::<Test>::get(),
Expand All @@ -265,7 +265,7 @@ fn epoch_change_block() {
assert_eq!(Sassafras::current_slot(), start_slot + epoch_duration);
assert_eq!(Sassafras::epoch_index(), 1);
assert_eq!(Sassafras::current_epoch_start(), start_slot + epoch_duration);
assert_eq!(Sassafras::current_slot_epoch_index(), 0);
assert_eq!(Sassafras::current_slot_index(), 0);
assert_eq!(Sassafras::randomness(), [0; 32]);
assert_eq!(
NextRandomness::<Test>::get(),
Expand Down Expand Up @@ -416,7 +416,7 @@ fn block_skips_epochs() {
assert_eq!(Sassafras::current_slot(), start_slot + offset);
assert_eq!(Sassafras::epoch_index(), 3);
assert_eq!(Sassafras::current_epoch_start(), start_slot + offset);
assert_eq!(Sassafras::current_slot_epoch_index(), 0);
assert_eq!(Sassafras::current_slot_index(), 0);

// Tickets were discarded
let meta = TicketsMeta::<Test>::get();
Expand Down
Loading