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

docs: add integrate docs #190

Merged
merged 5 commits into from
Sep 6, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
173 changes: 172 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,175 @@ for specs and wasm contracts.

* x - module code that is supposed to be imported by consumer chains
* demo - contains an example application and CLI that is using the mesh-security module
* tests/e2e - end-to-end tests with the demo app and contracts
* tests/e2e - end-to-end tests with the demo app and contracts

# Integrate the mesh security consumer and provider modules

## Prerequisites
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it should be both provider and consumer

Projects that want to integrate the meshsecurityprovider module onto their Cosmos SDK chain must enable the following modules:
- [x/staking](https://github.com/cosmos/cosmos-sdk/tree/main/x/staking)
- [x/auth](https://github.com/cosmos/cosmos-sdk/tree/main/x/auth)
- [x/bank](https://github.com/cosmos/cosmos-sdk/tree/main/x/bank)
- [x/wasm](github.com/CosmWasm/wasmd/x/wasm)

## Configuring and Adding Module
1. Add the mesh security package to the go.mod and install it.
```
require (
...
github.com/osmosis-labs/mesh-security
...
)
```

2. Add the following modules to `app.go`
```
import (
...
"github.com/osmosis-labs/mesh-security-sdk/x/meshsecurity"
meshseckeeper "github.com/osmosis-labs/mesh-security-sdk/x/meshsecurity/keeper"
meshsectypes "github.com/osmosis-labs/mesh-security-sdk/x/meshsecurity/types"
meshsecprov "github.com/osmosis-labs/mesh-security-sdk/x/meshsecurityprovider"
meshsecprovkeeper "github.com/osmosis-labs/mesh-security-sdk/x/meshsecurityprovider/keeper"
meshsecprovtypes "github.com/osmosis-labs/mesh-security-sdk/x/meshsecurityprovider/types"
...
)
```
3. In `app.go`: Register the AppModule for the mesh security modules.
```
ModuleBasics = module.NewBasicManager(
...
meshsecurity.AppModuleBasic{},
meshsecprov.AppModuleBasic{},
...
)
```
4. In `app.go`: Add module account permissions:
```
maccPerms = map[string][]string{
...
meshsectypes.ModuleName: {authtypes.Minter, authtypes.Burner}
}
```
5. In `app.go`: Add mesh security keepers.
```
type App struct {
...
MeshSecKeeper *meshseckeeper.Keeper,
MeshSecProvKeeper *meshsecprovkeeper.Keeper
...
}
```
6. In `app.go`: Add mesh security store keys.
```
keys := sdk.NewKVStoreKeys(
...
meshsectypes.StoreKey,
meshsecprovtypes.StoreKey,
...
)
```
7. In `app.go`: Instantiate mesh security keepers
```
app.MeshSecKeeper = meshseckeeper.NewKeeper(
app.appCodec,
keys[meshsectypes.StoreKey],
memKeys[meshsectypes.MemStoreKey],
app.BankKeeper,
app.StakingKeeper,
&app.WasmKeeper, // ensure this is a pointer as we instantiate the keeper a bit later
authtypes.NewModuleAddress(govtypes.ModuleName).String(),
)
app.MeshSecProvKeeper = meshsecprovkeeper.NewKeeper(
appCodec,
keys[meshsecprovtypes.StoreKey],
authtypes.NewModuleAddress(govtypes.ModuleName).String(),
app.BankKeeper,
&app.WasmKeeper,
app.StakingKeeper,
)
```
8. In `app.go`: Add the mesh security modules to the app manager instantiation.
```
app.mm = module.NewManager(
...
meshsecurity.NewAppModule(appCodec, app.MeshSecKeeper),
meshsecprov.NewAppModule(app.MeshSecProvKeeper)
...
)
```
9. In `app.go`: Add the module as the final element to the following:
- SetOrderBeginBlockers
- SetOrderEndBlockers
- SetOrderInitGenesis
```
// Add mesh security to begin blocker logic
app.moduleManager.SetOrderBeginBlockers(
...
meshsectypes.ModuleName,
meshsecprovtypes.ModuleName,
...
)

// Add mesh security to end blocker logic
app.moduleManager.SetOrderEndBlockers(
...
meshsectypes.ModuleName,
meshsecprovtypes.ModuleName,
...
)

// Add mesh security to init genesis logic
app.moduleManager.SetOrderInitGenesis(
...
meshsectypes.ModuleName,
meshsecprovtypes.ModuleName,
...
)
```
10. In `app.go`: Add the mesh security staking decorator to the slashing module.
```
app.SlashingKeeper = slashingkeeper.NewKeeper(
appCodec,
legacyAmino,
keys[slashingtypes.StoreKey],
// decorate the sdk keeper to capture all jail/ unjail events for MS
meshseckeeper.NewStakingDecorator(app.StakingKeeper, app.MeshSecKeeper),
authtypes.NewModuleAddress(govtypes.ModuleName).String(),
)
```
11. In `app.go`: Add the mesh security hooks to the staking module.
```
app.StakingKeeper.SetHooks(
stakingtypes.NewMultiStakingHooks(
...
// register hook to capture valset updates
app.MeshSecKeeper.Hooks()
),
)
```
12. In `app.go`: Add the mesh security hooks to the evidence module.
```
evidenceKeeper := evidencekeeper.NewKeeper(
...
// decorate the SlashingKeeper to capture the tombstone event
meshseckeeper.CaptureTombstoneDecorator(app.MeshSecKeeper, app.SlashingKeeper, app.StakingKeeper),
)
```
13. In `app.go`: Add the mesh security wasm message handler decorator to the wasm module.
```
meshMessageHandler := wasmkeeper.WithMessageHandlerDecorator(func(nested wasmkeeper.Messenger) wasmkeeper.Messenger {
return wasmkeeper.NewMessageHandlerChain(
// security layer for system integrity, should always be first in chain
meshseckeeper.NewIntegrityHandler(app.MeshSecKeeper),
nested,
// append our custom message handler for mesh-security
meshseckeeper.NewDefaultCustomMsgHandler(app.MeshSecKeeper),
meshsecprovkeeper.CustomMessageDecorator(app.MeshSecProvKeeper),
)
})
wasmOpts = append(wasmOpts, meshMessageHandler,
// add support for the mesh-security queries
wasmkeeper.WithQueryHandlerDecorator(meshseckeeper.NewQueryDecorator(app.MeshSecKeeper, app.SlashingKeeper)),
)
```
152 changes: 151 additions & 1 deletion x/meshsecurity/README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,152 @@
# Meshi-security
# Mesh-security
Cosmos module implementation

# Integrate the mesh security module

## Prerequisites
Projects that want to integrate the meshsecurity module onto their Cosmos SDK chain must enable the following modules:
- [x/staking](https://github.com/cosmos/cosmos-sdk/tree/main/x/staking)
- [x/auth](https://github.com/cosmos/cosmos-sdk/tree/main/x/auth)
- [x/bank](https://github.com/cosmos/cosmos-sdk/tree/main/x/bank)
- [x/wasm](github.com/CosmWasm/wasmd/x/wasm)

## Configuring and Adding Module
1. Add the mesh security package to the go.mod and install it.
```
require (
...
github.com/osmosis-labs/mesh-security
...
)
```

2. Add the following modules to `app.go`
```
import (
...
"github.com/osmosis-labs/mesh-security-sdk/x/meshsecurity"
meshseckeeper "github.com/osmosis-labs/mesh-security-sdk/x/meshsecurity/keeper"
meshsectypes "github.com/osmosis-labs/mesh-security-sdk/x/meshsecurity/types"
...
)
```
3. In `app.go`: Register the AppModule for the mesh security module.
```
ModuleBasics = module.NewBasicManager(
...
meshsecurity.AppModuleBasic{},
...
)
```
4. In `app.go`: Add module account permissions:
```
maccPerms = map[string][]string{
...
meshsectypes.ModuleName: {authtypes.Minter, authtypes.Burner}
}
```
5. In `app.go`: Add mesh security keeper.
```
type App struct {
...
MeshSecKeeper *meshseckeeper.Keeper
...
}
```
6. In `app.go`: Add mesh security store key.
```
keys := sdk.NewKVStoreKeys(
...
meshsectypes.StoreKey,
...
)
```
7. In `app.go`: Instantiate mesh security keeper
```
app.MeshSecKeeper = meshseckeeper.NewKeeper(
app.appCodec,
keys[meshsectypes.StoreKey],
memKeys[meshsectypes.MemStoreKey],
app.BankKeeper,
app.StakingKeeper,
&app.WasmKeeper, // ensure this is a pointer as we instantiate the keeper a bit later
authtypes.NewModuleAddress(govtypes.ModuleName).String(),
)
```
8. In `app.go`: Add the mesh security module to the app manager instantiation.
```
app.mm = module.NewManager(
...
meshsecurity.NewAppModule(appCodec, app.MeshSecKeeper),
...
)
```
9. In `app.go`: Add the module as the final element to the following:
- SetOrderBeginBlockers
- SetOrderEndBlockers
- SetOrderInitGenesis
```
// Add mesh security to begin blocker logic
app.moduleManager.SetOrderBeginBlockers(
...
meshsectypes.ModuleName,
...
)

// Add mesh security to end blocker logic
app.moduleManager.SetOrderEndBlockers(
...
meshsectypes.ModuleName,
...
)

// Add mesh security to init genesis logic
app.moduleManager.SetOrderInitGenesis(
...
meshsectypes.ModuleName,
...
)
```
10. In `app.go`: Add the mesh security staking decorator to the slashing module.
```
app.SlashingKeeper = slashingkeeper.NewKeeper(
appCodec,
legacyAmino,
keys[slashingtypes.StoreKey],
// decorate the sdk keeper to capture all jail/ unjail events for MS
meshseckeeper.NewStakingDecorator(app.StakingKeeper, app.MeshSecKeeper),
authtypes.NewModuleAddress(govtypes.ModuleName).String(),
)
```
11. In `app.go`: Add the mesh security hooks to the staking module.
```
app.StakingKeeper.SetHooks(
stakingtypes.NewMultiStakingHooks(
...
// register hook to capture valset updates
app.MeshSecKeeper.Hooks()
),
)
```
12. In `app.go`: Add the mesh security hooks to the evidence module.
```
evidenceKeeper := evidencekeeper.NewKeeper(
...
// decorate the SlashingKeeper to capture the tombstone event
meshseckeeper.CaptureTombstoneDecorator(app.MeshSecKeeper, app.SlashingKeeper, app.StakingKeeper),
)
```
13. In `app.go`: Add the mesh security wasm message handler decorator to the wasm module.
```
meshMessageHandler := wasmkeeper.WithMessageHandlerDecorator(func(nested wasmkeeper.Messenger) wasmkeeper.Messenger {
return wasmkeeper.NewMessageHandlerChain(
meshseckeeper.NewIntegrityHandler(app.MeshSecKeeper),
nested,
meshseckeeper.NewDefaultCustomMsgHandler(app.MeshSecKeeper),
)
})
wasmOpts = append(wasmOpts, meshMessageHandler,
// add support for the mesh-security queries
wasmkeeper.WithQueryHandlerDecorator(meshseckeeper.NewQueryDecorator(app.MeshSecKeeper, app.SlashingKeeper)),
)
```
Loading
Loading