Skip to content

Commit db2be6f

Browse files
ancazamfiradizere
andauthored
Migration to recent stargate (#449)
* Initial migration changes * More changes, add some of the ack CLIs * cleanup * fix packet ack * clippy and fmt fixes * Fixed connOpenTry tests; ignored update client tests * Fixed ack msg tests * Added next identifier generation in mock context * Fixed ICS26 tests * Fix for relayer tests * Timeout packet, add Uninit for conn and chan, extract clientId * Fix option order in packet Tx clis * Tx result parsing (not generalized yet) * add extern paths back * WIP General event parsing out of tx response * change packet envelope to packet * Make the code compile, return clientID in relayer and CLI * event parsing and matching for conn open init * Change tm dependency, fix update client CLI * log fix and move to cosmos v0.40.0-rc5 (no changes) * Finished connection CLIs * Event parsing and fixes for channel open CLIs * add more event attributes, some refactor of the packet CLIs and packet relaying * cleanup CLI output for channel, add more fields to events * Fix relayer connection loop for dynamic IDs * Fix relayer channel loop for dynamic IDs, started on config cleanup * Cleanup relayer config * update Changelog * fix channel verification for packets * Fix changelog typo Co-authored-by: Adi Seredinschi <[email protected]>
1 parent cfeee01 commit db2be6f

File tree

117 files changed

+4767
-3480
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

117 files changed

+4767
-3480
lines changed

CHANGELOG.md

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,16 @@
33
## Unreleased Changes
44

55
### FEATURES
6+
- Update to tendermint-rs version `0.17` ([#451])
7+
- Update to cosmos-sdk IBC proto version `v0.40.0-rc5` ([#451])
8+
69
- [relayer]
7-
- Implement relaying for recv_packet ([#379])
10+
- Implement packet relaying ([#379])
811

912
- [relayer-cli]
1013
- Packet CLIs for recv_packet ([#443])
11-
14+
- Packet CLIs for acknowledging packets ([#468])
15+
1216
### IMPROVEMENTS
1317
- [relayer]
1418
- Mock chain (implementing IBC handlers) and integration against CLI ([#158])
@@ -20,6 +24,9 @@
2024
[#381]: https://github.com/informalsystems/ibc-rs/issues/381
2125
[#443]: https://github.com/informalsystems/ibc-rs/issues/443
2226
[#447]: https://github.com/informalsystems/ibc-rs/issues/447
27+
[#451]: https://github.com/informalsystems/ibc-rs/issues/451
28+
[#468]: https://github.com/informalsystems/ibc-rs/issues/468
29+
2330

2431
## v0.0.5
2532
*December 2, 2020*

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,4 @@ tendermint = { git = "https://github.com/informalsystems/tendermint
1717
tendermint-rpc = { git = "https://github.com/informalsystems/tendermint-rs", branch = "romac/skip-verif" }
1818
tendermint-proto = { git = "https://github.com/informalsystems/tendermint-rs", branch = "romac/skip-verif" }
1919
tendermint-light-client = { git = "https://github.com/informalsystems/tendermint-rs", branch = "romac/skip-verif" }
20-
tendermint-testgen = { git = "https://github.com/informalsystems/tendermint-rs", branch = "romac/skip-verif" }
20+
tendermint-testgen = { git = "https://github.com/informalsystems/tendermint-rs", branch = "romac/skip-verif" }

docs/architecture/adr-004-relayer-domain-decomposition.md

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -251,13 +251,11 @@ fn main() -> Result<(), Box<dyn Error>> {
251251

252252
let src_foreign_client_on_dst = ForeignClient::new(
253253
&src_chain_handle,
254-
&dst_chain_handle,
255-
ForeignClientConfig::default())?;
254+
&dst_chain_handle)?;
256255

257256
let dst_foreign_client_on_src = ForeignClient::new(
258257
&src_chain_handle,
259-
&dst_chain_handle,
260-
ForeignClientConfig::default())?;
258+
&dst_chain_handle)?;
261259

262260
let connection = Connection::new(
263261
&src_chain_handle,

docs/spec/relayer/Packets.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ func CreateDatagram(ev WriteAcknowledgementEvent,
127127

128128
// Stage 1
129129
// Verify if acknowledment is committed to chain A and it is still pending
130-
packetAck, packetAckCommitmentProof, error =
130+
packetAck, PacketStateProof, error =
131131
GetPacketAcknowledgement(chainA, ev.port, ev.channel, ev.sequence, proofHeight)
132132
if error != nil { return (nil, error) }
133133

@@ -191,6 +191,6 @@ func CreateDatagram(ev WriteAcknowledgementEvent,
191191
data: ev.data
192192
}
193193

194-
return (PacketAcknowledgement { packet, ev.acknowledgement, packetAckCommitmentProof, proofHeight }, nil)
194+
return (PacketAcknowledgement { packet, ev.acknowledgement, PacketStateProof, proofHeight }, nil)
195195
}
196196
```

modules/Cargo.toml

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ mocks = [ "tendermint-testgen" ]
2222
[dependencies]
2323
# Proto definitions for all IBC-related interfaces, e.g., connections or channels.
2424
ibc-proto = { version = "0.5.0", path = "../proto" }
25-
25+
ics23 = "0.6.0"
2626
anomaly = "0.2.0"
2727
chrono = "0.4"
2828
thiserror = "1.0.11"
@@ -38,23 +38,23 @@ regex = "1"
3838
bech32 = "0.7.2"
3939

4040
[dependencies.tendermint]
41-
version = "=0.17.0-rc3"
41+
version = "=0.17.0"
4242

4343
[dependencies.tendermint-rpc]
44-
version = "=0.17.0-rc3"
44+
version = "=0.17.0"
4545
features = ["http-client", "websocket-client"]
4646

4747
[dependencies.tendermint-light-client]
48-
version = "=0.17.0-rc3"
48+
version = "=0.17.0"
4949

5050
[dependencies.tendermint-proto]
51-
version = "=0.17.0-rc3"
51+
version = "=0.17.0"
5252

5353
[dependencies.tendermint-testgen]
54-
version = "0.17.0-rc3"
54+
version = "0.17.0"
5555
optional = true
5656

5757
[dev-dependencies]
5858
tokio = { version = "0.2", features = ["macros"] }
5959
subtle-encoding = { version = "0.5" }
60-
tendermint-testgen = { version = "0.17.0-rc3" } # Needed for generating (synthetic) light blocks.
60+
tendermint-testgen = { version = "0.17.0" } # Needed for generating (synthetic) light blocks.

modules/src/events.rs

Lines changed: 77 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -13,20 +13,23 @@ use std::collections::HashMap;
1313
use std::convert::{TryFrom, TryInto};
1414
use tendermint::block::Height;
1515

16+
use tendermint::abci::Event;
1617
use tracing::warn;
1718

1819
/// Events types
1920
#[derive(Debug, Clone, Deserialize, Serialize)]
2021
pub enum IBCEventType {
22+
CreateClient,
2123
SendPacket,
22-
RecvPacket,
24+
WriteAck,
2325
}
2426

2527
impl IBCEventType {
2628
pub fn as_str(&self) -> &'static str {
2729
match *self {
30+
IBCEventType::CreateClient => "create_client",
2831
IBCEventType::SendPacket => "send_packet",
29-
_ => "unhandled",
32+
IBCEventType::WriteAck => "write_acknowledgement",
3033
}
3134
}
3235
}
@@ -54,13 +57,32 @@ pub enum IBCEvent {
5457

5558
SendPacketChannel(ChannelEvents::SendPacket),
5659
ReceivePacketChannel(ChannelEvents::ReceivePacket),
60+
WriteAcknowledgementChannel(ChannelEvents::WriteAcknowledgement),
5761
AcknowledgePacketChannel(ChannelEvents::AcknowledgePacket),
58-
CleanupPacketChannel(ChannelEvents::CleanupPacket),
5962
TimeoutPacketChannel(ChannelEvents::TimeoutPacket),
6063

6164
TimeoutTransfer(TransferEvents::Timeout),
6265
PacketTransfer(TransferEvents::Packet),
6366
ChannelClosedTransfer(TransferEvents::ChannelClosed),
67+
68+
Empty(String), // Special event, signifying empty response
69+
ChainError(String), // Special event, signifying an error on CheckTx or DeliverTx
70+
}
71+
72+
// This is tendermint specific
73+
pub fn from_tx_response_event(event: Event) -> Option<IBCEvent> {
74+
// Return the first hit we find
75+
// Look for client event...
76+
if let Some(client_res) = ClientEvents::try_from_tx(event.clone()) {
77+
return Some(client_res);
78+
// Look for connection event...
79+
} else if let Some(conn_res) = ConnectionEvents::try_from_tx(event.clone()) {
80+
return Some(conn_res);
81+
} else if let Some(chan_res) = ChannelEvents::try_from_tx(event) {
82+
return Some(chan_res);
83+
}
84+
85+
None
6486
}
6587

6688
impl IBCEvent {
@@ -70,9 +92,13 @@ impl IBCEvent {
7092
pub fn height(&self) -> Height {
7193
match self {
7294
IBCEvent::NewBlock(bl) => bl.height,
73-
IBCEvent::UpdateClient(uc) => uc.height,
74-
IBCEvent::SendPacketChannel(ev) => ev.envelope.height,
95+
IBCEvent::UpdateClient(uc) => *uc.height(),
96+
IBCEvent::SendPacketChannel(ev) => ev.height,
7597
IBCEvent::ReceivePacketChannel(ev) => ev.height,
98+
IBCEvent::WriteAcknowledgementChannel(ev) => ev.height,
99+
IBCEvent::AcknowledgePacketChannel(ev) => ev.height,
100+
IBCEvent::TimeoutPacketChannel(ev) => ev.height,
101+
76102
_ => {
77103
unimplemented!()
78104
}
@@ -81,7 +107,19 @@ impl IBCEvent {
81107
pub fn set_height(&mut self, height: ICSHeight) {
82108
match self {
83109
IBCEvent::SendPacketChannel(ev) => {
84-
ev.envelope.height = Height::try_from(height.version_height).unwrap()
110+
ev.height = Height::try_from(height.revision_height).unwrap()
111+
}
112+
IBCEvent::ReceivePacketChannel(ev) => {
113+
ev.height = Height::try_from(height.revision_height).unwrap()
114+
}
115+
IBCEvent::WriteAcknowledgementChannel(ev) => {
116+
ev.height = Height::try_from(height.revision_height).unwrap()
117+
}
118+
IBCEvent::AcknowledgePacketChannel(ev) => {
119+
ev.height = Height::try_from(height.revision_height).unwrap()
120+
}
121+
IBCEvent::TimeoutPacketChannel(ev) => {
122+
ev.height = Height::try_from(height.revision_height).unwrap()
85123
}
86124
_ => {
87125
unimplemented!()
@@ -200,15 +238,17 @@ pub fn get_all_events(result: RpcEvent) -> Result<Vec<(Height, IBCEvent)>, Strin
200238
Ok(vals)
201239
}
202240

203-
pub fn build_event(object: RawObject) -> Result<IBCEvent, BoxError> {
241+
pub fn build_event(mut object: RawObject) -> Result<IBCEvent, BoxError> {
204242
match object.action.as_str() {
243+
// Client events
205244
"create_client" => Ok(IBCEvent::from(ClientEvents::CreateClient::try_from(
206245
object,
207246
)?)),
208247
"update_client" => Ok(IBCEvent::from(ClientEvents::UpdateClient::try_from(
209248
object,
210249
)?)),
211250

251+
// Connection events
212252
"connection_open_init" => Ok(IBCEvent::from(ConnectionEvents::OpenInit::try_from(
213253
object,
214254
)?)),
@@ -218,6 +258,7 @@ pub fn build_event(object: RawObject) -> Result<IBCEvent, BoxError> {
218258
object,
219259
)?)),
220260

261+
// Channel events
221262
"channel_open_init" => Ok(IBCEvent::from(ChannelEvents::OpenInit::try_from(object)?)),
222263
"channel_open_try" => Ok(IBCEvent::from(ChannelEvents::OpenTry::try_from(object)?)),
223264
"channel_open_ack" => Ok(IBCEvent::from(ChannelEvents::OpenAck::try_from(object)?)),
@@ -229,33 +270,30 @@ pub fn build_event(object: RawObject) -> Result<IBCEvent, BoxError> {
229270
object,
230271
)?)),
231272

232-
// send_packet
233-
"transfer" => Ok(IBCEvent::from(ChannelEvents::SendPacket::try_from(object)?)),
234-
// recv_packet
235-
"ics04/opaque" => Ok(IBCEvent::from(ChannelEvents::ReceivePacket::try_from(
236-
object,
237-
)?)),
238-
// acknowledge_packet
239-
// needs these changes in cosmos-sdk
240-
// --- a/x/ibc/04-channel/types/msgs.go
241-
// +++ b/x/ibc/04-channel/types/msgs.go
242-
// @@ -511,5 +511,5 @@ func (msg MsgAcknowledgement) GetSigners() []sdk.AccAddress {
243-
//
244-
// // Type implements sdk.Msg
245-
// func (msg MsgAcknowledgement) Type() string {
246-
// - return "ics04/opaque"
247-
// + return "ics04/acknowledge"
248-
// }
249-
"ics04/acknowledge" => Ok(IBCEvent::from(ChannelEvents::AcknowledgePacket::try_from(
250-
object,
251-
)?)),
252-
//timeout_packet
253-
"ics04/timeout" => Ok(IBCEvent::from(ChannelEvents::TimeoutPacket::try_from(
273+
// Packet events
274+
// Note: There is no message.action "send_packet", the only one we can hook into is the
275+
// module's action, "transfer" being the only one in IBC1.0. However the attributes
276+
// are all prefixed with "send_packet" therefore the overwrite here
277+
// TODO: This need to be sorted out
278+
"transfer" => {
279+
object.action = "send_packet".to_string();
280+
Ok(IBCEvent::from(ChannelEvents::SendPacket::try_from(object)?))
281+
}
282+
// Same here
283+
// TODO: sort this out
284+
"recv_packet" => {
285+
object.action = "write_acknowledgement".to_string();
286+
Ok(IBCEvent::from(
287+
ChannelEvents::WriteAcknowledgement::try_from(object)?,
288+
))
289+
}
290+
"write_acknowledgement" => Ok(IBCEvent::from(
291+
ChannelEvents::WriteAcknowledgement::try_from(object)?,
292+
)),
293+
"acknowledge_packet" => Ok(IBCEvent::from(ChannelEvents::AcknowledgePacket::try_from(
254294
object,
255295
)?)),
256-
257-
// TODO not clear what the message.action for this is
258-
"cleanup_packet" => Ok(IBCEvent::from(ChannelEvents::CleanupPacket::try_from(
296+
"timeout_packet" => Ok(IBCEvent::from(ChannelEvents::TimeoutPacket::try_from(
259297
object,
260298
)?)),
261299

@@ -290,3 +328,10 @@ macro_rules! attribute {
290328
$a.events.get($b).ok_or($b)?[$a.idx].parse()?
291329
};
292330
}
331+
332+
#[macro_export]
333+
macro_rules! some_attribute {
334+
($a:ident, $b:literal) => {
335+
$a.events.get($b).ok_or($b)?[$a.idx].parse().ok()
336+
};
337+
}

modules/src/handler.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,14 @@ impl Attribute {
1010
pub fn new(key: String, value: String) -> Self {
1111
Self { key, value }
1212
}
13+
14+
pub fn value(&self) -> String {
15+
self.value.clone()
16+
}
17+
18+
pub fn key(&self) -> String {
19+
self.key.clone()
20+
}
1321
}
1422

1523
#[derive(Clone, Debug, PartialEq, Eq)]
@@ -34,6 +42,11 @@ impl Event {
3442
.collect(),
3543
}
3644
}
45+
46+
/// Returns a vector containing the values within all attributes of this event
47+
pub fn attribute_values(&self) -> Vec<String> {
48+
self.attributes.iter().map(|a| a.value.clone()).collect()
49+
}
3750
}
3851

3952
pub type HandlerResult<T, E> = Result<HandlerOutput<T>, E>;

modules/src/ics02_client/client_def.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use crate::ics07_tendermint::client_def::TendermintClient;
1313
use crate::ics07_tendermint::client_state::ClientState as TendermintClientState;
1414
use crate::ics07_tendermint::consensus_state::ConsensusState as TendermintConsensusState;
1515
use crate::ics07_tendermint::header::Header as TendermintHeader;
16-
use crate::ics23_commitment::commitment::{CommitmentPrefix, CommitmentProof, CommitmentRoot};
16+
use crate::ics23_commitment::commitment::{CommitmentPrefix, CommitmentProofBytes, CommitmentRoot};
1717
use crate::ics24_host::identifier::{ClientId, ConnectionId};
1818
use crate::Height;
1919

@@ -58,7 +58,7 @@ pub trait ClientDef: Clone {
5858
client_state: &Self::ClientState,
5959
height: Height,
6060
prefix: &CommitmentPrefix,
61-
proof: &CommitmentProof,
61+
proof: &CommitmentProofBytes,
6262
client_id: &ClientId,
6363
consensus_height: Height,
6464
expected_consensus_state: &AnyConsensusState,
@@ -70,7 +70,7 @@ pub trait ClientDef: Clone {
7070
client_state: &Self::ClientState,
7171
height: Height,
7272
prefix: &CommitmentPrefix,
73-
proof: &CommitmentProof,
73+
proof: &CommitmentProofBytes,
7474
connection_id: &ConnectionId,
7575
expected_connection_end: &ConnectionEnd,
7676
) -> Result<(), Box<dyn std::error::Error>>;
@@ -84,7 +84,7 @@ pub trait ClientDef: Clone {
8484
root: &CommitmentRoot,
8585
prefix: &CommitmentPrefix,
8686
client_id: &ClientId,
87-
proof: &CommitmentProof,
87+
proof: &CommitmentProofBytes,
8888
client_state: &AnyClientState,
8989
) -> Result<(), Box<dyn std::error::Error>>;
9090
}
@@ -403,7 +403,7 @@ impl ClientDef for AnyClient {
403403
client_state: &Self::ClientState,
404404
height: Height,
405405
prefix: &CommitmentPrefix,
406-
proof: &CommitmentProof,
406+
proof: &CommitmentProofBytes,
407407
client_id: &ClientId,
408408
consensus_height: Height,
409409
expected_consensus_state: &AnyConsensusState,
@@ -451,7 +451,7 @@ impl ClientDef for AnyClient {
451451
client_state: &AnyClientState,
452452
height: Height,
453453
prefix: &CommitmentPrefix,
454-
proof: &CommitmentProof,
454+
proof: &CommitmentProofBytes,
455455
connection_id: &ConnectionId,
456456
expected_connection_end: &ConnectionEnd,
457457
) -> Result<(), Box<dyn std::error::Error>> {
@@ -494,7 +494,7 @@ impl ClientDef for AnyClient {
494494
root: &CommitmentRoot,
495495
prefix: &CommitmentPrefix,
496496
client_id: &ClientId,
497-
proof: &CommitmentProof,
497+
proof: &CommitmentProofBytes,
498498
client_state_on_counterparty: &AnyClientState,
499499
) -> Result<(), Box<dyn std::error::Error>> {
500500
match self {

0 commit comments

Comments
 (0)