Skip to content

Commit 7c9b0ef

Browse files
committed
fix commitment prefix
1 parent c4f07de commit 7c9b0ef

File tree

7 files changed

+112
-93
lines changed

7 files changed

+112
-93
lines changed

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ where
3636
let payload = &packet.payloads[0];
3737

3838
let (_, port_id_on_a) = &payload.header.source_port;
39-
let channel_id_on_a = &packet.header.source_client;
39+
let channel_id_on_a = &packet.header.target_client_on_source;
4040
let seq_on_a = &packet.header.seq_on_a;
4141

4242
// In all cases, this event is emitted
@@ -93,9 +93,9 @@ where
9393
let payload = &packet.payloads[0];
9494

9595
let (prefix_on_a, port_id_on_a) = &payload.header.source_port;
96-
let channel_id_on_a = &packet.header.source_client;
96+
let channel_id_on_a = &packet.header.target_client_on_source;
9797
let (_, port_id_on_b) = &payload.header.target_port;
98-
let channel_id_on_b = &packet.header.target_client;
98+
let channel_id_on_b = &packet.header.source_client_on_target;
9999
let seq_on_a = &packet.header.seq_on_a;
100100
let data = &payload.data;
101101

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

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,16 @@ where
3535
let packet = &msg.packet;
3636
let payload = &packet.payloads[0];
3737

38-
let (_, port_id_on_b) = &payload.header.target_port;
39-
let channel_id_on_b = &packet.header.target_client;
38+
let (_, target_port) = &payload.header.target_port;
39+
let channel_source_client_on_target = &packet.header.source_client_on_target;
4040
let seq_on_a = &packet.header.seq_on_a;
4141

4242
// Check if another relayer already relayed the packet.
4343
// We don't want to fail the transaction in this case.
4444
{
4545
let packet_already_received = {
46-
let receipt_path_on_b = ReceiptPath::new(port_id_on_b, channel_id_on_b, *seq_on_a);
46+
let receipt_path_on_b =
47+
ReceiptPath::new(target_port, channel_source_client_on_target, *seq_on_a);
4748
ctx_b.get_packet_receipt(&receipt_path_on_b)?.is_ok()
4849
};
4950

@@ -58,11 +59,11 @@ where
5859
{
5960
// `recvPacket` core handler state changes
6061
{
61-
let seq_recv_path_on_b = SeqRecvPath::new(port_id_on_b, channel_id_on_b);
62+
let seq_recv_path_on_b = SeqRecvPath::new(target_port, channel_source_client_on_target);
6263
let next_seq_recv = ctx_b.get_next_sequence_recv(&seq_recv_path_on_b)?;
6364
ctx_b.store_next_sequence_recv(&seq_recv_path_on_b, next_seq_recv.increment())?;
6465
}
65-
let ack_path_on_b = AckPath::new(port_id_on_b, channel_id_on_b, *seq_on_a);
66+
let ack_path_on_b = AckPath::new(target_port, channel_source_client_on_target, *seq_on_a);
6667
// `writeAcknowledgement` handler state changes
6768
ctx_b.store_packet_acknowledgement(
6869
&ack_path_on_b,
@@ -104,10 +105,9 @@ where
104105
let packet = &msg.packet;
105106
let payload = &packet.payloads[0];
106107

107-
let (_, port_id_on_a) = &payload.header.source_port;
108-
let channel_id_on_a = &packet.header.source_client;
109-
let (prefix_on_b, _) = &payload.header.target_port;
110-
let _ = &packet.header.target_client;
108+
let (prefix_source, source_port) = &payload.header.source_port;
109+
let channel_target_client_on_source = &packet.header.target_client_on_source;
110+
let channel_source_client_on_target = &packet.header.source_client_on_target;
111111
let seq_on_a = &packet.header.seq_on_a;
112112
let data = &payload.data;
113113

@@ -130,18 +130,21 @@ where
130130

131131
// Verify proofs
132132
{
133-
let client_id_on_b = channel_id_on_a.as_ref();
133+
let id_source_client_on_target = channel_source_client_on_target.as_ref();
134134
let client_val_ctx_b = ctx_b.get_client_validation_context();
135-
let client_state_of_a_on_b = client_val_ctx_b.client_state(client_id_on_b)?;
135+
let source_client_on_target = client_val_ctx_b.client_state(id_source_client_on_target)?;
136136

137-
client_state_of_a_on_b
138-
.status(ctx_b.get_client_validation_context(), client_id_on_b)?
137+
source_client_on_target
138+
.status(
139+
ctx_b.get_client_validation_context(),
140+
id_source_client_on_target,
141+
)?
139142
.verify_is_active()?;
140143

141-
client_state_of_a_on_b.validate_proof_height(msg.proof_height_on_a)?;
144+
source_client_on_target.validate_proof_height(msg.proof_height_on_a)?;
142145

143146
let client_cons_state_path_on_b = ClientConsensusStatePath::new(
144-
client_id_on_b.clone(),
147+
id_source_client_on_target.clone(),
145148
msg.proof_height_on_a.revision_number(),
146149
msg.proof_height_on_a.revision_height(),
147150
);
@@ -154,11 +157,12 @@ where
154157
&packet.header.timeout_height_on_b,
155158
&packet.header.timeout_timestamp_on_b,
156159
);
157-
let commitment_path_on_a = CommitmentPath::new(port_id_on_a, channel_id_on_a, *seq_on_a);
160+
let commitment_path_on_a =
161+
CommitmentPath::new(source_port, channel_target_client_on_source, *seq_on_a);
158162

159163
// Verify the proof for the packet against the chain store.
160-
client_state_of_a_on_b.verify_membership(
161-
prefix_on_b,
164+
source_client_on_target.verify_membership(
165+
prefix_source,
162166
&msg.proof_commitment_on_a,
163167
consensus_state_of_a_on_b.root(),
164168
Path::Commitment(commitment_path_on_a),
@@ -187,11 +191,11 @@ where
187191
let packet = &msg.packet;
188192
let payload = &packet.payloads[0];
189193

190-
let (_, port_id_on_b) = &payload.header.target_port;
191-
let channel_id_on_b = &packet.header.target_client;
194+
let (_, target_port) = &payload.header.target_port;
195+
let channel_source_client_on_target = &packet.header.source_client_on_target;
192196
let seq_on_a = &packet.header.seq_on_a;
193197

194-
let ack_path_on_b = AckPath::new(port_id_on_b, channel_id_on_b, *seq_on_a);
198+
let ack_path_on_b = AckPath::new(target_port, channel_source_client_on_target, *seq_on_a);
195199
if ctx_b.get_packet_acknowledgement(&ack_path_on_b).is_ok() {
196200
return Err(ChannelError::DuplicateAcknowledgment(*seq_on_a));
197201
}

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

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -32,48 +32,50 @@ pub fn send_packet_validate(
3232

3333
let payload = &packet.payloads[0];
3434

35-
let (_, port_id_on_a) = &payload.header.source_port;
36-
let channel_id_on_a = &packet.header.source_client;
37-
let channel_id_on_b = &packet.header.target_client;
35+
let (_, source_port) = &payload.header.source_port;
36+
let channel_target_client_on_source = &packet.header.target_client_on_source;
3837
let seq_on_a = &packet.header.seq_on_a;
3938

40-
let client_id_on_a = channel_id_on_b.as_ref();
39+
let id_target_client_on_source = channel_target_client_on_source.as_ref();
4140

4241
let client_val_ctx_a = ctx_a.get_client_validation_context();
4342

44-
let client_state_of_b_on_a = client_val_ctx_a.client_state(client_id_on_a)?;
43+
let target_client_on_source = client_val_ctx_a.client_state(id_target_client_on_source)?;
4544

46-
client_state_of_b_on_a
47-
.status(ctx_a.get_client_validation_context(), client_id_on_a)?
45+
target_client_on_source
46+
.status(
47+
ctx_a.get_client_validation_context(),
48+
id_target_client_on_source,
49+
)?
4850
.verify_is_active()?;
4951

50-
let latest_height_on_a = client_state_of_b_on_a.latest_height();
52+
let latest_height_on_target = target_client_on_source.latest_height();
5153

5254
if packet
5355
.header
5456
.timeout_height_on_b
55-
.has_expired(latest_height_on_a)
57+
.has_expired(latest_height_on_target)
5658
{
5759
return Err(ChannelError::InsufficientPacketHeight {
58-
chain_height: latest_height_on_a,
60+
chain_height: latest_height_on_target,
5961
timeout_height: packet.header.timeout_height_on_b,
6062
});
6163
}
6264

6365
let client_cons_state_path_on_a = ClientConsensusStatePath::new(
64-
client_id_on_a.clone(),
65-
latest_height_on_a.revision_number(),
66-
latest_height_on_a.revision_height(),
66+
id_target_client_on_source.clone(),
67+
latest_height_on_target.revision_number(),
68+
latest_height_on_target.revision_height(),
6769
);
68-
let consensus_state_of_b_on_a =
69-
client_val_ctx_a.consensus_state(&client_cons_state_path_on_a)?;
70-
let latest_timestamp = consensus_state_of_b_on_a.timestamp()?;
70+
let target_consensus_state = client_val_ctx_a.consensus_state(&client_cons_state_path_on_a)?;
71+
let latest_timestamp = target_consensus_state.timestamp()?;
7172
let packet_timestamp = packet.header.timeout_timestamp_on_b;
7273
if packet_timestamp.has_expired(&latest_timestamp) {
7374
return Err(ChannelError::ExpiredPacketTimestamp);
7475
}
7576

76-
let seq_send_path_on_a = SeqSendPath::new(port_id_on_a, channel_id_on_a);
77+
// 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);
7779
let next_seq_send_on_a = ctx_a.get_next_sequence_send(&seq_send_path_on_a)?;
7880

7981
if seq_on_a != &next_seq_send_on_a {
@@ -95,20 +97,20 @@ pub fn send_packet_execute(
9597
) -> Result<(), ChannelError> {
9698
let payload = &packet.payloads[0];
9799

98-
let (_, port_id_on_a) = &payload.header.source_port;
99-
let channel_id_on_a = &packet.header.source_client;
100+
let (_, source_port) = &payload.header.source_port;
101+
let channel_target_client_on_source = &packet.header.target_client_on_source;
100102
let seq_on_a = &packet.header.seq_on_a;
101103
let data = &payload.data;
102104

103105
{
104-
let seq_send_path_on_a = SeqSendPath::new(port_id_on_a, channel_id_on_a);
106+
let seq_send_path_on_a = SeqSendPath::new(source_port, channel_target_client_on_source);
105107
let next_seq_send_on_a = ctx_a.get_next_sequence_send(&seq_send_path_on_a)?;
106108

107109
ctx_a.store_next_sequence_send(&seq_send_path_on_a, next_seq_send_on_a.increment())?;
108110
}
109111

110112
ctx_a.store_packet_commitment(
111-
&CommitmentPath::new(port_id_on_a, channel_id_on_a, *seq_on_a),
113+
&CommitmentPath::new(source_port, channel_target_client_on_source, *seq_on_a),
112114
compute_packet_commitment(
113115
data,
114116
&packet.header.timeout_height_on_b,

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

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -54,16 +54,17 @@ where
5454

5555
let payload = &packet.payloads[0];
5656

57-
let (_, port_id_on_a) = &payload.header.source_port;
58-
let channel_id_on_a = &packet.header.source_client;
57+
let (_, source_port) = &payload.header.source_port;
58+
let channel_target_client_on_source = &packet.header.target_client_on_source;
5959
let seq_on_a = &packet.header.seq_on_a;
6060

6161
// In all cases, this event is emitted
6262
let event = IbcEvent::TimeoutPacket(TimeoutPacket::new(packet.clone()));
6363
ctx_a.emit_ibc_event(IbcEvent::Message(MessageEvent::Channel))?;
6464
ctx_a.emit_ibc_event(event)?;
6565

66-
let commitment_path_on_a = CommitmentPath::new(port_id_on_a, channel_id_on_a, *seq_on_a);
66+
let commitment_path_on_a =
67+
CommitmentPath::new(source_port, channel_target_client_on_source, *seq_on_a);
6768

6869
// check if we're in the NO-OP case
6970
if ctx_a.get_packet_commitment(&commitment_path_on_a).is_err() {
@@ -103,15 +104,16 @@ where
103104
let packet = &msg.packet;
104105
let payload = &packet.payloads[0];
105106

106-
let (_, port_id_on_a) = &payload.header.source_port;
107-
let channel_id_on_a = &packet.header.source_client;
108-
let (prefix_on_a, port_id_on_b) = &payload.header.target_port;
109-
let channel_id_on_b = &packet.header.target_client;
107+
let (_, source_port) = &payload.header.source_port;
108+
let channel_target_client_on_source = &packet.header.target_client_on_source;
109+
let (target_prefix, target_port) = &payload.header.target_port;
110+
let channel_source_client_on_target = &packet.header.source_client_on_target;
110111
let seq_on_a = &packet.header.seq_on_a;
111112
let data = &payload.data;
112113

113114
//verify packet commitment
114-
let commitment_path_on_a = CommitmentPath::new(port_id_on_a, channel_id_on_a, *seq_on_a);
115+
let commitment_path_on_a =
116+
CommitmentPath::new(source_port, channel_target_client_on_source, *seq_on_a);
115117
let Ok(commitment_on_a) = ctx_a.get_packet_commitment(&commitment_path_on_a) else {
116118
// This error indicates that the timeout has already been relayed
117119
// or there is a misconfigured relayer attempting to prove a timeout
@@ -135,19 +137,22 @@ where
135137

136138
// Verify proofs
137139
{
138-
let client_id_on_a = channel_id_on_b.as_ref();
140+
let id_target_client_on_source = channel_target_client_on_source.as_ref();
139141
let client_val_ctx_a = ctx_a.get_client_validation_context();
140-
let client_state_of_b_on_a = client_val_ctx_a.client_state(client_id_on_a)?;
142+
let target_client_on_source = client_val_ctx_a.client_state(id_target_client_on_source)?;
141143

142-
client_state_of_b_on_a
143-
.status(ctx_a.get_client_validation_context(), client_id_on_a)?
144+
target_client_on_source
145+
.status(
146+
ctx_a.get_client_validation_context(),
147+
id_target_client_on_source,
148+
)?
144149
.verify_is_active()?;
145150

146-
client_state_of_b_on_a.validate_proof_height(msg.proof_height_on_b)?;
151+
target_client_on_source.validate_proof_height(msg.proof_height_on_b)?;
147152

148153
// check that timeout height or timeout timestamp has passed on the other end
149154
let client_cons_state_path_on_a = ClientConsensusStatePath::new(
150-
client_id_on_a.clone(),
155+
id_target_client_on_source.clone(),
151156
msg.proof_height_on_b.revision_number(),
152157
msg.proof_height_on_b.revision_height(),
153158
);
@@ -165,10 +170,11 @@ where
165170
}
166171

167172
let next_seq_recv_verification_result = {
168-
let receipt_path_on_b = ReceiptPath::new(port_id_on_b, channel_id_on_b, *seq_on_a);
173+
let receipt_path_on_b =
174+
ReceiptPath::new(target_port, channel_source_client_on_target, *seq_on_a);
169175

170-
client_state_of_b_on_a.verify_non_membership(
171-
prefix_on_a,
176+
target_client_on_source.verify_non_membership(
177+
target_prefix,
172178
&msg.proof_unreceived_on_b,
173179
consensus_state_of_b_on_a.root(),
174180
Path::Receipt(receipt_path_on_b),

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

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,15 @@ where
1717
let packet = &msg.packet;
1818
let payload = &packet.payloads[0];
1919

20-
let (prefix_on_a, port_id_on_a) = &payload.header.source_port;
21-
let channel_id_on_a = &packet.header.source_client;
22-
let (_, port_id_on_b) = &payload.header.target_port;
23-
let channel_id_on_b = &packet.header.target_client;
20+
let (_, source_port) = &payload.header.source_port;
21+
let channel_target_client_on_source = &packet.header.target_client_on_source;
22+
let (target_prefix, target_port) = &payload.header.target_port;
23+
let channel_source_client_on_target = &packet.header.source_client_on_target;
2424
let seq_on_a = &packet.header.seq_on_a;
2525
let data = &payload.data;
2626

27-
let commitment_path_on_a = CommitmentPath::new(port_id_on_a, channel_id_on_a, *seq_on_a);
27+
let commitment_path_on_a =
28+
CommitmentPath::new(source_port, channel_target_client_on_source, *seq_on_a);
2829

2930
//verify the packet was sent, check the store
3031
let Ok(commitment_on_a) = ctx_a.get_packet_commitment(&commitment_path_on_a) else {
@@ -49,29 +50,33 @@ where
4950

5051
// Verify proofs
5152
{
52-
let client_id_on_a = channel_id_on_b.as_ref();
53+
let id_target_client_on_source = channel_target_client_on_source.as_ref();
5354
let client_val_ctx_a = ctx_a.get_client_validation_context();
54-
let client_state_of_b_on_a = client_val_ctx_a.client_state(client_id_on_a)?;
55+
let target_client_on_source = client_val_ctx_a.client_state(id_target_client_on_source)?;
5556

56-
client_state_of_b_on_a
57-
.status(ctx_a.get_client_validation_context(), client_id_on_a)?
57+
target_client_on_source
58+
.status(
59+
ctx_a.get_client_validation_context(),
60+
id_target_client_on_source,
61+
)?
5862
.verify_is_active()?;
5963

60-
client_state_of_b_on_a.validate_proof_height(msg.proof_height_on_b)?;
64+
target_client_on_source.validate_proof_height(msg.proof_height_on_b)?;
6165

6266
let client_cons_state_path_on_a = ClientConsensusStatePath::new(
63-
client_id_on_a.clone(),
67+
id_target_client_on_source.clone(),
6468
msg.proof_height_on_b.revision_number(),
6569
msg.proof_height_on_b.revision_height(),
6670
);
6771
let consensus_state_of_b_on_a =
6872
client_val_ctx_a.consensus_state(&client_cons_state_path_on_a)?;
6973

7074
let next_seq_recv_verification_result = {
71-
let receipt_path_on_b = ReceiptPath::new(port_id_on_b, channel_id_on_b, *seq_on_a);
75+
let receipt_path_on_b =
76+
ReceiptPath::new(target_port, channel_source_client_on_target, *seq_on_a);
7277

73-
client_state_of_b_on_a.verify_non_membership(
74-
prefix_on_a,
78+
target_client_on_source.verify_non_membership(
79+
target_prefix,
7580
&msg.proof_unreceived_on_b,
7681
consensus_state_of_b_on_a.root(),
7782
Path::Receipt(receipt_path_on_b),

0 commit comments

Comments
 (0)