Skip to content

Commit

Permalink
refactor(transition-frontier): Add success states for NumAccounts and…
Browse files Browse the repository at this point in the history
… MerkleTreeSync (WIP)
  • Loading branch information
tizoc committed Mar 29, 2024
1 parent 1298de9 commit 213500a
Show file tree
Hide file tree
Showing 5 changed files with 110 additions and 18 deletions.
14 changes: 13 additions & 1 deletion node/src/action_kind.rs
Expand Up @@ -361,9 +361,12 @@ pub enum ActionKind {
TransitionFrontierSyncLedgerSnarkedChildHashesAccepted,
TransitionFrontierSyncLedgerSnarkedChildHashesReceived,
TransitionFrontierSyncLedgerSnarkedChildHashesRejected,
TransitionFrontierSyncLedgerSnarkedMerkleTreeSyncPending,
TransitionFrontierSyncLedgerSnarkedMerkleTreeSyncSuccess,
TransitionFrontierSyncLedgerSnarkedNumAccountsAccepted,
TransitionFrontierSyncLedgerSnarkedNumAccountsReceived,
TransitionFrontierSyncLedgerSnarkedNumAccountsRejected,
TransitionFrontierSyncLedgerSnarkedNumAccountsSuccess,
TransitionFrontierSyncLedgerSnarkedPeerQueryAddressError,
TransitionFrontierSyncLedgerSnarkedPeerQueryAddressInit,
TransitionFrontierSyncLedgerSnarkedPeerQueryAddressPending,
Expand Down Expand Up @@ -404,7 +407,7 @@ pub enum ActionKind {
}

impl ActionKind {
pub const COUNT: u16 = 337;
pub const COUNT: u16 = 340;
}

impl std::fmt::Display for ActionKind {
Expand Down Expand Up @@ -1191,6 +1194,12 @@ impl ActionKindGet for TransitionFrontierSyncLedgerSnarkedAction {
Self::NumAccountsRejected { .. } => {
ActionKind::TransitionFrontierSyncLedgerSnarkedNumAccountsRejected
}
Self::NumAccountsSuccess { .. } => {
ActionKind::TransitionFrontierSyncLedgerSnarkedNumAccountsSuccess
}
Self::MerkleTreeSyncPending => {
ActionKind::TransitionFrontierSyncLedgerSnarkedMerkleTreeSyncPending
}
Self::PeerQueryAddressInit { .. } => {
ActionKind::TransitionFrontierSyncLedgerSnarkedPeerQueryAddressInit
}
Expand Down Expand Up @@ -1224,6 +1233,9 @@ impl ActionKindGet for TransitionFrontierSyncLedgerSnarkedAction {
Self::ChildAccountsRejected { .. } => {
ActionKind::TransitionFrontierSyncLedgerSnarkedChildAccountsRejected
}
Self::MerkleTreeSyncSuccess => {
ActionKind::TransitionFrontierSyncLedgerSnarkedMerkleTreeSyncSuccess
}
Self::Success => ActionKind::TransitionFrontierSyncLedgerSnarkedSuccess,
}
}
Expand Down
Expand Up @@ -61,6 +61,12 @@ pub enum TransitionFrontierSyncLedgerSnarkedAction {
num_accounts: u64,
sender: PeerId,
},
NumAccountsSuccess {
num_accounts: u64,
contents_hash: LedgerHash,
},

MerkleTreeSyncPending,

// For child hashes and content queries
PeerQueryAddressInit {
Expand Down Expand Up @@ -117,6 +123,8 @@ pub enum TransitionFrontierSyncLedgerSnarkedAction {
address: LedgerAddress,
sender: PeerId,
},

MerkleTreeSyncSuccess,
Success,
}

Expand Down Expand Up @@ -242,6 +250,13 @@ impl redux::EnablingCondition<crate::State> for TransitionFrontierSyncLedgerSnar
.and_then(|s| s.attempts.get(sender))
.map_or(false, |s| s.is_success())
}
// TODO(tizoc): implement
TransitionFrontierSyncLedgerSnarkedAction::NumAccountsSuccess { .. } => true,

// TODO(tizoc): implement
TransitionFrontierSyncLedgerSnarkedAction::MerkleTreeSyncPending => true,
// TODO(tizoc): implement
TransitionFrontierSyncLedgerSnarkedAction::MerkleTreeSyncSuccess => true,

// hashes and contents
TransitionFrontierSyncLedgerSnarkedAction::PeerQueryAddressInit {
Expand Down
Expand Up @@ -235,15 +235,35 @@ impl TransitionFrontierSyncLedgerSnarkedAction {
);
}
}
TransitionFrontierSyncLedgerSnarkedAction::NumAccountsAccepted { .. } => {
if !store.dispatch(TransitionFrontierSyncLedgerSnarkedAction::PeersQuery) {
store.dispatch(TransitionFrontierSyncLedgerSnarkedAction::Success);
}
TransitionFrontierSyncLedgerSnarkedAction::NumAccountsAccepted {
num_accounts,
contents_hash,
..
} => {
store.dispatch(
TransitionFrontierSyncLedgerSnarkedAction::NumAccountsSuccess {
num_accounts: *num_accounts,
contents_hash: contents_hash.clone(),
},
);
}
TransitionFrontierSyncLedgerSnarkedAction::NumAccountsRejected { .. } => {
// TODO(tizoc): we do nothing here, but the peer must be punished somehow
store.dispatch(TransitionFrontierSyncLedgerSnarkedAction::PeersQuery);
}
TransitionFrontierSyncLedgerSnarkedAction::NumAccountsSuccess { .. } => {
store.dispatch(TransitionFrontierSyncLedgerSnarkedAction::MerkleTreeSyncPending);
}

TransitionFrontierSyncLedgerSnarkedAction::MerkleTreeSyncPending => {
if !store.dispatch(TransitionFrontierSyncLedgerSnarkedAction::PeersQuery) {
store
.dispatch(TransitionFrontierSyncLedgerSnarkedAction::MerkleTreeSyncSuccess);
}
}
TransitionFrontierSyncLedgerSnarkedAction::MerkleTreeSyncSuccess => {
store.dispatch(TransitionFrontierSyncLedgerSnarkedAction::Success);
}

TransitionFrontierSyncLedgerSnarkedAction::PeerQueryAddressInit {
peer_id,
Expand Down
Expand Up @@ -91,17 +91,40 @@ impl TransitionFrontierSyncLedgerSnarkedState {
};
}
TransitionFrontierSyncLedgerSnarkedAction::NumAccountsReceived { .. } => {}
TransitionFrontierSyncLedgerSnarkedAction::NumAccountsAccepted {
TransitionFrontierSyncLedgerSnarkedAction::NumAccountsAccepted { .. } => {}
TransitionFrontierSyncLedgerSnarkedAction::NumAccountsRejected { .. } => {
// TODO(tizoc): should this be reflected in the state somehow?
}
TransitionFrontierSyncLedgerSnarkedAction::NumAccountsSuccess {
num_accounts,
contents_hash,
..
} => {
let Self::NumAccountsPending { target, .. } = self else {
return;
};

// We know at which node to begin querying, so we skip all the intermediary depths
let target = target.clone();

*self = Self::NumAccountsSuccess {
time: meta.time(),
target,
num_accounts: *num_accounts,
contents_hash: contents_hash.clone(),
};
}

TransitionFrontierSyncLedgerSnarkedAction::MerkleTreeSyncPending => {
let Self::NumAccountsSuccess {
target,
num_accounts,
contents_hash,
..
} = self
else {
return;
};

// We know at which node to begin querying, so we skip all the intermediary depths
let first_query = LedgerAddressQuery {
address: ledger::Address::first(
LEDGER_DEPTH - tree_height_for_num_accounts(*num_accounts),
Expand All @@ -119,8 +142,14 @@ impl TransitionFrontierSyncLedgerSnarkedState {
pending_addresses: Default::default(),
};
}
TransitionFrontierSyncLedgerSnarkedAction::NumAccountsRejected { .. } => {
// TODO(tizoc): should this be reflected in the state somehow?
TransitionFrontierSyncLedgerSnarkedAction::MerkleTreeSyncSuccess => {
let Self::MerkleTreeSyncPending { target, .. } = self else {
return;
};
*self = Self::MerkleTreeSyncSuccess {
time: meta.time(),
target: target.clone(),
};
}

TransitionFrontierSyncLedgerSnarkedAction::PeerQueryAddressInit {
Expand Down
Expand Up @@ -22,6 +22,14 @@ pub enum TransitionFrontierSyncLedgerSnarkedState {
target: SyncLedgerTarget,
pending_num_accounts: LedgerNumAccountsQueryPending,
},
NumAccountsSuccess {
time: Timestamp,
target: SyncLedgerTarget,
/// NumAccounts value accepted from peer
num_accounts: u64,
/// Hash of the subtree containing all accounts
contents_hash: LedgerHash,
},
/// Doing BFS to sync snarked ledger tree.
MerkleTreeSyncPending {
time: Timestamp,
Expand All @@ -38,6 +46,10 @@ pub enum TransitionFrontierSyncLedgerSnarkedState {
#[serde_as(as = "Vec<(_, _)>")]
pending_addresses: BTreeMap<LedgerAddress, LedgerAddressQueryPending>,
},
MerkleTreeSyncSuccess {
time: Timestamp,
target: SyncLedgerTarget,
},
Success {
time: Timestamp,
target: SyncLedgerTarget,
Expand Down Expand Up @@ -123,17 +135,21 @@ impl TransitionFrontierSyncLedgerSnarkedState {

pub fn is_pending(&self) -> bool {
match self {
Self::NumAccountsPending { .. } => true,
Self::MerkleTreeSyncPending { .. } => true,
Self::NumAccountsPending { .. }
| Self::MerkleTreeSyncPending { .. }
| Self::NumAccountsSuccess { .. }
| Self::MerkleTreeSyncSuccess { .. } => true,
Self::Success { .. } => false,
}
}

pub fn target(&self) -> &SyncLedgerTarget {
match self {
Self::NumAccountsPending { target, .. } => target,
Self::MerkleTreeSyncPending { target, .. } => target,
Self::Success { target, .. } => target,
Self::NumAccountsPending { target, .. }
| Self::MerkleTreeSyncPending { target, .. }
| Self::NumAccountsSuccess { target, .. }
| Self::MerkleTreeSyncSuccess { target, .. }
| Self::Success { target, .. } => target,
}
}

Expand Down Expand Up @@ -195,8 +211,8 @@ impl TransitionFrontierSyncLedgerSnarkedState {

pub fn estimation(&self) -> Option<LedgerSyncProgress> {
match self {
TransitionFrontierSyncLedgerSnarkedState::NumAccountsPending { .. } => None,
TransitionFrontierSyncLedgerSnarkedState::MerkleTreeSyncPending {
Self::NumAccountsPending { .. } | Self::NumAccountsSuccess { .. } => None,
Self::MerkleTreeSyncPending {
total_accounts_expected,
synced_accounts_count,
synced_hashes_count,
Expand All @@ -217,7 +233,7 @@ impl TransitionFrontierSyncLedgerSnarkedState {
estimation,
})
}
TransitionFrontierSyncLedgerSnarkedState::Success { .. } => {
Self::MerkleTreeSyncSuccess { .. } | Self::Success { .. } => {
return Some(LedgerSyncProgress {
fetched: 1,
estimation: 1,
Expand Down

0 comments on commit 213500a

Please sign in to comment.