Skip to content

Commit 61ee18a

Browse files
committed
use new v2 paths for commit ack receipt
1 parent edcbb07 commit 61ee18a

File tree

5 files changed

+150
-50
lines changed

5 files changed

+150
-50
lines changed

ibc-eureka-core/ics04-channel/src/context.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ use ibc_eureka_core_client::context::prelude::*;
55
use ibc_eureka_core_handler_types::events::IbcEvent;
66
use ibc_eureka_core_host::types::error::HostError;
77
use ibc_eureka_core_host::types::identifiers::Sequence;
8-
use ibc_eureka_core_host::types::path::{CommitmentPath, SeqSendPath};
8+
use ibc_eureka_core_host::types::path::{
9+
CommitmentPathV2 as CommitmentPath, SeqSendPathV2 as SeqSendPath,
10+
};
911
use ibc_eureka_core_host::{ExecutionContext, ValidationContext};
1012
use ibc_primitives::prelude::*;
1113

ibc-eureka-core/ics04-channel/src/handler/acknowledgement.rs

Lines changed: 44 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ use ibc_eureka_core_channel_types::events::AcknowledgePacket;
66
use ibc_eureka_core_channel_types::msgs::MsgAcknowledgement;
77
use ibc_eureka_core_client::context::prelude::*;
88
use ibc_eureka_core_handler_types::events::{IbcEvent, MessageEvent};
9-
use ibc_eureka_core_host::types::path::{AckPath, ClientConsensusStatePath, CommitmentPath, Path};
9+
use ibc_eureka_core_host::types::path::{
10+
AckPathV2 as AckPath, ClientConsensusStatePath, CommitmentPathV2 as CommitmentPath, Path,
11+
};
1012
use ibc_eureka_core_host::{ExecutionContext, ValidationContext};
1113
use ibc_eureka_core_router::module::Module;
1214
use ibc_primitives::prelude::*;
@@ -35,16 +37,24 @@ where
3537
let packet = &msg.packet;
3638
let payload = &packet.payloads[0];
3739

38-
let (_, port_id_on_a) = &payload.header.source_port;
39-
let channel_id_on_a = &packet.header.target_client_on_source;
40+
let (source_prefix, _source_port) = &payload.header.source_port;
41+
let channel_target_client_on_source = &packet.header.target_client_on_source;
42+
let (target_prefix, _target_port) = &payload.header.target_port;
43+
let channel_source_client_on_target = &packet.header.source_client_on_target;
4044
let seq_on_a = &packet.header.seq_on_a;
4145

4246
// In all cases, this event is emitted
4347
let event = IbcEvent::AcknowledgePacket(AcknowledgePacket::new(packet.clone()));
4448
ctx_a.emit_ibc_event(IbcEvent::Message(MessageEvent::Channel))?;
4549
ctx_a.emit_ibc_event(event)?;
4650

47-
let commitment_path_on_a = CommitmentPath::new(port_id_on_a, channel_id_on_a, *seq_on_a);
51+
let commitment_path_on_a = CommitmentPath::new(
52+
channel_source_client_on_target.as_ref(),
53+
&format!("{source_prefix:?}"),
54+
channel_target_client_on_source.as_ref(),
55+
&format!("{target_prefix:?}"),
56+
seq_on_a,
57+
);
4858

4959
// check if we're in the NO-OP case
5060
if ctx_a.get_packet_commitment(&commitment_path_on_a).is_err() {
@@ -92,14 +102,20 @@ where
92102
let packet = &msg.packet;
93103
let payload = &packet.payloads[0];
94104

95-
let (prefix_on_a, port_id_on_a) = &payload.header.source_port;
96-
let channel_id_on_a = &packet.header.target_client_on_source;
97-
let (_, port_id_on_b) = &payload.header.target_port;
98-
let channel_id_on_b = &packet.header.source_client_on_target;
105+
let (source_prefix, _source_port) = &payload.header.source_port;
106+
let channel_target_client_on_source = &packet.header.target_client_on_source;
107+
let (target_prefix, _target_port) = &payload.header.target_port;
108+
let channel_source_client_on_target = &packet.header.source_client_on_target;
99109
let seq_on_a = &packet.header.seq_on_a;
100110
let data = &payload.data;
101111

102-
let commitment_path_on_a = CommitmentPath::new(port_id_on_a, channel_id_on_a, *seq_on_a);
112+
let commitment_path_on_a = CommitmentPath::new(
113+
channel_source_client_on_target.as_ref(),
114+
&format!("{source_prefix:?}"),
115+
channel_target_client_on_source.as_ref(),
116+
&format!("{target_prefix:?}"),
117+
seq_on_a,
118+
);
103119

104120
// Verify packet commitment
105121
let Ok(commitment_on_a) = ctx_a.get_packet_commitment(&commitment_path_on_a) else {
@@ -126,34 +142,43 @@ where
126142
// Verify proofs
127143
{
128144
// TODO(rano): avoid a vs b confusion
129-
let client_id_on_a = channel_id_on_b.as_ref();
145+
let id_target_client_on_source = channel_target_client_on_source.as_ref();
130146

131147
let client_val_ctx_a = ctx_a.get_client_validation_context();
132148

133-
let client_state_of_b_on_a = client_val_ctx_a.client_state(client_id_on_a)?;
149+
let target_client_on_source = client_val_ctx_a.client_state(id_target_client_on_source)?;
134150

135-
client_state_of_b_on_a
136-
.status(ctx_a.get_client_validation_context(), client_id_on_a)?
151+
target_client_on_source
152+
.status(
153+
ctx_a.get_client_validation_context(),
154+
id_target_client_on_source,
155+
)?
137156
.verify_is_active()?;
138157

139-
client_state_of_b_on_a.validate_proof_height(msg.proof_height_on_b)?;
158+
target_client_on_source.validate_proof_height(msg.proof_height_on_b)?;
140159

141160
let client_cons_state_path_on_a = ClientConsensusStatePath::new(
142-
client_id_on_a.clone(),
161+
id_target_client_on_source.clone(),
143162
msg.proof_height_on_b.revision_number(),
144163
msg.proof_height_on_b.revision_height(),
145164
);
146165
let consensus_state_of_b_on_a =
147166
client_val_ctx_a.consensus_state(&client_cons_state_path_on_a)?;
148167
let ack_commitment = compute_ack_commitment(&msg.acknowledgement);
149-
let ack_path_on_b = AckPath::new(port_id_on_b, channel_id_on_b, *seq_on_a);
168+
let ack_path_on_b = AckPath::new(
169+
channel_source_client_on_target.as_ref(),
170+
&format!("{source_prefix:?}"),
171+
channel_target_client_on_source.as_ref(),
172+
&format!("{target_prefix:?}"),
173+
seq_on_a,
174+
);
150175

151176
// Verify the proof for the packet against the chain store.
152-
client_state_of_b_on_a.verify_membership(
153-
prefix_on_a,
177+
target_client_on_source.verify_membership(
178+
target_prefix,
154179
&msg.proof_acked_on_b,
155180
consensus_state_of_b_on_a.root(),
156-
Path::Ack(ack_path_on_b),
181+
Path::AckV2(ack_path_on_b),
157182
ack_commitment.into_vec(),
158183
)?;
159184
}

ibc-eureka-core/ics04-channel/src/handler/recv_packet.rs

Lines changed: 46 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ use ibc_eureka_core_channel_types::msgs::MsgRecvPacket;
77
use ibc_eureka_core_client::context::prelude::*;
88
use ibc_eureka_core_handler_types::events::{IbcEvent, MessageEvent};
99
use ibc_eureka_core_host::types::path::{
10-
AckPath, ClientConsensusStatePath, CommitmentPath, Path, ReceiptPath, SeqRecvPath,
10+
AckPathV2 as AckPath, ClientConsensusStatePath, CommitmentPathV2 as CommitmentPath, Path,
11+
ReceiptPathV2 as ReceiptPath, SeqRecvPathV2 as SeqRecvPath,
1112
};
1213
use ibc_eureka_core_host::{ExecutionContext, ValidationContext};
1314
use ibc_eureka_core_router::module::Module;
@@ -35,16 +36,23 @@ where
3536
let packet = &msg.packet;
3637
let payload = &packet.payloads[0];
3738

38-
let (_, target_port) = &payload.header.target_port;
39+
let (source_prefix, _source_port) = &payload.header.source_port;
3940
let channel_source_client_on_target = &packet.header.source_client_on_target;
41+
let (target_prefix, _target_port) = &payload.header.target_port;
42+
let channel_target_client_on_source = &packet.header.target_client_on_source;
4043
let seq_on_a = &packet.header.seq_on_a;
4144

4245
// Check if another relayer already relayed the packet.
4346
// We don't want to fail the transaction in this case.
4447
{
4548
let packet_already_received = {
46-
let receipt_path_on_b =
47-
ReceiptPath::new(target_port, channel_source_client_on_target, *seq_on_a);
49+
let receipt_path_on_b = ReceiptPath::new(
50+
channel_source_client_on_target.as_ref(),
51+
&format!("{source_prefix:?}"),
52+
channel_target_client_on_source.as_ref(),
53+
&format!("{target_prefix:?}"),
54+
seq_on_a,
55+
);
4856
ctx_b.get_packet_receipt(&receipt_path_on_b)?.is_ok()
4957
};
5058

@@ -59,11 +67,22 @@ where
5967
{
6068
// `recvPacket` core handler state changes
6169
{
62-
let seq_recv_path_on_b = SeqRecvPath::new(target_port, channel_source_client_on_target);
70+
let seq_recv_path_on_b = SeqRecvPath::new(
71+
channel_source_client_on_target.as_ref(),
72+
&format!("{source_prefix:?}"),
73+
channel_target_client_on_source.as_ref(),
74+
&format!("{target_prefix:?}"),
75+
);
6376
let next_seq_recv = ctx_b.get_next_sequence_recv(&seq_recv_path_on_b)?;
6477
ctx_b.store_next_sequence_recv(&seq_recv_path_on_b, next_seq_recv.increment())?;
6578
}
66-
let ack_path_on_b = AckPath::new(target_port, channel_source_client_on_target, *seq_on_a);
79+
let ack_path_on_b = AckPath::new(
80+
channel_source_client_on_target.as_ref(),
81+
&format!("{source_prefix:?}"),
82+
channel_target_client_on_source.as_ref(),
83+
&format!("{target_prefix:?}"),
84+
seq_on_a,
85+
);
6786
// `writeAcknowledgement` handler state changes
6887
ctx_b.store_packet_acknowledgement(
6988
&ack_path_on_b,
@@ -105,8 +124,9 @@ where
105124
let packet = &msg.packet;
106125
let payload = &packet.payloads[0];
107126

108-
let (prefix_source, source_port) = &payload.header.source_port;
127+
let (source_prefix, _source_port) = &payload.header.source_port;
109128
let channel_target_client_on_source = &packet.header.target_client_on_source;
129+
let (target_prefix, _target_port) = &payload.header.target_port;
110130
let channel_source_client_on_target = &packet.header.source_client_on_target;
111131
let seq_on_a = &packet.header.seq_on_a;
112132
let data = &payload.data;
@@ -157,15 +177,20 @@ where
157177
&packet.header.timeout_height_on_b,
158178
&packet.header.timeout_timestamp_on_b,
159179
);
160-
let commitment_path_on_a =
161-
CommitmentPath::new(source_port, channel_target_client_on_source, *seq_on_a);
180+
let commitment_path_on_a = CommitmentPath::new(
181+
channel_source_client_on_target.as_ref(),
182+
&format!("{source_prefix:?}"),
183+
channel_target_client_on_source.as_ref(),
184+
&format!("{target_prefix:?}"),
185+
seq_on_a,
186+
);
162187

163188
// Verify the proof for the packet against the chain store.
164189
source_client_on_target.verify_membership(
165-
prefix_source,
190+
source_prefix,
166191
&msg.proof_commitment_on_a,
167192
consensus_state_of_a_on_b.root(),
168-
Path::Commitment(commitment_path_on_a),
193+
Path::CommitmentV2(commitment_path_on_a),
169194
expected_commitment_on_a.into_vec(),
170195
)?;
171196
}
@@ -191,11 +216,19 @@ where
191216
let packet = &msg.packet;
192217
let payload = &packet.payloads[0];
193218

194-
let (_, target_port) = &payload.header.target_port;
195219
let channel_source_client_on_target = &packet.header.source_client_on_target;
220+
let (target_prefix, _target_port) = &payload.header.target_port;
221+
let channel_target_client_on_source = &packet.header.target_client_on_source;
222+
let (source_prefix, _source_port) = &payload.header.source_port;
196223
let seq_on_a = &packet.header.seq_on_a;
197224

198-
let ack_path_on_b = AckPath::new(target_port, channel_source_client_on_target, *seq_on_a);
225+
let ack_path_on_b = AckPath::new(
226+
channel_source_client_on_target.as_ref(),
227+
&format!("{source_prefix:?}"),
228+
channel_target_client_on_source.as_ref(),
229+
&format!("{target_prefix:?}"),
230+
seq_on_a,
231+
);
199232
if ctx_b.get_packet_acknowledgement(&ack_path_on_b).is_ok() {
200233
return Err(ChannelError::DuplicateAcknowledgment(*seq_on_a));
201234
}

ibc-eureka-core/ics04-channel/src/handler/send_packet.rs

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ use ibc_eureka_core_channel_types::events::SendPacket;
44
use ibc_eureka_core_channel_types::packet::Packet;
55
use ibc_eureka_core_client::context::prelude::*;
66
use ibc_eureka_core_handler_types::events::{IbcEvent, MessageEvent};
7-
use ibc_eureka_core_host::types::path::{ClientConsensusStatePath, CommitmentPath, SeqSendPath};
7+
use ibc_eureka_core_host::types::path::{
8+
ClientConsensusStatePath, CommitmentPathV2 as CommitmentPath, SeqSendPathV2 as SeqSendPath,
9+
};
810
use ibc_primitives::prelude::*;
911

1012
use crate::context::{SendPacketExecutionContext, SendPacketValidationContext};
@@ -32,8 +34,10 @@ pub fn send_packet_validate(
3234

3335
let payload = &packet.payloads[0];
3436

35-
let (_, source_port) = &payload.header.source_port;
37+
let (source_prefix, _source_port) = &payload.header.source_port;
3638
let channel_target_client_on_source = &packet.header.target_client_on_source;
39+
let (target_prefix, _target_port) = &payload.header.target_port;
40+
let channel_source_client_on_target = &packet.header.source_client_on_target;
3741
let seq_on_a = &packet.header.seq_on_a;
3842

3943
let id_target_client_on_source = channel_target_client_on_source.as_ref();
@@ -75,7 +79,12 @@ pub fn send_packet_validate(
7579
}
7680

7781
// TODO(rano): include full channel identifier in the path
78-
let seq_send_path_on_a = SeqSendPath::new(source_port, channel_target_client_on_source);
82+
let seq_send_path_on_a = SeqSendPath::new(
83+
channel_source_client_on_target.as_ref(),
84+
&format!("{source_prefix:?}"),
85+
channel_target_client_on_source.as_ref(),
86+
&format!("{target_prefix:?}"),
87+
);
7988
let next_seq_send_on_a = ctx_a.get_next_sequence_send(&seq_send_path_on_a)?;
8089

8190
if seq_on_a != &next_seq_send_on_a {
@@ -97,20 +106,33 @@ pub fn send_packet_execute(
97106
) -> Result<(), ChannelError> {
98107
let payload = &packet.payloads[0];
99108

100-
let (_, source_port) = &payload.header.source_port;
109+
let (source_prefix, _source_port) = &payload.header.source_port;
101110
let channel_target_client_on_source = &packet.header.target_client_on_source;
111+
let (target_prefix, _target_port) = &payload.header.target_port;
112+
let channel_source_client_on_target = &packet.header.source_client_on_target;
102113
let seq_on_a = &packet.header.seq_on_a;
103114
let data = &payload.data;
104115

105116
{
106-
let seq_send_path_on_a = SeqSendPath::new(source_port, channel_target_client_on_source);
117+
let seq_send_path_on_a = SeqSendPath::new(
118+
channel_source_client_on_target.as_ref(),
119+
&format!("{source_prefix:?}"),
120+
channel_target_client_on_source.as_ref(),
121+
&format!("{target_prefix:?}"),
122+
);
107123
let next_seq_send_on_a = ctx_a.get_next_sequence_send(&seq_send_path_on_a)?;
108124

109125
ctx_a.store_next_sequence_send(&seq_send_path_on_a, next_seq_send_on_a.increment())?;
110126
}
111127

112128
ctx_a.store_packet_commitment(
113-
&CommitmentPath::new(source_port, channel_target_client_on_source, *seq_on_a),
129+
&CommitmentPath::new(
130+
channel_source_client_on_target.as_ref(),
131+
&format!("{source_prefix:?}"),
132+
channel_target_client_on_source.as_ref(),
133+
&format!("{target_prefix:?}"),
134+
seq_on_a,
135+
),
114136
compute_packet_commitment(
115137
data,
116138
&packet.header.timeout_height_on_b,

0 commit comments

Comments
 (0)