diff --git a/crates/bin/pd/src/main.rs b/crates/bin/pd/src/main.rs index e53a71cb65..7de7b1099a 100644 --- a/crates/bin/pd/src/main.rs +++ b/crates/bin/pd/src/main.rs @@ -12,7 +12,7 @@ use cnidarium::Storage; use metrics_exporter_prometheus::PrometheusBuilder; use pd::{ cli::{Opt, RootCommand, TestnetCommand}, - migrate::Migration::{ReadyToStart, Testnet77}, + migrate::Migration::{ReadyToStart, Testnet78}, testnet::{ config::{get_testnet_dir, parse_tm_address, url_has_necessary_parts}, generate::TestnetConfig, @@ -457,7 +457,7 @@ async fn main() -> anyhow::Result<()> { let genesis_start = pd::migrate::last_block_timestamp(pd_home.clone()).await?; tracing::info!(?genesis_start, "last block timestamp"); - Testnet77 + Testnet78 .migrate(pd_home.clone(), comet_home, Some(genesis_start), force) .instrument(pd_migrate_span) .await diff --git a/crates/bin/pd/src/migrate/testnet78.rs b/crates/bin/pd/src/migrate/testnet78.rs index 401b81f35c..abd308b5e9 100644 --- a/crates/bin/pd/src/migrate/testnet78.rs +++ b/crates/bin/pd/src/migrate/testnet78.rs @@ -1,11 +1,13 @@ //! Contains functions related to the migration script of Testnet78. +use anyhow::Context; use cnidarium::{Snapshot, StateDelta, Storage}; use futures::TryStreamExt as _; use jmt::RootHash; -use pbjson_types::Any; use penumbra_app::app::StateReadExt as _; use penumbra_governance::StateReadExt as _; -use penumbra_proto::{DomainType as _, StateReadProto as _, StateWriteProto as _}; +use penumbra_governance::StateWriteExt; +use penumbra_proto::{StateReadProto as _, StateWriteProto as _}; +use penumbra_sct::component::clock::EpochManager; use penumbra_sct::component::clock::EpochRead as _; use penumbra_stake::validator::Validator; use std::path::PathBuf; @@ -59,6 +61,7 @@ pub async fn migrate( // We initialize a `StateDelta` and start by reaching into the JMT for all entries matching the // swap execution prefix. Then, we write each entry to the nv-storage. let mut delta = StateDelta::new(initial_state); + tracing::info!("beginning migration steps"); let (migration_duration, post_upgrade_root_hash) = { let start_time = std::time::SystemTime::now(); // Adjust the length of `Validator` fields. @@ -78,6 +81,17 @@ pub async fn migrate( post_upgrade_root_hash, ) }; + tracing::info!("completed migration steps"); + + // Set halt bit to 0, so chain can start again. + let migrated_state = storage.latest_snapshot(); + let mut delta = StateDelta::new(migrated_state); + delta.ready_to_start(); + delta.put_block_height(0u64); + let _ = storage + .commit_in_place(delta) + .await + .context("failed to reset halt bit")?; storage.release().await; // The migration is complete, now we need to generate a genesis file. To do this, we need @@ -129,11 +143,16 @@ pub async fn migrate( /// - `website` (70 bytes) /// - `description` (280 bytes) async fn truncate_validator_fields(delta: &mut StateDelta) -> anyhow::Result<()> { + tracing::info!("truncating validator fields"); let key_prefix_validators = penumbra_stake::state_key::validators::definitions::prefix(); let all_validators = delta - .prefix_proto::(&key_prefix_validators) - .map_ok(|(k, v)| (k, Validator::decode(v.value).expect("only validators"))) - .try_collect::>() + .prefix_proto::( + &key_prefix_validators, + ) + .try_collect::>() .await?; for (key, mut validator) in all_validators { @@ -141,6 +160,8 @@ async fn truncate_validator_fields(delta: &mut StateDelta) -> anyhow:: validator.website = truncate(&validator.website, 70).to_string(); validator.description = truncate(&validator.description, 280).to_string(); + let validator: Validator = validator.try_into()?; + tracing::info!("put key {:?}", key); delta.put(key, validator); } @@ -161,10 +182,12 @@ async fn truncate_validator_fields(delta: &mut StateDelta) -> anyhow:: /// * Governance Signaling Proposals: /// - `commit hash` (255 bytes) async fn truncate_proposal_fields(delta: &mut StateDelta) -> anyhow::Result<()> { + tracing::info!("truncating proposal fields"); let next_proposal_id: u64 = delta.next_proposal_id().await?; // Range each proposal and truncate the fields. for proposal_id in 0..next_proposal_id { + tracing::info!("truncating proposal: {}", proposal_id); let proposal = delta.proposal_definition(proposal_id).await?; if proposal.is_none() { @@ -229,6 +252,10 @@ async fn truncate_proposal_fields(delta: &mut StateDelta) -> anyhow::R }; // Store the truncated proposal data + tracing::info!( + "put key {:?}", + penumbra_governance::state_key::proposal_definition(proposal_id) + ); delta.put( penumbra_governance::state_key::proposal_definition(proposal_id), proposal.clone(), @@ -241,10 +268,12 @@ async fn truncate_proposal_fields(delta: &mut StateDelta) -> anyhow::R /// * Governance Proposal Withdrawals: /// - `reason` (1024 bytes) async fn truncate_proposal_outcome_fields(delta: &mut StateDelta) -> anyhow::Result<()> { + tracing::info!("truncating proposal outcome fields"); let next_proposal_id: u64 = delta.next_proposal_id().await?; // Range each proposal outcome and truncate the fields. for proposal_id in 0..next_proposal_id { + tracing::info!("truncating proposal outcomes: {}", proposal_id); let proposal_state = delta.proposal_state(proposal_id).await?; if proposal_state.is_none() { @@ -329,6 +358,10 @@ async fn truncate_proposal_outcome_fields(delta: &mut StateDelta) -> a } // Store the truncated proposal state data + tracing::info!( + "put key {:?}", + penumbra_governance::state_key::proposal_state(proposal_id) + ); delta.put( penumbra_governance::state_key::proposal_state(proposal_id), proposal_state.clone(),