Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add wasm light client module to feat/wasm-clients branch #3486

Merged
merged 124 commits into from
Jul 6, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
124 commits
Select commit Hold shift + click to select a range
01cef00
WIP moving over code from chorus
jackzampolin Sep 14, 2022
0199a64
Compiles
jackzampolin Sep 14, 2022
cfae2d6
Genesis stubbed out, comments
jackzampolin Sep 16, 2022
9c5e210
Rename 28-wasm abstrations, prepare to move storage code over from 10…
jackzampolin Sep 20, 2022
d40e6f6
remove 28-wasm, consolidate 28-wasm to wasm light client module
antstalepresh Oct 25, 2022
a5ee4ec
remove 28-wasm completely, adjustments for wasm light client
antstalepresh Nov 3, 2022
6ffa4a2
define msg interface for getting client states as param
antstalepresh Nov 9, 2022
4d6eff5
Test WASM contract interaction
vmarkushin Nov 15, 2022
37e995b
change field name
vmarkushin Nov 15, 2022
144e762
remove unused vars
vmarkushin Nov 15, 2022
99abef8
TestVerifyClientMessageHeader
vmarkushin Nov 21, 2022
f8b4828
remove client state duplication, implement misbehaviour functions
antstalepresh Nov 22, 2022
1180143
adjustments for error handlers
antstalepresh Nov 22, 2022
9685732
Merge remote-tracking branch 'composable/vmarkushin/10-wasm-tests' in…
misko9 Nov 22, 2022
73b921b
Remove types directory, regenerate protobufs, and prepare for sharing
misko9 Nov 23, 2022
d9b287c
UpdateState implementation + test
vmarkushin Nov 23, 2022
0d9ddd3
Update proto files
vmarkushin Nov 23, 2022
9740871
Remove obsolete ClientState methods
vmarkushin Nov 23, 2022
3b53249
Verify(Non)Memership, refactor
vmarkushin Nov 23, 2022
7cf32bf
little refactor
vmarkushin Nov 23, 2022
ef386fc
Merge remote-tracking branch 'ыд/feat/wasm-clients' into vmarkushin/1…
vmarkushin Nov 23, 2022
ba4cece
fix merge errors
vmarkushin Nov 23, 2022
0f778e9
trying to get `SetupConnections` working
vmarkushin Nov 24, 2022
4231f11
implementation for status, verifyupgradeandupdatestate methods
antstalepresh Nov 25, 2022
10a8c45
Merge remote-tracking branch 'composable/vmarkushin/10-wasm-tests' in…
misko9 Nov 26, 2022
3fe00ff
Add wasm client keeper and wire up the tx/query messages
misko9 Dec 2, 2022
e9e8095
add unit tests for wasm client - wip
antstalepresh Jan 5, 2023
58ba765
add keeper level unit tests, adjust some file structures
antstalepresh Jan 11, 2023
3ff94ce
Rename 10-wasm to 08-wasm to reflect ICS08
misko9 Jan 18, 2023
6000ff7
Remove proof specs and repository from 08-wasm client state
misko9 Jan 19, 2023
e320691
Merge branch 'main' into feat/wasm-clients-main
misko9 Mar 27, 2023
50e5267
refactor: require light clients to set the initial client state and
misko9 Jan 27, 2023
3d471e0
Add governance to PushNewWasmCode msg
misko9 Feb 15, 2023
c816dd6
Minor fix on push new wasm code msg
misko9 Feb 17, 2023
fd553a3
add some types
blasrodri Feb 7, 2023
a040954
modify most of the methods to encode types
blasrodri Feb 7, 2023
0c5abe3
Omit the nil clientmessage
misko9 Feb 22, 2023
2b21a98
relocate files to follow regular sdk module folder structure
crodriguezvega Feb 26, 2023
34d3b8c
made gRPC endpoints the only entry point for querying by code id and …
crodriguezvega Feb 26, 2023
5e40b0f
remove wasm client keeper from IBC keeper
crodriguezvega Mar 1, 2023
a1ad177
Re-adding unit testing for client state's status, validate, initialize,
misko9 Mar 9, 2023
95bd51b
Added additional verify membership tests, added first verify
misko9 Mar 10, 2023
4d5e2ec
Align file names with the existing light clients, reducing pressure on
misko9 Mar 10, 2023
214870e
Re-add Status method query into contract. Finish building out unit
misko9 Mar 12, 2023
affd4c9
Refresh unit test data due to grandpa headers changing. Add unit tests
misko9 Mar 14, 2023
078ccd3
Add misbehaviour data and verify misbehaviour msg test cases.
misko9 Mar 17, 2023
b896191
Add store adapter for WasmVM 1.2.1 and finish replacing tendermint with
misko9 Mar 17, 2023
9261cd7
chore: clean up unused wasm clients enable
misko9 Mar 17, 2023
a3d8021
lint 7.1
faddat Mar 17, 2023
5a7bcfd
finish lints
faddat Mar 17, 2023
e0b0ee2
test: added testing for MisbehaviourValidateBasic and most of
misko9 Mar 17, 2023
80e94a7
fix: modify gas fees for WasmVM calls. Added a new gas register, copied
misko9 Mar 19, 2023
188c635
Add ExportMetadata back along with a unit test for it. Add a unit test
misko9 Mar 20, 2023
ed74bd9
test: add VerifyUpgradeAndUpdateState unit tests, fix the interface to
misko9 Mar 20, 2023
4f33d5c
Remove unused msg params:
misko9 Mar 22, 2023
8240399
refactor: contract will get/set client state from store, removed passing
misko9 Mar 22, 2023
9f63ae8
fix: set interface and test CheckSubstituteAndUpdateState
misko9 Mar 23, 2023
7c94eef
query all wasm id
vuong177 Mar 21, 2023
67d4cfc
fix grpc_query
vuong177 Mar 21, 2023
1ebce32
Add cmd
vuong177 Mar 21, 2023
af23c10
route
vuong177 Mar 21, 2023
e2762ad
max bytes
vuong177 Mar 21, 2023
ccaa2b9
increase max wasm size
vuong177 Mar 21, 2023
e04a422
pagination for AllWasmCodeID query
vuong177 Mar 21, 2023
edef441
add TestQueryAllWasmCode
vuong177 Mar 21, 2023
0a2e0dc
minor
vuong177 Mar 21, 2023
7215b60
review from misko
vuong177 Mar 23, 2023
fb47c67
wire up grpc gateway
crodriguezvega Mar 24, 2023
6c50447
fix: CheckForMisbehaviour and UpdateStateOnMisbehaviour fully working.
misko9 Mar 24, 2023
16b217c
Add grandpa contract for unit testing, remove unused raw.json
misko9 Mar 24, 2023
815add6
Add some defensive checks on VerifyMembership and VerifyNonMembership
misko9 Mar 24, 2023
ca54009
Add genesis state for wasm light client's keeper. Add export
misko9 Mar 26, 2023
51abf6a
style: cleanup
misko9 Mar 26, 2023
54b14cb
nits for client state
crodriguezvega Mar 27, 2023
3ff042c
Fix typo
misko9 Mar 27, 2023
70ae58b
Merge branch 'main' into feat/wasm-clients-main
misko9 Mar 27, 2023
3b69036
Fixes after merging fom main
misko9 Mar 27, 2023
c61af53
Removed wasm light client ibctesting additions. They are currently
misko9 Mar 27, 2023
c96e6a9
style: go fmt
misko9 Mar 27, 2023
d7c9d06
chore: pass lint
misko9 Mar 27, 2023
826503c
fixes: send wasmvm the block time in nano seconds, remove unnecessary
misko9 Apr 3, 2023
9507a32
test: add unit tests and cw tendermint light client contracts (#28)
misko9 Apr 10, 2023
b93beaa
nits, style, typos, documentation improvements
crodriguezvega Apr 13, 2023
825045c
Merge branch 'feat/wasm-clients-main' into carlos/nits-docs-style-imp…
crodriguezvega Apr 13, 2023
0813647
rename
crodriguezvega Apr 13, 2023
47be78a
fix test
crodriguezvega Apr 13, 2023
4a76339
parameter renaming / delete unused const
crodriguezvega Apr 13, 2023
9b7e5a4
URI change
crodriguezvega Apr 13, 2023
7e5ace5
Merge branch 'main' into feat/wasm-clients-main
jackzampolin Apr 13, 2023
22d790d
rename field in genesis contract / re-generated swagger
crodriguezvega Apr 14, 2023
fb0cab4
fix linter
crodriguezvega Apr 14, 2023
61648d7
disable test
crodriguezvega Apr 14, 2023
f8081a1
Merge pull request #29 from crodriguezvega/carlos/nits-docs-style-imp…
misko9 Apr 14, 2023
f60edbf
Merge branch 'cosmos:main' into feat/wasm-clients-main
misko9 Apr 18, 2023
1a981d0
some improvements for 08-wasm testing
crodriguezvega May 16, 2023
52dc7ef
Merge branch 'feat/wasm-clients-main' into carlos/tests-improvements
crodriguezvega May 16, 2023
a9feb7b
removed field from suite
crodriguezvega May 16, 2023
b9d75e2
gofumpt
crodriguezvega May 16, 2023
efa5e32
var renamed
crodriguezvega May 16, 2023
95a2db0
address some of the review comments
crodriguezvega May 22, 2023
bd7d287
address review comment
crodriguezvega May 26, 2023
a61b0db
remove unused code
crodriguezvega May 26, 2023
e1f075b
docs: update ADR 027
crodriguezvega May 26, 2023
6368e3a
indentation
crodriguezvega May 26, 2023
1aa2e90
fix code block
crodriguezvega May 26, 2023
65eda5d
update consequence
crodriguezvega May 26, 2023
4a1722b
Merge pull request #30 from crodriguezvega/carlos/tests-improvements
misko9 May 26, 2023
037fc02
address review comments
crodriguezvega Jun 2, 2023
eef685a
review comment
crodriguezvega Jun 2, 2023
8aa59a8
Update docs/architecture/adr-027-ibc-wasm.md
crodriguezvega Jun 4, 2023
848ab23
nit improvements and genesis function tests
crodriguezvega Jun 4, 2023
acf8442
genesis tests
crodriguezvega Jun 4, 2023
618d4f6
revert testing change
crodriguezvega Jun 4, 2023
f17aada
fix typo
crodriguezvega Jun 4, 2023
a2c49e5
Merge pull request #37 from crodriguezvega/carlos/nit-improvements-ge…
misko9 Jun 5, 2023
96e9930
Update ics07_tendermint_cw.wasm.gz
misko9 Jun 5, 2023
3966477
add explanation to global wasm vm variable
crodriguezvega Jun 6, 2023
65456b7
address first round of review nits
crodriguezvega Jun 12, 2023
ee3049f
add comment
crodriguezvega Jun 13, 2023
ca4ada2
addressing more review comments
crodriguezvega Jun 26, 2023
24d0738
fix
crodriguezvega Jun 26, 2023
83fa69f
Merge pull request #42 from crodriguezvega/carlos/address-review-nits
misko9 Jun 29, 2023
bf9ec20
Merge pull request #31 from crodriguezvega/carlos/update-adr-027
misko9 Jun 29, 2023
d46298f
Merge remote-tracking branch 'cosmos/feat/wasm-clients' into feat/was…
misko9 Jul 5, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ artifacts
baseapp/data/*
client/lcd/keys/*
mytestnet
modules/light-clients/08-wasm/types/ibc_08-wasm_client_data/

# Testing
coverage.txt
Expand Down Expand Up @@ -56,6 +57,8 @@ dependency-graph.png

*.history

tmp/
*.wasm
# Go
go.work
go.work.sum
214 changes: 122 additions & 92 deletions docs/architecture/adr-027-ibc-wasm.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,147 +3,177 @@
## Changelog

- 26/11/2020: Initial Draft
- 26/05/2023: Update after 02-client refactor and re-implementation by Strangelove

## Status

*Draft, needs updates*

## Abstract

In the Cosmos SDK light clients are current hardcoded in Go. This makes upgrading existing IBC light clients or adding
support for new light client a multi step process involving on-chain governance which is time-consuming.
In the Cosmos SDK light clients are current hardcoded in Go. This makes upgrading existing IBC light clients or
adding support for new light client a multi step process involving on-chain governance which is time-consuming.

To remedy this, we are proposing a WASM VM to host light client bytecode, which allows easier upgrading of
existing IBC light clients as well as adding support for new IBC light clients without requiring a code release and corresponding
hard-fork event.
To remedy this, we are proposing a Wasm VM to host light client bytecode, which allows easier upgrading of
existing IBC light clients as well as adding support for new IBC light clients without requiring a code release and
corresponding hard-fork event.

## Context

Currently in the SDK, light clients are defined as part of the codebase and are implemented as submodules under
`ibc-go/core/modules/light-clients/`.
Currently in ibc-go light clients are defined as part of the codebase and are implemented as modules under
`modules/light-clients`. Adding support for new light clients or updating an existing light client in the event
of a security issue or consensus update is a multi-step process which is both time consuming and error prone.
In order to enable new IBC light client implementations it is necessary to modify the codebase of ibc-go,
re-build chains' binaries, pass a governance proposal and validators upgrade their nodes.

Adding support for new light client or update an existing light client in the event of security
issue or consensus update is multi-step process which is both time consuming and error prone:
Another problem stemming from the above process is that if a chain wants to upgrade its own consensus, it will
need to convince every chain or hub connected to it to upgrade its light client in order to stay connected. Due
to the time consuming process required to upgrade a light client, a chain with lots of connections needs to be
disconnected for quite some time after upgrading its consensus, which can be very expensive in terms of time and effort.

1. To add support for new light client or update an existing light client in the
event of security issue or consensus update, we need to modify the codebase and integrate it in numerous places.
We are proposing simplifying this workflow by integrating a Wasm light client module that makes adding support for
new light clients a simple governance-gated transaction. The light client bytecode, written in Wasm-compilable Rust,
runs inside a Wasm VM. The Wasm light client submodule exposes a proxy light client interface that routes incoming
messages to the appropriate handler function, inside the Wasm VM for execution.

2. Governance voting: Adding new light client implementations require governance support and is expensive: This is
not ideal as chain governance is gatekeeper for new light client implementations getting added. If a small community
want support for light client X, they may not be able to convince governance to support it.

3. Validator upgrade: After governance voting succeeds, validators need to upgrade their nodes in order to enable new
IBC light client implementation.

Another problem stemming from the above process is that if a chain wants to upgrade its own consensus, it will need to convince every chain
or hub connected to it to upgrade its light client in order to stay connected. Due to time consuming process required
to upgrade light client, a chain with lots of connections needs to be disconnected for quite some time after upgrading
its consensus, which can be very expensive in terms of time and effort.

We are proposing simplifying this workflow by integrating a WASM light client module which makes adding support for
a new light client a simple transaction. The light client bytecode, written in Wasm-compilable Rust, runs inside a WASM
VM. The Wasm light client submodule exposes a proxy light client interface that routes incoming messages to the
appropriate handler function, inside the Wasm VM for execution.

With WASM light client module, anybody can add new IBC light client in the form of WASM bytecode (provided they are able to pay the requisite gas fee for the transaction)
as well as instantiate clients using any created client type. This allows any chain to update its own light client in other chains
without going through steps outlined above.
With the Wasm light client module, anybody can add new IBC light client in the form of Wasm bytecode (provided they are
able to submit the governance proposal transaction and that it passes) as well as instantiate clients using any created
client type. This allows any chain to update its own light client in other chains without going through the steps outlined above.

## Decision

We decided to use WASM light client module as a light client proxy which will interface with the actual light client
uploaded as WASM bytecode. This will require changing client selection method to allow any client if the client type
has prefix of `wasm/`.
We decided to implement the Wasm light client module as a light client proxy that will interface with the actual light client
uploaded as Wasm bytecode. To enable usage of the Wasm light client module, users need to add it to the list of allowed clients
by updating the `AllowedClients` parameter in the 02-client submodule of core IBC.

```go
// IsAllowedClient checks if the given client type is registered on the allowlist.
func (p Params) IsAllowedClient(clientType string) bool {
if p.AreWASMClientsAllowed && isWASMClient(clientType) {
return true
}
params := clientKeeper.GetParams(ctx)
params.AllowedClients = append(params.AllowedClients, exported.Wasm)
clientKeeper.SetParams(ctx, params)
```

for _, allowedClient := range p.AllowedClients {
if allowedClient == clientType {
return true
}
}
Adding a new light client contract is governance-gated. To upload a new light client users need to submit
a [governance v1 proposal](https://docs.cosmos.network/main/modules/gov#proposals) that contains the `sdk.Msg` for storing
the Wasm contract's bytecode. The required message is `MsgStoreCode` and the bytecode is provided in the field `code`:

return false
```proto
// MsgStoreCode defines the request type for the StoreCode rpc.
message MsgStoreCode {
string signer = 1;
bytes code = 2;
}
```

To upload new light client, user need to create a transaction with Wasm byte code which will be
processed by IBC Wasm module.
The RPC handler processing `MsgStoreCode` will make sure that the signer of the message matches the address of authority allowed to
submit this message (which is normally the address of the governance module).

```go
func (k Keeper) UploadLightClient (wasmCode: []byte, description: String) {
wasmRegistry = getWASMRegistry()
id := hex.EncodeToString(sha256.Sum256(wasmCode))
assert(!wasmRegistry.Exists(id))
assert(wasmRegistry.ValidateAndStoreCode(id, description, wasmCode, false))
// StoreCode defines a rpc handler method for MsgStoreCode
func (k Keeper) StoreCode(goCtx context.Context, msg *types.MsgStoreCode) (*types.MsgStoreCodeResponse, error) {
ctx := sdk.UnwrapSDKContext(goCtx)

if k.authority != msg.Signer {
return nil, sdkerrors.Wrapf(govtypes.ErrInvalidSigner, "invalid authority: expected %s, got %s", k.authority, msg.Signer)
}

codeID, err := k.storeWasmCode(ctx, msg.Code)
if err != nil {
return nil, sdkerrors.Wrap(err, "storing wasm code failed")
}

ctx.EventManager().EmitEvents(sdk.Events{
sdk.NewEvent(
clienttypes.EventTypeStoreWasmCode,
sdk.NewAttribute(clienttypes.AttributeKeyWasmCodeID, hex.EncodeToString(codeID)),
),
sdk.NewEvent(
sdk.EventTypeMessage,
sdk.NewAttribute(sdk.AttributeKeyModule, clienttypes.AttributeValueCategory),
),
})

return &types.MsgStoreCodeResponse{
CodeId: codeID,
}, nil
}
```

As name implies, Wasm registry is a registry which stores set of Wasm client code indexed by its hash and allows
client code to retrieve latest code uploaded.

`ValidateAndStoreCode` checks if the wasm bytecode uploaded is valid and confirms to VM interface.
The contract's bytecode is stored in state in an entry indexed by the code ID: `codeId/{code ID}`. The code ID is simply
the hash of the bytecode of the contract.

### How light client proxy works?

The light client proxy behind the scenes will call a cosmwasm smart contract instance with incoming arguments in json
serialized format with appropriate environment information. Data returned by the smart contract is deserialized and
The light client proxy behind the scenes will call a CosmWasm smart contract instance with incoming arguments serialized
in JSON format with appropriate environment information. Data returned by the smart contract is deserialized and
returned to the caller.

Consider an example of `CheckProposedHeaderAndUpdateState` function of `ClientState` interface. Incoming arguments are
packaged inside a payload which is json serialized and passed to `callContract` which calls `vm.Execute` and returns the
array of bytes returned by the smart contract. This data is deserialized and passed as return argument.
Consider the example of the `VerifyClientMessage` function of `ClientState` interface. Incoming arguments are
packaged inside a payload object that is then JSON serialized and passed to `callContract`, which execute `WasmVm.Execute`
and returns the slice of bytes returned by the smart contract. This data is deserialized and passed as return argument.

```go
func (c *ClientState) CheckProposedHeaderAndUpdateState(context sdk.Context, marshaler codec.BinaryMarshaler, store sdk.KVStore, header exported.ClientMessage) (exported.ClientState, exported.ConsensusState, error) {
// get consensus state corresponding to client state to check if the client is expired
consensusState, err := GetConsensusState(store, marshaler, c.LatestHeight)
if err != nil {
return nil, nil, sdkerrors.Wrapf(
err, "could not get consensus state from clientstore at height: %d", c.LatestHeight,
)
type (
verifyClientMessageInnerPayload struct {
ClientMessage clientMessage `json:"client_message"`
}

payload := make(map[string]map[string]interface{})
payload[CheckProposedHeaderAndUpdateState] = make(map[string]interface{})
inner := payload[CheckProposedHeaderAndUpdateState]
inner["me"] = c
inner["header"] = header
inner["consensus_state"] = consensusState

encodedData, err := json.Marshal(payload)
if err != nil {
return nil, nil, sdkerrors.Wrapf(ErrUnableToMarshalPayload, fmt.Sprintf("underlying error: %s", err.Error()))
clientMessage struct {
Header *Header `json:"header,omitempty"`
Misbehaviour *Misbehaviour `json:"misbehaviour,omitempty"`
}
out, err := callContract(c.CodeId, context, store, encodedData)
if err != nil {
return nil, nil, sdkerrors.Wrapf(ErrUnableToCall, fmt.Sprintf("underlying error: %s", err.Error()))
verifyClientMessagePayload struct {
VerifyClientMessage verifyClientMessageInnerPayload `json:"verify_client_message"`
}
)

// VerifyClientMessage must verify a ClientMessage. A ClientMessage could be a Header, Misbehaviour, or batch update.
// It must handle each type of ClientMessage appropriately. Calls to CheckForMisbehaviour, UpdateState, and UpdateStateOnMisbehaviour
// will assume that the content of the ClientMessage has been verified and can be trusted. An error should be returned
// if the ClientMessage fails to verify.
func (cs ClientState) VerifyClientMessage(
ctx sdk.Context,
_ codec.BinaryCodec,
clientStore sdk.KVStore,
clientMsg exported.ClientMessage
) error {
clientMsgConcrete := clientMessage{
Header: nil,
Misbehaviour: nil,
}
switch clientMsg := clientMsg.(type) {
case *Header:
clientMsgConcrete.Header = clientMsg
case *Misbehaviour:
clientMsgConcrete.Misbehaviour = clientMsg
}
output := clientStateCallResponse{}
if err := json.Unmarshal(out.Data, &output); err != nil {
return nil, nil, sdkerrors.Wrapf(ErrUnableToUnmarshalPayload, fmt.Sprintf("underlying error: %s", err.Error()))
inner := verifyClientMessageInnerPayload{
ClientMessage: clientMsgConcrete,
}
if !output.Result.IsValid {
return nil, nil, fmt.Errorf("%s error ocurred while updating client state", output.Result.ErrorMsg)
payload := verifyClientMessagePayload{
VerifyClientMessage: inner,
}
output.resetImmutables(c)
return output.NewClientState, output.NewConsensusState, nil
_, err := call[contractResult](ctx, clientStore, &cs, payload)
return err
}
```

### Global Wasm VM variable

The 08-wasm keeper structure keeps a reference to the Wasm VM instantiated in the keeper constructor function. The keeper uses
the Wasm VM to store the bytecode of light client contracts. However, the Wasm VM is also needed in the 08-wasm implementations of
some of the `ClientState` interface functions to initialise a contract, execute calls on the contract and query the contract. Since
the `ClientState` functions do not have access to the 08-wasm keeper, then it has been decided to keep a global pointer variable that
points to the same instance as the one in the 08-wasm keeper. This global pointer variable is then used in the implementations of
the `ClientState` functions.

## Consequences

### Positive

- Adding support for new light client or upgrading existing light client is way easier than before and only requires single transaction.
- Improves maintainability of Cosmos SDK, since no change in codebase is required to support new client or upgrade it.
- Adding support for new light client or upgrading existing light client is way easier than before and only requires single transaction instead of a hard-fork.
- Improves maintainability of ibc-go, since no change in codebase is required to support new client or upgrade it.
- The existence of support for Rust dependencies in light clients which may not exist in Go.

### Negative

- Light clients need to be written in subset of rust which could compile in Wasm.
- Light clients written in Rust need to be written in a subset of Rust which could compile in Wasm.
- Introspecting light client code is difficult as only compiled bytecode exists in the blockchain.
8 changes: 8 additions & 0 deletions docs/client/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -62,5 +62,13 @@
}
}
},
{
"url": "./tmp-swagger-gen/ibc/lightclients/wasm/v1/query.swagger.json",
"operationIds": {
"rename": {
"Params": "WasmParams"
}
}
}
]
}
Loading