Skip to content
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
54 changes: 29 additions & 25 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -10,26 +10,26 @@ export GO111MODULE = on
LEDGER_ENABLED ?= true
build_tags = netgo
ifeq ($(LEDGER_ENABLED),true)
ifeq ($(OS),Windows_NT)
GCCEXE = $(shell where gcc.exe 2> NUL)
ifeq ($(GCCEXE),)
$(error gcc.exe not installed for ledger support, please install or set LEDGER_ENABLED=false)
else
build_tags += ledger
endif
else
UNAME_S = $(shell uname -s)
ifeq ($(UNAME_S),OpenBSD)
$(warning OpenBSD detected, disabling ledger support (https://github.com/cosmos/cosmos-sdk/issues/1988))
else
GCC = $(shell command -v gcc 2> /dev/null)
ifeq ($(GCC),)
$(error gcc not installed for ledger support, please install or set LEDGER_ENABLED=false)
else
build_tags += ledger
endif
endif
endif
ifeq ($(OS),Windows_NT)
GCCEXE = $(shell where gcc.exe 2> NUL)
ifeq ($(GCCEXE),)
$(error gcc.exe not installed for ledger support, please install or set LEDGER_ENABLED=false)
else
build_tags += ledger
endif
else
UNAME_S = $(shell uname -s)
ifeq ($(UNAME_S),OpenBSD)
$(warning OpenBSD detected, disabling ledger support (https://github.com/cosmos/cosmos-sdk/issues/1988))
else
GCC = $(shell command -v gcc 2> /dev/null)
ifeq ($(GCC),)
$(error gcc not installed for ledger support, please install or set LEDGER_ENABLED=false)
else
build_tags += ledger
endif
endif
endif
endif

build_tags += $(BUILD_TAGS)
Expand All @@ -43,13 +43,13 @@ build_tags_comma_sep := $(subst $(whitespace),$(comma),$(build_tags))
# process linker flags

ldflags = -X github.com/cosmos/cosmos-sdk/version.Name=sei \
-X github.com/cosmos/cosmos-sdk/version.ServerName=seid \
-X github.com/cosmos/cosmos-sdk/version.Version=$(VERSION) \
-X github.com/cosmos/cosmos-sdk/version.Commit=$(COMMIT) \
-X "github.com/cosmos/cosmos-sdk/version.BuildTags=$(build_tags_comma_sep)"
-X github.com/cosmos/cosmos-sdk/version.ServerName=seid \
-X github.com/cosmos/cosmos-sdk/version.Version=$(VERSION) \
-X github.com/cosmos/cosmos-sdk/version.Commit=$(COMMIT) \
-X "github.com/cosmos/cosmos-sdk/version.BuildTags=$(build_tags_comma_sep)"

ifeq ($(LINK_STATICALLY),true)
ldflags += -linkmode=external -extldflags "-Wl,-z,muldefs -static"
ldflags += -linkmode=external -extldflags "-Wl,-z,muldefs -static"
endif
ldflags += $(LDFLAGS)
ldflags := $(strip $(ldflags))
Expand All @@ -64,6 +64,10 @@ all: lint install
install: go.sum
go install $(BUILD_FLAGS) ./cmd/seid

loadtest: go.sum
go build $(BUILD_FLAGS) -o ./build/loadtest ./loadtest/


go.sum: go.mod
@echo "--> Ensure dependencies have not been modified"
@go mod verify
Expand Down
69 changes: 69 additions & 0 deletions aclmapping/oracle/mappings.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package acloraclemapping

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"
utils "github.com/sei-protocol/sei-chain/aclmapping/utils"
oracletypes "github.com/sei-protocol/sei-chain/x/oracle/types"
)

var ErrorInvalidMsgType = fmt.Errorf("invalid message received for oracle module")

func GetOracleDependencyGenerator() aclkeeper.DependencyGeneratorMap {
dependencyGeneratorMap := make(aclkeeper.DependencyGeneratorMap)

// vote
voteKey := acltypes.GenerateMessageKey(&oracletypes.MsgAggregateExchangeRateVote{})
dependencyGeneratorMap[voteKey] = MsgVoteDependencyGenerator

return dependencyGeneratorMap
}

func MsgVoteDependencyGenerator(keeper aclkeeper.Keeper, ctx sdk.Context, msg sdk.Msg) ([]sdkacltypes.AccessOperation, error) {
msgVote, ok := msg.(*oracletypes.MsgAggregateExchangeRateVote)
if !ok {
return []sdkacltypes.AccessOperation{}, ErrorInvalidMsgType
}

accessOperations := []sdkacltypes.AccessOperation{
// validate feeder
// read feeder delegation for val addr - READ
{
ResourceType: sdkacltypes.ResourceType_KV_ORACLE_FEEDERS,
AccessType: sdkacltypes.AccessType_READ,
IdentifierTemplate: msgVote.Validator,
},
// read validator from staking - READ
// validator is bonded check - READ
// (both covered by below)
{
ResourceType: sdkacltypes.ResourceType_KV_STAKING,
AccessType: sdkacltypes.AccessType_READ,
IdentifierTemplate: msgVote.Validator,
},
// get vote target (for all exchange rate tuples) -> blanket read on that prefix - READ
{
ResourceType: sdkacltypes.ResourceType_KV_ORACLE_VOTE_TARGETS,
AccessType: sdkacltypes.AccessType_READ,
IdentifierTemplate: utils.DefaultIDTemplate,
},

// set exchange rate vote - WRITE
{
ResourceType: sdkacltypes.ResourceType_KV_ORACLE_AGGREGATE_VOTES,
AccessType: sdkacltypes.AccessType_READ,
IdentifierTemplate: msgVote.Validator,
},
// Last Operation should always be a commit
{
ResourceType: sdkacltypes.ResourceType_ANY,
AccessType: sdkacltypes.AccessType_COMMIT,
IdentifierTemplate: utils.DefaultIDTemplate,
},
}
return accessOperations, nil
}
30 changes: 30 additions & 0 deletions aclmapping/oracle/mappings_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package acloraclemapping

import (
"testing"
"time"

"github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1"
acltypes "github.com/cosmos/cosmos-sdk/x/accesscontrol/types"
"github.com/sei-protocol/sei-chain/app"
oracletypes "github.com/sei-protocol/sei-chain/x/oracle/types"
"github.com/stretchr/testify/require"
)

func TestMsgVoteDependencyGenerator(t *testing.T) {
tm := time.Now().UTC()
valPub := secp256k1.GenPrivKey().PubKey()

testWrapper := app.NewTestWrapper(t, tm, valPub)

oracleVote := oracletypes.MsgAggregateExchangeRateVote{
ExchangeRates: "1usei",
Feeder: "test",
Validator: "validator",
}

accessOps, err := MsgVoteDependencyGenerator(testWrapper.App.AccessControlKeeper, testWrapper.Ctx, &oracleVote)
require.NoError(t, err)
err = acltypes.ValidateAccessOps(accessOps)
require.NoError(t, err)
}
8 changes: 4 additions & 4 deletions aclmapping/utils/identifier_templates.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,13 @@ func GetOracleReadAccessOpsForValAndFeeder(feederAddr sdk.Address, valAddr sdk.A
return []sdkacltypes.AccessOperation{
{
AccessType: sdkacltypes.AccessType_READ,
ResourceType: sdkacltypes.ResourceType_KV,
IdentifierTemplate: GetIdentifierTemplatePerModule("oracle", feederAddr.String()),
ResourceType: sdkacltypes.ResourceType_KV_ORACLE,
IdentifierTemplate: feederAddr.String(),
},
{
AccessType: sdkacltypes.AccessType_READ,
ResourceType: sdkacltypes.ResourceType_KV,
IdentifierTemplate: GetIdentifierTemplatePerModule("oracle", valAddr.String()),
ResourceType: sdkacltypes.ResourceType_KV_ORACLE,
IdentifierTemplate: valAddr.String(),
},
}
}
73 changes: 3 additions & 70 deletions app/antedecorators/gasless.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,18 +45,11 @@ func (gd GaslessDecorator) AnteDeps(txDeps []sdkacltypes.AccessOperation, tx sdk
for _, msg := range tx.GetMsgs() {
// Error checking will be handled in AnteHandler
switch m := msg.(type) {
case *oracletypes.MsgAggregateExchangeRatePrevote:
feederAddr, _ := sdk.AccAddressFromBech32(m.Feeder)
valAddr, _ := sdk.ValAddressFromBech32(m.Validator)
deps = append(deps, aclutils.GetOracleReadAccessOpsForValAndFeeder(feederAddr, valAddr)...)
Comment on lines -48 to -51
Copy link
Contributor

Choose a reason for hiding this comment

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

is this part of the cherry-picked changes?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

yup, it removed the prevote and combined vote from oracle

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

well, this exact change wasn't cherry picked, but I removed this to match the removal in the cherry picked section

case *oracletypes.MsgAggregateExchangeRateVote:
feederAddr, _ := sdk.AccAddressFromBech32(m.Feeder)
valAddr, _ := sdk.ValAddressFromBech32(m.Validator)
deps = append(deps, aclutils.GetOracleReadAccessOpsForValAndFeeder(feederAddr, valAddr)...)
case *oracletypes.MsgAggregateExchangeRateCombinedVote:
feederAddr, _ := sdk.AccAddressFromBech32(m.Feeder)
valAddr, _ := sdk.ValAddressFromBech32(m.Validator)
deps = append(deps, aclutils.GetOracleReadAccessOpsForValAndFeeder(feederAddr, valAddr)...)
// TODO: we also need to add READs for Validator + bonded check
default:
continue
}
Expand All @@ -82,21 +75,11 @@ func isTxGasless(tx sdk.Tx, ctx sdk.Context, oracleKeeper oraclekeeper.Keeper) b
continue
}
return false
case *oracletypes.MsgAggregateExchangeRatePrevote:
if OraclePrevoteIsGasless(m, ctx, oracleKeeper) {
continue
}
return false
case *oracletypes.MsgAggregateExchangeRateVote:
if OracleVoteIsGasless(m, ctx, oracleKeeper) {
continue
}
return false
case *oracletypes.MsgAggregateExchangeRateCombinedVote:
if OracleCombinedVoteIsGasless(m, ctx, oracleKeeper) {
continue
}
return false
default:
return false
}
Expand Down Expand Up @@ -131,34 +114,6 @@ func allSignersWhitelisted(msg *dextypes.MsgCancelOrders) bool {
return true
}

func OraclePrevoteIsGasless(msg *oracletypes.MsgAggregateExchangeRatePrevote, ctx sdk.Context, keeper oraclekeeper.Keeper) bool {
feederAddr, err := sdk.AccAddressFromBech32(msg.Feeder)
if err != nil {
return false
}

valAddr, err := sdk.ValAddressFromBech32(msg.Validator)
if err != nil {
return false
}

err = keeper.ValidateFeeder(ctx, feederAddr, valAddr)
if err != nil {
return false
}

currHeight := ctx.BlockHeight()
votePeriod := keeper.VotePeriod(ctx)
lastPrevote, err := keeper.GetAggregateExchangeRatePrevote(ctx, valAddr)
if err != nil {
return true
}

lastPrevoteWindow := lastPrevote.SubmitBlock / votePeriod
currPrevoteWindow := uint64(currHeight) / votePeriod
return currPrevoteWindow > lastPrevoteWindow
}

func OracleVoteIsGasless(msg *oracletypes.MsgAggregateExchangeRateVote, ctx sdk.Context, keeper oraclekeeper.Keeper) bool {
feederAddr, err := sdk.AccAddressFromBech32(msg.Feeder)
if err != nil {
Expand All @@ -178,28 +133,6 @@ func OracleVoteIsGasless(msg *oracletypes.MsgAggregateExchangeRateVote, ctx sdk.
// this returns an error IFF there is no vote present
// this also gets cleared out after every vote window, so if there is no vote present, we may want to allow gasless tx
_, err = keeper.GetAggregateExchangeRateVote(ctx, valAddr)
// if there is no error that means there is a vote present, so we dont allow gasless tx
if err == nil {
return false
}

currHeight := ctx.BlockHeight()
votePeriod := keeper.VotePeriod(ctx)
// we expect a prevote from the previous window
lastPrevote, err := keeper.GetAggregateExchangeRatePrevote(ctx, valAddr)
if err != nil {
// if there is no prevote present, there shouldnt be a vote expected so we dont allow gasless
return false
}

lastPrevoteWindow := lastPrevote.SubmitBlock / votePeriod
currPrevoteWindow := uint64(currHeight) / votePeriod

// we allow gasless tx if the difference is exactly 1, since then the prevote is in the valid window
return currPrevoteWindow-lastPrevoteWindow == 1
}

func OracleCombinedVoteIsGasless(msg *oracletypes.MsgAggregateExchangeRateCombinedVote, ctx sdk.Context, keeper oraclekeeper.Keeper) bool {
return (OraclePrevoteIsGasless(msg.GetPrevoteFromCombinedVote(), ctx, keeper) ||
OracleVoteIsGasless(msg.GetVoteFromCombinedVote(), ctx, keeper))
// if there is no error that means there is a vote present, so we dont allow gasless tx otherwise we allow it
return err != nil
}
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ require (
)

replace (
github.com/cosmos/cosmos-sdk => github.com/sei-protocol/sei-cosmos v0.1.194
github.com/cosmos/cosmos-sdk => github.com/sei-protocol/sei-cosmos v0.1.199
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
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -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.194 h1:6vm3HlPY1ErGu0s+V9zLX7lYowSmj4u0vUL2W65KVcs=
github.com/sei-protocol/sei-cosmos v0.1.194/go.mod h1:8ccWQxpBkWbpvBos/T4QO9K9gQxFs0duTqKRnagKo+0=
github.com/sei-protocol/sei-cosmos v0.1.199 h1:p+kqO95BjKycKJcL+nPBib+nrygutYtV9/nimI4cCVs=
github.com/sei-protocol/sei-cosmos v0.1.199/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=
Expand Down
5 changes: 3 additions & 2 deletions loadtest/config.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"msgs_per_tx": 10,
"chain_id": "sei-loadtest-testnet",
"orders_per_block": 400,
"txs_per_block": 400,
"rounds": 5,
"price_distribution": {
"min": "45",
Expand All @@ -24,7 +24,8 @@
"begin_redelegate_percentage": "0.25"
}
},
"message_type": "basic",
"message_type": "none",
"run_oracle": true,
"contract_distribution": [
{
"contract_address": "sei1yw4xvtc43me9scqfr2jr2gzvcxd3a9y4eq7gaukreugw2yd2f8tsy4qgdm",
Expand Down
Loading