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

feat!: (x/gov) store an index of proposals that are in voting period #13576

Merged
merged 48 commits into from
Oct 26, 2022
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
63c6057
(x/gov) feat: move parts of Proposal into separate storages
facundomedica Oct 18, 2022
d8219fc
fix some
facundomedica Oct 18, 2022
cb12f0e
fix others
facundomedica Oct 18, 2022
5514486
fix unit tests
facundomedica Oct 18, 2022
1d62ba4
fix unit tests
facundomedica Oct 18, 2022
4b97f7b
fix conflicts
facundomedica Oct 18, 2022
d9364d4
fix conflicts
facundomedica Oct 18, 2022
8e838f5
progress
facundomedica Oct 18, 2022
3fccb66
do not overwrite messages
facundomedica Oct 18, 2022
e2bef95
remove change
facundomedica Oct 18, 2022
82998ef
simplify methods
facundomedica Oct 19, 2022
da271d5
static data
facundomedica Oct 19, 2022
601c411
fix tests
facundomedica Oct 19, 2022
162353c
fix tests
facundomedica Oct 19, 2022
04e9308
fix tests
facundomedica Oct 19, 2022
d62d0c1
rollback some changes
facundomedica Oct 19, 2022
733f286
rollback some changes
facundomedica Oct 19, 2022
d7918b7
progress
facundomedica Oct 19, 2022
d9d339f
progress
facundomedica Oct 19, 2022
1f32225
progress
facundomedica Oct 19, 2022
b5b2ada
progress
facundomedica Oct 19, 2022
37af9c4
progress
facundomedica Oct 19, 2022
1a9a443
progress
facundomedica Oct 19, 2022
2edde57
add delete
facundomedica Oct 19, 2022
f4a128f
fix tests
facundomedica Oct 19, 2022
3f8936e
use SetProposalWithoutContents whenever possible
facundomedica Oct 19, 2022
46b087c
add migrations
facundomedica Oct 19, 2022
59dc8a7
fix godoc
facundomedica Oct 19, 2022
d7c8cd1
gofumpt
facundomedica Oct 19, 2022
78dbf6c
Merge branch 'main' into facu/gov-storage
facundomedica Oct 19, 2022
ece934d
add changelog
facundomedica Oct 19, 2022
c3af4cf
rolling back changes
facundomedica Oct 24, 2022
59434a7
rolling back changes
facundomedica Oct 24, 2022
2d07421
progress
facundomedica Oct 24, 2022
4ecb17c
progress
facundomedica Oct 24, 2022
c20b48f
progress
facundomedica Oct 24, 2022
dd38f3d
progress
facundomedica Oct 24, 2022
b6e24af
fix tests
facundomedica Oct 24, 2022
ecc8917
fix cl
facundomedica Oct 24, 2022
fc8b9d0
fix cl
facundomedica Oct 24, 2022
cd2ae66
fix
facundomedica Oct 24, 2022
ff62538
fix test error
facundomedica Oct 24, 2022
e23a08b
Merge branch 'main' into facu/gov-storage
facundomedica Oct 25, 2022
e42c114
add store key in readme
facundomedica Oct 26, 2022
97e54bd
add store key in readme
facundomedica Oct 26, 2022
0bda41c
Merge branch 'main' into facu/gov-storage
facundomedica Oct 26, 2022
8707966
Merge branch 'facu/gov-storage' of https://github.com/cosmos/cosmos-s…
facundomedica Oct 26, 2022
aa1ed8b
Merge branch 'main' into facu/gov-storage
facundomedica Oct 26, 2022
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
Prev Previous commit
Next Next commit
simplify methods
  • Loading branch information
facundomedica committed Oct 19, 2022
commit 82998efe092989db33f50ddaf1cf17fed50068e9
18 changes: 10 additions & 8 deletions x/gov/abci.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,15 +66,17 @@ func EndBlocker(ctx sdk.Context, keeper *keeper.Keeper) {
// Messages may mutate state thus we use a cached context. If one of
// the handlers fails, no state mutation is written and the error
// message is logged.
keeper.PopulateProposalStaticData(ctx, &proposal)
Fixed Show fixed Hide fixed
messages, err := proposal.GetMsgs()

cacheCtx, writeCache := ctx.CacheContext()
messages := keeper.GetProposalMessages(ctx, proposal.GetId())

var err error
for idx, msg = range messages {
handler := keeper.Router().Handler(msg)
_, err = handler(cacheCtx, msg)
if err != nil {
break
if err == nil {
for idx, msg = range messages {
handler := keeper.Router().Handler(msg)
_, err = handler(cacheCtx, msg)
if err != nil {
break
}
}
}

Expand Down
2 changes: 1 addition & 1 deletion x/gov/abci_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -263,7 +263,7 @@ func TestTickPassedVotingPeriod(t *testing.T) {
require.True(t, activeQueue.Valid())

activeProposalID := types.GetProposalIDFromBytes(activeQueue.Value())
proposal, ok := suite.GovKeeper.GetProposal(ctx, activeProposalID)
proposal, ok := suite.GovKeeper.GetProposal(ctx, activeProposalID, false)
require.True(t, ok)
require.Equal(t, v1.StatusVotingPeriod, proposal.Status)

Expand Down
2 changes: 1 addition & 1 deletion x/gov/keeper/deposit.go
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ func (keeper Keeper) IterateDeposits(ctx sdk.Context, proposalID uint64, cb func
// Activates voting period when appropriate and returns true in that case, else returns false.
func (keeper Keeper) AddDeposit(ctx sdk.Context, proposalID uint64, depositorAddr sdk.AccAddress, depositAmount sdk.Coins) (bool, error) {
// Checks to see if proposal exists
proposal, ok := keeper.GetProposal(ctx, proposalID)
proposal, ok := keeper.GetProposal(ctx, proposalID, false)
if !ok {
return false, sdkerrors.Wrapf(types.ErrUnknownProposal, "%d", proposalID)
}
Expand Down
19 changes: 3 additions & 16 deletions x/gov/keeper/grpc_query.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import (
"github.com/cosmos/cosmos-sdk/store/prefix"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/types/query"
sdktx "github.com/cosmos/cosmos-sdk/types/tx"
v3 "github.com/cosmos/cosmos-sdk/x/gov/migrations/v3"
"github.com/cosmos/cosmos-sdk/x/gov/types"
v1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1"
Expand All @@ -30,18 +29,11 @@ func (q Keeper) Proposal(c context.Context, req *v1.QueryProposalRequest) (*v1.Q

ctx := sdk.UnwrapSDKContext(c)

proposal, found := q.GetProposal(ctx, req.ProposalId)
proposal, found := q.GetProposal(ctx, req.ProposalId, true)
if !found {
return nil, status.Errorf(codes.NotFound, "proposal %d doesn't exist", req.ProposalId)
}

msgs := q.GetProposalMessages(ctx, req.ProposalId)
var err error
proposal.Messages, err = sdktx.SetMsgs(msgs)
if err != nil {
return nil, status.Errorf(codes.Internal, "failed to get proposal messages: %v", err)
}

return &v1.QueryProposalResponse{Proposal: &proposal}, nil
}

Expand Down Expand Up @@ -96,12 +88,7 @@ func (q Keeper) Proposals(c context.Context, req *v1.QueryProposalsRequest) (*v1
}

for i := range filteredProposals {
msgs := q.GetProposalMessages(ctx, filteredProposals[i].Id)
var err error
filteredProposals[i].Messages, err = sdktx.SetMsgs(msgs)
if err != nil {
return nil, status.Errorf(codes.Internal, "failed to get proposal messages: %v", err)
}
q.PopulateProposalStaticData(ctx, filteredProposals[i])
}

return &v1.QueryProposalsResponse{Proposals: filteredProposals, Pagination: pageRes}, nil
Expand Down Expand Up @@ -276,7 +263,7 @@ func (q Keeper) TallyResult(c context.Context, req *v1.QueryTallyResultRequest)

ctx := sdk.UnwrapSDKContext(c)

proposal, ok := q.GetProposal(ctx, req.ProposalId)
proposal, ok := q.GetProposal(ctx, req.ProposalId, false)
if !ok {
return nil, status.Errorf(codes.NotFound, "proposal %d doesn't exist", req.ProposalId)
}
Expand Down
4 changes: 2 additions & 2 deletions x/gov/keeper/keeper.go
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@ func (keeper Keeper) IterateActiveProposalsQueue(ctx sdk.Context, endTime time.T
defer iterator.Close()
for ; iterator.Valid(); iterator.Next() {
proposalID, _ := types.SplitActiveProposalQueueKey(iterator.Key())
proposal, found := keeper.GetProposal(ctx, proposalID)
proposal, found := keeper.GetProposal(ctx, proposalID, false)
if !found {
panic(fmt.Sprintf("proposal %d does not exist", proposalID))
}
Expand All @@ -198,7 +198,7 @@ func (keeper Keeper) IterateInactiveProposalsQueue(ctx sdk.Context, endTime time
defer iterator.Close()
for ; iterator.Valid(); iterator.Next() {
proposalID, _ := types.SplitInactiveProposalQueueKey(iterator.Key())
proposal, found := keeper.GetProposal(ctx, proposalID)
proposal, found := keeper.GetProposal(ctx, proposalID, false)
if !found {
panic(fmt.Sprintf("proposal %d does not exist", proposalID))
}
Expand Down
31 changes: 16 additions & 15 deletions x/gov/keeper/proposal.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import (
cdctypes "github.com/cosmos/cosmos-sdk/codec/types"
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
sdktx "github.com/cosmos/cosmos-sdk/types/tx"
"github.com/cosmos/cosmos-sdk/x/gov/types"
v1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1"
)
Expand Down Expand Up @@ -98,8 +97,9 @@ func (keeper Keeper) SubmitProposal(ctx sdk.Context, messages []sdk.Msg, metadat
}

// GetProposal gets a proposal from store by ProposalID.
// If withStaticData is true, it will get the proposal's messages from the separate store.
// Panics if can't unmarshal the proposal.
func (keeper Keeper) GetProposal(ctx sdk.Context, proposalID uint64) (v1.Proposal, bool) {
func (keeper Keeper) GetProposal(ctx sdk.Context, proposalID uint64, withStaticData bool) (v1.Proposal, bool) {
store := ctx.KVStore(keeper.storeKey)

bz := store.Get(types.ProposalKey(proposalID))
Expand All @@ -112,6 +112,10 @@ func (keeper Keeper) GetProposal(ctx sdk.Context, proposalID uint64) (v1.Proposa
panic(err)
}

if withStaticData {
keeper.PopulateProposalStaticData(ctx, &proposal)
}

return proposal, true
}

Expand Down Expand Up @@ -142,7 +146,14 @@ func (keeper Keeper) setProposalMessages(ctx sdk.Context, proposalID uint64, mes
store.Set(types.ProposalMessagesKey(proposalID), bz)
}

func (keeper Keeper) GetProposalMessages(ctx sdk.Context, proposalID uint64) []sdk.Msg {
// PopulateProposalStaticData populates the proposal's static data from the separate stores.
func (keeper Keeper) PopulateProposalStaticData(ctx sdk.Context, proposal *v1.Proposal) {
proposal.Messages = keeper.getProposalMessages(ctx, proposal.Id)
}

// getProposalMessages gets the proposal's messages from the separate store.
// TODO: define if we would like this to be exported.
func (keeper Keeper) getProposalMessages(ctx sdk.Context, proposalID uint64) []*cdctypes.Any {
store := ctx.KVStore(keeper.storeKey)

bz := store.Get(types.ProposalMessagesKey(proposalID))
Expand All @@ -156,24 +167,14 @@ func (keeper Keeper) GetProposalMessages(ctx sdk.Context, proposalID uint64) []s
panic(err)
}

err = sdktx.UnpackInterfaces(keeper.cdc, propMsgs.Messages)
if err != nil {
panic(err)
}

msgs, err := sdktx.GetMsgs(propMsgs.Messages, "sdk.MsgProposal")
if err != nil {
panic(err)
}

return msgs
return propMsgs.Messages
}

// DeleteProposal deletes a proposal from store.
// Panics if the proposal doesn't exist.
func (keeper Keeper) DeleteProposal(ctx sdk.Context, proposalID uint64) {
store := ctx.KVStore(keeper.storeKey)
proposal, ok := keeper.GetProposal(ctx, proposalID)
proposal, ok := keeper.GetProposal(ctx, proposalID, false)
if !ok {
panic(fmt.Sprintf("couldn't find proposal with id#%d", proposalID))
}
Expand Down
9 changes: 1 addition & 8 deletions x/gov/keeper/proposal_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import (

"github.com/cosmos/cosmos-sdk/testutil/testdata"
sdk "github.com/cosmos/cosmos-sdk/types"
sdktx "github.com/cosmos/cosmos-sdk/types/tx"
"github.com/cosmos/cosmos-sdk/x/gov/types"
v1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1"
"github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1"
Expand All @@ -24,13 +23,7 @@ func (suite *KeeperTestSuite) TestGetSetProposal() {
proposalID := proposal.Id
suite.govKeeper.SetProposal(suite.ctx, proposal)

gotProposal, ok := suite.govKeeper.GetProposal(suite.ctx, proposalID)

msgs := suite.govKeeper.GetProposalMessages(suite.ctx, proposalID)
suite.Require().Equal(len(tp), len(msgs))
gotProposal.Messages, err = sdktx.SetMsgs(msgs)
suite.Require().NoError(err)

gotProposal, ok := suite.govKeeper.GetProposal(suite.ctx, proposalID, true)
suite.Require().True(ok)
suite.Require().Equal(proposal, gotProposal)
}
Expand Down
2 changes: 1 addition & 1 deletion x/gov/keeper/vote.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import (

// AddVote adds a vote on a specific proposal
func (keeper Keeper) AddVote(ctx sdk.Context, proposalID uint64, voterAddr sdk.AccAddress, options v1.WeightedVoteOptions, metadata string) error {
proposal, ok := keeper.GetProposal(ctx, proposalID)
proposal, ok := keeper.GetProposal(ctx, proposalID, false)
if !ok {
return sdkerrors.Wrapf(types.ErrUnknownProposal, "%d", proposalID)
}
Expand Down
2 changes: 1 addition & 1 deletion x/gov/simulation/operations.go
Original file line number Diff line number Diff line change
Expand Up @@ -452,7 +452,7 @@ func randomProposalID(r *rand.Rand, k *keeper.Keeper, ctx sdk.Context, status v1
initialProposalID = proposalID
}

proposal, ok := k.GetProposal(ctx, proposalID)
proposal, ok := k.GetProposal(ctx, proposalID, false)
if !ok || proposal.Status != status {
return proposalID, false
}
Expand Down