From 4dbbc71757406a919655e6f7879ab828d3349e7e Mon Sep 17 00:00:00 2001 From: dhruvja Date: Sat, 19 Oct 2024 00:33:47 +0530 Subject: [PATCH 1/7] get host consensus state based on feature --- .../restaking/programs/restaking/Cargo.toml | 1 + .../solana-ibc/src/validation_context.rs | 57 ++++++++++++------- 2 files changed, 37 insertions(+), 21 deletions(-) diff --git a/solana/restaking/programs/restaking/Cargo.toml b/solana/restaking/programs/restaking/Cargo.toml index ca817d2f..e54dd439 100644 --- a/solana/restaking/programs/restaking/Cargo.toml +++ b/solana/restaking/programs/restaking/Cargo.toml @@ -16,6 +16,7 @@ no-idl = [] no-log-ix-name = [] cpi = ["no-entrypoint"] default = [] +witness = [] [dependencies] anchor-lang = { workspace = true, features = ["init-if-needed"] } diff --git a/solana/solana-ibc/programs/solana-ibc/src/validation_context.rs b/solana/solana-ibc/programs/solana-ibc/src/validation_context.rs index 53b1f9a0..a4bfc2d7 100644 --- a/solana/solana-ibc/programs/solana-ibc/src/validation_context.rs +++ b/solana/solana-ibc/programs/solana-ibc/src/validation_context.rs @@ -1,3 +1,5 @@ +#[cfg(feature = "witness")] +use core::num::NonZeroU64; use std::str::FromStr; use std::time::Duration; @@ -7,7 +9,7 @@ use spl_token::solana_program::clock::Clock; use crate::client_state::AnyClientState; use crate::consensus_state::AnyConsensusState; -use crate::ibc::{self, ConsensusState}; +use crate::ibc; use crate::storage::{self, IbcStorage}; type Result = core::result::Result; @@ -79,27 +81,40 @@ impl ibc::ValidationContext for IbcStorage<'_, '_> { height: &ibc::Height, ) -> Result { let store = self.borrow(); - let state = if height.revision_number() == 1 { - store.chain.consensus_state(height.revision_height().into())? - } else { - None + #[cfg(feature = "witness")] + { + let (_slot, fetched_timestamp, fetched_trie_root) = store + .private + .local_consensus_state + .iter() + .find(|cs| cs.0 == height.revision_height()) + .unwrap(); + let rollup_consensus_state = cf_solana::ConsensusState { + trie_root: ibc::CommitmentRoot::from_bytes( + fetched_trie_root.as_slice(), + ), + timestamp_sec: NonZeroU64::new(*fetched_timestamp).unwrap(), + }; + Ok(AnyConsensusState::Rollup(rollup_consensus_state)) + } + #[cfg(not(feature = "witness"))] + { + let state = if height.revision_number() == 1 { + store.chain.consensus_state(height.revision_height().into())? + } else { + None + } + .ok_or( + ibc::ClientError::MissingLocalConsensusState { + height: *height, + }, + )?; + let guest_consensus_state = cf_guest::ConsensusState { + block_hash: state.0.as_array().to_vec().into(), + timestamp_ns: state.1, + }; + return Ok(AnyConsensusState::Guest(guest_consensus_state)); } - .ok_or(ibc::ClientError::MissingLocalConsensusState { - height: *height, - })?; - let guest_consensus_state = cf_guest::ConsensusState { - block_hash: state.0.as_array().to_vec().into(), - timestamp_ns: state.1, - }; - let wasm_consensus_state = wasm::consensus_state::ConsensusState::new( - guest_consensus_state.encode_vec(), - state.1.into(), - ); - Ok(AnyConsensusState::Wasm(wasm_consensus_state)) - // Ok(Self::AnyConsensusState::from(cf_guest::ConsensusState { - // block_hash: state.0.as_array().to_vec().into(), - // timestamp_ns: state.1, - // })) } fn client_counter(&self) -> Result { From 4c03ca21156f55e1687b6b6bbe4a49754eb88a38 Mon Sep 17 00:00:00 2001 From: dhruvja Date: Sat, 19 Oct 2024 00:37:59 +0530 Subject: [PATCH 2/7] remove witness feature for restaking --- solana/restaking/programs/restaking/Cargo.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/solana/restaking/programs/restaking/Cargo.toml b/solana/restaking/programs/restaking/Cargo.toml index e54dd439..ca817d2f 100644 --- a/solana/restaking/programs/restaking/Cargo.toml +++ b/solana/restaking/programs/restaking/Cargo.toml @@ -16,7 +16,6 @@ no-idl = [] no-log-ix-name = [] cpi = ["no-entrypoint"] default = [] -witness = [] [dependencies] anchor-lang = { workspace = true, features = ["init-if-needed"] } From 5e04f5789b79a501026947a44c6ee8a1f4d83926 Mon Sep 17 00:00:00 2001 From: dhruvja Date: Sat, 19 Oct 2024 01:29:20 +0530 Subject: [PATCH 3/7] propagate error outside the feature --- .../solana-ibc/src/validation_context.rs | 72 ++++++++++--------- 1 file changed, 37 insertions(+), 35 deletions(-) diff --git a/solana/solana-ibc/programs/solana-ibc/src/validation_context.rs b/solana/solana-ibc/programs/solana-ibc/src/validation_context.rs index a4bfc2d7..aa17675b 100644 --- a/solana/solana-ibc/programs/solana-ibc/src/validation_context.rs +++ b/solana/solana-ibc/programs/solana-ibc/src/validation_context.rs @@ -82,39 +82,39 @@ impl ibc::ValidationContext for IbcStorage<'_, '_> { ) -> Result { let store = self.borrow(); #[cfg(feature = "witness")] - { - let (_slot, fetched_timestamp, fetched_trie_root) = store - .private - .local_consensus_state - .iter() - .find(|cs| cs.0 == height.revision_height()) - .unwrap(); - let rollup_consensus_state = cf_solana::ConsensusState { - trie_root: ibc::CommitmentRoot::from_bytes( - fetched_trie_root.as_slice(), - ), - timestamp_sec: NonZeroU64::new(*fetched_timestamp).unwrap(), - }; - Ok(AnyConsensusState::Rollup(rollup_consensus_state)) - } + let state = store + .private + .local_consensus_state + .iter() + .find(|cs| cs.0 == height.revision_height()) + .map(|(_slot, timestamp, trie_root)| { + let state = cf_solana::ConsensusState { + trie_root: ibc::CommitmentRoot::from_bytes( + trie_root.as_slice(), + ), + timestamp_sec: NonZeroU64::new(*timestamp).unwrap(), + }; + AnyConsensusState::Rollup(state) + }); #[cfg(not(feature = "witness"))] - { - let state = if height.revision_number() == 1 { - store.chain.consensus_state(height.revision_height().into())? - } else { - None - } - .ok_or( - ibc::ClientError::MissingLocalConsensusState { - height: *height, - }, - )?; - let guest_consensus_state = cf_guest::ConsensusState { - block_hash: state.0.as_array().to_vec().into(), - timestamp_ns: state.1, - }; - return Ok(AnyConsensusState::Guest(guest_consensus_state)); - } + let state = (height.revision_number() == 1) + .then(|| { + let height = height.revision_height().into(); + store.chain.consensus_state(height) + }) + .transpose()? + .flatten() + .map(|state| { + let state = cf_guest::ConsensusState { + block_hash: state.0.as_array().to_vec().into(), + timestamp_ns: state.1, + }; + AnyConsensusState::Guest(state) + }); + state.ok_or( + ibc::ClientError::MissingLocalConsensusState { height: *height } + .into(), + ) } fn client_counter(&self) -> Result { @@ -285,7 +285,9 @@ impl ibc::ValidationContext for IbcStorage<'_, '_> { } } - fn get_client_validation_context(&self) -> &Self::V { self } + fn get_client_validation_context(&self) -> &Self::V { + self + } fn get_compatible_versions(&self) -> Vec { ibc::conn::get_compatible_versions() @@ -398,7 +400,7 @@ fn calculate_block_delay( if max_expected_time_per_block.is_zero() { return 0; } - let delay = delay_period_time.as_secs_f64() / - max_expected_time_per_block.as_secs_f64(); + let delay = delay_period_time.as_secs_f64() + / max_expected_time_per_block.as_secs_f64(); delay.ceil() as u64 } From ec57402c4b3e7300817623c2b7cf47741beeafa4 Mon Sep 17 00:00:00 2001 From: dhruvja Date: Sat, 19 Oct 2024 01:32:49 +0530 Subject: [PATCH 4/7] add revision number check for witness feature --- .../solana-ibc/src/validation_context.rs | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/solana/solana-ibc/programs/solana-ibc/src/validation_context.rs b/solana/solana-ibc/programs/solana-ibc/src/validation_context.rs index aa17675b..879ae372 100644 --- a/solana/solana-ibc/programs/solana-ibc/src/validation_context.rs +++ b/solana/solana-ibc/programs/solana-ibc/src/validation_context.rs @@ -82,20 +82,22 @@ impl ibc::ValidationContext for IbcStorage<'_, '_> { ) -> Result { let store = self.borrow(); #[cfg(feature = "witness")] - let state = store - .private - .local_consensus_state - .iter() - .find(|cs| cs.0 == height.revision_height()) - .map(|(_slot, timestamp, trie_root)| { - let state = cf_solana::ConsensusState { - trie_root: ibc::CommitmentRoot::from_bytes( - trie_root.as_slice(), - ), - timestamp_sec: NonZeroU64::new(*timestamp).unwrap(), - }; - AnyConsensusState::Rollup(state) - }); + let state = (height.revision_number() == 1).then(|| { + store + .private + .local_consensus_state + .iter() + .find(|cs| cs.0 == height.revision_height()) + .map(|(_slot, timestamp, trie_root)| { + let state = cf_solana::ConsensusState { + trie_root: ibc::CommitmentRoot::from_bytes( + trie_root.as_slice(), + ), + timestamp_sec: NonZeroU64::new(*timestamp).unwrap(), + }; + AnyConsensusState::Rollup(state) + }) + }); #[cfg(not(feature = "witness"))] let state = (height.revision_number() == 1) .then(|| { From b207c1207a4ba7a112a38031fef542bb63935b1c Mon Sep 17 00:00:00 2001 From: dhruvja Date: Sat, 19 Oct 2024 01:33:06 +0530 Subject: [PATCH 5/7] fmt --- .../programs/solana-ibc/src/validation_context.rs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/solana/solana-ibc/programs/solana-ibc/src/validation_context.rs b/solana/solana-ibc/programs/solana-ibc/src/validation_context.rs index 879ae372..92b5f20f 100644 --- a/solana/solana-ibc/programs/solana-ibc/src/validation_context.rs +++ b/solana/solana-ibc/programs/solana-ibc/src/validation_context.rs @@ -287,9 +287,7 @@ impl ibc::ValidationContext for IbcStorage<'_, '_> { } } - fn get_client_validation_context(&self) -> &Self::V { - self - } + fn get_client_validation_context(&self) -> &Self::V { self } fn get_compatible_versions(&self) -> Vec { ibc::conn::get_compatible_versions() @@ -402,7 +400,7 @@ fn calculate_block_delay( if max_expected_time_per_block.is_zero() { return 0; } - let delay = delay_period_time.as_secs_f64() - / max_expected_time_per_block.as_secs_f64(); + let delay = delay_period_time.as_secs_f64() / + max_expected_time_per_block.as_secs_f64(); delay.ceil() as u64 } From 8fc88a900553924da1d4a08174d177c82be5521a Mon Sep 17 00:00:00 2001 From: dhruvja Date: Sat, 19 Oct 2024 01:44:58 +0530 Subject: [PATCH 6/7] flatten --- .../solana-ibc/src/validation_context.rs | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/solana/solana-ibc/programs/solana-ibc/src/validation_context.rs b/solana/solana-ibc/programs/solana-ibc/src/validation_context.rs index 92b5f20f..173625ed 100644 --- a/solana/solana-ibc/programs/solana-ibc/src/validation_context.rs +++ b/solana/solana-ibc/programs/solana-ibc/src/validation_context.rs @@ -82,22 +82,24 @@ impl ibc::ValidationContext for IbcStorage<'_, '_> { ) -> Result { let store = self.borrow(); #[cfg(feature = "witness")] - let state = (height.revision_number() == 1).then(|| { - store - .private - .local_consensus_state - .iter() - .find(|cs| cs.0 == height.revision_height()) - .map(|(_slot, timestamp, trie_root)| { - let state = cf_solana::ConsensusState { - trie_root: ibc::CommitmentRoot::from_bytes( - trie_root.as_slice(), - ), - timestamp_sec: NonZeroU64::new(*timestamp).unwrap(), - }; - AnyConsensusState::Rollup(state) - }) - }); + let state = (height.revision_number() == 1) + .then(|| { + store + .private + .local_consensus_state + .iter() + .find(|cs| cs.0 == height.revision_height()) + .map(|(_slot, timestamp, trie_root)| { + let state = cf_solana::ConsensusState { + trie_root: ibc::CommitmentRoot::from_bytes( + trie_root.as_slice(), + ), + timestamp_sec: NonZeroU64::new(*timestamp).unwrap(), + }; + AnyConsensusState::Rollup(state) + }) + }) + .flatten(); #[cfg(not(feature = "witness"))] let state = (height.revision_number() == 1) .then(|| { From 3f05e6ff183148bf2876c4e12f923c6b50b67f97 Mon Sep 17 00:00:00 2001 From: dhruvja Date: Sat, 19 Oct 2024 01:45:46 +0530 Subject: [PATCH 7/7] use more concise trie root conversion --- .../solana-ibc/programs/solana-ibc/src/validation_context.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/solana/solana-ibc/programs/solana-ibc/src/validation_context.rs b/solana/solana-ibc/programs/solana-ibc/src/validation_context.rs index 173625ed..61e40367 100644 --- a/solana/solana-ibc/programs/solana-ibc/src/validation_context.rs +++ b/solana/solana-ibc/programs/solana-ibc/src/validation_context.rs @@ -91,9 +91,7 @@ impl ibc::ValidationContext for IbcStorage<'_, '_> { .find(|cs| cs.0 == height.revision_height()) .map(|(_slot, timestamp, trie_root)| { let state = cf_solana::ConsensusState { - trie_root: ibc::CommitmentRoot::from_bytes( - trie_root.as_slice(), - ), + trie_root: trie_root.to_vec().into(), timestamp_sec: NonZeroU64::new(*timestamp).unwrap(), }; AnyConsensusState::Rollup(state)