parent
dced7ec56a
commit
f2d94445c0
|
@ -14,7 +14,7 @@ jobs:
|
|||
steps:
|
||||
- uses: actions/setup-go@v2.1.4
|
||||
with:
|
||||
go-version: 1.17
|
||||
go-version: 1.18
|
||||
- uses: technote-space/get-diff-action@v5
|
||||
id: git_diff
|
||||
with:
|
||||
|
|
|
@ -21,7 +21,7 @@ jobs:
|
|||
steps:
|
||||
- name: install runsim
|
||||
run: |
|
||||
export GO111MODULE="on" && go get github.com/cosmos/tools/cmd/runsim@v1.0.0
|
||||
export GO111MODULE="on" && go install github.com/cosmos/tools/cmd/runsim@v1.0.0
|
||||
- uses: actions/cache@v2.1.6
|
||||
with:
|
||||
path: ~/go/bin
|
||||
|
|
|
@ -15,7 +15,7 @@ jobs:
|
|||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-go@v2.1.3
|
||||
with:
|
||||
go-version: 1.17
|
||||
go-version: 1.18
|
||||
- name: Display go version
|
||||
run: go version
|
||||
- run: make build
|
||||
|
@ -26,11 +26,11 @@ jobs:
|
|||
steps:
|
||||
- uses: actions/setup-go@v2.1.3
|
||||
with:
|
||||
go-version: 1.17
|
||||
go-version: 1.18
|
||||
- name: Display go version
|
||||
run: go version
|
||||
- name: Install runsim
|
||||
run: export GO111MODULE="on" && go get github.com/cosmos/tools/cmd/runsim@v1.0.0
|
||||
run: export GO111MODULE="on" && go install github.com/cosmos/tools/cmd/runsim@v1.0.0
|
||||
- uses: actions/cache@v2.1.6
|
||||
with:
|
||||
path: ~/go/bin
|
||||
|
@ -43,7 +43,7 @@ jobs:
|
|||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-go@v2.1.3
|
||||
with:
|
||||
go-version: 1.17
|
||||
go-version: 1.18
|
||||
- name: Display go version
|
||||
run: go version
|
||||
- uses: technote-space/get-diff-action@v4
|
||||
|
@ -69,7 +69,7 @@ jobs:
|
|||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-go@v2.1.3
|
||||
with:
|
||||
go-version: 1.17
|
||||
go-version: 1.18
|
||||
- name: Display go version
|
||||
run: go version
|
||||
- uses: technote-space/get-diff-action@v4
|
||||
|
@ -97,7 +97,7 @@ jobs:
|
|||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-go@v2.1.3
|
||||
with:
|
||||
go-version: 1.17
|
||||
go-version: 1.18
|
||||
- name: Display go version
|
||||
run: go version
|
||||
- uses: technote-space/get-diff-action@v4
|
||||
|
@ -125,7 +125,7 @@ jobs:
|
|||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-go@v2.1.3
|
||||
with:
|
||||
go-version: 1.17
|
||||
go-version: 1.18
|
||||
- name: Display go version
|
||||
run: go version
|
||||
- uses: technote-space/get-diff-action@v4
|
||||
|
|
|
@ -15,7 +15,7 @@ jobs:
|
|||
- name: Install Go
|
||||
uses: actions/setup-go@v2.1.3
|
||||
with:
|
||||
go-version: 1.17
|
||||
go-version: 1.18
|
||||
- name: Unshallow
|
||||
run: git fetch --prune --unshallow
|
||||
- name: Create release
|
||||
|
|
|
@ -12,7 +12,7 @@ jobs:
|
|||
steps:
|
||||
- uses: actions/setup-go@v2.1.3
|
||||
with:
|
||||
go-version: 1.17
|
||||
go-version: 1.18
|
||||
- name: Display go version
|
||||
run: go version
|
||||
- name: install tparse
|
||||
|
@ -32,7 +32,7 @@ jobs:
|
|||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-go@v2.1.3
|
||||
with:
|
||||
go-version: 1.17
|
||||
go-version: 1.18
|
||||
- uses: technote-space/get-diff-action@v4
|
||||
id: git_diff
|
||||
with:
|
||||
|
@ -49,7 +49,7 @@ jobs:
|
|||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-go@v2.1.3
|
||||
with:
|
||||
go-version: 1.17
|
||||
go-version: 1.18
|
||||
- name: Display go version
|
||||
run: go version
|
||||
- uses: technote-space/get-diff-action@v4
|
||||
|
@ -102,7 +102,7 @@ jobs:
|
|||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-go@v2.1.3
|
||||
with:
|
||||
go-version: 1.17
|
||||
go-version: 1.18
|
||||
- uses: technote-space/get-diff-action@v4
|
||||
with:
|
||||
PATTERNS: |
|
||||
|
@ -180,7 +180,7 @@ jobs:
|
|||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-go@v2.1.3
|
||||
with:
|
||||
go-version: 1.17
|
||||
go-version: 1.18
|
||||
- uses: technote-space/get-diff-action@v4
|
||||
with:
|
||||
PATTERNS: |
|
||||
|
@ -224,7 +224,7 @@ jobs:
|
|||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-go@v2.1.3
|
||||
with:
|
||||
go-version: 1.17
|
||||
go-version: 1.18
|
||||
- uses: technote-space/get-diff-action@v4
|
||||
id: git_diff
|
||||
with:
|
||||
|
|
|
@ -42,6 +42,7 @@ Ref: https://keepachangelog.com/en/1.0.0/
|
|||
### Improvements
|
||||
|
||||
* (simapp) [#12314](https://github.com/cosmos/cosmos-sdk/pull/12314) Increase `DefaultGenTxGas` from `1000000` to `10000000`
|
||||
* [#12371](https://github.com/cosmos/cosmos-sdk/pull/12371) Update min required Golang version to 1.18.
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
|
@ -49,6 +50,10 @@ Ref: https://keepachangelog.com/en/1.0.0/
|
|||
* (x/upgrade) [#12264](https://github.com/cosmos/cosmos-sdk/pull/12264) Fix `GetLastCompleteUpgrade` to properly return the latest upgrade.
|
||||
* (x/crisis) [#12208](https://github.com/cosmos/cosmos-sdk/pull/12208) Fix progress index of crisis invariant assertion logs.
|
||||
|
||||
### Features
|
||||
|
||||
* (query) [#12253](https://github.com/cosmos/cosmos-sdk/pull/12253) Add `GenericFilteredPaginate` to the `query` package to improve UX.
|
||||
|
||||
## [v0.45.5](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.45.5) - 2022-06-09
|
||||
|
||||
### Improvements
|
||||
|
|
|
@ -45,7 +45,7 @@ The Cosmos SDK is a framework for building blockchain applications. [Tendermint
|
|||
**WARNING**: The Cosmos SDK has mostly stabilized, but we are still making some
|
||||
breaking changes.
|
||||
|
||||
**Note**: Requires [Go 1.17+](https://golang.org/dl/)
|
||||
**Note**: Requires [Go 1.18+](https://golang.org/dl/)
|
||||
|
||||
## Quick Start
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
FROM golang:1.17-alpine AS build
|
||||
FROM golang:1.18-alpine AS build
|
||||
RUN apk add build-base git linux-headers libc-dev
|
||||
RUN go install github.com/go-delve/delve/cmd/dlv@latest
|
||||
WORKDIR /work
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
FROM golang:1.17-alpine AS build
|
||||
FROM golang:1.18-alpine AS build
|
||||
RUN apk add build-base git linux-headers
|
||||
WORKDIR /work
|
||||
COPY go.mod go.sum /work/
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
FROM golang:1.17-alpine as build
|
||||
FROM golang:1.18-alpine as build
|
||||
|
||||
RUN apk add --no-cache tar
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
FROM golang:1.17-alpine as build
|
||||
FROM golang:1.18-alpine as build
|
||||
|
||||
RUN apk add git gcc libc-dev --no-cache
|
||||
|
||||
|
|
|
@ -3,6 +3,7 @@ package query
|
|||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/codec"
|
||||
"github.com/cosmos/cosmos-sdk/store/types"
|
||||
)
|
||||
|
||||
|
@ -46,8 +47,10 @@ func FilteredPaginate(
|
|||
iterator := getIterator(prefixStore, key, reverse)
|
||||
defer iterator.Close()
|
||||
|
||||
var numHits uint64
|
||||
var nextKey []byte
|
||||
var (
|
||||
numHits uint64
|
||||
nextKey []byte
|
||||
)
|
||||
|
||||
for ; iterator.Valid(); iterator.Next() {
|
||||
if numHits == limit {
|
||||
|
@ -79,8 +82,10 @@ func FilteredPaginate(
|
|||
|
||||
end := offset + limit
|
||||
|
||||
var numHits uint64
|
||||
var nextKey []byte
|
||||
var (
|
||||
numHits uint64
|
||||
nextKey []byte
|
||||
)
|
||||
|
||||
for ; iterator.Valid(); iterator.Next() {
|
||||
if iterator.Error() != nil {
|
||||
|
@ -113,3 +118,137 @@ func FilteredPaginate(
|
|||
|
||||
return res, nil
|
||||
}
|
||||
|
||||
// GenericFilteredPaginate does pagination of all the results in the PrefixStore based on the
|
||||
// provided PageRequest. `onResult` should be used to filter or transform the results.
|
||||
// `c` is a constructor function that needs to return a new instance of the type T (this is to
|
||||
// workaround some generic pitfalls in which we can't instantiate a T struct inside the function).
|
||||
// If key is provided, the pagination uses the optimized querying.
|
||||
// If offset is used, the pagination uses lazy filtering i.e., searches through all the records.
|
||||
// The resulting slice (of type F) can be of a different type than the one being iterated through
|
||||
// (type T), so it's possible to do any necessary transformation inside the onResult function.
|
||||
func GenericFilteredPaginate[T codec.ProtoMarshaler, F codec.ProtoMarshaler](
|
||||
cdc codec.BinaryCodec,
|
||||
prefixStore types.KVStore,
|
||||
pageRequest *PageRequest,
|
||||
onResult func(key []byte, value T) (F, error),
|
||||
constructor func() T,
|
||||
) ([]F, *PageResponse, error) {
|
||||
// if the PageRequest is nil, use default PageRequest
|
||||
if pageRequest == nil {
|
||||
pageRequest = &PageRequest{}
|
||||
}
|
||||
|
||||
offset := pageRequest.Offset
|
||||
key := pageRequest.Key
|
||||
limit := pageRequest.Limit
|
||||
countTotal := pageRequest.CountTotal
|
||||
reverse := pageRequest.Reverse
|
||||
results := []F{}
|
||||
|
||||
if offset > 0 && key != nil {
|
||||
return results, nil, fmt.Errorf("invalid request, either offset or key is expected, got both")
|
||||
}
|
||||
|
||||
if limit == 0 {
|
||||
limit = DefaultLimit
|
||||
|
||||
// count total results when the limit is zero/not supplied
|
||||
countTotal = true
|
||||
}
|
||||
|
||||
if len(key) != 0 {
|
||||
iterator := getIterator(prefixStore, key, reverse)
|
||||
defer iterator.Close()
|
||||
|
||||
var (
|
||||
numHits uint64
|
||||
nextKey []byte
|
||||
)
|
||||
|
||||
for ; iterator.Valid(); iterator.Next() {
|
||||
if numHits == limit {
|
||||
nextKey = iterator.Key()
|
||||
break
|
||||
}
|
||||
|
||||
if iterator.Error() != nil {
|
||||
return nil, nil, iterator.Error()
|
||||
}
|
||||
|
||||
protoMsg := constructor()
|
||||
|
||||
err := cdc.Unmarshal(iterator.Value(), protoMsg)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
val, err := onResult(iterator.Key(), protoMsg)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
if val.Size() != 0 {
|
||||
results = append(results, val)
|
||||
numHits++
|
||||
}
|
||||
}
|
||||
|
||||
return results, &PageResponse{
|
||||
NextKey: nextKey,
|
||||
}, nil
|
||||
}
|
||||
|
||||
iterator := getIterator(prefixStore, nil, reverse)
|
||||
defer iterator.Close()
|
||||
|
||||
end := offset + limit
|
||||
|
||||
var (
|
||||
numHits uint64
|
||||
nextKey []byte
|
||||
)
|
||||
|
||||
for ; iterator.Valid(); iterator.Next() {
|
||||
if iterator.Error() != nil {
|
||||
return nil, nil, iterator.Error()
|
||||
}
|
||||
|
||||
protoMsg := constructor()
|
||||
|
||||
err := cdc.Unmarshal(iterator.Value(), protoMsg)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
val, err := onResult(iterator.Key(), protoMsg)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
if val.Size() != 0 {
|
||||
// Previously this was the "accumulate" flag
|
||||
if numHits >= offset && numHits < end {
|
||||
results = append(results, val)
|
||||
}
|
||||
numHits++
|
||||
}
|
||||
|
||||
if numHits == end+1 {
|
||||
if nextKey == nil {
|
||||
nextKey = iterator.Key()
|
||||
}
|
||||
|
||||
if !countTotal {
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
res := &PageResponse{NextKey: nextKey}
|
||||
if countTotal {
|
||||
res.Total = numHits
|
||||
}
|
||||
|
||||
return results, res, nil
|
||||
}
|
||||
|
|
|
@ -6,9 +6,6 @@ import (
|
|||
"google.golang.org/grpc/codes"
|
||||
"google.golang.org/grpc/status"
|
||||
|
||||
proto "github.com/gogo/protobuf/proto"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/codec"
|
||||
codectypes "github.com/cosmos/cosmos-sdk/codec/types"
|
||||
"github.com/cosmos/cosmos-sdk/store/prefix"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
|
@ -35,10 +32,6 @@ func (k Keeper) Grants(c context.Context, req *authz.QueryGrantsRequest) (*authz
|
|||
}
|
||||
ctx := sdk.UnwrapSDKContext(c)
|
||||
|
||||
store := ctx.KVStore(k.storeKey)
|
||||
key := grantStoreKey(grantee, granter, "")
|
||||
authStore := prefix.NewStore(store, key)
|
||||
|
||||
if req.MsgTypeUrl != "" {
|
||||
authorization, expiration := k.GetCleanAuthorization(ctx, grantee, granter, req.MsgTypeUrl)
|
||||
if authorization == nil {
|
||||
|
@ -56,29 +49,26 @@ func (k Keeper) Grants(c context.Context, req *authz.QueryGrantsRequest) (*authz
|
|||
}, nil
|
||||
}
|
||||
|
||||
var authorizations []*authz.Grant
|
||||
pageRes, err := query.FilteredPaginate(authStore, req.Pagination, func(key []byte, value []byte, accumulate bool) (bool, error) {
|
||||
auth, err := unmarshalAuthorization(k.cdc, value)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
auth1 := auth.GetAuthorization()
|
||||
if accumulate {
|
||||
msg, ok := auth1.(proto.Message)
|
||||
if !ok {
|
||||
return false, status.Errorf(codes.Internal, "can't protomarshal %T", msg)
|
||||
}
|
||||
store := ctx.KVStore(k.storeKey)
|
||||
key := grantStoreKey(grantee, granter, "")
|
||||
grantsStore := prefix.NewStore(store, key)
|
||||
|
||||
authorizationAny, err := codectypes.NewAnyWithValue(msg)
|
||||
if err != nil {
|
||||
return false, status.Errorf(codes.Internal, err.Error())
|
||||
}
|
||||
authorizations = append(authorizations, &authz.Grant{
|
||||
Authorization: authorizationAny,
|
||||
Expiration: auth.Expiration,
|
||||
})
|
||||
authorizations, pageRes, err := query.GenericFilteredPaginate(k.cdc, grantsStore, req.Pagination, func(key []byte, auth *authz.Grant) (*authz.Grant, error) {
|
||||
auth1 := auth.GetAuthorization()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return true, nil
|
||||
|
||||
authorizationAny, err := codectypes.NewAnyWithValue(auth1)
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.Internal, err.Error())
|
||||
}
|
||||
return &authz.Grant{
|
||||
Authorization: authorizationAny,
|
||||
Expiration: auth.Expiration,
|
||||
}, nil
|
||||
}, func() *authz.Grant {
|
||||
return &authz.Grant{}
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
@ -105,32 +95,29 @@ func (k Keeper) GranterGrants(c context.Context, req *authz.QueryGranterGrantsRe
|
|||
store := ctx.KVStore(k.storeKey)
|
||||
authzStore := prefix.NewStore(store, grantStoreKey(nil, granter, ""))
|
||||
|
||||
var grants []*authz.GrantAuthorization
|
||||
pageRes, err := query.FilteredPaginate(authzStore, req.Pagination, func(key []byte, value []byte,
|
||||
accumulate bool,
|
||||
) (bool, error) {
|
||||
auth, err := unmarshalAuthorization(k.cdc, value)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
||||
grants, pageRes, err := query.GenericFilteredPaginate(k.cdc, authzStore, req.Pagination, func(key []byte, auth *authz.Grant) (*authz.GrantAuthorization, error) {
|
||||
auth1 := auth.GetAuthorization()
|
||||
if accumulate {
|
||||
any, err := codectypes.NewAnyWithValue(auth1)
|
||||
if err != nil {
|
||||
return false, status.Errorf(codes.Internal, err.Error())
|
||||
}
|
||||
|
||||
grantee := firstAddressFromGrantStoreKey(key)
|
||||
grants = append(grants, &authz.GrantAuthorization{
|
||||
Granter: granter.String(),
|
||||
Grantee: grantee.String(),
|
||||
Authorization: any,
|
||||
Expiration: auth.Expiration,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return true, nil
|
||||
|
||||
any, err := codectypes.NewAnyWithValue(auth1)
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.Internal, err.Error())
|
||||
}
|
||||
|
||||
grantee := firstAddressFromGrantStoreKey(key)
|
||||
return &authz.GrantAuthorization{
|
||||
Granter: granter.String(),
|
||||
Grantee: grantee.String(),
|
||||
Authorization: any,
|
||||
Expiration: auth.Expiration,
|
||||
}, nil
|
||||
|
||||
}, func() *authz.Grant {
|
||||
return &authz.Grant{}
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@ -155,35 +142,30 @@ func (k Keeper) GranteeGrants(c context.Context, req *authz.QueryGranteeGrantsRe
|
|||
ctx := sdk.UnwrapSDKContext(c)
|
||||
store := prefix.NewStore(ctx.KVStore(k.storeKey), GrantKey)
|
||||
|
||||
var authorizations []*authz.GrantAuthorization
|
||||
pageRes, err := query.FilteredPaginate(store, req.Pagination, func(key []byte, value []byte,
|
||||
accumulate bool,
|
||||
) (bool, error) {
|
||||
auth, err := unmarshalAuthorization(k.cdc, value)
|
||||
authorizations, pageRes, err := query.GenericFilteredPaginate(k.cdc, store, req.Pagination, func(key []byte, auth *authz.Grant) (*authz.GrantAuthorization, error) {
|
||||
auth1 := auth.GetAuthorization()
|
||||
if err != nil {
|
||||
return false, err
|
||||
return nil, err
|
||||
}
|
||||
|
||||
granter, g := addressesFromGrantStoreKey(append(GrantKey, key...))
|
||||
if !g.Equals(grantee) {
|
||||
return false, nil
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
auth1 := auth.GetAuthorization()
|
||||
if accumulate {
|
||||
any, err := codectypes.NewAnyWithValue(auth1)
|
||||
if err != nil {
|
||||
return false, status.Errorf(codes.Internal, err.Error())
|
||||
}
|
||||
|
||||
authorizations = append(authorizations, &authz.GrantAuthorization{
|
||||
Authorization: any,
|
||||
Expiration: auth.Expiration,
|
||||
Granter: granter.String(),
|
||||
Grantee: grantee.String(),
|
||||
})
|
||||
authorizationAny, err := codectypes.NewAnyWithValue(auth1)
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.Internal, err.Error())
|
||||
}
|
||||
return true, nil
|
||||
|
||||
return &authz.GrantAuthorization{
|
||||
Authorization: authorizationAny,
|
||||
Expiration: auth.Expiration,
|
||||
Granter: granter.String(),
|
||||
Grantee: grantee.String(),
|
||||
}, nil
|
||||
}, func() *authz.Grant {
|
||||
return &authz.Grant{}
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
@ -194,9 +176,3 @@ func (k Keeper) GranteeGrants(c context.Context, req *authz.QueryGranteeGrantsRe
|
|||
Pagination: pageRes,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// unmarshal an authorization from a store value
|
||||
func unmarshalAuthorization(cdc codec.BinaryCodec, value []byte) (v authz.Grant, err error) {
|
||||
err = cdc.Unmarshal(value, &v)
|
||||
return v, err
|
||||
}
|
||||
|
|
|
@ -214,7 +214,8 @@ func (suite *TestSuite) TestGRPCQueryGranterGrants() {
|
|||
},
|
||||
{
|
||||
"valid case, pagination",
|
||||
func() {},
|
||||
func() {
|
||||
},
|
||||
false,
|
||||
authz.QueryGranterGrantsRequest{
|
||||
Granter: addrs[0].String(),
|
||||
|
@ -273,6 +274,15 @@ func (suite *TestSuite) TestGRPCQueryGranteeGrants() {
|
|||
},
|
||||
1,
|
||||
},
|
||||
{
|
||||
"valid case, no authorization found",
|
||||
func() {},
|
||||
false,
|
||||
authz.QueryGranteeGrantsRequest{
|
||||
Grantee: addrs[2].String(),
|
||||
},
|
||||
0,
|
||||
},
|
||||
{
|
||||
"valid case, multiple authorization",
|
||||
func() {
|
||||
|
|
Loading…
Reference in New Issue