From e1c124b5975a9c826bc43239d34ffa9bb7cfddd0 Mon Sep 17 00:00:00 2001 From: Eric Zhu Date: Thu, 20 Oct 2022 16:09:37 -0400 Subject: [PATCH 01/15] add staking dep gen mappings --- aclmapping/dependency_generator.go | 2 + aclmapping/staking/mappings.go | 214 +++++++++++++++++++++++ aclmapping/utils/identifier_templates.go | 1 + 3 files changed, 217 insertions(+) create mode 100644 aclmapping/staking/mappings.go diff --git a/aclmapping/dependency_generator.go b/aclmapping/dependency_generator.go index beec9783a8..fe4be3a313 100644 --- a/aclmapping/dependency_generator.go +++ b/aclmapping/dependency_generator.go @@ -4,6 +4,7 @@ import ( aclkeeper "github.com/cosmos/cosmos-sdk/x/accesscontrol/keeper" aclbankmapping "github.com/sei-protocol/sei-chain/aclmapping/bank" acldexmapping "github.com/sei-protocol/sei-chain/aclmapping/dex" + aclstakingmapping "github.com/sei-protocol/sei-chain/aclmapping/staking" aclwasmmapping "github.com/sei-protocol/sei-chain/aclmapping/wasm" ) @@ -18,6 +19,7 @@ func (customDepGen CustomDependencyGenerator) GetCustomDependencyGenerators() ac dependencyGeneratorMap.Merge(acldexmapping.GetDexDependencyGenerators()) dependencyGeneratorMap.Merge(aclbankmapping.GetBankDepedencyGenerator()) + dependencyGeneratorMap.Merge(aclstakingmapping.GetStakingDependencyGenerator()) wasmDependencyGenerators := aclwasmmapping.NewWasmDependencyGenerator() dependencyGeneratorMap.Merge(wasmDependencyGenerators.GetWasmDependencyGenerators()) diff --git a/aclmapping/staking/mappings.go b/aclmapping/staking/mappings.go new file mode 100644 index 0000000000..374653b6e8 --- /dev/null +++ b/aclmapping/staking/mappings.go @@ -0,0 +1,214 @@ +package aclstakingmapping + +import ( + "fmt" + + sdk "github.com/cosmos/cosmos-sdk/types" + sdkacltypes "github.com/cosmos/cosmos-sdk/types/accesscontrol" + aclkeeper "github.com/cosmos/cosmos-sdk/x/accesscontrol/keeper" + acltypes "github.com/cosmos/cosmos-sdk/x/accesscontrol/types" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + utils "github.com/sei-protocol/sei-chain/aclmapping/utils" +) + +var ErrorInvalidMsgType = fmt.Errorf("invalid message received for staking module") + +func GetStakingDependencyGenerator() aclkeeper.DependencyGeneratorMap { + dependencyGeneratorMap := make(aclkeeper.DependencyGeneratorMap) + + delegateKey := acltypes.GenerateMessageKey(&stakingtypes.MsgDelegate{}) + undelegateKey := acltypes.GenerateMessageKey(&stakingtypes.MsgUndelegate{}) + beginRedelegateKey := acltypes.GenerateMessageKey(&stakingtypes.MsgBeginRedelegate{}) + dependencyGeneratorMap[delegateKey] = MsgDelegateDependencyGenerator + dependencyGeneratorMap[undelegateKey] = MsgUndelegateDependencyGenerator + dependencyGeneratorMap[beginRedelegateKey] = MsgBeginRedelegateDependencyGenerator + + return dependencyGeneratorMap +} + +func MsgDelegateDependencyGenerator(keeper aclkeeper.Keeper, ctx sdk.Context, msg sdk.Msg) ([]sdkacltypes.AccessOperation, error) { + msgDelegate, ok := msg.(*stakingtypes.MsgDelegate) + if !ok { + return []sdkacltypes.AccessOperation{}, ErrorInvalidMsgType + } + + accessOperations := []sdkacltypes.AccessOperation{ + // Checks if the delegator exists + // Checks if there is a delegation object that already exists for (delegatorAddr, validatorAddr) + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV, + IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.STAKING, msgDelegate.DelegatorAddress+msgDelegate.ValidatorAddress), + }, + // Store new delegator for (delegator, validator) + { + AccessType: sdkacltypes.AccessType_WRITE, + ResourceType: sdkacltypes.ResourceType_KV, + IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.STAKING, msgDelegate.DelegatorAddress+msgDelegate.ValidatorAddress), + }, + + // delegate coins from account validator account + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV, + IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.BANK, msgDelegate.DelegatorAddress), + }, + { + AccessType: sdkacltypes.AccessType_WRITE, + ResourceType: sdkacltypes.ResourceType_KV, + IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.BANK, msgDelegate.DelegatorAddress), + }, + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV, + IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.BANK, msgDelegate.ValidatorAddress), + }, + { + AccessType: sdkacltypes.AccessType_WRITE, + ResourceType: sdkacltypes.ResourceType_KV, + IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.BANK, msgDelegate.ValidatorAddress), + }, + + // Checks if the validators exchange rate is valid + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV, + IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.STAKING, msgDelegate.ValidatorAddress), + }, + // Update validator shares and power index + { + AccessType: sdkacltypes.AccessType_WRITE, + ResourceType: sdkacltypes.ResourceType_KV, + IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.STAKING, msgDelegate.ValidatorAddress), + }, + + // Last Operation should always be a commit + { + ResourceType: sdkacltypes.ResourceType_ANY, + AccessType: sdkacltypes.AccessType_COMMIT, + IdentifierTemplate: utils.DefaultIDTemplate, + }, + } + + return accessOperations, nil +} + +func MsgUndelegateDependencyGenerator(keeper aclkeeper.Keeper, ctx sdk.Context, msg sdk.Msg) ([]sdkacltypes.AccessOperation, error) { + msgUndelegate, ok := msg.(*stakingtypes.MsgUndelegate) + if !ok { + return []sdkacltypes.AccessOperation{}, ErrorInvalidMsgType + } + + accessOperations := []sdkacltypes.AccessOperation{ + // Treat Delegations and Undelegations to have the same ACL since they are highly coupled, no point in finer granularization + + // Get delegation/redelegations and error checking + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV, + IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.STAKING, msgUndelegate.DelegatorAddress+msgUndelegate.ValidatorAddress), + }, + // Update/delete delegation and update redelegation + { + AccessType: sdkacltypes.AccessType_WRITE, + ResourceType: sdkacltypes.ResourceType_KV, + IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.STAKING, msgUndelegate.DelegatorAddress+msgUndelegate.ValidatorAddress), + }, + + // Update the delegator and validator account balances + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV, + IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.BANK, msgUndelegate.DelegatorAddress), + }, + { + AccessType: sdkacltypes.AccessType_WRITE, + ResourceType: sdkacltypes.ResourceType_KV, + IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.BANK, msgUndelegate.DelegatorAddress), + }, + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV, + IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.BANK, msgUndelegate.ValidatorAddress), + }, + { + AccessType: sdkacltypes.AccessType_WRITE, + ResourceType: sdkacltypes.ResourceType_KV, + IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.BANK, msgUndelegate.ValidatorAddress), + }, + + // Last Operation should always be a commit + { + ResourceType: sdkacltypes.ResourceType_ANY, + AccessType: sdkacltypes.AccessType_COMMIT, + IdentifierTemplate: utils.DefaultIDTemplate, + }, + } + + return accessOperations, nil +} + +func MsgBeginRedelegateDependencyGenerator(keeper aclkeeper.Keeper, ctx sdk.Context, msg sdk.Msg) ([]sdkacltypes.AccessOperation, error) { + msgBeingRedelegate, ok := msg.(*stakingtypes.MsgBeginRedelegate) + if !ok { + return []sdkacltypes.AccessOperation{}, ErrorInvalidMsgType + } + + accessOperations := []sdkacltypes.AccessOperation{ + // Treat Delegations and Redelegations to have the same ACL since they are highly coupled, no point in finer granularization + + // Get delegation to verify it has sufficient funds to undelegate + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV, + IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.STAKING, msgBeingRedelegate.DelegatorAddress+msgUndelegate.ValidatorAddress), + }, + // Update/delete delegation after tokens have been unbonded + { + AccessType: sdkacltypes.AccessType_WRITE, + ResourceType: sdkacltypes.ResourceType_KV, + IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.STAKING, msgBeingRedelegate.DelegatorAddress+msgUndelegate.ValidatorAddress), + }, + + // Update the delegator, src validator and dest validator account balances + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV, + IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.BANK, msgBeingRedelegate.DelegatorAddress), + }, + { + AccessType: sdkacltypes.AccessType_WRITE, + ResourceType: sdkacltypes.ResourceType_KV, + IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.BANK, msgBeingRedelegate.DelegatorAddress), + }, + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV, + IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.BANK, msgBeingRedelegate.ValidatorSrcAddress), + }, + { + AccessType: sdkacltypes.AccessType_WRITE, + ResourceType: sdkacltypes.ResourceType_KV, + IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.BANK, msgBeingRedelegate.ValidatorSrcAddress), + }, + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV, + IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.BANK, msgBeingRedelegate.ValidatorDstAddress), + }, + { + AccessType: sdkacltypes.AccessType_WRITE, + ResourceType: sdkacltypes.ResourceType_KV, + IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.BANK, msgBeingRedelegate.ValidatorDstAddress), + }, + + // Last Operation should always be a commit + { + ResourceType: sdkacltypes.ResourceType_ANY, + AccessType: sdkacltypes.AccessType_COMMIT, + IdentifierTemplate: utils.DefaultIDTemplate, + }, + } + + return accessOperations, nil +} diff --git a/aclmapping/utils/identifier_templates.go b/aclmapping/utils/identifier_templates.go index ac28dad9ff..3098e33742 100644 --- a/aclmapping/utils/identifier_templates.go +++ b/aclmapping/utils/identifier_templates.go @@ -11,6 +11,7 @@ const ( ACCOUNT = "acc" BANK = "bank" AUTH = "auth" + STAKING = "staking" DefaultIDTemplate = "*" ) From 02bf6131dd32ed95d0f90590bde6d58d7f17f12e Mon Sep 17 00:00:00 2001 From: Eric Zhu Date: Thu, 20 Oct 2022 16:28:20 -0400 Subject: [PATCH 02/15] update begin redelegate dep generator --- aclmapping/staking/mappings.go | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/aclmapping/staking/mappings.go b/aclmapping/staking/mappings.go index 374653b6e8..8bd36dd6c0 100644 --- a/aclmapping/staking/mappings.go +++ b/aclmapping/staking/mappings.go @@ -157,17 +157,28 @@ func MsgBeginRedelegateDependencyGenerator(keeper aclkeeper.Keeper, ctx sdk.Cont accessOperations := []sdkacltypes.AccessOperation{ // Treat Delegations and Redelegations to have the same ACL since they are highly coupled, no point in finer granularization - // Get delegation to verify it has sufficient funds to undelegate + // Get src delegation to verify it has sufficient funds to undelegate + // Get dest delegation to see if it already exists { AccessType: sdkacltypes.AccessType_READ, ResourceType: sdkacltypes.ResourceType_KV, - IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.STAKING, msgBeingRedelegate.DelegatorAddress+msgUndelegate.ValidatorAddress), + IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.STAKING, msgBeingRedelegate.DelegatorAddress+msgBeingRedelegate.ValidatorSrcAddress), + }, + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV, + IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.STAKING, msgBeingRedelegate.DelegatorAddress+msgBeingRedelegate.ValidatorDstAddress), + }, + // Update/delete src and destination delegation after tokens have been unbonded + { + AccessType: sdkacltypes.AccessType_WRITE, + ResourceType: sdkacltypes.ResourceType_KV, + IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.STAKING, msgBeingRedelegate.DelegatorAddress+msgBeingRedelegate.ValidatorSrcAddress), }, - // Update/delete delegation after tokens have been unbonded { AccessType: sdkacltypes.AccessType_WRITE, ResourceType: sdkacltypes.ResourceType_KV, - IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.STAKING, msgBeingRedelegate.DelegatorAddress+msgUndelegate.ValidatorAddress), + IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.STAKING, msgBeingRedelegate.DelegatorAddress+msgBeingRedelegate.ValidatorDstAddress), }, // Update the delegator, src validator and dest validator account balances From 165be31877f01f719a15c4eb2d7e1d2f7734b520 Mon Sep 17 00:00:00 2001 From: Eric Zhu Date: Fri, 21 Oct 2022 11:14:17 -0400 Subject: [PATCH 03/15] add missing Staking module ACLs --- aclmapping/staking/mappings.go | 35 ++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/aclmapping/staking/mappings.go b/aclmapping/staking/mappings.go index 8bd36dd6c0..18e8d68223 100644 --- a/aclmapping/staking/mappings.go +++ b/aclmapping/staking/mappings.go @@ -137,6 +137,19 @@ func MsgUndelegateDependencyGenerator(keeper aclkeeper.Keeper, ctx sdk.Context, IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.BANK, msgUndelegate.ValidatorAddress), }, + // Checks if the validators exchange rate is valid + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV, + IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.STAKING, msgUndelegate.ValidatorAddress), + }, + // Update validator shares and power index + { + AccessType: sdkacltypes.AccessType_WRITE, + ResourceType: sdkacltypes.ResourceType_KV, + IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.STAKING, msgUndelegate.ValidatorAddress), + }, + // Last Operation should always be a commit { ResourceType: sdkacltypes.ResourceType_ANY, @@ -213,6 +226,28 @@ func MsgBeginRedelegateDependencyGenerator(keeper aclkeeper.Keeper, ctx sdk.Cont IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.BANK, msgBeingRedelegate.ValidatorDstAddress), }, + // Update validators staking shares and power index + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV, + IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.STAKING, msgBeingRedelegate.ValidatorSrcAddress), + }, + { + AccessType: sdkacltypes.AccessType_WRITE, + ResourceType: sdkacltypes.ResourceType_KV, + IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.STAKING, msgBeingRedelegate.ValidatorSrcAddress), + }, + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV, + IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.STAKING, msgBeingRedelegate.ValidatorDstAddress), + }, + { + AccessType: sdkacltypes.AccessType_WRITE, + ResourceType: sdkacltypes.ResourceType_KV, + IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.STAKING, msgBeingRedelegate.ValidatorDstAddress), + }, + // Last Operation should always be a commit { ResourceType: sdkacltypes.ResourceType_ANY, From 04979c6e9759a521b8919b836d26ba82c9b4fede Mon Sep 17 00:00:00 2001 From: Eric Zhu Date: Mon, 24 Oct 2022 12:16:13 -0400 Subject: [PATCH 04/15] update sei-cosmos tag --- app/app.go | 3 +-- go.mod | 2 +- go.sum | 4 ++-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/app/app.go b/app/app.go index dbd94d4ad1..46529bb31a 100644 --- a/app/app.go +++ b/app/app.go @@ -38,7 +38,6 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth/ante" aclmodule "github.com/cosmos/cosmos-sdk/x/accesscontrol" - aclclient "github.com/cosmos/cosmos-sdk/x/accesscontrol/client" aclkeeper "github.com/cosmos/cosmos-sdk/x/accesscontrol/keeper" acltypes "github.com/cosmos/cosmos-sdk/x/accesscontrol/types" @@ -148,7 +147,7 @@ func getGovProposalHandlers() []govclient.ProposalHandler { upgradeclient.CancelProposalHandler, ibcclientclient.UpdateClientProposalHandler, ibcclientclient.UpgradeProposalHandler, - aclclient.ProposalHandler, + // aclclient.ProposalHandler, // this line is used by starport scaffolding # stargate/app/govProposalHandler ) diff --git a/go.mod b/go.mod index 9879d1ce4d..72b2d3097b 100644 --- a/go.mod +++ b/go.mod @@ -131,7 +131,7 @@ require ( ) replace ( - github.com/cosmos/cosmos-sdk => github.com/sei-protocol/sei-cosmos v0.1.175 + github.com/cosmos/cosmos-sdk => github.com/sei-protocol/sei-cosmos v0.1.192 github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 github.com/keybase/go-keychain => github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 github.com/tendermint/tendermint => github.com/sei-protocol/sei-tendermint v0.1.59 diff --git a/go.sum b/go.sum index 8c05668605..ff4bb4d040 100644 --- a/go.sum +++ b/go.sum @@ -1098,8 +1098,8 @@ github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= github.com/securego/gosec/v2 v2.11.0/go.mod h1:SX8bptShuG8reGC0XS09+a4H2BoWSJi+fscA+Pulbpo= github.com/segmentio/fasthash v1.0.3/go.mod h1:waKX8l2N8yckOgmSsXJi7x1ZfdKZ4x7KRMzBtS3oedY= -github.com/sei-protocol/sei-cosmos v0.1.175 h1:JFeAe8NeUvAnt4423O51HLzePN2WTmLHWv8iXeWZTA0= -github.com/sei-protocol/sei-cosmos v0.1.175/go.mod h1:8ccWQxpBkWbpvBos/T4QO9K9gQxFs0duTqKRnagKo+0= +github.com/sei-protocol/sei-cosmos v0.1.192 h1:qrrzr2qHrj7zMDmU7KizOjlXm2uLROUtz8ogEYSxfSE= +github.com/sei-protocol/sei-cosmos v0.1.192/go.mod h1:8ccWQxpBkWbpvBos/T4QO9K9gQxFs0duTqKRnagKo+0= github.com/sei-protocol/sei-tendermint v0.1.59 h1:POGL60PumMQHF4EzAHzvkGfDnodQJLHpl65LuiwSO/Y= github.com/sei-protocol/sei-tendermint v0.1.59/go.mod h1:Olwbjyagrpoxj5DAUhHxMTWDVEfQ3FYdpypaJ3+6Hs8= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= From 8ca73db9f649965ec3def2283ca5fdbd88c73776 Mon Sep 17 00:00:00 2001 From: Eric Zhu Date: Mon, 24 Oct 2022 15:59:55 -0400 Subject: [PATCH 05/15] update loadtest config script --- loadtest/config.json | 7 +++++-- loadtest/main.go | 44 ++++++++++++++++++++++++++++++++++++++++---- loadtest/sign.go | 26 ++++++++++++++++++++++++++ 3 files changed, 71 insertions(+), 6 deletions(-) diff --git a/loadtest/config.json b/loadtest/config.json index d8673d83b0..b55d61faed 100644 --- a/loadtest/config.json +++ b/loadtest/config.json @@ -15,9 +15,12 @@ }, "message_type_distribution": { "limit_order_percentage": "0.2", - "market_order_percentage": "0.8" + "market_order_percentage": "0.8", + "delegate_percentage": "1", + "redelegate_percentage": "0.0", + "begin_redelegate_percentage": "0.0" }, - "message_type": "basic", + "message_type": "staking", "contract_distribution": [ { "contract_address": "sei1yw4xvtc43me9scqfr2jr2gzvcxd3a9y4eq7gaukreugw2yd2f8tsy4qgdm", diff --git a/loadtest/main.go b/loadtest/main.go index 1759091eca..0183912339 100644 --- a/loadtest/main.go +++ b/loadtest/main.go @@ -22,6 +22,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" typestx "github.com/cosmos/cosmos-sdk/types/tx" "github.com/cosmos/cosmos-sdk/x/auth/tx" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/sei-protocol/sei-chain/app" "github.com/sei-protocol/sei-chain/utils" dextypes "github.com/sei-protocol/sei-chain/x/dex/types" @@ -60,11 +61,14 @@ func (d *NumericDistribution) Sample() sdk.Dec { } type MsgTypeDistribution struct { - LimitOrderPct sdk.Dec `json:"limit_order_percentage"` - MarketOrderPct sdk.Dec `json:"market_order_percentage"` + LimitOrderPct sdk.Dec `json:"limit_order_percentage"` + MarketOrderPct sdk.Dec `json:"market_order_percentage"` + DelegatePct sdk.Dec `json:"delegate_percentage"` + UndelegatePct sdk.Dec `json:"undelegate_percentage"` + BeginRedelegatePct sdk.Dec `json:"begin_redelegate_percentage"` } -func (d *MsgTypeDistribution) Sample() string { +func (d *MsgTypeDistribution) SampleDexMsgs() string { if !d.LimitOrderPct.Add(d.MarketOrderPct).Equal(sdk.OneDec()) { panic("Distribution percentages must add up to 1") } @@ -75,6 +79,19 @@ func (d *MsgTypeDistribution) Sample() string { return "market" } +func (d *MsgTypeDistribution) SampleStakingMsgs() string { + if !d.DelegatePct.Add(d.UndelegatePct).Add(d.BeginRedelegatePct).Equal(sdk.OneDec()) { + panic("Distribution percentages must add up to 1") + } + randNum := sdk.MustNewDecFromStr(fmt.Sprintf("%f", rand.Float64())) + if randNum.LT(d.DelegatePct) { + return "delegate" + } else if randNum.LT(d.DelegatePct.Add(d.UndelegatePct)) { + return "undelegate" + } + return "begin_redelegate" +} + type ContractDistributions []ContractDistribution func (d *ContractDistributions) Sample() string { @@ -225,8 +242,27 @@ func generateMessage(config Config, key cryptotypes.PrivKey, batchSize uint64) s Amount: sdk.NewInt(1), }), } + case "staking": + msgType := config.MsgTypeDistr.SampleStakingMsgs() + validatorAddresses := GetValidators() + + switch msgType { + case "delegate": + msg = &stakingtypes.MsgDelegate{ + DelegatorAddress: sdk.AccAddress(key.PubKey().Address()).String(), + ValidatorAddress: validatorAddresses[rand.Intn(len(validatorAddresses))], + Amount: sdk.Coin{Denom: "usei", Amount: sdk.NewInt(1)}, + } + case "undelegate": + msg = &stakingtypes.MsgUndelegate{} + case "begin_redelegate": + msg = &stakingtypes.MsgBeginRedelegate{} + default: + panic("Unknown message type") + } + case "dex": - msgType := config.MsgTypeDistr.Sample() + msgType := config.MsgTypeDistr.SampleDexMsgs() orderPlacements := []*dextypes.Order{} var orderType dextypes.OrderType if msgType == "limit" { diff --git a/loadtest/sign.go b/loadtest/sign.go index 0ebaccd94e..545a4a04d2 100644 --- a/loadtest/sign.go +++ b/loadtest/sign.go @@ -1,6 +1,7 @@ package main import ( + "bufio" "encoding/json" "fmt" "io" @@ -26,6 +27,31 @@ type AccountInfo struct { Mnemonic string `json:"mnemonic"` } +func GetValidators() []string { + userHomeDir, _ := os.UserHomeDir() + validatorAddrFilePath := filepath.Join(userHomeDir, "validator_addrs.txt") + f, err := os.Open(validatorAddrFilePath) + if err != nil { + panic(err) + } + defer f.Close() + + scanner := bufio.NewScanner(f) + scanner.Split(bufio.ScanWords) + + validatorAddresses := []string{} + for scanner.Scan() { + addr := scanner.Text() + validatorAddresses = append(validatorAddresses, addr[1:len(addr)-1]) + } + + if err := scanner.Err(); err != nil { + fmt.Println(err) + } + + return validatorAddresses +} + func GetKey(accountIdx uint64) cryptotypes.PrivKey { userHomeDir, _ := os.UserHomeDir() accountKeyFilePath := filepath.Join(userHomeDir, "test_accounts", fmt.Sprintf("ta%d.json", accountIdx)) From 38762234108000dbc0289ffac69646861d905ae1 Mon Sep 17 00:00:00 2001 From: Eric Zhu Date: Mon, 24 Oct 2022 16:03:11 -0400 Subject: [PATCH 06/15] fix config.json naming --- loadtest/config.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/loadtest/config.json b/loadtest/config.json index b55d61faed..8133fef3ae 100644 --- a/loadtest/config.json +++ b/loadtest/config.json @@ -16,8 +16,8 @@ "message_type_distribution": { "limit_order_percentage": "0.2", "market_order_percentage": "0.8", - "delegate_percentage": "1", - "redelegate_percentage": "0.0", + "delegate_percentage": "1.0", + "undelegate_percentage": "0.0", "begin_redelegate_percentage": "0.0" }, "message_type": "staking", From 00be8ae90716d9983f3aca03316b21c037df261e Mon Sep 17 00:00:00 2001 From: Eric Zhu Date: Mon, 24 Oct 2022 16:12:50 -0400 Subject: [PATCH 07/15] populate other messages --- loadtest/main.go | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/loadtest/main.go b/loadtest/main.go index 0183912339..776a8b08d2 100644 --- a/loadtest/main.go +++ b/loadtest/main.go @@ -251,12 +251,21 @@ func generateMessage(config Config, key cryptotypes.PrivKey, batchSize uint64) s msg = &stakingtypes.MsgDelegate{ DelegatorAddress: sdk.AccAddress(key.PubKey().Address()).String(), ValidatorAddress: validatorAddresses[rand.Intn(len(validatorAddresses))], - Amount: sdk.Coin{Denom: "usei", Amount: sdk.NewInt(1)}, + Amount: sdk.Coin{Denom: "usei", Amount: sdk.NewInt(5)}, } case "undelegate": - msg = &stakingtypes.MsgUndelegate{} + msg = &stakingtypes.MsgUndelegate{ + DelegatorAddress: sdk.AccAddress(key.PubKey().Address()).String(), + ValidatorAddress: validatorAddresses[rand.Intn(len(validatorAddresses))], + Amount: sdk.Coin{Denom: "usei", Amount: sdk.NewInt(1)}, + } case "begin_redelegate": - msg = &stakingtypes.MsgBeginRedelegate{} + msg = &stakingtypes.MsgBeginRedelegate{ + DelegatorAddress: sdk.AccAddress(key.PubKey().Address()).String(), + ValidatorSrcAddress: validatorAddresses[rand.Intn(len(validatorAddresses))], + ValidatorDstAddress: validatorAddresses[rand.Intn(len(validatorAddresses))], + Amount: sdk.Coin{Denom: "usei", Amount: sdk.NewInt(1)}, + } default: panic("Unknown message type") } From bec280cd9e344be91bd64d34128fff22177af0fc Mon Sep 17 00:00:00 2001 From: Eric Zhu Date: Mon, 24 Oct 2022 16:20:12 -0400 Subject: [PATCH 08/15] adjust msg distribution --- loadtest/config.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/loadtest/config.json b/loadtest/config.json index 8133fef3ae..70ce847f71 100644 --- a/loadtest/config.json +++ b/loadtest/config.json @@ -16,9 +16,9 @@ "message_type_distribution": { "limit_order_percentage": "0.2", "market_order_percentage": "0.8", - "delegate_percentage": "1.0", - "undelegate_percentage": "0.0", - "begin_redelegate_percentage": "0.0" + "delegate_percentage": "0.5", + "undelegate_percentage": "0.25", + "begin_redelegate_percentage": "0.25" }, "message_type": "staking", "contract_distribution": [ From 92971489e4a3ad46b7f98e8b701d918c8b87dcfe Mon Sep 17 00:00:00 2001 From: Eric Zhu Date: Mon, 24 Oct 2022 16:41:33 -0400 Subject: [PATCH 09/15] query validators on loadtest --- loadtest/main.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/loadtest/main.go b/loadtest/main.go index 776a8b08d2..b682749ca2 100644 --- a/loadtest/main.go +++ b/loadtest/main.go @@ -333,6 +333,10 @@ func getLastHeight() int { return height } +func setup() { + exec.Command("seid query staking validators --output json | jq '.validators | to_entries | .[].value.operator_address' > ~/validator_addrs.txt") +} + func main() { config := Config{} pwd, _ := os.Getwd() @@ -340,5 +344,6 @@ func main() { if err := json.Unmarshal(file, &config); err != nil { panic(err) } + setup() run(config) } From 13c53d3c92d8be5de3a35ad510e1fb8af86f3cf7 Mon Sep 17 00:00:00 2001 From: Eric Zhu Date: Mon, 24 Oct 2022 17:47:01 -0400 Subject: [PATCH 10/15] query validators in loadtest script --- loadtest/main.go | 14 +++++++------- loadtest/sign.go | 34 ++++++++++++++++------------------ 2 files changed, 23 insertions(+), 25 deletions(-) diff --git a/loadtest/main.go b/loadtest/main.go index b682749ca2..1bd46bf172 100644 --- a/loadtest/main.go +++ b/loadtest/main.go @@ -163,6 +163,7 @@ func run(config Config) { if config.OrdersPerBlock < batchSize { panic("Must have more orders per block than batch size") } + qv := GetValidators() numberOfAccounts := config.OrdersPerBlock / batchSize * 2 // * 2 because we need two sets of accounts activeAccounts := []int{} @@ -189,7 +190,7 @@ func run(config Config) { for _, account := range activeAccounts { key := GetKey(uint64(account)) - msg := generateMessage(config, key, batchSize) + msg := generateMessage(config, key, batchSize, qv.Validators) txBuilder := TestConfig.TxConfig.NewTxBuilder() _ = txBuilder.SetMsgs(msg) seqDelta := uint64(i / 2) @@ -230,7 +231,7 @@ func run(config Config) { fmt.Printf("%s - Finished\n", time.Now().Format("2006-01-02T15:04:05")) } -func generateMessage(config Config, key cryptotypes.PrivKey, batchSize uint64) sdk.Msg { +func generateMessage(config Config, key cryptotypes.PrivKey, batchSize uint64, validators []Validator) sdk.Msg { var msg sdk.Msg switch config.MessageType { case "basic": @@ -244,26 +245,25 @@ func generateMessage(config Config, key cryptotypes.PrivKey, batchSize uint64) s } case "staking": msgType := config.MsgTypeDistr.SampleStakingMsgs() - validatorAddresses := GetValidators() switch msgType { case "delegate": msg = &stakingtypes.MsgDelegate{ DelegatorAddress: sdk.AccAddress(key.PubKey().Address()).String(), - ValidatorAddress: validatorAddresses[rand.Intn(len(validatorAddresses))], + ValidatorAddress: validators[rand.Intn(len(validators))].OpperatorAddr, Amount: sdk.Coin{Denom: "usei", Amount: sdk.NewInt(5)}, } case "undelegate": msg = &stakingtypes.MsgUndelegate{ DelegatorAddress: sdk.AccAddress(key.PubKey().Address()).String(), - ValidatorAddress: validatorAddresses[rand.Intn(len(validatorAddresses))], + ValidatorAddress: validators[rand.Intn(len(validators))].OpperatorAddr, Amount: sdk.Coin{Denom: "usei", Amount: sdk.NewInt(1)}, } case "begin_redelegate": msg = &stakingtypes.MsgBeginRedelegate{ DelegatorAddress: sdk.AccAddress(key.PubKey().Address()).String(), - ValidatorSrcAddress: validatorAddresses[rand.Intn(len(validatorAddresses))], - ValidatorDstAddress: validatorAddresses[rand.Intn(len(validatorAddresses))], + ValidatorSrcAddress: validators[rand.Intn(len(validators))].OpperatorAddr, + ValidatorDstAddress: validators[rand.Intn(len(validators))].OpperatorAddr, Amount: sdk.Coin{Denom: "usei", Amount: sdk.NewInt(1)}, } default: diff --git a/loadtest/sign.go b/loadtest/sign.go index 545a4a04d2..aeaffa5235 100644 --- a/loadtest/sign.go +++ b/loadtest/sign.go @@ -1,11 +1,11 @@ package main import ( - "bufio" "encoding/json" "fmt" "io" "os" + "os/exec" "path/filepath" "time" @@ -27,29 +27,27 @@ type AccountInfo struct { Mnemonic string `json:"mnemonic"` } -func GetValidators() []string { - userHomeDir, _ := os.UserHomeDir() - validatorAddrFilePath := filepath.Join(userHomeDir, "validator_addrs.txt") - f, err := os.Open(validatorAddrFilePath) - if err != nil { - panic(err) - } - defer f.Close() +type Validator struct { + OpperatorAddr string `json:"operator_address"` +} - scanner := bufio.NewScanner(f) - scanner.Split(bufio.ScanWords) +type QueryValidators struct { + Validators []Validator `json:"validators"` +} + +func GetValidators() QueryValidators { + seid_query, err := exec.Command("seid", "query", "staking", "validators", "--output", "json").Output() - validatorAddresses := []string{} - for scanner.Scan() { - addr := scanner.Text() - validatorAddresses = append(validatorAddresses, addr[1:len(addr)-1]) + if err != nil { + panic(err) } - if err := scanner.Err(); err != nil { - fmt.Println(err) + qv := QueryValidators{} + if err := json.Unmarshal(seid_query, &qv); err != nil { + panic(err) } - return validatorAddresses + return qv } func GetKey(accountIdx uint64) cryptotypes.PrivKey { From 116ab5adb02668e7dd58e71a1c05a7d8fafb350e Mon Sep 17 00:00:00 2001 From: Eric Zhu Date: Mon, 24 Oct 2022 17:56:01 -0400 Subject: [PATCH 11/15] prevent same validator addr from redelegation --- loadtest/main.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/loadtest/main.go b/loadtest/main.go index 1bd46bf172..e51ccf00e9 100644 --- a/loadtest/main.go +++ b/loadtest/main.go @@ -260,10 +260,11 @@ func generateMessage(config Config, key cryptotypes.PrivKey, batchSize uint64, v Amount: sdk.Coin{Denom: "usei", Amount: sdk.NewInt(1)}, } case "begin_redelegate": + validator_idx := rand.Intn(len(validators)) msg = &stakingtypes.MsgBeginRedelegate{ DelegatorAddress: sdk.AccAddress(key.PubKey().Address()).String(), - ValidatorSrcAddress: validators[rand.Intn(len(validators))].OpperatorAddr, - ValidatorDstAddress: validators[rand.Intn(len(validators))].OpperatorAddr, + ValidatorSrcAddress: validators[validator_idx].OpperatorAddr, + ValidatorDstAddress: validators[validator_idx+rand.Intn(len(validators)-1)+1].OpperatorAddr, Amount: sdk.Coin{Denom: "usei", Amount: sdk.NewInt(1)}, } default: From 99bb17bd47ea6dfe626054e4af26e52a67451f73 Mon Sep 17 00:00:00 2001 From: Eric Zhu Date: Mon, 24 Oct 2022 17:58:00 -0400 Subject: [PATCH 12/15] missing module statement --- loadtest/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/loadtest/main.go b/loadtest/main.go index e51ccf00e9..c8a499352f 100644 --- a/loadtest/main.go +++ b/loadtest/main.go @@ -264,7 +264,7 @@ func generateMessage(config Config, key cryptotypes.PrivKey, batchSize uint64, v msg = &stakingtypes.MsgBeginRedelegate{ DelegatorAddress: sdk.AccAddress(key.PubKey().Address()).String(), ValidatorSrcAddress: validators[validator_idx].OpperatorAddr, - ValidatorDstAddress: validators[validator_idx+rand.Intn(len(validators)-1)+1].OpperatorAddr, + ValidatorDstAddress: validators[(validator_idx+rand.Intn(len(validators)-1)+1)%len(validators)].OpperatorAddr, Amount: sdk.Coin{Denom: "usei", Amount: sdk.NewInt(1)}, } default: From 88c3a6808231c0771f781f5b2f74d7699ea2f419 Mon Sep 17 00:00:00 2001 From: Eric Zhu Date: Mon, 24 Oct 2022 18:02:22 -0400 Subject: [PATCH 13/15] revert exclusive validator redelegate --- loadtest/main.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/loadtest/main.go b/loadtest/main.go index c8a499352f..1bd46bf172 100644 --- a/loadtest/main.go +++ b/loadtest/main.go @@ -260,11 +260,10 @@ func generateMessage(config Config, key cryptotypes.PrivKey, batchSize uint64, v Amount: sdk.Coin{Denom: "usei", Amount: sdk.NewInt(1)}, } case "begin_redelegate": - validator_idx := rand.Intn(len(validators)) msg = &stakingtypes.MsgBeginRedelegate{ DelegatorAddress: sdk.AccAddress(key.PubKey().Address()).String(), - ValidatorSrcAddress: validators[validator_idx].OpperatorAddr, - ValidatorDstAddress: validators[(validator_idx+rand.Intn(len(validators)-1)+1)%len(validators)].OpperatorAddr, + ValidatorSrcAddress: validators[rand.Intn(len(validators))].OpperatorAddr, + ValidatorDstAddress: validators[rand.Intn(len(validators))].OpperatorAddr, Amount: sdk.Coin{Denom: "usei", Amount: sdk.NewInt(1)}, } default: From b3e01fef0f21e7d4ac1e6267d8e8c62b3688e699 Mon Sep 17 00:00:00 2001 From: Eric Zhu Date: Mon, 24 Oct 2022 18:31:50 -0400 Subject: [PATCH 14/15] remove useless comment --- app/app.go | 1 - 1 file changed, 1 deletion(-) diff --git a/app/app.go b/app/app.go index d57befc283..5b1a7bca10 100644 --- a/app/app.go +++ b/app/app.go @@ -148,7 +148,6 @@ func getGovProposalHandlers() []govclient.ProposalHandler { upgradeclient.CancelProposalHandler, ibcclientclient.UpdateClientProposalHandler, ibcclientclient.UpgradeProposalHandler, - // aclclient.ProposalHandler, aclclient.ResourceDependencyProposalHandler, aclclient.WasmDependencyProposalHandler, // this line is used by starport scaffolding # stargate/app/govProposalHandler From b11244bf7bf7f9a20d21c090f4e6ffb322ce53bc Mon Sep 17 00:00:00 2001 From: Eric Zhu Date: Mon, 24 Oct 2022 19:11:13 -0400 Subject: [PATCH 15/15] address comments by brandon --- loadtest/config.json | 2 +- loadtest/main.go | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/loadtest/config.json b/loadtest/config.json index 70ce847f71..3ed19e2914 100644 --- a/loadtest/config.json +++ b/loadtest/config.json @@ -20,7 +20,7 @@ "undelegate_percentage": "0.25", "begin_redelegate_percentage": "0.25" }, - "message_type": "staking", + "message_type": "basic", "contract_distribution": [ { "contract_address": "sei1yw4xvtc43me9scqfr2jr2gzvcxd3a9y4eq7gaukreugw2yd2f8tsy4qgdm", diff --git a/loadtest/main.go b/loadtest/main.go index 1bd46bf172..0ed24f0d41 100644 --- a/loadtest/main.go +++ b/loadtest/main.go @@ -60,9 +60,14 @@ func (d *NumericDistribution) Sample() sdk.Dec { return d.Min.Add(d.Max.Sub(d.Min).QuoInt64(d.NumDistinct).Mul(steps)) } +// @TODO: Eventually, want to convert so we can send a distribution of messages +// across various modules, currently only supports single module loadtesting +// For a specific module, the sum of the msg types must equal 1 type MsgTypeDistribution struct { - LimitOrderPct sdk.Dec `json:"limit_order_percentage"` - MarketOrderPct sdk.Dec `json:"market_order_percentage"` + // dex msg distribution + LimitOrderPct sdk.Dec `json:"limit_order_percentage"` + MarketOrderPct sdk.Dec `json:"market_order_percentage"` + // staking msg distribution DelegatePct sdk.Dec `json:"delegate_percentage"` UndelegatePct sdk.Dec `json:"undelegate_percentage"` BeginRedelegatePct sdk.Dec `json:"begin_redelegate_percentage"` @@ -333,10 +338,6 @@ func getLastHeight() int { return height } -func setup() { - exec.Command("seid query staking validators --output json | jq '.validators | to_entries | .[].value.operator_address' > ~/validator_addrs.txt") -} - func main() { config := Config{} pwd, _ := os.Getwd() @@ -344,6 +345,5 @@ func main() { if err := json.Unmarshal(file, &config); err != nil { panic(err) } - setup() run(config) }