Skip to content

Commit 95da20d

Browse files
committed
Add get_current_height function to the IBC Context
The connection spec's OpenTry datagram handler needs to know the host's current height. Connection Spec: https://github.com/cosmos/ics/tree/master/spec/ics-003-connection-semantics Host Spec: https://github.com/cosmos/ics/tree/master/spec/ics-024-host-requirements#consensus-state-introspection
1 parent 5ebf5cb commit 95da20d

File tree

6 files changed

+30
-11
lines changed

6 files changed

+30
-11
lines changed

core/src/client/client.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -867,7 +867,8 @@ impl IBCTransactionExecutor for Client {
867867
state: &mut TopLevelState,
868868
fee_payer: &Address,
869869
sender_pubkey: &Public,
870+
current_block_number: BlockNumber,
870871
) -> StateResult<()> {
871-
ibc::execute_transaction(bytes, state, fee_payer, sender_pubkey)
872+
ibc::execute_transaction(bytes, state, fee_payer, sender_pubkey, current_block_number)
872873
}
873874
}

core/src/ibc/context.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,18 +22,21 @@ use rlp::RlpStream;
2222

2323
pub trait Context {
2424
fn get_kv_store(&mut self) -> &mut dyn kv_store::KVStore;
25+
fn get_current_height(&self) -> u64;
2526
}
2627

2728
pub struct TopLevelContext<'a> {
2829
kv_store: TopLevelKVStore<'a>,
30+
current_height: u64,
2931
}
3032

3133
impl<'a> TopLevelContext<'a> {
32-
pub fn new(state: &'a mut TopLevelState) -> Self {
34+
pub fn new(state: &'a mut TopLevelState, current_height: u64) -> Self {
3335
TopLevelContext {
3436
kv_store: TopLevelKVStore {
3537
state,
3638
},
39+
current_height,
3740
}
3841
}
3942
}
@@ -42,6 +45,10 @@ impl<'a> Context for TopLevelContext<'a> {
4245
fn get_kv_store(&mut self) -> &mut dyn KVStore {
4346
&mut self.kv_store
4447
}
48+
49+
fn get_current_height(&self) -> u64 {
50+
self.current_height
51+
}
4552
}
4653

4754
struct TopLevelKVStore<'a> {

core/src/ibc/transaction_handler/mod.rs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,26 +32,27 @@ pub fn execute(
3232
state: &mut TopLevelState,
3333
fee_payer: &Address,
3434
_sender_public: &Public,
35+
current_block_number: u64,
3536
) -> StateResult<()> {
3637
let datagram = Datagram::decode(&Rlp::new(bytes)).expect("Verification passed");
3738
match datagram {
3839
Datagram::CreateClient {
3940
id,
4041
kind,
4142
consensus_state,
42-
} => create_client(state, fee_payer, &id, kind, &consensus_state),
43+
} => create_client(state, fee_payer, &id, kind, &consensus_state, current_block_number),
4344
Datagram::UpdateClient {
4445
id,
4546
header,
46-
} => update_client(state, &id, &header),
47+
} => update_client(state, &id, &header, current_block_number),
4748
Datagram::ConnOpenInit {
4849
identifier,
4950
desired_counterparty_connection_identifier,
5051
counterparty_prefix,
5152
client_identifier,
5253
counterparty_client_identifier,
5354
} => {
54-
let mut context = ibc_context::TopLevelContext::new(state);
55+
let mut context = ibc_context::TopLevelContext::new(state, current_block_number);
5556
let connection_manager = ibc_connection::Manager::new();
5657
connection_manager
5758
.handle_open_init(
@@ -74,8 +75,9 @@ fn create_client(
7475
id: &str,
7576
kind: ibc_client::Kind,
7677
consensus_state: &[u8],
78+
current_block_number: u64,
7779
) -> StateResult<()> {
78-
let mut context = ibc_context::TopLevelContext::new(state);
80+
let mut context = ibc_context::TopLevelContext::new(state, current_block_number);
7981
let client_manager = ibc_client::Manager::new();
8082
if kind != ibc_client::KIND_FOUNDRY {
8183
return Err(RuntimeError::IBC(format!("CreateClient has invalid type {}", kind)).into())
@@ -94,8 +96,8 @@ fn create_client(
9496
Ok(())
9597
}
9698

97-
fn update_client(state: &mut TopLevelState, id: &str, header: &[u8]) -> StateResult<()> {
98-
let mut context = ibc_context::TopLevelContext::new(state);
99+
fn update_client(state: &mut TopLevelState, id: &str, header: &[u8], current_block_number: u64) -> StateResult<()> {
100+
let mut context = ibc_context::TopLevelContext::new(state, current_block_number);
99101
let client_manager = ibc_client::Manager::new();
100102
let client_state = client_manager.query(&mut context, id).map_err(RuntimeError::IBC)?;
101103

rpc/src/v1/impls/ibc.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ where
5656
Some(block_number) => block_number,
5757
};
5858

59-
let mut context = ibc::context::TopLevelContext::new(&mut state);
59+
let mut context = ibc::context::TopLevelContext::new(&mut state, block_number);
6060
let client_manager = ibc::client::Manager::new();
6161
let client_state =
6262
client_manager.query(&mut context, &client_id).map_err(|_| errors::ibc_client_not_exist())?;
@@ -96,7 +96,7 @@ where
9696
Some(block_number) => block_number,
9797
};
9898

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

state/src/ibc.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
use crate::{StateResult, TopLevelState};
1818
use ckey::{Address, Public};
19+
use ctypes::BlockNumber;
1920

2021
pub trait IBCTransactionExecutor {
2122
fn execute(
@@ -24,6 +25,7 @@ pub trait IBCTransactionExecutor {
2425
_state: &mut TopLevelState,
2526
_fee_payer: &Address,
2627
_sender_pubkey: &Public,
28+
_current_block_number: BlockNumber,
2729
) -> StateResult<()> {
2830
Ok(())
2931
}

state/src/impls/top_level.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -408,7 +408,14 @@ impl TopLevelState {
408408
Action::IBC {
409409
bytes,
410410
} => {
411-
IBCTransactionExecutor::execute(client, bytes, self, fee_payer, signer_public)?;
411+
IBCTransactionExecutor::execute(
412+
client,
413+
bytes,
414+
self,
415+
fee_payer,
416+
signer_public,
417+
parent_block_number + 1,
418+
)?;
412419
return Ok(())
413420
}
414421
};

0 commit comments

Comments
 (0)