Versioning #409
Replies: 2 comments 8 replies
-
I agree. Many thanks for the discussion, this is very well written and already provides some clarifications!
In general the releases have not been that disruptive so far. I can mention here two areas of consideration, though they are not related strictly to versioning, and would be curious to hear other's opinion:
|
Beta Was this translation helpful? Give feedback.
-
A concrete example: Not sure what the looking forward solution is but maybe we should consider something similar to networking protocols where we could preemptively add some fields (very similar to the |
Beta Was this translation helpful? Give feedback.
-
With each layer we stack upon new pieces of technology we increase the complexity of our dependency graphs and the versioning requirements that go along with it.
Traditional software development might use semantic versioning, but the concept of "backwards compatibility" starts to break down once you introduce decentralized systems. It's possible a change is backwards compatible for clients interacting with a process, but the change is not backwards compatible for processes within the same cluster communicating with each other. We might call this a state machine breaking change and the lack of external clients breaking a non API breaking change.
Now that we have IBC, we introduce another layer of complexity. One can think of the versioning here like the ability for a cluster of processes to communicate with another cluster of processes. That is, chains (constructed of many nodes) communicating with other chains (constructed of many nodes). We have the IBC specification version to handle this complexity.
What isn't well defined at this layer of the stack are the individual choices an implementation may make/change which still support the IBC specification version. This is very burdensome for relayers who may be reliant on unspecified/versioned code of these implementations. Even more so, relayers are needed to support interaction between chains using uncompatible code. This is to say that a relayer may need to introduce exceptions based on the version a chain is using. This is already enormously complex when using a single implementation of ibc-go which may have breaking API/state changes between the oldest version (stargate) and the newest version. This becomes exponentially complex as new implementations of IBC are introduced
#408 introduces are outlined meaning of ibc-go semantic versioning. It allows us to follow a straightforward decision tree. This is a good starting point, but it intentionally does not encapsulate all current concerns. This is because we don't have the current insight to make a best/informed decision at the moment, but as time progresses we can iron out problem areas and increase the strength of our backwards compatibility guarantees beyond just the IBC specification version
Just as it is unsustainable for us to try to account for backwards compatibility with all of our user groups, it is unsustainable for relayers to maintain full compatibility with all connected implementations and versions of those implementations. To the best of my knowledge, the stop gap solution in hermes is to track the code version of a node it is communicating with and add custom if statements to handle new logic based on new functionality, with the idea of eventually deprecating support for the oldest versions of the code. Deprecating support for old versions is idealistic and not practical, we should not rely on this as a solution.
In order to push development further, breaking changes will need to be made eventually, but there should be a natural give/take to ensure we are only causing disruption when necessary. Ensuring that we aren't causing disruption requires being aware of what might cause disruption. This will also allow us to increase the strength of our backwards compatibility guarantees and potentially amend the meaning of our semantic versioning
As I've outlined before, I believe there are four user groups of ibc-go:
Chains care about API breaking changes, state machine breaking changes, and IBC spec versioning. They are accounted for in the current semantic versioning proposal.
IBC app developers care primarily about API breaking changes (to the app module interface). They are accounted for in the current semantic versioning proposal.
IBC light client developers care primarily about API breaking changes (to the light client interface). They are accounted for in the current semantic versioning proposal
Relayers care about many aspects of our code. All the dependencies are not entirely clear to me. Relayers certainly care about the gRPCs we expose and how they function (this should be added to IBC specs). They may care about our internal handling of IBC spec recommendations. For example, the portID limit or the supported amount for ics20 packet transfers. They may want to optimistically drop sending packets which cannot succeed based on the chain they are connected to. They may care about how IBC governance related actions are implemented. They may care about which IBC applications are supported
In general I think we should outline which dependencies are absolutely necessary for relayers to successfully relay between old versions of IBC implementations and new version of IBC implementations. These should be added as requirements or at least recommendations to the IBC specification. Having a clear understanding of what changes might cause breakage in relayers will allow us to give more care when making potentially disruptive changes
Opening for discussion. What changes since the stargate release have been disruptive? What changes have been ok to support? What part of our API is most used? Is there any areas of consideration I haven't mentioned?
Beta Was this translation helpful? Give feedback.
All reactions