Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 15 additions & 17 deletions core/src/ibc/client_02/manager.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,30 +19,28 @@ use super::types::{ConsensusState, State};
use crate::ibc;
use ibc::client_02::get_state;

#[derive(Default)]
pub struct Manager {}
pub struct Manager<'a> {
ctx: &'a mut dyn ibc::Context,
}

impl Manager {
pub fn new() -> Self {
Manager {}
impl<'a> Manager<'a> {
pub fn new(ctx: &'a mut dyn ibc::Context) -> Self {
Manager {
ctx,
}
}

pub fn create(
&self,
ctx: &mut dyn ibc::Context,
id: &str,
cs: &dyn ConsensusState,
) -> Result<Box<dyn State>, String> {
let state = new_state(id, ctx, cs.kind());
if state.exists(ctx) {
pub fn create(&mut self, id: &str, cs: &dyn ConsensusState) -> Result<Box<dyn State>, String> {
let state = new_state(id, self.ctx, cs.kind());
if state.exists(self.ctx) {
return Err("Create client on already existing id".to_owned())
}
state.set_root(ctx, cs.get_height(), cs.get_root());
state.set_consensus_state(ctx, cs);
state.set_root(self.ctx, cs.get_height(), cs.get_root());
state.set_consensus_state(self.ctx, cs);
Ok(state)
}

pub fn query(&self, ctx: &mut dyn ibc::Context, id: &str) -> Result<Box<dyn State>, String> {
get_state(id, ctx)
pub fn query(&mut self, id: &str) -> Result<Box<dyn State>, String> {
get_state(id, self.ctx)
}
}
43 changes: 21 additions & 22 deletions core/src/ibc/connection_03/manager.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,29 +21,31 @@ use crate::ibc::connection_03::client_connections_path;
use crate::ibc::connection_03::types::{ConnectionEnd, ConnectionIdentifiersInClient, ConnectionState};
use rlp::{Encodable, Rlp};

#[derive(Default)]
pub struct Manager {}
pub struct Manager<'a> {
ctx: &'a mut dyn ibc::Context,
}

// FIXME: this will be changed after implementing Vector commitment
fn get_commiment_prefix() -> String {
"".to_owned()
}

impl Manager {
pub fn new() -> Self {
Manager {}
impl<'a> Manager<'a> {
pub fn new(ctx: &'a mut dyn ibc::Context) -> Self {
Manager {
ctx,
}
}

pub fn handle_open_init(
&self,
ctx: &mut dyn ibc::Context,
&mut self,
identifier: Identifier,
desired_counterparty_connection_identifier: Identifier,
counterparty_prefix: CommitmentPrefix,
client_identifier: Identifier,
counterparty_client_identifier: Identifier,
) -> Result<(), String> {
let kv_store = ctx.get_kv_store();
let kv_store = self.ctx.get_kv_store();
if kv_store.has(&connection_path(&identifier)) {
return Err("Connection exist".to_owned())
}
Expand All @@ -56,15 +58,14 @@ impl Manager {
counterparty_client_identifier,
};
kv_store.set(&connection_path(&identifier), &connection.rlp_bytes());
self.add_connection_to_client(ctx, client_identifier, identifier)?;
self.add_connection_to_client(client_identifier, identifier)?;
Ok(())
}

// We all following ICS spec.
#[allow(clippy::too_many_arguments)]
pub fn handle_open_try(
&self,
ctx: &mut dyn ibc::Context,
&mut self,
desired_identifier: Identifier,
counterparty_connection_identifier: Identifier,
counterparty_prefix: CommitmentPrefix,
Expand All @@ -75,7 +76,7 @@ impl Manager {
proof_height: u64,
consensus_height: u64,
) -> Result<(), String> {
let current_height = ctx.get_current_height();
let current_height = self.ctx.get_current_height();
if consensus_height > current_height {
return Err(format!(
"Consensus height {} is greater than current height {}",
Expand All @@ -98,9 +99,9 @@ impl Manager {
counterparty_client_identifier: counterparty_client_identifier.clone(),
};

self.verify_connection_state(ctx, &connection, proof_height, proof_init, desired_identifier.clone(), &expected);
self.verify_connection_state(&connection, proof_height, proof_init, desired_identifier.clone(), &expected);

if let Some(previous_connection_end) = self.query(ctx, &desired_identifier) {
if let Some(previous_connection_end) = self.query(&desired_identifier) {
let expected_init = ConnectionEnd {
state: ConnectionState::INIT,
counterparty_connection_identifier,
Expand All @@ -116,13 +117,13 @@ impl Manager {
}
}

let kv_store = ctx.get_kv_store();
let kv_store = self.ctx.get_kv_store();
kv_store.set(&connection_path(&desired_identifier), &connection.rlp_bytes());
Ok(())
}

fn query(&self, ctx: &mut dyn ibc::Context, identifier: &str) -> Option<ConnectionEnd> {
let kv_store = ctx.get_kv_store();
fn query(&mut self, identifier: &str) -> Option<ConnectionEnd> {
let kv_store = self.ctx.get_kv_store();

let path = connection_path(&identifier);
if kv_store.has(&path) {
Expand All @@ -135,8 +136,7 @@ impl Manager {
}

fn verify_connection_state(
&self,
ctx: &mut dyn ibc::Context,
&mut self,
connection: &ConnectionEnd,
proof_height: u64,
proof: CommitmentProof,
Expand All @@ -160,12 +160,11 @@ impl Manager {
}

fn add_connection_to_client(
&self,
ctx: &mut dyn ibc::Context,
&mut self,
client_identifier: Identifier,
connection_identifier: Identifier,
) -> Result<(), String> {
let kv_store = ctx.get_kv_store();
let kv_store = self.ctx.get_kv_store();
if kv_store.has(&connection_path(&connection_identifier)) {
return Err("Connection exist".to_owned())
}
Expand Down
14 changes: 6 additions & 8 deletions core/src/ibc/transaction_handler/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -53,10 +53,9 @@ pub fn execute(
client_identifier,
counterparty_client_identifier,
} => {
let connection_manager = ibc_connection::Manager::new();
let mut connection_manager = ibc_connection::Manager::new(&mut context);
connection_manager
.handle_open_init(
&mut context,
identifier,
desired_counterparty_connection_identifier,
counterparty_prefix,
Expand All @@ -77,10 +76,9 @@ pub fn execute(
consensus_height,
} => {
let mut context = ibc_context::TopLevelContext::new(state, current_block_number);
let connection_manager = ibc_connection::Manager::new();
let mut connection_manager = ibc_connection::Manager::new(&mut context);
connection_manager
.handle_open_try(
&mut context,
desired_identifier,
counterparty_connection_identifier,
counterparty_prefix,
Expand All @@ -103,7 +101,7 @@ fn create_client(
kind: ibc_client::Kind,
consensus_state: &[u8],
) -> StateResult<()> {
let client_manager = ibc_client::Manager::new();
let mut client_manager = ibc_client::Manager::new(ctx);
if kind != ibc_client::KIND_FOUNDRY {
return Err(RuntimeError::IBC(format!("CreateClient has invalid type {}", kind)).into())
}
Expand All @@ -116,14 +114,14 @@ fn create_client(
};

client_manager
.create(ctx, id, &foundry_consensus_state)
.create(id, &foundry_consensus_state)
.map_err(|err| RuntimeError::IBC(format!("CreateClient: {:?}", err)))?;
Ok(())
}

fn update_client(ctx: &mut dyn ibc::Context, id: &str, header: &[u8]) -> StateResult<()> {
let client_manager = ibc_client::Manager::new();
let client_state = client_manager.query(ctx, id).map_err(RuntimeError::IBC)?;
let mut client_manager = ibc_client::Manager::new(ctx);
let client_state = client_manager.query(id).map_err(RuntimeError::IBC)?;

client_state.update(ctx, header).map_err(RuntimeError::IBC)?;

Expand Down
10 changes: 4 additions & 6 deletions rpc/src/v1/impls/ibc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -57,9 +57,8 @@ where
};

let mut context = ibc::context::TopLevelContext::new(&mut state, block_number);
let client_manager = ibc::client::Manager::new();
let client_state =
client_manager.query(&mut context, &client_id).map_err(|_| errors::ibc_client_not_exist())?;
let mut client_manager = ibc::client::Manager::new(&mut context);
let client_state = client_manager.query(&client_id).map_err(|_| errors::ibc_client_not_exist())?;

let consensus_state = client_state.get_consensus_state(&mut context);

Expand Down Expand Up @@ -97,9 +96,8 @@ where
};

let mut context = ibc::context::TopLevelContext::new(&mut state, block_number);
let client_manager = ibc::client::Manager::new();
let client_state =
client_manager.query(&mut context, &client_id).map_err(|_| errors::ibc_client_not_exist())?;
let mut client_manager = ibc::client::Manager::new(&mut context);
let client_state = client_manager.query(&client_id).map_err(|_| errors::ibc_client_not_exist())?;

let root =
client_state.get_root(&mut context, other_block_number).map_err(|_| errors::ibc_client_root_not_exist())?;
Expand Down