From 32d83407a383cf6b5636861f5aee0752ed885a0c Mon Sep 17 00:00:00 2001 From: Artur Troian Date: Wed, 6 Mar 2024 12:08:01 -0500 Subject: [PATCH] feat(upgrade): network upgrade v0.32.0 Signed-off-by: Artur Troian --- meta.json | 5 ++ tests/upgrade/upgrade-v0.32.0.json | 8 ++ tests/upgrade/upgrade_test.go | 1 + tests/upgrade/v0.32.0/postupgrade.go | 118 +++++++++++++++++++++++++++ tests/upgrade/workers_test.go | 1 + upgrades/CHANGELOG.md | 10 ++- upgrades/software/v0.32.0/init.go | 14 ++++ upgrades/software/v0.32.0/market.go | 39 +++++++++ upgrades/software/v0.32.0/upgrade.go | 47 +++++++++++ upgrades/upgrades.go | 2 + x/market/keeper/keeper.go | 5 -- x/market/keeper/keys/v1beta4/key.go | 4 +- x/provider/handler/handler_test.go | 35 +------- x/provider/handler/server.go | 29 +------ 14 files changed, 248 insertions(+), 70 deletions(-) create mode 100644 tests/upgrade/upgrade-v0.32.0.json create mode 100644 tests/upgrade/v0.32.0/postupgrade.go create mode 100644 upgrades/software/v0.32.0/init.go create mode 100644 upgrades/software/v0.32.0/market.go create mode 100644 upgrades/software/v0.32.0/upgrade.go diff --git a/meta.json b/meta.json index 5e1478d691..898a215563 100644 --- a/meta.json +++ b/meta.json @@ -19,6 +19,11 @@ "skipped": false, "from_binary": "v0.28.2", "from_version": "v0.28.0" + }, + "v0.32.0": { + "skipped": false, + "from_binary": "v0.30.3", + "from_version": "v0.30.0" } } } diff --git a/tests/upgrade/upgrade-v0.32.0.json b/tests/upgrade/upgrade-v0.32.0.json new file mode 100644 index 0000000000..12769d3ba3 --- /dev/null +++ b/tests/upgrade/upgrade-v0.32.0.json @@ -0,0 +1,8 @@ +{ + "migrations": { + "market": { + "from": "4", + "to": "5" + } + } +} diff --git a/tests/upgrade/upgrade_test.go b/tests/upgrade/upgrade_test.go index 15fe44da1c..e94e106c77 100644 --- a/tests/upgrade/upgrade_test.go +++ b/tests/upgrade/upgrade_test.go @@ -375,6 +375,7 @@ func TestUpgrade(t *testing.T) { postUpgradeParams.ChainID = cfg.ChainID postUpgradeParams.Node = "tcp://127.0.0.1:26657" postUpgradeParams.KeyringBackend = "test" + postUpgradeParams.From = cfg.Work.Key cmdr = valCmd diff --git a/tests/upgrade/v0.32.0/postupgrade.go b/tests/upgrade/v0.32.0/postupgrade.go new file mode 100644 index 0000000000..390649f183 --- /dev/null +++ b/tests/upgrade/v0.32.0/postupgrade.go @@ -0,0 +1,118 @@ +//go:build e2e.upgrade + +// Package v0_32_0 +// nolint revive +package v0_32_0 + +import ( + "context" + "testing" + + types "github.com/akash-network/akash-api/go/node/types/v1beta3" + sdkclient "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + sdk "github.com/cosmos/cosmos-sdk/types" + + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + "github.com/stretchr/testify/require" + + cltypes "github.com/akash-network/akash-api/go/node/client/types" + ptypes "github.com/akash-network/akash-api/go/node/provider/v1beta3" + + "github.com/akash-network/node/app" + "github.com/akash-network/node/client" + uttypes "github.com/akash-network/node/tests/upgrade/types" +) + +func init() { + uttypes.RegisterPostUpgradeWorker("v0.32.0", &postUpgrade{}) +} + +type postUpgrade struct{} + +var _ uttypes.TestWorker = (*postUpgrade)(nil) + +func (pu *postUpgrade) Run(ctx context.Context, t *testing.T, params uttypes.TestParams) { + encodingConfig := app.MakeEncodingConfig() + + rpcClient, err := sdkclient.NewClientFromNode(params.Node) + require.NoError(t, err) + + cctx := sdkclient.Context{}. + WithCodec(encodingConfig.Marshaler). + WithInterfaceRegistry(encodingConfig.InterfaceRegistry). + WithTxConfig(encodingConfig.TxConfig). + WithLegacyAmino(encodingConfig.Amino). + WithAccountRetriever(authtypes.AccountRetriever{}). + WithBroadcastMode(flags.BroadcastBlock). + WithHomeDir(params.Home). + WithChainID(params.ChainID). + WithNodeURI(params.Node). + WithClient(rpcClient). + WithSkipConfirmation(true). + WithFrom(params.From). + WithKeyringDir(params.Home) + + kr, err := sdkclient.NewKeyringFromBackend(cctx, params.KeyringBackend) + require.NoError(t, err) + + info, err := kr.Key(params.From) + require.NoError(t, err) + + cctx = cctx.WithFromName(info.GetName()). + WithFromAddress(info.GetAddress()). + WithKeyring(kr) + + cl, err := client.DiscoverClient(ctx, cctx, cltypes.WithGasPrices("0.0025uakt"), cltypes.WithGas(flags.GasSetting{Simulate: false, Gas: 100000})) + require.NoError(t, err) + require.NotNil(t, cl) + + cmsg := &ptypes.MsgCreateProvider{ + Owner: cctx.GetFromAddress().String(), + HostURI: "https://example.com:443", + Info: ptypes.ProviderInfo{}, + Attributes: types.Attributes{ + { + Key: "test1", + Value: "test1", + }, + }, + } + + err = cmsg.ValidateBasic() + require.NoError(t, err) + + resp, err := cl.Tx().Broadcast(ctx, []sdk.Msg{cmsg}) + require.NoError(t, err) + require.NotNil(t, resp) + require.IsType(t, &sdk.TxResponse{}, resp) + + txResp := resp.(*sdk.TxResponse) + + require.Equal(t, uint32(0), txResp.Code) + + pmsg := &ptypes.MsgUpdateProvider{ + Owner: cctx.GetFromAddress().String(), + HostURI: "https://example.com:443", + Info: ptypes.ProviderInfo{}, + Attributes: types.Attributes{ + { + Key: "test1", + Value: "test1", + }, + }, + } + + err = cmsg.ValidateBasic() + require.NoError(t, err) + + resp, err = cl.Tx().Broadcast(ctx, []sdk.Msg{pmsg}) + require.NoError(t, err) + require.NotNil(t, resp) + require.IsType(t, &sdk.TxResponse{}, resp) + + txResp = resp.(*sdk.TxResponse) + + require.Equal(t, uint32(0), txResp.Code) + require.LessOrEqual(t, txResp.GasUsed, int64(100000)) +} diff --git a/tests/upgrade/workers_test.go b/tests/upgrade/workers_test.go index 5207ee2852..3549b0c091 100644 --- a/tests/upgrade/workers_test.go +++ b/tests/upgrade/workers_test.go @@ -4,4 +4,5 @@ package upgrade import ( _ "github.com/akash-network/node/tests/upgrade/v0.26.0" + _ "github.com/akash-network/node/tests/upgrade/v0.32.0" ) diff --git a/upgrades/CHANGELOG.md b/upgrades/CHANGELOG.md index 7fdaa5f086..b02a08e4e3 100644 --- a/upgrades/CHANGELOG.md +++ b/upgrades/CHANGELOG.md @@ -12,7 +12,7 @@ | escrow | 2 | | agov | 1 | | inflation | 1 | -| market | 4 | +| market | 5 | | provider | 2 | | astaking | 1 | | take | 1 | @@ -43,6 +43,14 @@ Goal of the upgrade here Add new upgrades after this line based on the template above ----- +##### v0.32.0 + +1. remove checking if provider has active leases during provider update transactions. This check was iterating thru all existing leases on the network causing gas and thus transaction fees go to up to 3AKT which is way above desired values. Initial intention of check was to prevent provider changing attributes that is in use by active leases. Akash Network team will reintroduce check by adding secondary indexes in future network upgrades. +2. remove secondary index for market store which was never user. + +- Migrations + - market `4 -> 5` + ##### v0.30.0 1. fix `MatchGSpec` which used during Bid validation. Previous upgrade **v0.28.0** brought up resources offer.Existing implementation of `MatchGSpec` improperly validates offer against group spec, which rejects bids on multi-service deployments with unequal amount of replicas. diff --git a/upgrades/software/v0.32.0/init.go b/upgrades/software/v0.32.0/init.go new file mode 100644 index 0000000000..c92faed6f1 --- /dev/null +++ b/upgrades/software/v0.32.0/init.go @@ -0,0 +1,14 @@ +// Package v0_32_0 +// nolint revive +package v0_32_0 + +import ( + mv1beta4 "github.com/akash-network/akash-api/go/node/market/v1beta4" + + utypes "github.com/akash-network/node/upgrades/types" +) + +func init() { + utypes.RegisterUpgrade(UpgradeName, initUpgrade) + utypes.RegisterMigration(mv1beta4.ModuleName, 4, newMarketMigration) +} diff --git a/upgrades/software/v0.32.0/market.go b/upgrades/software/v0.32.0/market.go new file mode 100644 index 0000000000..66d8f92d21 --- /dev/null +++ b/upgrades/software/v0.32.0/market.go @@ -0,0 +1,39 @@ +// Package v0_32_0 +// nolint revive +package v0_32_0 + +import ( + types "github.com/akash-network/akash-api/go/node/market/v1beta4" + sdk "github.com/cosmos/cosmos-sdk/types" + sdkmodule "github.com/cosmos/cosmos-sdk/types/module" + + utypes "github.com/akash-network/node/upgrades/types" + "github.com/akash-network/node/x/market/keeper/keys/v1beta4" +) + +type marketMigrations struct { + utypes.Migrator +} + +func newMarketMigration(m utypes.Migrator) utypes.Migration { + return marketMigrations{Migrator: m} +} + +func (m marketMigrations) GetHandler() sdkmodule.MigrationHandler { + return m.handler +} + +// handler migrates market from version 3 to 4. +func (m marketMigrations) handler(ctx sdk.Context) error { + store := ctx.KVStore(m.StoreKey()) + iter := sdk.KVStorePrefixIterator(store, types.LeasePrefix()) + defer iter.Close() + for ; iter.Valid(); iter.Next() { + var val types.Lease + m.Codec().MustUnmarshal(iter.Value(), &val) + + store.Delete(v1beta4.SecondaryLeaseKeyByProvider(val.LeaseID)) + } + + return nil +} diff --git a/upgrades/software/v0.32.0/upgrade.go b/upgrades/software/v0.32.0/upgrade.go new file mode 100644 index 0000000000..cf6326cd0e --- /dev/null +++ b/upgrades/software/v0.32.0/upgrade.go @@ -0,0 +1,47 @@ +// Package v0_32_0 +// nolint revive +package v0_32_0 + +import ( + "fmt" + + "github.com/tendermint/tendermint/libs/log" + + storetypes "github.com/cosmos/cosmos-sdk/store/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" + + apptypes "github.com/akash-network/node/app/types" + utypes "github.com/akash-network/node/upgrades/types" +) + +const ( + UpgradeName = "v0.32.0" +) + +type upgrade struct { + *apptypes.App + log log.Logger +} + +var _ utypes.IUpgrade = (*upgrade)(nil) + +func initUpgrade(log log.Logger, app *apptypes.App) (utypes.IUpgrade, error) { + up := &upgrade{ + App: app, + log: log.With("module", fmt.Sprintf("upgrade/%s", UpgradeName)), + } + + return up, nil +} + +func (up *upgrade) StoreLoader() *storetypes.StoreUpgrades { + return &storetypes.StoreUpgrades{} +} + +func (up *upgrade) UpgradeHandler() upgradetypes.UpgradeHandler { + return func(ctx sdk.Context, _ upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { + return up.MM.RunMigrations(ctx, up.Configurator, fromVM) + } +} diff --git a/upgrades/upgrades.go b/upgrades/upgrades.go index 51ae9ba299..9a92c90f0c 100644 --- a/upgrades/upgrades.go +++ b/upgrades/upgrades.go @@ -1,6 +1,8 @@ package upgrades import ( + // nolint: revive + _ "github.com/akash-network/node/upgrades/software/v0.32.0" // nolint: revive _ "github.com/akash-network/node/upgrades/software/v0.30.0" // nolint: revive diff --git a/x/market/keeper/keeper.go b/x/market/keeper/keeper.go index 466dcd0a34..164af4489f 100644 --- a/x/market/keeper/keeper.go +++ b/x/market/keeper/keeper.go @@ -169,11 +169,6 @@ func (k Keeper) CreateLease(ctx sdk.Context, bid types.Bid) { types.NewEventLeaseCreated(lease.ID(), lease.Price). ToSDKEvent(), ) - - secondaryKeys := keys.SecondaryKeysForLease(lease.ID()) - for _, secondaryKey := range secondaryKeys { - store.Set(secondaryKey, key) - } } // OnOrderMatched updates order state to matched diff --git a/x/market/keeper/keys/v1beta4/key.go b/x/market/keeper/keys/v1beta4/key.go index 7892692a88..6282c95dbb 100644 --- a/x/market/keeper/keys/v1beta4/key.go +++ b/x/market/keeper/keys/v1beta4/key.go @@ -114,7 +114,7 @@ func LeaseKey(id types.LeaseID) []byte { return buf.Bytes() } -func secondaryLeaseKeyByProvider(id types.LeaseID) []byte { +func SecondaryLeaseKeyByProvider(id types.LeaseID) []byte { buf := bytes.NewBuffer(types.SecondaryLeasePrefix()) buf.Write(address.MustLengthPrefix(sdkutil.MustAccAddressFromBech32(id.Provider))) buf.Write(address.MustLengthPrefix(sdkutil.MustAccAddressFromBech32(id.Owner))) @@ -132,7 +132,7 @@ func secondaryLeaseKeyByProvider(id types.LeaseID) []byte { func SecondaryKeysForLease(id types.LeaseID) [][]byte { return [][]byte{ - secondaryLeaseKeyByProvider(id), + SecondaryLeaseKeyByProvider(id), } } diff --git a/x/provider/handler/handler_test.go b/x/provider/handler/handler_test.go index 98ff213ba4..b7d65e8ddd 100644 --- a/x/provider/handler/handler_test.go +++ b/x/provider/handler/handler_test.go @@ -9,7 +9,6 @@ import ( sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/stretchr/testify/require" - mtypes "github.com/akash-network/akash-api/go/node/market/v1beta4" types "github.com/akash-network/akash-api/go/node/provider/v1beta3" akashtypes "github.com/akash-network/akash-api/go/node/types/v1beta3" @@ -224,42 +223,10 @@ func TestProviderUpdateAttributes(t *testing.T) { err := suite.keeper.Create(suite.ctx, types.Provider(*createMsg)) require.NoError(t, err) - group := testutil.DeploymentGroup(t, testutil.DeploymentID(t), 0) - - group.GroupSpec.Resources = testutil.Resources(t) - group.GroupSpec.Requirements = akashtypes.PlacementRequirements{ - Attributes: createMsg.Attributes, - } - - order, err := suite.mkeeper.CreateOrder(suite.ctx, group.ID(), group.GroupSpec) - require.NoError(t, err) - - price := testutil.DecCoin(t) - roffer := mtypes.ResourceOfferFromRU(group.GroupSpec.Resources) - - bid, err := suite.mkeeper.CreateBid(suite.ctx, order.ID(), addr, price, roffer) - require.NoError(t, err) - - suite.mkeeper.CreateLease(suite.ctx, bid) - + updateMsg.Attributes = nil res, err := suite.handler(suite.ctx, updateMsg) require.NoError(t, err) require.NotNil(t, res) - - t.Run("ensure event created", func(t *testing.T) { - - iev := testutil.ParseProviderEvent(t, res.Events[4:]) - require.IsType(t, types.EventProviderUpdated{}, iev) - - dev := iev.(types.EventProviderUpdated) - - require.Equal(t, updateMsg.Owner, dev.Owner.String()) - }) - - updateMsg.Attributes = nil - res, err = suite.handler(suite.ctx, updateMsg) - require.Error(t, err, types.ErrIncompatibleAttributes.Error()) - require.Nil(t, res) } func TestProviderDeleteExisting(t *testing.T) { diff --git a/x/provider/handler/server.go b/x/provider/handler/server.go index ca783b8364..21cd71fe06 100644 --- a/x/provider/handler/server.go +++ b/x/provider/handler/server.go @@ -7,8 +7,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - mtypes "github.com/akash-network/akash-api/go/node/market/v1beta4" - types "github.com/akash-network/akash-api/go/node/provider/v1beta3" mkeeper "github.com/akash-network/node/x/market/keeper" @@ -62,36 +60,11 @@ func (ms msgServer) UpdateProvider(goCtx context.Context, msg *types.MsgUpdatePr } owner, _ := sdk.AccAddressFromBech32(msg.Owner) - prov, found := ms.provider.Get(ctx, owner) + _, found := ms.provider.Get(ctx, owner) if !found { return nil, fmt.Errorf("%w: id: %s", types.ErrProviderNotFound, msg.Owner) } - // all filtering code below is madness!. should make an index to not melt the cpu - // TODO: use WithActiveLeases, filter by lease.Provider - ms.market.WithLeases(ctx, func(lease mtypes.Lease) bool { - if prov.Owner == lease.ID().Provider && (lease.State == mtypes.LeaseActive) { - var order mtypes.Order - order, found = ms.market.GetOrder(ctx, lease.ID().OrderID()) - if !found { - err = fmt.Errorf("%w: order \"%s\" for lease \"%s\" has not been found", - ErrInternal, - order.ID(), - lease.ID()) - return true - } - if !order.MatchAttributes(msg.Attributes) { - err = types.ErrIncompatibleAttributes - return true - } - } - return false - }) - - if err != nil { - return nil, err - } - if err := ms.provider.Update(ctx, types.Provider(*msg)); err != nil { return nil, sdkerrors.Wrapf(ErrInternal, "err: %v", err) }