Skip to content

Commit

Permalink
compute revision number from chain id instead of hardcoding
Browse files Browse the repository at this point in the history
  • Loading branch information
avahowell committed Sep 28, 2023
1 parent b967dfb commit b1ce102
Show file tree
Hide file tree
Showing 9 changed files with 36 additions and 26 deletions.
10 changes: 5 additions & 5 deletions crates/bin/pd/src/info.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,7 @@ use ibc_types::core::channel::{ChannelId, PortId};
use ibc_types::core::client::ClientId;
use ibc_types::core::connection::ConnectionId;
use ibc_types::core::connection::IdentifiedConnectionEnd;
use penumbra_chain::{
component::{AppHashRead, StateReadExt},
APP_VERSION,
};
use penumbra_chain::component::{AppHashRead, StateReadExt};
use penumbra_ibc::component::ChannelStateReadExt as _;
use penumbra_ibc::component::ClientStateReadExt as _;
use penumbra_ibc::component::ConnectionStateReadExt as _;
Expand Down Expand Up @@ -82,14 +79,17 @@ impl Info {
.unwrap_or_default()
.try_into()?;

// likewise, we want to return 0 if we can't get the revision number
let app_version = state.get_revision_number().await.unwrap_or_default();

tracing::info!(?info, state_version = ?state.version(), last_block_height = ?last_block_height, "reporting height in info query");

let last_block_app_hash = state.app_hash().await?.0.to_vec().try_into()?;

Ok(response::Info {
data: "penumbra".to_string(),
version: ABCI_INFO_VERSION.to_string(),
app_version: APP_VERSION,
app_version,
last_block_height,
last_block_app_hash,
})
Expand Down
8 changes: 8 additions & 0 deletions crates/core/component/chain/src/component/view.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ use std::str::FromStr;

use anyhow::{anyhow, Context, Result};
use async_trait::async_trait;
use ibc_types::core::connection::ChainId;
use penumbra_proto::{StateReadProto, StateWriteProto};
use penumbra_storage::{StateRead, StateWrite};
use tendermint::Time;
Expand Down Expand Up @@ -54,6 +55,13 @@ pub trait StateReadExt: StateRead {
self.get_chain_params().await.map(|params| params.chain_id)
}

/// Gets the chain revision number, from the chain ID
async fn get_revision_number(&self) -> Result<u64> {
let cid_str = self.get_chain_id().await?;

Ok(ChainId::from_string(&cid_str).version())
}

/// Gets the current block height from the JMT
async fn get_block_height(&self) -> Result<u64> {
let height_bytes: u64 = self
Expand Down
5 changes: 0 additions & 5 deletions crates/core/component/chain/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,6 @@ mod note_source;
#[cfg(feature = "component")]
pub mod component;

// This corresponds to the "revision number" in Cosmos SDK chains, and the "app_version" field in the Tendermint RPC.
// Currently, we don't use a revision number, because we don't have
// any further namespacing of blocks than the block height. So, we just set this to 0.
pub const APP_VERSION: u64 = 0;

pub mod genesis;
pub mod params;
pub mod state_key;
Expand Down
11 changes: 9 additions & 2 deletions crates/core/component/ibc/src/component/ibc_component.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ use async_trait::async_trait;
use ibc_types::{
core::client::Height, lightclients::tendermint::ConsensusState as TendermintConsensusState,
};
use penumbra_chain::component::StateReadExt;
use penumbra_chain::genesis;
use penumbra_component::Component;
use penumbra_storage::StateWrite;
Expand Down Expand Up @@ -48,8 +49,14 @@ impl Component for IBCComponent {

// Currently, we don't use a revision number, because we don't have
// any further namespacing of blocks than the block height.
let height = Height::new(APP_VERSION, begin_block.header.height.into())
.expect("block height cannot be zero");
let height = Height::new(
state
.get_revision_number()
.await
.expect("must be able to get revision number in begin block"),
begin_block.header.height.into(),
)
.expect("block height cannot be zero");

state.put_penumbra_consensus_state(height, cs);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,7 @@ use ibc_types::core::{
};
use ibc_types::lightclients::tendermint::client_state::ClientState as TendermintClientState;
use ibc_types::path::{ClientConsensusStatePath, ClientStatePath, ConnectionPath};
use penumbra_chain::{
component::{StateReadExt as _, PENUMBRA_COMMITMENT_PREFIX},
APP_VERSION,
};
use penumbra_chain::component::{StateReadExt as _, PENUMBRA_COMMITMENT_PREFIX};
use penumbra_storage::{StateRead, StateWrite};

use crate::component::{
Expand Down Expand Up @@ -197,7 +194,10 @@ async fn consensus_height_is_correct<S: StateRead>(
state: S,
msg: &MsgConnectionOpenAck,
) -> anyhow::Result<()> {
let current_height = Height::new(APP_VERSION, state.get_block_height().await?)?;
let current_height = Height::new(
state.get_revision_number().await?,
state.get_block_height().await?,
)?;
if msg.consensus_height_of_a_on_b > current_height {
anyhow::bail!("consensus height is greater than the current block height",);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ use ibc_types::{
},
};
use penumbra_chain::component::{StateReadExt as _, PENUMBRA_COMMITMENT_PREFIX};
use penumbra_chain::APP_VERSION;
use penumbra_storage::{StateRead, StateWrite};

use crate::component::{
Expand Down Expand Up @@ -204,7 +203,10 @@ async fn consensus_height_is_correct<S: StateRead>(
state: S,
msg: &MsgConnectionOpenTry,
) -> anyhow::Result<()> {
let current_height = IBCHeight::new(APP_VERSION, state.get_block_height().await?)?;
let current_height = IBCHeight::new(
state.get_revision_number().await?,
state.get_block_height().await?,
)?;
if msg.consensus_height_of_b_on_a > current_height {
anyhow::bail!("consensus height is greater than the current block height",);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ use ibc_types::core::{
client::Height as IBCHeight,
connection::State as ConnectionState,
};
use penumbra_chain::{component::StateReadExt, APP_VERSION};
use penumbra_chain::component::StateReadExt;
use penumbra_storage::StateWrite;

use crate::component::{
Expand Down Expand Up @@ -65,7 +65,7 @@ impl MsgHandler for MsgRecvPacket {
}

let block_height = state.get_block_height().await?;
let height = IBCHeight::new(APP_VERSION, block_height)?;
let height = IBCHeight::new(state.get_revision_number().await?, block_height)?;

if self.packet.timeout_height_on_b.has_expired(height) {
anyhow::bail!("packet has timed out");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -355,8 +355,6 @@ pub trait PacketProofVerifier: StateReadExt + inner::Inner {
impl<T: StateRead> PacketProofVerifier for T {}

mod inner {
use penumbra_chain::APP_VERSION;

use super::*;

#[async_trait]
Expand Down Expand Up @@ -398,7 +396,7 @@ mod inner {

TendermintClientState::verify_delay_passed(
current_timestamp.into(),
Height::new(APP_VERSION, current_height)?,
Height::new(self.get_revision_number().await?, current_height)?,
processed_time,
processed_height,
delay_period_time,
Expand Down
4 changes: 2 additions & 2 deletions crates/narsil/narsil/src/ledger/info.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use std::{
};

use futures::FutureExt;
use penumbra_chain::{component::AppHashRead, APP_VERSION};
use penumbra_chain::component::{AppHashRead, StateReadExt};
use penumbra_storage::Storage;
use penumbra_tower_trace::v034::RequestExt;
use tendermint::v0_34::abci::{self, response::Echo, InfoRequest, InfoResponse};
Expand Down Expand Up @@ -47,7 +47,7 @@ impl Info {
Ok(abci::response::Info {
data: "penumbra".to_string(),
version: ABCI_INFO_VERSION.to_string(),
app_version: APP_VERSION,
app_version: state.get_revision_number().await?,
last_block_height,
last_block_app_hash,
})
Expand Down

0 comments on commit b1ce102

Please sign in to comment.