Skip to content

Commit

Permalink
Merge branch 'interchain-accounts' into sean/issue#279-module-test
Browse files Browse the repository at this point in the history
  • Loading branch information
seantking committed Sep 24, 2021
2 parents 9e98647 + c149317 commit 1778c9e
Show file tree
Hide file tree
Showing 371 changed files with 2,827 additions and 2,166 deletions.
10 changes: 10 additions & 0 deletions .github/workflows/link-check-config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"ignorePatterns": [
{
"pattern": "(localhost)"
}
],
"retryOn429": true,
"retryCount": 3,
"fallbackRetryDelay": "10s"
}
4 changes: 3 additions & 1 deletion .github/workflows/link-check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,6 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: gaurav-nelson/github-action-markdown-link-check@v1
- uses: gaurav-nelson/github-action-markdown-link-check@v1
with:
config-file: '.github/workflows/link-check-config.json'
41 changes: 36 additions & 5 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,15 +43,45 @@ Ref: https://keepachangelog.com/en/1.0.0/

### State Machine Breaking

* (24-host) [#\344](https://github.com/cosmos/ibc-go/pull/344) Increase port identifier limit to 128 characters.

### Improvements
* [\#373](https://github.com/cosmos/ibc-go/pull/375) Added optional field `PacketCommitmentSequences` to `QueryPacketAcknowledgementsRequest` to provide filtering of packet acknowledgements

* [\#383](https://github.com/cosmos/ibc-go/pull/383) Adds helper functions for merging and splitting middleware versions from the underlying app version.
* (modules/core/05-port) [\#288](https://github.com/cosmos/ibc-go/issues/288) Making the 05-port keeper function IsBound public. The IsBound function checks if the provided portID is already binded to a module.

### Features
* [\#372](https://github.com/cosmos/ibc-go/pull/372) New CLI command `query ibc client status <client id>` to get the current activity status of a client

* [\#384](https://github.com/cosmos/ibc-go/pull/384) Added `NegotiateAppVersion` method to `IBCModule` interface supported by a gRPC query service in `05-port`. This provides routing of requests to the desired application module callback, which in turn performs application version negotiation.

## [v1.2.0](https://github.com/cosmos/ibc-go/releases/tag/v1.2.0) - 2021-09-10

### State Machine Breaking

* (24-host) [\#344](https://github.com/cosmos/ibc-go/pull/344) Increase port identifier limit to 128 characters.

### Improvements

* [\#373](https://github.com/cosmos/ibc-go/pull/375) Added optional field `PacketCommitmentSequences` to `QueryPacketAcknowledgementsRequest` to provide filtering of packet acknowledgements.

### Features

* [\#372](https://github.com/cosmos/ibc-go/pull/372) New CLI command `query ibc client status <client id>` to get the current activity status of a client.

### Dependencies

* [\#386](https://github.com/cosmos/ibc-go/pull/386) Bump [tendermint](https://github.com/tendermint/tendermint) from 0.34.12 to 0.34.13.

## [v1.1.0](https://github.com/cosmos/ibc-go/releases/tag/v1.1.0) - 2021-09-03

### Dependencies

* [\#367](https://github.com/cosmos/ibc-go/pull/367) Bump [cosmos-sdk](https://github.com/cosmos/cosmos-sdk) from 0.43 to 0.44.

## [v1.0.1](https://github.com/cosmos/ibc-go/releases/tag/v1.0.1) - 2021-08-25

### Improvements

* [\#343](https://github.com/cosmos/ibc-go/pull/343) Create helper functions for publishing of packet sent and acknowledgement sent events.

## [v1.0.0](https://github.com/cosmos/ibc-go/releases/tag/v1.0.0) - 2021-08-10

### Bug Fixes
Expand All @@ -66,6 +96,7 @@ Ref: https://keepachangelog.com/en/1.0.0/
* (modules/light-clients/06-solomachine) [\#153](https://github.com/cosmos/ibc-go/pull/153) Fix solo machine proof height sequence mismatch bug.
* (modules/light-clients/06-solomachine) [\#122](https://github.com/cosmos/ibc-go/pull/122) Fix solo machine merkle prefix casting bug.
* (modules/light-clients/06-solomachine) [\#120](https://github.com/cosmos/ibc-go/pull/120) Fix solo machine handshake verification bug.
* (modules/light-clients/06-solomachine) [\#153](https://github.com/cosmos/ibc-go/pull/153) fix solo machine connection handshake failure at `ConnectionOpenAck`.

### API Breaking

Expand Down Expand Up @@ -120,7 +151,7 @@ The IBC module was originally released in [v0.40.0](https://github.com/cosmos/co
Please see the [Release Notes](https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/RELEASE_NOTES.md).

The IBC module is also contained in the releases for [v0.41.x](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.41.0) and [v0.42.x](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.42.0).
Please see the Release Notes for [v0.41.x](https://github.com/cosmos/cosmos-sdk/blob/release/v0.41.x/RELEASE_NOTES.md) and [v0.42.x](https://github.com/cosmos/cosmos-sdk/blob/release/v0.42.x/RELEASE_NOTES.md).
Please see the Release Notes for [v0.41.x](https://github.com/cosmos/cosmos-sdk/blob/v0.41.0/RELEASE_NOTES.md) and [v0.42.x](https://github.com/cosmos/cosmos-sdk/blob/v0.42.0/RELEASE_NOTES.md).

The IBC module was removed in the commit hash [da064e13d56add466548135739c5860a9f7ed842](https://github.com/cosmos/cosmos-sdk/commit/da064e13d56add466548135739c5860a9f7ed842) on the SDK. The release for SDK v0.43.0 will be the first release without the IBC module.

Expand Down
42 changes: 42 additions & 0 deletions RELEASES.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# Releases

IBC-Go follows [semantic versioning](https://semver.org), but with the following deviations:

- A state-machine breaking change will result in an increase of the minor version Y (x.Y.z | x > 0).
- An API breaking change will result in an increase of the major number (X.y.z | x > 0). Please note that these changes **will be backwards compatible** (as opposed to canonical semantic versioning; read [Backwards compatibility](#backwards) for a detailed explanation).

This is visually explained in the following decision tree:

![](releases-decision-tree.png)

When bumping the dependencies of [Cosmos SDK](https://github.com/cosmos/cosmos-sdk) and [Tendermint](https://github.com/tendermint/tendermint) we will only treat patch releases as non state-machine breaking.

## <a name="backwards"></a> Backwards compatibility

[ibc-go](https://github.com/cosmos/ibc-go) and the [IBC protocol specification](https://github.com/cosmos/ibc) maintain different versions. Furthermore, ibc-go serves several different user groups (chains, IBC app developers, relayers, IBC light client developers). Each of these groups has different expectations of what *backwards compatible* means. It simply isn't possible to categorize a change as backwards or non backwards compatible for all user groups. We are primarily interested in when our API breaks and when changes are state machine breaking (thus requiring a coordinated upgrade). This is scoping the meaning of ibc-go to that of those interacting with the code (IBC app developers, relayers, IBC light client developers), not chains using IBC to communicate (that should be encapsulated by the IBC protocol specification versioning).

To summarize: **All our ibc-go releases allow chains to communicate successfully with any chain running any version of our code**. That is to say, we are still using IBC protocol specification v1.0.

We ensure all major releases are supported by relayers ([hermes](https://github.com/informalsystems/ibc-rs) and [ts-relayer](https://github.com/confio/ts-relayer) at the moment) which can relay between the new major release and older releases. We have no plans of upgrading to an IBC protocol specification v2.0, as this would be very disruptive to the ecosystem.

## Graphics

The decision tree above was generated with the following code:

```
%%{init:
{'theme': 'default',
'themeVariables':
{'fontFamily': 'verdana', 'fontSize': '13px'}
}
}%%
flowchart TD
A(Change):::c --> B{API breaking?}
B:::c --> |Yes| C(Increase major version):::c
B:::c --> |No| D{state-machine breaking?}
D:::c --> |Yes| G(Increase minor version):::c
D:::c --> |No| H(Increase patch version):::c
classDef c fill:#eee,stroke:#aaa
```

using [Mermaid](https://mermaid-js.github.io)'s [live editor](https://mermaid.live).
22 changes: 11 additions & 11 deletions SECURITY.md
Original file line number Diff line number Diff line change
@@ -1,32 +1,32 @@
# Security

> **IMPORTANT**: If you find a security issue, you can contact our team directly at
security@interchain.berlin, or report it to our [bug bounty program](https://hackerone.com/tendermint) on HackerOne. *DO NOT* open a public issue on the repository.
security@interchain.berlin, or report it to our [bug bounty program](https://hackerone.com/cosmos) on HackerOne. *DO NOT* open a public issue on the repository.

## Bug Bounty

As part of our [Coordinated Vulnerability Disclosure Policy](https://tendermint.com/security), we operate a
[bug bounty program](https://hackerone.com/tendermint) with Hacker One.
[bug bounty program](https://hackerone.com/cosmos) with Hacker One.

See the policy linked above for more details on submissions and rewards and read
this [blog post](https://blog.cosmos.network/bug-bounty-program-for-tendermint-cosmos-833c67693586) for the program scope.

The following is a list of examples of the kinds of bugs we're most interested
in for the IBC Golang repository. Please refer to the corresponding repositories for vulnerabilities on the [Cosmos SDK]((https://github.com/cosmos/cosmos-sdk/blob/master/SECURITY.md)) and [Tendermint](https://github.com/tendermint/tendermint/blob/master/SECURITY.md) repositories.
in for the IBC Golang repository. Please refer to the corresponding repositories for vulnerabilities on the [Cosmos SDK](https://github.com/cosmos/cosmos-sdk/blob/master/SECURITY.md) and [Tendermint](https://github.com/tendermint/tendermint/blob/master/SECURITY.md) repositories.

### IBC Core

- [`02-client`](https://github.com/cosmos/ibc-go/tree/modules/core/02-client)
- [`03-connection`](https://github.com/cosmos/ibc-go/tree/modules/core/03-connection)
- [`04-channel`](https://github.com/cosmos/ibc-go/tree/modules/core/04-channel)
- [`05-port`](https://github.com/cosmos/ibc-go/tree/modules/core/05-port)
- [`23-commitment`](https://github.com/cosmos/ibc-go/tree/modules/core/23-commitment)
- [`24-host`](https://github.com/cosmos/ibc-go/tree/modules/core/24-host)
- [`02-client`](https://github.com/cosmos/ibc-go/tree/main/modules/core/02-client)
- [`03-connection`](https://github.com/cosmos/ibc-go/tree/main/modules/core/03-connection)
- [`04-channel`](https://github.com/cosmos/ibc-go/tree/main/modules/core/04-channel)
- [`05-port`](https://github.com/cosmos/ibc-go/tree/main/modules/core/05-port)
- [`23-commitment`](https://github.com/cosmos/ibc-go/tree/main/modules/core/23-commitment)
- [`24-host`](https://github.com/cosmos/ibc-go/tree/main/modules/core/24-host)

### IBC Applications

- [`transfer`](https://github.com/cosmos/ibc-go/tree/modules/apps/transfer)
- [`transfer`](https://github.com/cosmos/ibc-go/tree/main/modules/apps/transfer)

### Light Clients

- [`07-tendermint`](https://github.com/cosmos/ibc-go/tree/modules/light-clients/07-tendermint)
- [`07-tendermint`](https://github.com/cosmos/ibc-go/tree/main/modules/light-clients/07-tendermint)
12 changes: 1 addition & 11 deletions docs/DOCS_README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ If you want to update the documentation please open a pr on ibc-go.

## Docs Build Workflow

The documentation for the Cosmos SDK is hosted at https://ibc.cosmos.network/
The documentation for IBC-Go is hosted at https://ibc.cosmos.network.

built from the files in this (`/docs`) directory for
[main](https://github.com/cosmos/ibc-go/tree/main/docs).
Expand Down Expand Up @@ -87,16 +87,6 @@ Run `pre` and `post` hooks and start a hot-reloading web-server. See output of t

To build documentation as a static website run `npm run build`. You will find the website in `.vuepress/dist` directory.

## Build RPC Docs

TODO: is this still true?

First, run `make tools` from the root of repo, to install the swagger-ui tool.

Then, edit the `swagger.yaml` manually; it is found [here](https://github.com/cosmos/cosmos-sdk/blob/master/client/lcd/swagger-ui/swagger.yaml)

Finally, run `make update_gaia_lite_docs` from the root of the repo.

## Search

TODO: update or remove
Expand Down
2 changes: 2 additions & 0 deletions docs/OLD_README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ parent:
title: "ibc"
-->

<!-- markdown-link-check-disable -->
# `ibc`

## Abstract
Expand Down Expand Up @@ -113,3 +114,4 @@ x/ibc
│   └── 09-localhost/
└── testing/
```
<!-- markdown-link-check-enable-->
4 changes: 2 additions & 2 deletions docs/architecture/adr-001-coin-source-tracing.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ Accepted, Implemented
## Context

The specification for IBC cross-chain fungible token transfers
([ICS20](https://github.com/cosmos/ics/tree/master/spec/ics-020-fungible-token-transfer)), needs to
([ICS20](https://github.com/cosmos/ibc/tree/master/spec/app/ics-020-fungible-token-transfer)), needs to
be aware of the origin of any token denomination in order to relay a `Packet` which contains the sender
and recipient addressed in the
[`FungibleTokenPacketData`](https://github.com/cosmos/ibc/tree/master/spec/app/ics-020-fungible-token-transfer#data-structures).
Expand Down Expand Up @@ -199,7 +199,7 @@ func (msg MsgTransfer) ValidateBasic() error {
// ValidateIBCDenom validates that the given denomination is either:
//
// - A valid base denomination (eg: 'uatom')
// - A valid fungible token representation (i.e 'ibc/{hash}') per ADR 001 https://github.com/cosmos/cosmos-sdk/blob/master/docs/architecture/adr-001-coin-source-tracing.md
// - A valid fungible token representation (i.e 'ibc/{hash}') per ADR 001 https://github.com/cosmos/ibc-go/blob/main/docs/architecture/adr-001-coin-source-tracing.md
func ValidateIBCDenom(denom string) error {
denomSplit := strings.SplitN(denom, "/", 2)

Expand Down
2 changes: 1 addition & 1 deletion docs/architecture/adr-015-ibc-packet-receiver.md
Original file line number Diff line number Diff line change
Expand Up @@ -296,4 +296,4 @@ Proposed
## References

- Relevant comment: [cosmos/ics#289](https://github.com/cosmos/ics/issues/289#issuecomment-544533583)
- [ICS26 - Routing Module](https://github.com/cosmos/ics/blob/master/spec/ics-026-routing-module)
- [ICS26 - Routing Module](https://github.com/cosmos/ibc/tree/master/spec/core/ics-026-routing-module)
8 changes: 4 additions & 4 deletions docs/ibc/apps.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ order: 3
Learn how to configure your application to use IBC and send data packets to other chains. {synopsis}

This document serves as a guide for developers who want to write their own Inter-blockchain
Communication Protocol (IBC) applications for custom [use-cases](https://github.com/cosmos/ics/blob/master/ibc/4_IBC_USECASES.md).
Communication Protocol (IBC) applications for custom use cases.

Due to the modular design of the IBC protocol, IBC
application developers do not need to concern themselves with the low-level details of clients,
Expand Down Expand Up @@ -255,7 +255,7 @@ to implement callbacks for handling the packet flow through a channel.
Once a module A and module B are connected to each other, relayers can start relaying packets and
acknowledgements back and forth on the channel.

![IBC packet flow diagram](https://media.githubusercontent.com/media/cosmos/ics/master/spec/ics-004-channel-and-packet-semantics/packet-state-machine.png)
![IBC packet flow diagram](https://media.githubusercontent.com/media/cosmos/ibc/old/spec/ics-004-channel-and-packet-semantics/channel-state-machine.png)

Briefly, a successful packet flow works as follows:

Expand Down Expand Up @@ -353,7 +353,7 @@ receive acknowledegments with the IBC modules as byte strings.

Thus, modules must agree on how to encode/decode acknowledgements. The process of creating an
acknowledgement struct along with encoding and decoding it, is very similar to the packet data
example above. [ICS 04](https://github.com/cosmos/ics/tree/master/spec/ics-004-channel-and-packet-semantics#acknowledgement-envelope)
example above. [ICS 04](https://github.com/cosmos/ibc/blob/master/spec/core/ics-004-channel-and-packet-semantics#acknowledgement-envelope)
specifies a recommended format for acknowledgements. This acknowledgement type can be imported from
[channel types](https://github.com/cosmos/ibc-go/tree/main/modules/core/04-channel/types).

Expand All @@ -366,7 +366,7 @@ While modules may choose arbitrary acknowledgement structs, a default acknowledg
// conflicts with other protobuf message formats used for acknowledgements.
// The first byte of any message with this format will be the non-ASCII values
// `0xaa` (result) or `0xb2` (error). Implemented as defined by ICS:
// https://github.com/cosmos/ics/tree/master/spec/ics-004-channel-and-packet-semantics#acknowledgement-envelope
// https://github.com/cosmos/ibc/tree/master/spec/core/ics-004-channel-and-packet-semantics#acknowledgement-envelope
message Acknowledgement {
// response contains either a result or an error and must be non-empty
oneof response {
Expand Down
2 changes: 1 addition & 1 deletion docs/ibc/integration.md
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ connection handhake.
The IBC module also has
[`BeginBlock`](https://github.com/cosmos/ibc-go/blob/main/modules/core/02-client/abci.go) logic as
well. This is optional as it is only required if your application uses the [localhost
client](https://github.com/cosmos/ics/blob/master/spec/ics-009-loopback-client) to connect two
client](https://github.com/cosmos/ibc/blob/master/spec/client/ics-009-loopback-client) to connect two
different modules from the same chain.
::: tip
Expand Down
10 changes: 5 additions & 5 deletions docs/ibc/overview.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ Learn what IBC is, its components and use cases. {synopsis}
## What is the Interblockchain Communication Protocol (IBC)?

This document serves as a guide for developers who want to write their own Inter-blockchain
Communication Protocol (IBC) applications for custom [use-cases](https://github.com/cosmos/ics/blob/master/ibc/4_IBC_USECASES.md).
Communication Protocol (IBC) applications for custom use cases.

Due to the modular design of the IBC protocol, IBC
application developers do not need to concern themselves with the low-level details of clients,
Expand Down Expand Up @@ -61,12 +61,12 @@ must use for committing IBC messages is defined in
[ICS-24](https://github.com/cosmos/ics/tree/master/spec/core/ics-024-host-requirements) and the proof
format that all implementations must be able to produce and verify is defined in this [ICS-23 implementation](https://github.com/confio/ics23).

### [Capabilities](./ocap.md)
### [Capabilities](https://github.com/cosmos/cosmos-sdk/blob/master/docs/core/ocap.md)

IBC is intended to work in execution environements where modules do not necessarily trust each
other. Thus IBC must authenticate module actions on ports and channels so that only modules with the
appropriate permissions can use them. This is accomplished using [dynamic
capabilities](../architecture/adr-003-dynamic-capability-store.md). Upon binding to a port or
capabilities](https://github.com/cosmos/cosmos-sdk/blob/master/docs/architecture/adr-003-dynamic-capability-store.md). Upon binding to a port or
creating a channel for a module, IBC will return a dynamic capability that the module must claim in
order to use that port or channel. This prevents other modules from using that port or channel since
they will not own the appropriate capability.
Expand Down Expand Up @@ -175,8 +175,8 @@ Once an acknowledgement is received successfully on the original sender the chai

If you want to learn more about IBC, check the following specifications:

* [IBC specification overview](https://github.com/cosmos/ics/blob/master/ibc/README.md)
* [IBC SDK specification](../../modules/ibc)
* [IBC specification overview](https://github.com/cosmos/ibc/blob/master/README.md)
* [IBC SDK specification](../../modules/core/spec/README.md)

## Next {hide}

Expand Down
6 changes: 3 additions & 3 deletions docs/ibc/proto-docs.md
Original file line number Diff line number Diff line change
Expand Up @@ -829,7 +829,7 @@ upgrade.
### MsgTransfer
MsgTransfer defines a msg to transfer fungible tokens (i.e Coins) between
ICS20 enabled chains. See ICS Spec here:
https://github.com/cosmos/ics/tree/master/spec/ics-020-fungible-token-transfer#data-structures
https://github.com/cosmos/ibc/tree/master/spec/app/ics-020-fungible-token-transfer#data-structures


| Field | Type | Label | Description |
Expand Down Expand Up @@ -888,7 +888,7 @@ Msg defines the ibc/transfer Msg service.
### FungibleTokenPacketData
FungibleTokenPacketData defines a struct for the packet payload
See FungibleTokenPacketData spec:
https://github.com/cosmos/ics/tree/master/spec/ics-020-fungible-token-transfer#data-structures
https://github.com/cosmos/ibc/tree/master/spec/app/ics-020-fungible-token-transfer#data-structures


| Field | Type | Label | Description |
Expand Down Expand Up @@ -928,7 +928,7 @@ NOTE: The field numbers 21 and 22 were explicitly chosen to avoid accidental
conflicts with other protobuf message formats used for acknowledgements.
The first byte of any message with this format will be the non-ASCII values
`0xaa` (result) or `0xb2` (error). Implemented as defined by ICS:
https://github.com/cosmos/ics/tree/master/spec/ics-004-channel-and-packet-semantics#acknowledgement-envelope
https://github.com/cosmos/ibc/tree/master/spec/core/ics-004-channel-and-packet-semantics#acknowledgement-envelope


| Field | Type | Label | Description |
Expand Down
Loading

0 comments on commit 1778c9e

Please sign in to comment.