Skip to content

Commit

Permalink
Merge PR #2601: Bech32 Empty Addresses
Browse files Browse the repository at this point in the history
  • Loading branch information
sunnya97 authored and cwgoes committed Feb 8, 2019
1 parent fd5e7b9 commit da0426a
Show file tree
Hide file tree
Showing 8 changed files with 84 additions and 22 deletions.
2 changes: 2 additions & 0 deletions PENDING.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ BREAKING CHANGES
* [\#3522](https://github.com/cosmos/cosmos-sdk/pull/3522) Get rid of double negatives: Coins.IsNotNegative() -> Coins.IsAnyNegative().
* \#3561 Don't unnecessarily store denominations in staking


* Tendermint


Expand All @@ -59,6 +60,7 @@ FEATURES
* [\#3477][distribution] new query endpoint "delegator_validators"
* [\#3514](https://github.com/cosmos/cosmos-sdk/pull/3514) Provided a lazy loading implementation of Keybase that locks the underlying
storage only for the time needed to perform the required operation. Also added Keybase reference to TxBuilder struct.
* [types] [\#2580](https://github.com/cosmos/cosmos-sdk/issues/2580) Addresses now Bech32 empty addresses to an empty string

* Tendermint

Expand Down
43 changes: 43 additions & 0 deletions types/address.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"encoding/json"
"errors"
"fmt"
"strings"

"github.com/tendermint/tendermint/crypto"
"github.com/tendermint/tendermint/crypto/encoding/amino"
Expand Down Expand Up @@ -71,12 +72,21 @@ 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
}

bech32PrefixAccAddr := GetConfig().GetBech32AccountAddrPrefix()

bz, err := GetFromBech32(address, bech32PrefixAccAddr)
if err != nil {
return nil, err
}

if len(bz) != AddrLen {
return nil, errors.New("Incorrect address length")
}

return AccAddress(bz), nil
}

Expand Down Expand Up @@ -141,7 +151,12 @@ func (aa AccAddress) Bytes() []byte {

// String implements the Stringer interface.
func (aa AccAddress) String() string {
if aa.Empty() {
return ""
}

bech32PrefixAccAddr := GetConfig().GetBech32AccountAddrPrefix()

bech32Addr, err := bech32.ConvertAndEncode(bech32PrefixAccAddr, aa.Bytes())
if err != nil {
panic(err)
Expand Down Expand Up @@ -187,12 +202,21 @@ 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
}

bech32PrefixValAddr := GetConfig().GetBech32ValidatorAddrPrefix()

bz, err := GetFromBech32(address, bech32PrefixValAddr)
if err != nil {
return nil, err
}

if len(bz) != AddrLen {
return nil, errors.New("Incorrect address length")
}

return ValAddress(bz), nil
}

Expand Down Expand Up @@ -258,7 +282,12 @@ func (va ValAddress) Bytes() []byte {

// String implements the Stringer interface.
func (va ValAddress) String() string {
if va.Empty() {
return ""
}

bech32PrefixValAddr := GetConfig().GetBech32ValidatorAddrPrefix()

bech32Addr, err := bech32.ConvertAndEncode(bech32PrefixValAddr, va.Bytes())
if err != nil {
panic(err)
Expand Down Expand Up @@ -304,12 +333,21 @@ 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
}

bech32PrefixConsAddr := GetConfig().GetBech32ConsensusAddrPrefix()

bz, err := GetFromBech32(address, bech32PrefixConsAddr)
if err != nil {
return nil, err
}

if len(bz) != AddrLen {
return nil, errors.New("Incorrect address length")
}

return ConsAddress(bz), nil
}

Expand Down Expand Up @@ -380,7 +418,12 @@ func (ca ConsAddress) Bytes() []byte {

// String implements the Stringer interface.
func (ca ConsAddress) String() string {
if ca.Empty() {
return ""
}

bech32PrefixConsAddr := GetConfig().GetBech32ConsensusAddrPrefix()

bech32Addr, err := bech32.ConvertAndEncode(bech32PrefixConsAddr, ca.Bytes())
if err != nil {
panic(err)
Expand Down
21 changes: 19 additions & 2 deletions types/address_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import (
)

var invalidStrs = []string{
"",
"hello, world!",
"0xAA",
"AAA",
Expand All @@ -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

Expand Down Expand Up @@ -200,7 +217,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"))

Expand Down
10 changes: 5 additions & 5 deletions x/distribution/types/msg.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions x/gov/msgs.go
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down Expand Up @@ -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 {
Expand Down
2 changes: 1 addition & 1 deletion x/slashing/msg.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions x/staking/keeper/query_utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -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())
Expand Down
20 changes: 10 additions & 10 deletions x/staking/types/msg.go
Original file line number Diff line number Diff line change
Expand Up @@ -123,10 +123,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()) {
Expand Down Expand Up @@ -186,7 +186,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")
}

Expand Down Expand Up @@ -237,10 +237,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()) {
Expand Down Expand Up @@ -285,13 +285,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()) {
Expand Down Expand Up @@ -328,10 +328,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()) {
Expand Down

0 comments on commit da0426a

Please sign in to comment.