From 272088324814b737c4c0c155b1f9ab75a19b4f80 Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Fri, 26 Oct 2018 00:10:07 -0700 Subject: [PATCH 1/5] empty addresses --- types/address.go | 25 +++++++++++++++++++++++++ types/address_test.go | 19 ++++++++++++++++++- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/types/address.go b/types/address.go index ae13b2ad0afc..23a75c521943 100644 --- a/types/address.go +++ b/types/address.go @@ -6,6 +6,7 @@ import ( "encoding/json" "errors" "fmt" + "strings" "github.com/tendermint/tendermint/crypto" "github.com/tendermint/tendermint/crypto/encoding/amino" @@ -55,6 +56,10 @@ func AccAddressFromHex(address string) (addr AccAddress, err error) { // AccAddressFromBech32 creates an AccAddress from a Bech32 string. func AccAddressFromBech32(address string) (addr AccAddress, err error) { + if len(strings.TrimSpace(address)) == 0 { + return AccAddress{}, nil + } + bz, err := GetFromBech32(address, Bech32PrefixAccAddr) if err != nil { return nil, err @@ -124,6 +129,10 @@ func (aa AccAddress) Bytes() []byte { // String implements the Stringer interface. func (aa AccAddress) String() string { + if aa.Empty() { + return "" + } + bech32Addr, err := bech32.ConvertAndEncode(Bech32PrefixAccAddr, aa.Bytes()) if err != nil { panic(err) @@ -169,6 +178,10 @@ func ValAddressFromHex(address string) (addr ValAddress, err error) { // ValAddressFromBech32 creates a ValAddress from a Bech32 string. func ValAddressFromBech32(address string) (addr ValAddress, err error) { + if len(strings.TrimSpace(address)) == 0 { + return ValAddress{}, nil + } + bz, err := GetFromBech32(address, Bech32PrefixValAddr) if err != nil { return nil, err @@ -239,6 +252,10 @@ func (va ValAddress) Bytes() []byte { // String implements the Stringer interface. func (va ValAddress) String() string { + if va.Empty() { + return "" + } + bech32Addr, err := bech32.ConvertAndEncode(Bech32PrefixValAddr, va.Bytes()) if err != nil { panic(err) @@ -284,6 +301,10 @@ func ConsAddressFromHex(address string) (addr ConsAddress, err error) { // ConsAddressFromBech32 creates a ConsAddress from a Bech32 string. func ConsAddressFromBech32(address string) (addr ConsAddress, err error) { + if len(strings.TrimSpace(address)) == 0 { + return ConsAddress{}, nil + } + bz, err := GetFromBech32(address, Bech32PrefixConsAddr) if err != nil { return nil, err @@ -359,6 +380,10 @@ func (ca ConsAddress) Bytes() []byte { // String implements the Stringer interface. func (ca ConsAddress) String() string { + if ca.Empty() { + return "" + } + bech32Addr, err := bech32.ConvertAndEncode(Bech32PrefixConsAddr, ca.Bytes()) if err != nil { panic(err) diff --git a/types/address_test.go b/types/address_test.go index e2ec36876cd5..300163a82cf5 100644 --- a/types/address_test.go +++ b/types/address_test.go @@ -13,7 +13,6 @@ import ( ) var invalidStrs = []string{ - "", "hello, world!", "0xAA", "AAA", @@ -33,6 +32,24 @@ func testMarshal(t *testing.T, original interface{}, res interface{}, marshal fu require.Equal(t, original, res) } +func TestEmptyAddresses(t *testing.T) { + require.Equal(t, (types.AccAddress{}).String(), "") + require.Equal(t, (types.ValAddress{}).String(), "") + require.Equal(t, (types.ConsAddress{}).String(), "") + + accAddr, err := types.AccAddressFromBech32("") + require.True(t, accAddr.Empty()) + require.Nil(t, err) + + valAddr, err := types.ValAddressFromBech32("") + require.True(t, valAddr.Empty()) + require.Nil(t, err) + + consAddr, err := types.ConsAddressFromBech32("") + require.True(t, consAddr.Empty()) + require.Nil(t, err) +} + func TestRandBech32PubkeyConsistency(t *testing.T) { var pub ed25519.PubKeyEd25519 From bdce0195a3bf194241010fc23ac6e39649524b65 Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Fri, 26 Oct 2018 17:05:52 -0700 Subject: [PATCH 2/5] PENDING --- PENDING.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/PENDING.md b/PENDING.md index f315af561e7e..b8953265d485 100644 --- a/PENDING.md +++ b/PENDING.md @@ -10,6 +10,7 @@ BREAKING CHANGES * SDK + * Tendermint @@ -22,6 +23,7 @@ FEATURES * Gaia * SDK + * [types] [\#2580](https://github.com/cosmos/cosmos-sdk/issues/2580) Addresses now Bech32 empty addresses to an empty string * Tendermint From 203908060e540b8127aa2e4a75183985a0b284ce Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Thu, 15 Nov 2018 16:20:28 -0800 Subject: [PATCH 3/5] fixed addr len --- types/address.go | 12 +++++++++++ types/address_test.go | 50 +++++++++++++++++++++---------------------- 2 files changed, 36 insertions(+), 26 deletions(-) diff --git a/types/address.go b/types/address.go index 6866b20e26ea..194a578f1bce 100644 --- a/types/address.go +++ b/types/address.go @@ -65,6 +65,10 @@ func AccAddressFromBech32(address string) (addr AccAddress, err error) { return nil, err } + if len(bz) != AddrLen { + return nil, errors.New("Incorrect address length") + } + return AccAddress(bz), nil } @@ -187,6 +191,10 @@ func ValAddressFromBech32(address string) (addr ValAddress, err error) { return nil, err } + if len(bz) != AddrLen { + return nil, errors.New("Incorrect address length") + } + return ValAddress(bz), nil } @@ -310,6 +318,10 @@ func ConsAddressFromBech32(address string) (addr ConsAddress, err error) { return nil, err } + if len(bz) != AddrLen { + return nil, errors.New("Incorrect address length") + } + return ConsAddress(bz), nil } diff --git a/types/address_test.go b/types/address_test.go index 64012a4e1242..b1ccffdc436d 100644 --- a/types/address_test.go +++ b/types/address_test.go @@ -210,31 +210,29 @@ func RandString(n int) string { func TestConfiguredPrefix(t *testing.T) { var pub ed25519.PubKeyEd25519 - for length := 1; length < 10; length++ { - for times := 1; times < 20; times++ { - rand.Read(pub[:]) - // Test if randomly generated prefix of a given length works - prefix := RandString(length) - // Assuming that GetConfig is not sealed. - config := types.GetConfig() - config.SetBech32PrefixForAccount(prefix+"acc", prefix+"pub") - acc := types.AccAddress(pub.Address()) - require.True(t, strings.HasPrefix(acc.String(), prefix+"acc")) - bech32Pub := types.MustBech32ifyAccPub(pub) - require.True(t, strings.HasPrefix(bech32Pub, prefix+"pub")) - - config.SetBech32PrefixForValidator(prefix+"valaddr", prefix+"valpub") - val := types.ValAddress(pub.Address()) - require.True(t, strings.HasPrefix(val.String(), prefix+"valaddr")) - bech32ValPub := types.MustBech32ifyValPub(pub) - require.True(t, strings.HasPrefix(bech32ValPub, prefix+"valpub")) - - config.SetBech32PrefixForConsensusNode(prefix+"consaddr", prefix+"conspub") - cons := types.ConsAddress(pub.Address()) - require.True(t, strings.HasPrefix(cons.String(), prefix+"consaddr")) - bech32ConsPub := types.MustBech32ifyConsPub(pub) - require.True(t, strings.HasPrefix(bech32ConsPub, prefix+"conspub")) - } - + for times := 1; times < 20; times++ { + rand.Read(pub[:]) + // Test if randomly generated prefix of a given length works + prefix := RandString(types.AddrLen) + // Assuming that GetConfig is not sealed. + config := types.GetConfig() + config.SetBech32PrefixForAccount(prefix+"acc", prefix+"pub") + acc := types.AccAddress(pub.Address()) + require.True(t, strings.HasPrefix(acc.String(), prefix+"acc")) + bech32Pub := types.MustBech32ifyAccPub(pub) + require.True(t, strings.HasPrefix(bech32Pub, prefix+"pub")) + + config.SetBech32PrefixForValidator(prefix+"valaddr", prefix+"valpub") + val := types.ValAddress(pub.Address()) + require.True(t, strings.HasPrefix(val.String(), prefix+"valaddr")) + bech32ValPub := types.MustBech32ifyValPub(pub) + require.True(t, strings.HasPrefix(bech32ValPub, prefix+"valpub")) + + config.SetBech32PrefixForConsensusNode(prefix+"consaddr", prefix+"conspub") + cons := types.ConsAddress(pub.Address()) + require.True(t, strings.HasPrefix(cons.String(), prefix+"consaddr")) + bech32ConsPub := types.MustBech32ifyConsPub(pub) + require.True(t, strings.HasPrefix(bech32ConsPub, prefix+"conspub")) } + } From 0090817dd4cae7d13d7bf9b1df1dc9db4956a17b Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Fri, 16 Nov 2018 15:28:08 -0800 Subject: [PATCH 4/5] asdf --- types/address_test.go | 50 ++++++++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/types/address_test.go b/types/address_test.go index b1ccffdc436d..64012a4e1242 100644 --- a/types/address_test.go +++ b/types/address_test.go @@ -210,29 +210,31 @@ func RandString(n int) string { func TestConfiguredPrefix(t *testing.T) { var pub ed25519.PubKeyEd25519 - for times := 1; times < 20; times++ { - rand.Read(pub[:]) - // Test if randomly generated prefix of a given length works - prefix := RandString(types.AddrLen) - // Assuming that GetConfig is not sealed. - config := types.GetConfig() - config.SetBech32PrefixForAccount(prefix+"acc", prefix+"pub") - acc := types.AccAddress(pub.Address()) - require.True(t, strings.HasPrefix(acc.String(), prefix+"acc")) - bech32Pub := types.MustBech32ifyAccPub(pub) - require.True(t, strings.HasPrefix(bech32Pub, prefix+"pub")) - - config.SetBech32PrefixForValidator(prefix+"valaddr", prefix+"valpub") - val := types.ValAddress(pub.Address()) - require.True(t, strings.HasPrefix(val.String(), prefix+"valaddr")) - bech32ValPub := types.MustBech32ifyValPub(pub) - require.True(t, strings.HasPrefix(bech32ValPub, prefix+"valpub")) - - config.SetBech32PrefixForConsensusNode(prefix+"consaddr", prefix+"conspub") - cons := types.ConsAddress(pub.Address()) - require.True(t, strings.HasPrefix(cons.String(), prefix+"consaddr")) - bech32ConsPub := types.MustBech32ifyConsPub(pub) - require.True(t, strings.HasPrefix(bech32ConsPub, prefix+"conspub")) - } + for length := 1; length < 10; length++ { + for times := 1; times < 20; times++ { + rand.Read(pub[:]) + // Test if randomly generated prefix of a given length works + prefix := RandString(length) + // Assuming that GetConfig is not sealed. + config := types.GetConfig() + config.SetBech32PrefixForAccount(prefix+"acc", prefix+"pub") + acc := types.AccAddress(pub.Address()) + require.True(t, strings.HasPrefix(acc.String(), prefix+"acc")) + bech32Pub := types.MustBech32ifyAccPub(pub) + require.True(t, strings.HasPrefix(bech32Pub, prefix+"pub")) + + config.SetBech32PrefixForValidator(prefix+"valaddr", prefix+"valpub") + val := types.ValAddress(pub.Address()) + require.True(t, strings.HasPrefix(val.String(), prefix+"valaddr")) + bech32ValPub := types.MustBech32ifyValPub(pub) + require.True(t, strings.HasPrefix(bech32ValPub, prefix+"valpub")) + + config.SetBech32PrefixForConsensusNode(prefix+"consaddr", prefix+"conspub") + cons := types.ConsAddress(pub.Address()) + require.True(t, strings.HasPrefix(cons.String(), prefix+"consaddr")) + bech32ConsPub := types.MustBech32ifyConsPub(pub) + require.True(t, strings.HasPrefix(bech32ConsPub, prefix+"conspub")) + } + } } From 7cdcc7aba6533641a26f8275a6dd1cbcabc205ce Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Fri, 8 Feb 2019 14:38:58 -0800 Subject: [PATCH 5/5] works? --- types/address.go | 24 ++++++++++++++++++------ types/address_test.go | 2 +- x/distribution/types/msg.go | 10 +++++----- x/gov/msgs.go | 4 ++-- x/slashing/msg.go | 2 +- x/slashing/params.go | 8 ++++---- x/staking/keeper/query_utils.go | 4 ++-- x/staking/types/msg.go | 20 ++++++++++---------- 8 files changed, 43 insertions(+), 31 deletions(-) diff --git a/types/address.go b/types/address.go index 234a3778ebd9..748e978f23e7 100644 --- a/types/address.go +++ b/types/address.go @@ -76,7 +76,9 @@ func AccAddressFromBech32(address string) (addr AccAddress, err error) { return AccAddress{}, nil } - bz, err := GetFromBech32(address, Bech32PrefixAccAddr) + bech32PrefixAccAddr := GetConfig().GetBech32AccountAddrPrefix() + + bz, err := GetFromBech32(address, bech32PrefixAccAddr) if err != nil { return nil, err } @@ -153,7 +155,9 @@ func (aa AccAddress) String() string { return "" } - bech32Addr, err := bech32.ConvertAndEncode(Bech32PrefixAccAddr, aa.Bytes()) + bech32PrefixAccAddr := GetConfig().GetBech32AccountAddrPrefix() + + bech32Addr, err := bech32.ConvertAndEncode(bech32PrefixAccAddr, aa.Bytes()) if err != nil { panic(err) } @@ -202,7 +206,9 @@ func ValAddressFromBech32(address string) (addr ValAddress, err error) { return ValAddress{}, nil } - bz, err := GetFromBech32(address, Bech32PrefixValAddr) + bech32PrefixValAddr := GetConfig().GetBech32ValidatorAddrPrefix() + + bz, err := GetFromBech32(address, bech32PrefixValAddr) if err != nil { return nil, err } @@ -280,7 +286,9 @@ func (va ValAddress) String() string { return "" } - bech32Addr, err := bech32.ConvertAndEncode(Bech32PrefixValAddr, va.Bytes()) + bech32PrefixValAddr := GetConfig().GetBech32ValidatorAddrPrefix() + + bech32Addr, err := bech32.ConvertAndEncode(bech32PrefixValAddr, va.Bytes()) if err != nil { panic(err) } @@ -329,7 +337,9 @@ func ConsAddressFromBech32(address string) (addr ConsAddress, err error) { return ConsAddress{}, nil } - bz, err := GetFromBech32(address, Bech32PrefixConsAddr) + bech32PrefixConsAddr := GetConfig().GetBech32ConsensusAddrPrefix() + + bz, err := GetFromBech32(address, bech32PrefixConsAddr) if err != nil { return nil, err } @@ -412,7 +422,9 @@ func (ca ConsAddress) String() string { return "" } - bech32Addr, err := bech32.ConvertAndEncode(Bech32PrefixConsAddr, ca.Bytes()) + bech32PrefixConsAddr := GetConfig().GetBech32ConsensusAddrPrefix() + + bech32Addr, err := bech32.ConvertAndEncode(bech32PrefixConsAddr, ca.Bytes()) if err != nil { panic(err) } diff --git a/types/address_test.go b/types/address_test.go index f2d144c1bca1..61e67642df27 100644 --- a/types/address_test.go +++ b/types/address_test.go @@ -219,7 +219,7 @@ func TestConfiguredPrefix(t *testing.T) { config := types.GetConfig() config.SetBech32PrefixForAccount(prefix+"acc", prefix+"pub") acc := types.AccAddress(pub.Address()) - require.True(t, strings.HasPrefix(acc.String(), prefix+"acc")) + require.True(t, strings.HasPrefix(acc.String(), prefix+"acc"), acc.String()) bech32Pub := types.MustBech32ifyAccPub(pub) require.True(t, strings.HasPrefix(bech32Pub, prefix+"pub")) diff --git a/x/distribution/types/msg.go b/x/distribution/types/msg.go index 9c977ea91085..a6fb7d5181fe 100644 --- a/x/distribution/types/msg.go +++ b/x/distribution/types/msg.go @@ -40,10 +40,10 @@ func (msg MsgSetWithdrawAddress) GetSignBytes() []byte { // quick validity check func (msg MsgSetWithdrawAddress) ValidateBasic() sdk.Error { - if msg.DelegatorAddr == nil { + if msg.DelegatorAddr.Empty() { return ErrNilDelegatorAddr(DefaultCodespace) } - if msg.WithdrawAddr == nil { + if msg.WithdrawAddr.Empty() { return ErrNilWithdrawAddr(DefaultCodespace) } return nil @@ -78,10 +78,10 @@ func (msg MsgWithdrawDelegatorReward) GetSignBytes() []byte { // quick validity check func (msg MsgWithdrawDelegatorReward) ValidateBasic() sdk.Error { - if msg.DelegatorAddr == nil { + if msg.DelegatorAddr.Empty() { return ErrNilDelegatorAddr(DefaultCodespace) } - if msg.ValidatorAddr == nil { + if msg.ValidatorAddr.Empty() { return ErrNilValidatorAddr(DefaultCodespace) } return nil @@ -114,7 +114,7 @@ func (msg MsgWithdrawValidatorCommission) GetSignBytes() []byte { // quick validity check func (msg MsgWithdrawValidatorCommission) ValidateBasic() sdk.Error { - if msg.ValidatorAddr == nil { + if msg.ValidatorAddr.Empty() { return ErrNilValidatorAddr(DefaultCodespace) } return nil diff --git a/x/gov/msgs.go b/x/gov/msgs.go index ef671a48b9b9..78ad6f5ad7bb 100644 --- a/x/gov/msgs.go +++ b/x/gov/msgs.go @@ -59,7 +59,7 @@ func (msg MsgSubmitProposal) ValidateBasic() sdk.Error { if !validProposalType(msg.ProposalType) { return ErrInvalidProposalType(DefaultCodespace, msg.ProposalType) } - if len(msg.Proposer) == 0 { + if msg.Proposer.Empty() { return sdk.ErrInvalidAddress(msg.Proposer.String()) } if !msg.InitialDeposit.IsValid() { @@ -172,7 +172,7 @@ func (msg MsgVote) Type() string { return TypeMsgVote } // Implements Msg. func (msg MsgVote) ValidateBasic() sdk.Error { - if len(msg.Voter.Bytes()) == 0 { + if msg.Voter.Empty() { return sdk.ErrInvalidAddress(msg.Voter.String()) } if msg.ProposalID < 0 { diff --git a/x/slashing/msg.go b/x/slashing/msg.go index 551258627773..a108142f77ee 100644 --- a/x/slashing/msg.go +++ b/x/slashing/msg.go @@ -36,7 +36,7 @@ func (msg MsgUnjail) GetSignBytes() []byte { // quick validity check func (msg MsgUnjail) ValidateBasic() sdk.Error { - if msg.ValidatorAddr == nil { + if msg.ValidatorAddr.Empty() { return ErrBadValidatorAddr(DefaultCodespace) } return nil diff --git a/x/slashing/params.go b/x/slashing/params.go index 439de35ea201..5a4f18f1676f 100644 --- a/x/slashing/params.go +++ b/x/slashing/params.go @@ -18,10 +18,10 @@ const ( // The Double Sign Jail period ends at Max Time supported by Amino (Dec 31, 9999 - 23:59:59 GMT) var ( - DoubleSignJailEndTime = time.Unix(253402300799, 0) - DefaultMinSignedPerWindow sdk.Dec = sdk.NewDecWithPrec(5, 1) - DefaultSlashFractionDoubleSign sdk.Dec = sdk.NewDec(1).Quo(sdk.NewDec(20)) - DefaultSlashFractionDowntime sdk.Dec = sdk.NewDec(1).Quo(sdk.NewDec(100)) + DoubleSignJailEndTime = time.Unix(253402300799, 0) + DefaultMinSignedPerWindow = sdk.NewDecWithPrec(5, 1) + DefaultSlashFractionDoubleSign = sdk.NewDec(1).Quo(sdk.NewDec(20)) + DefaultSlashFractionDowntime = sdk.NewDec(1).Quo(sdk.NewDec(100)) ) // Parameter store keys diff --git a/x/staking/keeper/query_utils.go b/x/staking/keeper/query_utils.go index 9de7f627f491..5a13fbcd14fc 100644 --- a/x/staking/keeper/query_utils.go +++ b/x/staking/keeper/query_utils.go @@ -90,8 +90,8 @@ func (k Keeper) GetAllRedelegations(ctx sdk.Context, delegator sdk.AccAddress, s iterator := sdk.KVStorePrefixIterator(store, delegatorPrefixKey) // smallest to largest defer iterator.Close() - srcValFilter := !(srcValAddress.Empty() || srcValAddress == nil) - dstValFilter := !(dstValAddress.Empty() || dstValAddress == nil) + srcValFilter := !(srcValAddress.Empty()) + dstValFilter := !(dstValAddress.Empty()) for ; iterator.Valid(); iterator.Next() { redelegation := types.MustUnmarshalRED(k.cdc, iterator.Value()) diff --git a/x/staking/types/msg.go b/x/staking/types/msg.go index 2437d3ea3806..7fecc49f39f3 100644 --- a/x/staking/types/msg.go +++ b/x/staking/types/msg.go @@ -119,10 +119,10 @@ func (msg MsgCreateValidator) GetSignBytes() []byte { // quick validity check func (msg MsgCreateValidator) ValidateBasic() sdk.Error { // note that unmarshaling from bech32 ensures either empty or valid - if msg.DelegatorAddr == nil { + if msg.DelegatorAddr.Empty() { return ErrNilDelegatorAddr(DefaultCodespace) } - if msg.ValidatorAddr == nil { + if msg.ValidatorAddr.Empty() { return ErrNilValidatorAddr(DefaultCodespace) } if msg.Value.Amount.LTE(sdk.ZeroInt()) { @@ -174,7 +174,7 @@ func (msg MsgEditValidator) GetSignBytes() []byte { // quick validity check func (msg MsgEditValidator) ValidateBasic() sdk.Error { - if msg.ValidatorAddr == nil { + if msg.ValidatorAddr.Empty() { return sdk.NewError(DefaultCodespace, CodeInvalidInput, "nil validator address") } @@ -222,10 +222,10 @@ func (msg MsgDelegate) GetSignBytes() []byte { // quick validity check func (msg MsgDelegate) ValidateBasic() sdk.Error { - if msg.DelegatorAddr == nil { + if msg.DelegatorAddr.Empty() { return ErrNilDelegatorAddr(DefaultCodespace) } - if msg.ValidatorAddr == nil { + if msg.ValidatorAddr.Empty() { return ErrNilValidatorAddr(DefaultCodespace) } if msg.Value.Amount.LTE(sdk.ZeroInt()) { @@ -270,13 +270,13 @@ func (msg MsgBeginRedelegate) GetSignBytes() []byte { // quick validity check func (msg MsgBeginRedelegate) ValidateBasic() sdk.Error { - if msg.DelegatorAddr == nil { + if msg.DelegatorAddr.Empty() { return ErrNilDelegatorAddr(DefaultCodespace) } - if msg.ValidatorSrcAddr == nil { + if msg.ValidatorSrcAddr.Empty() { return ErrNilValidatorAddr(DefaultCodespace) } - if msg.ValidatorDstAddr == nil { + if msg.ValidatorDstAddr.Empty() { return ErrNilValidatorAddr(DefaultCodespace) } if msg.SharesAmount.LTE(sdk.ZeroDec()) { @@ -313,10 +313,10 @@ func (msg MsgUndelegate) GetSignBytes() []byte { // quick validity check func (msg MsgUndelegate) ValidateBasic() sdk.Error { - if msg.DelegatorAddr == nil { + if msg.DelegatorAddr.Empty() { return ErrNilDelegatorAddr(DefaultCodespace) } - if msg.ValidatorAddr == nil { + if msg.ValidatorAddr.Empty() { return ErrNilValidatorAddr(DefaultCodespace) } if msg.SharesAmount.LTE(sdk.ZeroDec()) {