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

R4R [Staging PR 1/3]: module generalization #4033

Closed
wants to merge 35 commits into from
Closed
Show file tree
Hide file tree
Changes from 4 commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
fc3343b
first commit
rigelrozanski Apr 3, 2019
2ed7ec3
gaia cleanup
rigelrozanski Apr 4, 2019
fa8d51b
...
rigelrozanski Apr 4, 2019
78beb8b
Merge 'origin/develop' and working on module manager
rigelrozanski Apr 4, 2019
f3c84d2
Merge remote-tracking branch 'origin/develop' into rigel/genesis-gene…
rigelrozanski Apr 8, 2019
31e268a
staking multihooks
rigelrozanski Apr 8, 2019
f04fd65
missing module function return args
rigelrozanski Apr 8, 2019
b9fea80
bank module name constant
rigelrozanski Apr 8, 2019
53096ec
working, module interface for x/
rigelrozanski Apr 9, 2019
f89b67b
got this thing compiling
rigelrozanski Apr 9, 2019
fc2c20a
Merge remote-tracking branch 'origin/develop' into rigel/genesis-gene…
rigelrozanski Apr 9, 2019
f026bec
make test compiles and passes
rigelrozanski Apr 9, 2019
45d82f9
remove expanded simulation invariants
rigelrozanski Apr 9, 2019
3f4d0cf
genesis issue
rigelrozanski Apr 10, 2019
050317d
continued
rigelrozanski Apr 10, 2019
69a543e
continued
rigelrozanski Apr 10, 2019
95236c4
Merge remote-tracking branch 'origin/develop' into rigel/genesis-gene…
rigelrozanski Apr 10, 2019
03328ee
Merge remote-tracking branch 'origin/develop' into rigel/genesis-gene…
rigelrozanski Apr 10, 2019
9031e9d
register crisis routes thought mm
rigelrozanski Apr 10, 2019
480c10e
begin blocker to mm
rigelrozanski Apr 10, 2019
ef5ec28
end blocker to mm
rigelrozanski Apr 10, 2019
3c681a6
empty routes not initialized
rigelrozanski Apr 10, 2019
4ad51d2
move gaia initChainer sanity check to baseapp
rigelrozanski Apr 10, 2019
3620b2e
remove codecs from module manager
rigelrozanski Apr 10, 2019
62342b2
reorging genesis stuff
rigelrozanski Apr 10, 2019
6ce6260
Merge remote-tracking branch 'origin/develop' into rigel/genesis-gene…
rigelrozanski Apr 15, 2019
c8c3a08
module manager passed by reference/bugfixes from working last commit
rigelrozanski Apr 15, 2019
cd4d68f
move invariant checks from gaia to crisis
rigelrozanski Apr 15, 2019
2d95c57
typo
rigelrozanski Apr 15, 2019
631298e
MultiStakingHooks from types to x/staking/types
rigelrozanski Apr 17, 2019
a2cd3dc
default module manager order of operations from input modules
rigelrozanski Apr 17, 2019
022498e
typo
rigelrozanski Apr 17, 2019
092aab3
Merge remote-tracking branch 'origin/develop' into rigel/genesis-gene…
rigelrozanski Apr 22, 2019
7977e7e
Merge remote-tracking branch 'origin/develop' into rigel/genesis-gene…
rigelrozanski Apr 26, 2019
87ed491
comment improvement
rigelrozanski Apr 26, 2019
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
121 changes: 30 additions & 91 deletions cmd/gaia/app/app.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package app

import (
"encoding/json"
"fmt"
"io"
"os"
Expand Down Expand Up @@ -56,7 +57,7 @@ type GaiaApp struct {
keyParams *sdk.KVStoreKey
tkeyParams *sdk.TransientStoreKey

// Manage getting and setting accounts
// keepers
accountKeeper auth.AccountKeeper
feeCollectionKeeper auth.FeeCollectionKeeper
bankKeeper bank.Keeper
Expand Down Expand Up @@ -95,17 +96,18 @@ func NewGaiaApp(logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest,
tkeyParams: sdk.NewTransientStoreKey(params.TStoreKey),
}

app.paramsKeeper = params.NewKeeper(app.cdc, app.keyParams, app.tkeyParams)

// define the accountKeeper
// add keepers
app.paramsKeeper = params.NewKeeper(
app.cdc,
app.keyParams,
app.tkeyParams,
)
app.accountKeeper = auth.NewAccountKeeper(
app.cdc,
app.keyAccount,
app.paramsKeeper.Subspace(auth.DefaultParamspace),
auth.ProtoBaseAccount,
)

// add handlers
app.bankKeeper = bank.NewBaseKeeper(
app.accountKeeper,
app.paramsKeeper.Subspace(bank.DefaultParamspace),
Expand Down Expand Up @@ -181,9 +183,9 @@ func NewGaiaApp(logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest,
AddRoute(mint.QuerierRoute, mint.NewQuerier(app.mintKeeper))

// initialize BaseApp
app.MountStores(app.keyMain, app.keyAccount, app.keyStaking, app.keyMint, app.keyDistr,
app.keySlashing, app.keyGov, app.keyFeeCollection, app.keyParams,
app.tkeyParams, app.tkeyStaking, app.tkeyDistr,
app.MountStores(app.keyMain, app.keyAccount, app.keyStaking, app.keyMint,
app.keyDistr, app.keySlashing, app.keyGov, app.keyFeeCollection,
app.keyParams, app.tkeyParams, app.tkeyStaking, app.tkeyDistr,
)
app.SetInitChainer(app.initChainer)
app.SetBeginBlocker(app.BeginBlocker)
Expand Down Expand Up @@ -245,11 +247,11 @@ func (app *GaiaApp) EndBlocker(ctx sdk.Context, req abci.RequestEndBlock) (abci.
if err != nil {
return abci.ResponseEndBlock{}, err
}
validatorUpdates, endBlockerTags, err := staking.EndBlocker(ctx, app.stakingKeeper)
validatorUpdates, stakingTags, err := staking.EndBlocker(ctx, app.stakingKeeper)
if err != nil {
return abci.ResponseEndBlock{}, err
}
tags = append(tags, endBlockerTags...)
tags = append(tags, stakingTags...)

if app.assertInvariantsBlockly {
app.assertRuntimeInvariants()
Expand Down Expand Up @@ -295,42 +297,36 @@ func (app *GaiaApp) initFromGenesisState(ctx sdk.Context, genesisState GenesisSt
}

if len(genesisState.GenTxs) > 0 {
for _, genTx := range genesisState.GenTxs {
var tx auth.StdTx
err = app.cdc.UnmarshalJSON(genTx, &tx)
if err != nil {
panic(err)
}
bz := app.cdc.MustMarshalBinaryLengthPrefixed(tx)
res := app.BaseApp.DeliverTx(bz)
if !res.IsOK() {
panic(res.Log)
}
}

validators = app.stakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx)
validators = app.deliverGenTxs(ctx, genesisState.GenTxs)
}
return validators
}

func (app *GaiaApp) deliverGenTxs(ctx sdk.Context, genTxs []json.RawMessage) []abci.ValidatorUpdate {
for _, genTx := range genTxs {
var tx auth.StdTx
app.cdc.MustUnmarshalJSON(genTx, &tx)
bz := app.cdc.MustMarshalBinaryLengthPrefixed(tx)
res := app.BaseApp.DeliverTx(bz)
if !res.IsOK() {
panic(res.Log)
}
}
return app.stakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx)
}

// custom logic for gaia initialization
func (app *GaiaApp) initChainer(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain {
stateJSON := req.AppStateBytes
// TODO is this now the whole genesis file?

var genesisState GenesisState
err := app.cdc.UnmarshalJSON(stateJSON, &genesisState)
if err != nil {
panic(err) // TODO https://github.com/cosmos/cosmos-sdk/issues/468
// return sdk.ErrGenesisParse("").TraceCause(err, "")
}

app.cdc.MustUnmarshalJSON(req.AppStateBytes, &genesisState)
validators := app.initFromGenesisState(ctx, genesisState)

// sanity check
if len(req.Validators) > 0 {
if len(req.Validators) != len(validators) {
panic(fmt.Errorf("len(RequestInitChain.Validators) != len(validators) (%d != %d)",
panic(fmt.Errorf(
"len(RequestInitChain.Validators) != len(validators) (%d != %d)",
len(req.Validators), len(validators)))
}
sort.Sort(abci.ValidatorUpdates(req.Validators))
Expand All @@ -354,60 +350,3 @@ func (app *GaiaApp) initChainer(ctx sdk.Context, req abci.RequestInitChain) abci
func (app *GaiaApp) LoadHeight(height int64) error {
return app.LoadVersion(height, app.keyMain)
}

// ______________________________________________________________________________________________

var _ sdk.StakingHooks = StakingHooks{}

// StakingHooks contains combined distribution and slashing hooks needed for the
// staking module.
type StakingHooks struct {
dh distr.Hooks
sh slashing.Hooks
}

func NewStakingHooks(dh distr.Hooks, sh slashing.Hooks) StakingHooks {
return StakingHooks{dh, sh}
}

// nolint
func (h StakingHooks) AfterValidatorCreated(ctx sdk.Context, valAddr sdk.ValAddress) {
h.dh.AfterValidatorCreated(ctx, valAddr)
h.sh.AfterValidatorCreated(ctx, valAddr)
}
func (h StakingHooks) BeforeValidatorModified(ctx sdk.Context, valAddr sdk.ValAddress) {
h.dh.BeforeValidatorModified(ctx, valAddr)
h.sh.BeforeValidatorModified(ctx, valAddr)
}
func (h StakingHooks) AfterValidatorRemoved(ctx sdk.Context, consAddr sdk.ConsAddress, valAddr sdk.ValAddress) {
h.dh.AfterValidatorRemoved(ctx, consAddr, valAddr)
h.sh.AfterValidatorRemoved(ctx, consAddr, valAddr)
}
func (h StakingHooks) AfterValidatorBonded(ctx sdk.Context, consAddr sdk.ConsAddress, valAddr sdk.ValAddress) {
h.dh.AfterValidatorBonded(ctx, consAddr, valAddr)
h.sh.AfterValidatorBonded(ctx, consAddr, valAddr)
}
func (h StakingHooks) AfterValidatorBeginUnbonding(ctx sdk.Context, consAddr sdk.ConsAddress, valAddr sdk.ValAddress) {
h.dh.AfterValidatorBeginUnbonding(ctx, consAddr, valAddr)
h.sh.AfterValidatorBeginUnbonding(ctx, consAddr, valAddr)
}
func (h StakingHooks) BeforeDelegationCreated(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) {
h.dh.BeforeDelegationCreated(ctx, delAddr, valAddr)
h.sh.BeforeDelegationCreated(ctx, delAddr, valAddr)
}
func (h StakingHooks) BeforeDelegationSharesModified(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) {
h.dh.BeforeDelegationSharesModified(ctx, delAddr, valAddr)
h.sh.BeforeDelegationSharesModified(ctx, delAddr, valAddr)
}
func (h StakingHooks) BeforeDelegationRemoved(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) {
h.dh.BeforeDelegationRemoved(ctx, delAddr, valAddr)
h.sh.BeforeDelegationRemoved(ctx, delAddr, valAddr)
}
func (h StakingHooks) AfterDelegationModified(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) {
h.dh.AfterDelegationModified(ctx, delAddr, valAddr)
h.sh.AfterDelegationModified(ctx, delAddr, valAddr)
}
func (h StakingHooks) BeforeValidatorSlashed(ctx sdk.Context, valAddr sdk.ValAddress, fraction sdk.Dec) {
h.dh.BeforeValidatorSlashed(ctx, valAddr, fraction)
h.sh.BeforeValidatorSlashed(ctx, valAddr, fraction)
}
52 changes: 18 additions & 34 deletions cmd/gaia/app/genesis.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ var (
defaultBondDenom = sdk.DefaultBondDenom
)

// XXX should use map for all module data

// State to Unmarshal
type GenesisState struct {
Accounts []GenesisAccount `json:"accounts"`
Expand All @@ -46,8 +48,7 @@ type GenesisState struct {
}

func NewGenesisState(accounts []GenesisAccount, authData auth.GenesisState,
bankData bank.GenesisState,
stakingData staking.GenesisState, mintData mint.GenesisState,
bankData bank.GenesisState, stakingData staking.GenesisState, mintData mint.GenesisState,
distrData distr.GenesisState, govData gov.GenesisState, crisisData crisis.GenesisState,
slashingData slashing.GenesisState) GenesisState {

Expand Down Expand Up @@ -121,32 +122,20 @@ func NewGenesisAccountI(acc auth.Account) GenesisAccount {

// convert GenesisAccount to auth.BaseAccount
func (ga *GenesisAccount) ToAccount() auth.Account {
bacc := &auth.BaseAccount{
Address: ga.Address,
Coins: ga.Coins.Sort(),
AccountNumber: ga.AccountNumber,
Sequence: ga.Sequence,
}

if !ga.OriginalVesting.IsZero() {
baseVestingAcc := &auth.BaseVestingAccount{
BaseAccount: bacc,
OriginalVesting: ga.OriginalVesting,
DelegatedFree: ga.DelegatedFree,
DelegatedVesting: ga.DelegatedVesting,
EndTime: ga.EndTime,
}
bacc := auth.NewBaseAccount(ga.Address, ga.Coins.Sort(),
nil, ga.AccountNumber, ga.Sequence)

if ga.StartTime != 0 && ga.EndTime != 0 {
return &auth.ContinuousVestingAccount{
BaseVestingAccount: baseVestingAcc,
StartTime: ga.StartTime,
}
} else if ga.EndTime != 0 {
return &auth.DelayedVestingAccount{
BaseVestingAccount: baseVestingAcc,
}
} else {
if !ga.OriginalVesting.IsZero() {
baseVestingAcc := auth.NewBaseVestingAccount(bacc, ga.OriginalVesting,
ga.DelegatedFree, ga.DelegatedVesting, ga.EndTime)

switch {
case ga.StartTime != 0 && ga.EndTime != 0:
return NewContinuousVestingAccount(baseVestingAcc, ga.StartTime, ga.EndTime) // XXX XXX XXX XXX confirm ga.EndTime missing was a bug
case ga.EndTime != 0:
return NewDelayedVestingAccount(baseVestingAcc, ga.EndTime) // XXX same!
default:
panic(fmt.Sprintf("invalid genesis vesting account: %+v", ga))
}
}
Expand Down Expand Up @@ -219,8 +208,6 @@ func NewDefaultGenesisState() GenesisState {
}

// GaiaValidateGenesisState ensures that the genesis state obeys the expected invariants
// TODO: No validators are both bonded and jailed (#2088)
// TODO: Error if there is a duplicate validator (#1708)
// TODO: Ensure all state machine parameters are in genesis (#1704)
func GaiaValidateGenesisState(genesisState GenesisState) error {
if err := validateGenesisStateAccounts(genesisState.Accounts); err != nil {
Expand Down Expand Up @@ -295,6 +282,7 @@ func validateGenesisStateAccounts(accs []GenesisAccount) error {
// GaiaAppGenState but with JSON
func GaiaAppGenStateJSON(cdc *codec.Codec, genDoc tmtypes.GenesisDoc, appGenTxs []json.RawMessage) (
appState json.RawMessage, err error) {

// create the final app state
genesisState, err := GaiaAppGenState(cdc, genDoc, appGenTxs)
if err != nil {
Expand Down Expand Up @@ -405,13 +393,9 @@ func CollectStdTxs(cdc *codec.Codec, moniker string, genTxsDir string, genDoc tm

func NewDefaultGenesisAccount(addr sdk.AccAddress) GenesisAccount {
accAuth := auth.NewBaseAccountWithAddress(addr)
coins := sdk.Coins{
accAuth.Coins = sdk.NewCoins(
sdk.NewCoin("footoken", sdk.NewInt(1000)),
sdk.NewCoin(defaultBondDenom, freeTokensPerAcc),
}

coins.Sort()

accAuth.Coins = coins
)
return NewGenesisAccount(&accAuth)
}
62 changes: 62 additions & 0 deletions cmd/gaia/app/hooks.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package app

import (
sdk "github.com/cosmos/cosmos-sdk/types"
distr "github.com/cosmos/cosmos-sdk/x/distribution"
"github.com/cosmos/cosmos-sdk/x/slashing"
)

var _ sdk.StakingHooks = StakingHooks{}

// StakingHooks contains combined distribution and slashing hooks needed for the
// staking module.
type StakingHooks struct {
dh distr.Hooks
sh slashing.Hooks
}

func NewStakingHooks(dh distr.Hooks, sh slashing.Hooks) StakingHooks {
return StakingHooks{dh, sh}
}

// nolint
func (h StakingHooks) AfterValidatorCreated(ctx sdk.Context, valAddr sdk.ValAddress) {
h.dh.AfterValidatorCreated(ctx, valAddr)
h.sh.AfterValidatorCreated(ctx, valAddr)
}
func (h StakingHooks) BeforeValidatorModified(ctx sdk.Context, valAddr sdk.ValAddress) {
h.dh.BeforeValidatorModified(ctx, valAddr)
h.sh.BeforeValidatorModified(ctx, valAddr)
}
func (h StakingHooks) AfterValidatorRemoved(ctx sdk.Context, consAddr sdk.ConsAddress, valAddr sdk.ValAddress) {
h.dh.AfterValidatorRemoved(ctx, consAddr, valAddr)
h.sh.AfterValidatorRemoved(ctx, consAddr, valAddr)
}
func (h StakingHooks) AfterValidatorBonded(ctx sdk.Context, consAddr sdk.ConsAddress, valAddr sdk.ValAddress) {
h.dh.AfterValidatorBonded(ctx, consAddr, valAddr)
h.sh.AfterValidatorBonded(ctx, consAddr, valAddr)
}
func (h StakingHooks) AfterValidatorBeginUnbonding(ctx sdk.Context, consAddr sdk.ConsAddress, valAddr sdk.ValAddress) {
h.dh.AfterValidatorBeginUnbonding(ctx, consAddr, valAddr)
h.sh.AfterValidatorBeginUnbonding(ctx, consAddr, valAddr)
}
func (h StakingHooks) BeforeDelegationCreated(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) {
h.dh.BeforeDelegationCreated(ctx, delAddr, valAddr)
h.sh.BeforeDelegationCreated(ctx, delAddr, valAddr)
}
func (h StakingHooks) BeforeDelegationSharesModified(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) {
h.dh.BeforeDelegationSharesModified(ctx, delAddr, valAddr)
h.sh.BeforeDelegationSharesModified(ctx, delAddr, valAddr)
}
func (h StakingHooks) BeforeDelegationRemoved(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) {
h.dh.BeforeDelegationRemoved(ctx, delAddr, valAddr)
h.sh.BeforeDelegationRemoved(ctx, delAddr, valAddr)
}
func (h StakingHooks) AfterDelegationModified(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) {
h.dh.AfterDelegationModified(ctx, delAddr, valAddr)
h.sh.AfterDelegationModified(ctx, delAddr, valAddr)
}
func (h StakingHooks) BeforeValidatorSlashed(ctx sdk.Context, valAddr sdk.ValAddress, fraction sdk.Dec) {
h.dh.BeforeValidatorSlashed(ctx, valAddr, fraction)
h.sh.BeforeValidatorSlashed(ctx, valAddr, fraction)
}
7 changes: 0 additions & 7 deletions cmd/gaia/testnets/README.md

This file was deleted.

Loading