Skip to content

Commit

Permalink
staking: break out staking component into modular traits (#3737)
Browse files Browse the repository at this point in the history
* staking: move the action handlers to `component`

* staking: break out component impl

* staking: break out validator manager

* staking(validator_manager): fix warnings / improve comments

* staking(validator_manager): add `update_validator`

* staking(validator_manager): scaffolding for `ValidatorDataRead`

* staking(validator_manager): break out validator state getters

* penumbra: `fmt`

* staking(epoch_handler): break out end-epoch logic

* staking(validator_handler): rename module

* staking(validator_handler): track manager

* staking(validator_store): flesh out `ValidatorDataRead`

* staking(validator_manager): use internal traits

* staking(component): move epoch handling to `EpochHandler`

* penumbra: propagate staking component api

* penumbra: remove unused imports

* staking(component): clean component root

* staking(component): prepare breaking out slashing data read

* staking(component): fix holdover `metrics@0.22` changes

* staking(validator_store): add stateless `compute_unbonding_delay`
  • Loading branch information
erwanor committed Feb 6, 2024
1 parent e3ec5df commit 3d7d4ca
Show file tree
Hide file tree
Showing 20 changed files with 2,028 additions and 1,864 deletions.
5 changes: 4 additions & 1 deletion crates/bin/pd/src/migrate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@ use cnidarium::{StateDelta, StateWrite, Storage};
use jmt::RootHash;
use penumbra_app::{genesis, SUBSTORE_PREFIXES};
use penumbra_sct::component::clock::{EpochManager, EpochRead};
use penumbra_stake::{genesis::Content as StakeContent, StateReadExt as _};
use penumbra_stake::{
component::validator_handler::ValidatorDataRead, genesis::Content as StakeContent,
};

use crate::testnet::generate::TestnetConfig;

Expand Down Expand Up @@ -66,6 +68,7 @@ impl Migration {
let validators = migrated_state.validator_definitions().await?;
let app_state = genesis::Content {
stake_content: StakeContent {
// TODO(erwan): should remove this.
validators: validators.into_iter().map(Into::into).collect(),
..Default::default()
},
Expand Down
4 changes: 3 additions & 1 deletion crates/core/app/src/app/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,9 @@ use penumbra_sct::component::sct::Sct;
use penumbra_sct::component::{StateReadExt as _, StateWriteExt as _};
use penumbra_sct::epoch::Epoch;
use penumbra_shielded_pool::component::{ShieldedPool, StateReadExt as _, StateWriteExt as _};
use penumbra_stake::component::{Staking, StateReadExt as _, StateWriteExt as _, ValidatorUpdates};
use penumbra_stake::component::{
stake::ConsensusUpdateRead, Staking, StateReadExt as _, StateWriteExt as _,
};
use penumbra_transaction::Transaction;
use prost::Message as _;
use tendermint::abci::{self, Event};
Expand Down
2 changes: 1 addition & 1 deletion crates/core/app/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ pub static SUBSTORE_PREFIXES: Lazy<Vec<String>> = Lazy::new(|| {
]
});

/// The substore prefix used for storing histori CometBFT block data.
/// The substore prefix used for storing historical CometBFT block data.
pub static COMETBFT_SUBSTORE_PREFIX: &'static str = "cometbft-data";

/// Temporary compat wrapper for duplicate trait impls
Expand Down
4 changes: 2 additions & 2 deletions crates/core/component/funding/src/component.rs
Original file line number Diff line number Diff line change
Expand Up @@ -61,10 +61,10 @@ impl Component for Funding {
// Here, we want to process the funding rewards for the epoch that just ended. To do this,
// we pull the funding queue that the staking component has prepared for us, as well as the
// base rate data for the epoch that just ended.
let funding_queue = state.funding_queue().unwrap_or_default();
let funding_queue = state.get_funding_queue().unwrap_or_default();
let funding_queue_len = funding_queue.len();

let Some(base_rate) = state.previous_base_rate() else {
let Some(base_rate) = state.get_previous_base_rate() else {
tracing::error!("the ending epoch's base rate has not beed found in object storage, computing rewards is not possible");
return Ok(());
};
Expand Down
18 changes: 12 additions & 6 deletions crates/core/component/governance/src/component/view.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,15 @@ use penumbra_sct::{
Nullifier,
};
use penumbra_shielded_pool::component::SupplyRead;
use penumbra_stake::{DelegationToken, GovernanceKey, IdentityKey};
use penumbra_stake::{
component::{validator_handler::ValidatorDataRead, ConsensusIndexRead},
DelegationToken, GovernanceKey, IdentityKey,
};
use penumbra_tct as tct;
use tokio::task::JoinSet;
use tracing::instrument;

use penumbra_stake::{rate::RateData, validator, StateReadExt as _};
use penumbra_stake::{rate::RateData, validator};

use crate::{
params::GovernanceParameters,
Expand Down Expand Up @@ -355,7 +358,7 @@ pub trait StateReadExt: StateRead + penumbra_stake::StateReadExt {
identity_key: &IdentityKey,
governance_key: &GovernanceKey,
) -> Result<()> {
if let Some(validator) = self.validator(identity_key).await? {
if let Some(validator) = self.get_validator_definition(identity_key).await? {
if validator.governance_key != *governance_key {
anyhow::bail!(
"governance key {} does not match validator {}",
Expand Down Expand Up @@ -627,9 +630,12 @@ pub trait StateWriteExt: StateWrite + penumbra_ibc::component::ConnectionStateWr
while let Some(identity_key) = validator_identity_stream.next().await {
let identity_key = identity_key?;

let state = self.validator_state(&identity_key);
let rate_data = self.current_validator_rate(&identity_key);
let power = self.validator_power(&identity_key);
let state = self.get_validator_state(&identity_key);
let rate_data = self.get_validator_rate(&identity_key);
let power: penumbra_proto::state::future::DomainFuture<
Amount,
<Self as StateRead>::GetRawFut,
> = self.get_validator_power(&identity_key);
js.spawn(async move {
let state = state
.await?
Expand Down
Loading

0 comments on commit 3d7d4ca

Please sign in to comment.