context.CLIContext.verifier is defined as a reference to the global singleton lite verifier, assuming that the process will connect to only a single chain. In https://github.com/cosmos/cosmos-sdk/blob/master/client/context/context.go#L77
var (
verifier tmlite.Verifier
verifierHome string
)
// We need to use a single verifier for all contexts
if verifier == nil || verifierHome != viper.GetString(flags.FlagHome) {
verifier = createVerifier()
verifierHome = viper.GetString(flags.FlagHome)
}
This is not true on IBC, where the handshake/packet handling requires access on both chains. We can keep it as a global verifier but it has to be map[string]tmlite.Verifier where the key is verifierHome. This way we can let the multiple contexts share the same verifier if they are connecting to the same chain but can have different verifiers if not.
It might be a good idea to try https://github.com/tendermint/tendermint/pull/3989 where verify is a pure function as opposite to Verifier struct.
It seems that's a better approach. I think in order for the ibc testnet to run successfully we'll need something quick so we can quickly tackle this and then remove it once tendermint/tendermint#3989 is ready and in a release.
After discussing with @melekes I think these are somewhat orthogonal. I will continue on with the proposed solution for which we can use the IBC-Gaia integration testnet.
Most helpful comment
It seems that's a better approach. I think in order for the ibc testnet to run successfully we'll need something quick so we can quickly tackle this and then remove it once tendermint/tendermint#3989 is ready and in a release.