Merge cosmos-sdk master
This commit is contained in:
+10
-4
@@ -12,7 +12,9 @@ import (
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/codec/legacy"
|
||||
cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
|
||||
"github.com/cosmos/cosmos-sdk/types/address"
|
||||
"github.com/cosmos/cosmos-sdk/types/bech32"
|
||||
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
|
||||
)
|
||||
|
||||
const (
|
||||
@@ -28,8 +30,6 @@ const (
|
||||
// config.SetFullFundraiserPath(yourFullFundraiserPath)
|
||||
// config.Seal()
|
||||
|
||||
// AddrLen defines a valid address length
|
||||
AddrLen = 20
|
||||
// Bech32MainPrefix defines the main SDK Bech32 prefix of an account's address
|
||||
Bech32MainPrefix = "cosmos"
|
||||
|
||||
@@ -110,9 +110,15 @@ func VerifyAddressFormat(bz []byte) error {
|
||||
if verifier != nil {
|
||||
return verifier(bz)
|
||||
}
|
||||
if len(bz) != AddrLen {
|
||||
return fmt.Errorf("incorrect address length (expected: %d, actual: %d)", AddrLen, len(bz))
|
||||
|
||||
if len(bz) == 0 {
|
||||
return sdkerrors.Wrap(sdkerrors.ErrUnknownAddress, "addresses cannot be empty")
|
||||
}
|
||||
|
||||
if len(bz) > address.MaxAddrLen {
|
||||
return sdkerrors.Wrapf(sdkerrors.ErrUnknownAddress, "address max length is %d, got %d", address.MaxAddrLen, len(bz))
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
package address
|
||||
|
||||
import (
|
||||
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
|
||||
)
|
||||
|
||||
// MaxAddrLen is the maximum allowed length (in bytes) for an address.
|
||||
const MaxAddrLen = 255
|
||||
|
||||
// LengthPrefix prefixes the address bytes with its length, this is used
|
||||
// for example for variable-length components in store keys.
|
||||
func LengthPrefix(bz []byte) ([]byte, error) {
|
||||
bzLen := len(bz)
|
||||
if bzLen == 0 {
|
||||
return bz, nil
|
||||
}
|
||||
|
||||
if bzLen > MaxAddrLen {
|
||||
return nil, sdkerrors.Wrapf(sdkerrors.ErrUnknownAddress, "address length should be max %d bytes, got %d", MaxAddrLen, bzLen)
|
||||
}
|
||||
|
||||
return append([]byte{byte(bzLen)}, bz...), nil
|
||||
}
|
||||
|
||||
// MustLengthPrefix is LengthPrefix with panic on error.
|
||||
func MustLengthPrefix(bz []byte) []byte {
|
||||
res, err := LengthPrefix(bz)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
return res
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
package address_test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/types/address"
|
||||
)
|
||||
|
||||
func TestLengthPrefixedAddressStoreKey(t *testing.T) {
|
||||
addr10byte := []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
|
||||
addr20byte := []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19}
|
||||
addr256byte := make([]byte, 256)
|
||||
|
||||
tests := []struct {
|
||||
name string
|
||||
addr []byte
|
||||
expStoreKey []byte
|
||||
expErr bool
|
||||
}{
|
||||
{"10-byte address", addr10byte, append([]byte{byte(10)}, addr10byte...), false},
|
||||
{"20-byte address", addr20byte, append([]byte{byte(20)}, addr20byte...), false},
|
||||
{"256-byte address (too long)", addr256byte, nil, true},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
tt := tt
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
storeKey, err := address.LengthPrefix(tt.addr)
|
||||
if tt.expErr {
|
||||
require.Error(t, err)
|
||||
} else {
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, tt.expStoreKey, storeKey)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -12,6 +12,7 @@ import (
|
||||
)
|
||||
|
||||
func BenchmarkBech32ifyPubKey(b *testing.B) {
|
||||
b.ReportAllocs()
|
||||
pkBz := make([]byte, ed25519.PubKeySize)
|
||||
pk := &ed25519.PubKey{Key: pkBz}
|
||||
rng := rand.New(rand.NewSource(time.Now().Unix()))
|
||||
@@ -29,6 +30,7 @@ func BenchmarkBech32ifyPubKey(b *testing.B) {
|
||||
}
|
||||
|
||||
func BenchmarkGetPubKeyFromBech32(b *testing.B) {
|
||||
b.ReportAllocs()
|
||||
pkBz := make([]byte, ed25519.PubKeySize)
|
||||
pk := &ed25519.PubKey{Key: pkBz}
|
||||
rng := rand.New(rand.NewSource(time.Now().Unix()))
|
||||
|
||||
+24
-16
@@ -347,15 +347,18 @@ func (s *addressTestSuite) TestVerifyAddressFormat() {
|
||||
addr5 := make([]byte, 5)
|
||||
addr20 := make([]byte, 20)
|
||||
addr32 := make([]byte, 32)
|
||||
addr256 := make([]byte, 256)
|
||||
|
||||
err := types.VerifyAddressFormat(addr0)
|
||||
s.Require().EqualError(err, "incorrect address length 0")
|
||||
s.Require().EqualError(err, "addresses cannot be empty: unknown address")
|
||||
err = types.VerifyAddressFormat(addr5)
|
||||
s.Require().EqualError(err, "incorrect address length 5")
|
||||
s.Require().NoError(err)
|
||||
err = types.VerifyAddressFormat(addr20)
|
||||
s.Require().Nil(err)
|
||||
s.Require().NoError(err)
|
||||
err = types.VerifyAddressFormat(addr32)
|
||||
s.Require().EqualError(err, "incorrect address length 32")
|
||||
s.Require().NoError(err)
|
||||
err = types.VerifyAddressFormat(addr256)
|
||||
s.Require().EqualError(err, "address max length is 255, got 256: unknown address")
|
||||
}
|
||||
|
||||
func (s *addressTestSuite) TestCustomAddressVerifier() {
|
||||
@@ -364,34 +367,39 @@ func (s *addressTestSuite) TestCustomAddressVerifier() {
|
||||
accBech := types.AccAddress(addr).String()
|
||||
valBech := types.ValAddress(addr).String()
|
||||
consBech := types.ConsAddress(addr).String()
|
||||
// Verifiy that the default logic rejects this 10 byte address
|
||||
// Verify that the default logic doesn't reject this 10 byte address
|
||||
// The default verifier is nil, we're only checking address length is
|
||||
// between 1-255 bytes.
|
||||
err := types.VerifyAddressFormat(addr)
|
||||
s.Require().NotNil(err)
|
||||
s.Require().Nil(err)
|
||||
_, err = types.AccAddressFromBech32(accBech)
|
||||
s.Require().NotNil(err)
|
||||
s.Require().Nil(err)
|
||||
_, err = types.ValAddressFromBech32(valBech)
|
||||
s.Require().NotNil(err)
|
||||
s.Require().Nil(err)
|
||||
_, err = types.ConsAddressFromBech32(consBech)
|
||||
s.Require().NotNil(err)
|
||||
s.Require().Nil(err)
|
||||
|
||||
// Set a custom address verifier that accepts 10 or 20 byte addresses
|
||||
// Set a custom address verifier only accepts 20 byte addresses
|
||||
types.GetConfig().SetAddressVerifier(func(bz []byte) error {
|
||||
n := len(bz)
|
||||
if n == 10 || n == types.AddrLen {
|
||||
if n == 20 {
|
||||
return nil
|
||||
}
|
||||
return fmt.Errorf("incorrect address length %d", n)
|
||||
})
|
||||
|
||||
// Verifiy that the custom logic accepts this 10 byte address
|
||||
// Verifiy that the custom logic rejects this 10 byte address
|
||||
err = types.VerifyAddressFormat(addr)
|
||||
s.Require().Nil(err)
|
||||
s.Require().NotNil(err)
|
||||
_, err = types.AccAddressFromBech32(accBech)
|
||||
s.Require().Nil(err)
|
||||
s.Require().NotNil(err)
|
||||
_, err = types.ValAddressFromBech32(valBech)
|
||||
s.Require().Nil(err)
|
||||
s.Require().NotNil(err)
|
||||
_, err = types.ConsAddressFromBech32(consBech)
|
||||
s.Require().Nil(err)
|
||||
s.Require().NotNil(err)
|
||||
|
||||
// Reinitialize the global config to default address verifier (nil)
|
||||
types.GetConfig().SetAddressVerifier(nil)
|
||||
}
|
||||
|
||||
func (s *addressTestSuite) TestBech32ifyAddressBytes() {
|
||||
|
||||
@@ -6,10 +6,11 @@ import (
|
||||
)
|
||||
|
||||
func coinName(suffix int) string {
|
||||
return fmt.Sprintf("COINZ_%d", suffix)
|
||||
return fmt.Sprintf("coinz%d", suffix)
|
||||
}
|
||||
|
||||
func BenchmarkCoinsAdditionIntersect(b *testing.B) {
|
||||
b.ReportAllocs()
|
||||
benchmarkingFunc := func(numCoinsA int, numCoinsB int) func(b *testing.B) {
|
||||
return func(b *testing.B) {
|
||||
coinsA := Coins(make([]Coin, numCoinsA))
|
||||
@@ -39,6 +40,7 @@ func BenchmarkCoinsAdditionIntersect(b *testing.B) {
|
||||
}
|
||||
|
||||
func BenchmarkCoinsAdditionNoIntersect(b *testing.B) {
|
||||
b.ReportAllocs()
|
||||
benchmarkingFunc := func(numCoinsA int, numCoinsB int) func(b *testing.B) {
|
||||
return func(b *testing.B) {
|
||||
coinsA := Coins(make([]Coin, numCoinsA))
|
||||
|
||||
@@ -487,6 +487,7 @@ func (s *decimalTestSuite) TestOperationOrders() {
|
||||
}
|
||||
|
||||
func BenchmarkMarshalTo(b *testing.B) {
|
||||
b.ReportAllocs()
|
||||
bis := []struct {
|
||||
in sdk.Dec
|
||||
want []byte
|
||||
|
||||
@@ -6,6 +6,7 @@ import (
|
||||
"github.com/cosmos/cosmos-sdk/codec"
|
||||
"github.com/cosmos/cosmos-sdk/store/prefix"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
"github.com/cosmos/cosmos-sdk/types/address"
|
||||
"github.com/cosmos/cosmos-sdk/types/query"
|
||||
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
|
||||
"github.com/cosmos/cosmos-sdk/x/bank/types"
|
||||
@@ -111,7 +112,7 @@ func ExampleFilteredPaginate() {
|
||||
pageReq := &query.PageRequest{Key: nil, Limit: 1, CountTotal: true}
|
||||
store := ctx.KVStore(app.GetKey(authtypes.StoreKey))
|
||||
balancesStore := prefix.NewStore(store, types.BalancesPrefix)
|
||||
accountStore := prefix.NewStore(balancesStore, addr1.Bytes())
|
||||
accountStore := prefix.NewStore(balancesStore, address.MustLengthPrefix(addr1))
|
||||
|
||||
var balResult sdk.Coins
|
||||
pageRes, err := query.FilteredPaginate(accountStore, pageReq, func(key []byte, value []byte, accumulate bool) (bool, error) {
|
||||
@@ -143,7 +144,7 @@ func ExampleFilteredPaginate() {
|
||||
|
||||
func execFilterPaginate(store sdk.KVStore, pageReq *query.PageRequest, appCodec codec.Marshaler) (balances sdk.Coins, res *query.PageResponse, err error) {
|
||||
balancesStore := prefix.NewStore(store, types.BalancesPrefix)
|
||||
accountStore := prefix.NewStore(balancesStore, addr1.Bytes())
|
||||
accountStore := prefix.NewStore(balancesStore, address.MustLengthPrefix(addr1))
|
||||
|
||||
var balResult sdk.Coins
|
||||
res, err = query.FilteredPaginate(accountStore, pageReq, func(key []byte, value []byte, accumulate bool) (bool, error) {
|
||||
|
||||
@@ -17,6 +17,7 @@ import (
|
||||
"github.com/cosmos/cosmos-sdk/store"
|
||||
"github.com/cosmos/cosmos-sdk/store/prefix"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
"github.com/cosmos/cosmos-sdk/types/address"
|
||||
"github.com/cosmos/cosmos-sdk/types/query"
|
||||
authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper"
|
||||
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
|
||||
@@ -193,7 +194,7 @@ func ExamplePaginate() {
|
||||
balResult := sdk.NewCoins()
|
||||
authStore := ctx.KVStore(app.GetKey(authtypes.StoreKey))
|
||||
balancesStore := prefix.NewStore(authStore, types.BalancesPrefix)
|
||||
accountStore := prefix.NewStore(balancesStore, addr1.Bytes())
|
||||
accountStore := prefix.NewStore(balancesStore, address.MustLengthPrefix(addr1))
|
||||
pageRes, err := query.Paginate(accountStore, request.Pagination, func(key []byte, value []byte) error {
|
||||
var tempRes sdk.Coin
|
||||
err := app.AppCodec().UnmarshalBinaryBare(value, &tempRes)
|
||||
|
||||
Reference in New Issue
Block a user