Merge PR #2601: Bech32 Empty Addresses

This commit is contained in:
Sunny Aggarwal 2019-02-08 15:54:40 -08:00 committed by Christopher Goes
parent fd5e7b9b80
commit da0426a2dd
8 changed files with 84 additions and 22 deletions

View File

@ -35,6 +35,7 @@ BREAKING CHANGES
* [\#3522](https://github.com/cosmos/cosmos-sdk/pull/3522) Get rid of double negatives: Coins.IsNotNegative() -> Coins.IsAnyNegative(). * [\#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 * \#3561 Don't unnecessarily store denominations in staking
* Tendermint * Tendermint
@ -59,6 +60,7 @@ FEATURES
* [\#3477][distribution] new query endpoint "delegator_validators" * [\#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 * [\#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. 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 * Tendermint

View File

@ -6,6 +6,7 @@ import (
"encoding/json" "encoding/json"
"errors" "errors"
"fmt" "fmt"
"strings"
"github.com/tendermint/tendermint/crypto" "github.com/tendermint/tendermint/crypto"
"github.com/tendermint/tendermint/crypto/encoding/amino" "github.com/tendermint/tendermint/crypto/encoding/amino"
@ -71,12 +72,21 @@ func AccAddressFromHex(address string) (addr AccAddress, err error) {
// AccAddressFromBech32 creates an AccAddress from a Bech32 string. // AccAddressFromBech32 creates an AccAddress from a Bech32 string.
func AccAddressFromBech32(address string) (addr AccAddress, err error) { func AccAddressFromBech32(address string) (addr AccAddress, err error) {
if len(strings.TrimSpace(address)) == 0 {
return AccAddress{}, nil
}
bech32PrefixAccAddr := GetConfig().GetBech32AccountAddrPrefix() bech32PrefixAccAddr := GetConfig().GetBech32AccountAddrPrefix()
bz, err := GetFromBech32(address, bech32PrefixAccAddr) bz, err := GetFromBech32(address, bech32PrefixAccAddr)
if err != nil { if err != nil {
return nil, err return nil, err
} }
if len(bz) != AddrLen {
return nil, errors.New("Incorrect address length")
}
return AccAddress(bz), nil return AccAddress(bz), nil
} }
@ -141,7 +151,12 @@ func (aa AccAddress) Bytes() []byte {
// String implements the Stringer interface. // String implements the Stringer interface.
func (aa AccAddress) String() string { func (aa AccAddress) String() string {
if aa.Empty() {
return ""
}
bech32PrefixAccAddr := GetConfig().GetBech32AccountAddrPrefix() bech32PrefixAccAddr := GetConfig().GetBech32AccountAddrPrefix()
bech32Addr, err := bech32.ConvertAndEncode(bech32PrefixAccAddr, aa.Bytes()) bech32Addr, err := bech32.ConvertAndEncode(bech32PrefixAccAddr, aa.Bytes())
if err != nil { if err != nil {
panic(err) panic(err)
@ -187,12 +202,21 @@ func ValAddressFromHex(address string) (addr ValAddress, err error) {
// ValAddressFromBech32 creates a ValAddress from a Bech32 string. // ValAddressFromBech32 creates a ValAddress from a Bech32 string.
func ValAddressFromBech32(address string) (addr ValAddress, err error) { func ValAddressFromBech32(address string) (addr ValAddress, err error) {
if len(strings.TrimSpace(address)) == 0 {
return ValAddress{}, nil
}
bech32PrefixValAddr := GetConfig().GetBech32ValidatorAddrPrefix() bech32PrefixValAddr := GetConfig().GetBech32ValidatorAddrPrefix()
bz, err := GetFromBech32(address, bech32PrefixValAddr) bz, err := GetFromBech32(address, bech32PrefixValAddr)
if err != nil { if err != nil {
return nil, err return nil, err
} }
if len(bz) != AddrLen {
return nil, errors.New("Incorrect address length")
}
return ValAddress(bz), nil return ValAddress(bz), nil
} }
@ -258,7 +282,12 @@ func (va ValAddress) Bytes() []byte {
// String implements the Stringer interface. // String implements the Stringer interface.
func (va ValAddress) String() string { func (va ValAddress) String() string {
if va.Empty() {
return ""
}
bech32PrefixValAddr := GetConfig().GetBech32ValidatorAddrPrefix() bech32PrefixValAddr := GetConfig().GetBech32ValidatorAddrPrefix()
bech32Addr, err := bech32.ConvertAndEncode(bech32PrefixValAddr, va.Bytes()) bech32Addr, err := bech32.ConvertAndEncode(bech32PrefixValAddr, va.Bytes())
if err != nil { if err != nil {
panic(err) panic(err)
@ -304,12 +333,21 @@ func ConsAddressFromHex(address string) (addr ConsAddress, err error) {
// ConsAddressFromBech32 creates a ConsAddress from a Bech32 string. // ConsAddressFromBech32 creates a ConsAddress from a Bech32 string.
func ConsAddressFromBech32(address string) (addr ConsAddress, err error) { func ConsAddressFromBech32(address string) (addr ConsAddress, err error) {
if len(strings.TrimSpace(address)) == 0 {
return ConsAddress{}, nil
}
bech32PrefixConsAddr := GetConfig().GetBech32ConsensusAddrPrefix() bech32PrefixConsAddr := GetConfig().GetBech32ConsensusAddrPrefix()
bz, err := GetFromBech32(address, bech32PrefixConsAddr) bz, err := GetFromBech32(address, bech32PrefixConsAddr)
if err != nil { if err != nil {
return nil, err return nil, err
} }
if len(bz) != AddrLen {
return nil, errors.New("Incorrect address length")
}
return ConsAddress(bz), nil return ConsAddress(bz), nil
} }
@ -380,7 +418,12 @@ func (ca ConsAddress) Bytes() []byte {
// String implements the Stringer interface. // String implements the Stringer interface.
func (ca ConsAddress) String() string { func (ca ConsAddress) String() string {
if ca.Empty() {
return ""
}
bech32PrefixConsAddr := GetConfig().GetBech32ConsensusAddrPrefix() bech32PrefixConsAddr := GetConfig().GetBech32ConsensusAddrPrefix()
bech32Addr, err := bech32.ConvertAndEncode(bech32PrefixConsAddr, ca.Bytes()) bech32Addr, err := bech32.ConvertAndEncode(bech32PrefixConsAddr, ca.Bytes())
if err != nil { if err != nil {
panic(err) panic(err)

View File

@ -13,7 +13,6 @@ import (
) )
var invalidStrs = []string{ var invalidStrs = []string{
"",
"hello, world!", "hello, world!",
"0xAA", "0xAA",
"AAA", "AAA",
@ -33,6 +32,24 @@ func testMarshal(t *testing.T, original interface{}, res interface{}, marshal fu
require.Equal(t, original, res) 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) { func TestRandBech32PubkeyConsistency(t *testing.T) {
var pub ed25519.PubKeyEd25519 var pub ed25519.PubKeyEd25519
@ -200,7 +217,7 @@ func TestConfiguredPrefix(t *testing.T) {
config := types.GetConfig() config := types.GetConfig()
config.SetBech32PrefixForAccount(prefix+"acc", prefix+"pub") config.SetBech32PrefixForAccount(prefix+"acc", prefix+"pub")
acc := types.AccAddress(pub.Address()) 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) bech32Pub := types.MustBech32ifyAccPub(pub)
require.True(t, strings.HasPrefix(bech32Pub, prefix+"pub")) require.True(t, strings.HasPrefix(bech32Pub, prefix+"pub"))

View File

@ -40,10 +40,10 @@ func (msg MsgSetWithdrawAddress) GetSignBytes() []byte {
// quick validity check // quick validity check
func (msg MsgSetWithdrawAddress) ValidateBasic() sdk.Error { func (msg MsgSetWithdrawAddress) ValidateBasic() sdk.Error {
if msg.DelegatorAddr == nil { if msg.DelegatorAddr.Empty() {
return ErrNilDelegatorAddr(DefaultCodespace) return ErrNilDelegatorAddr(DefaultCodespace)
} }
if msg.WithdrawAddr == nil { if msg.WithdrawAddr.Empty() {
return ErrNilWithdrawAddr(DefaultCodespace) return ErrNilWithdrawAddr(DefaultCodespace)
} }
return nil return nil
@ -78,10 +78,10 @@ func (msg MsgWithdrawDelegatorReward) GetSignBytes() []byte {
// quick validity check // quick validity check
func (msg MsgWithdrawDelegatorReward) ValidateBasic() sdk.Error { func (msg MsgWithdrawDelegatorReward) ValidateBasic() sdk.Error {
if msg.DelegatorAddr == nil { if msg.DelegatorAddr.Empty() {
return ErrNilDelegatorAddr(DefaultCodespace) return ErrNilDelegatorAddr(DefaultCodespace)
} }
if msg.ValidatorAddr == nil { if msg.ValidatorAddr.Empty() {
return ErrNilValidatorAddr(DefaultCodespace) return ErrNilValidatorAddr(DefaultCodespace)
} }
return nil return nil
@ -114,7 +114,7 @@ func (msg MsgWithdrawValidatorCommission) GetSignBytes() []byte {
// quick validity check // quick validity check
func (msg MsgWithdrawValidatorCommission) ValidateBasic() sdk.Error { func (msg MsgWithdrawValidatorCommission) ValidateBasic() sdk.Error {
if msg.ValidatorAddr == nil { if msg.ValidatorAddr.Empty() {
return ErrNilValidatorAddr(DefaultCodespace) return ErrNilValidatorAddr(DefaultCodespace)
} }
return nil return nil

View File

@ -59,7 +59,7 @@ func (msg MsgSubmitProposal) ValidateBasic() sdk.Error {
if !validProposalType(msg.ProposalType) { if !validProposalType(msg.ProposalType) {
return ErrInvalidProposalType(DefaultCodespace, msg.ProposalType) return ErrInvalidProposalType(DefaultCodespace, msg.ProposalType)
} }
if len(msg.Proposer) == 0 { if msg.Proposer.Empty() {
return sdk.ErrInvalidAddress(msg.Proposer.String()) return sdk.ErrInvalidAddress(msg.Proposer.String())
} }
if !msg.InitialDeposit.IsValid() { if !msg.InitialDeposit.IsValid() {
@ -172,7 +172,7 @@ func (msg MsgVote) Type() string { return TypeMsgVote }
// Implements Msg. // Implements Msg.
func (msg MsgVote) ValidateBasic() sdk.Error { func (msg MsgVote) ValidateBasic() sdk.Error {
if len(msg.Voter.Bytes()) == 0 { if msg.Voter.Empty() {
return sdk.ErrInvalidAddress(msg.Voter.String()) return sdk.ErrInvalidAddress(msg.Voter.String())
} }
if msg.ProposalID < 0 { if msg.ProposalID < 0 {

View File

@ -36,7 +36,7 @@ func (msg MsgUnjail) GetSignBytes() []byte {
// quick validity check // quick validity check
func (msg MsgUnjail) ValidateBasic() sdk.Error { func (msg MsgUnjail) ValidateBasic() sdk.Error {
if msg.ValidatorAddr == nil { if msg.ValidatorAddr.Empty() {
return ErrBadValidatorAddr(DefaultCodespace) return ErrBadValidatorAddr(DefaultCodespace)
} }
return nil return nil

View File

@ -90,8 +90,8 @@ func (k Keeper) GetAllRedelegations(ctx sdk.Context, delegator sdk.AccAddress, s
iterator := sdk.KVStorePrefixIterator(store, delegatorPrefixKey) // smallest to largest iterator := sdk.KVStorePrefixIterator(store, delegatorPrefixKey) // smallest to largest
defer iterator.Close() defer iterator.Close()
srcValFilter := !(srcValAddress.Empty() || srcValAddress == nil) srcValFilter := !(srcValAddress.Empty())
dstValFilter := !(dstValAddress.Empty() || dstValAddress == nil) dstValFilter := !(dstValAddress.Empty())
for ; iterator.Valid(); iterator.Next() { for ; iterator.Valid(); iterator.Next() {
redelegation := types.MustUnmarshalRED(k.cdc, iterator.Value()) redelegation := types.MustUnmarshalRED(k.cdc, iterator.Value())

View File

@ -123,10 +123,10 @@ func (msg MsgCreateValidator) GetSignBytes() []byte {
// quick validity check // quick validity check
func (msg MsgCreateValidator) ValidateBasic() sdk.Error { func (msg MsgCreateValidator) ValidateBasic() sdk.Error {
// note that unmarshaling from bech32 ensures either empty or valid // note that unmarshaling from bech32 ensures either empty or valid
if msg.DelegatorAddr == nil { if msg.DelegatorAddr.Empty() {
return ErrNilDelegatorAddr(DefaultCodespace) return ErrNilDelegatorAddr(DefaultCodespace)
} }
if msg.ValidatorAddr == nil { if msg.ValidatorAddr.Empty() {
return ErrNilValidatorAddr(DefaultCodespace) return ErrNilValidatorAddr(DefaultCodespace)
} }
if msg.Value.Amount.LTE(sdk.ZeroInt()) { if msg.Value.Amount.LTE(sdk.ZeroInt()) {
@ -186,7 +186,7 @@ func (msg MsgEditValidator) GetSignBytes() []byte {
// quick validity check // quick validity check
func (msg MsgEditValidator) ValidateBasic() sdk.Error { func (msg MsgEditValidator) ValidateBasic() sdk.Error {
if msg.ValidatorAddr == nil { if msg.ValidatorAddr.Empty() {
return sdk.NewError(DefaultCodespace, CodeInvalidInput, "nil validator address") return sdk.NewError(DefaultCodespace, CodeInvalidInput, "nil validator address")
} }
@ -237,10 +237,10 @@ func (msg MsgDelegate) GetSignBytes() []byte {
// quick validity check // quick validity check
func (msg MsgDelegate) ValidateBasic() sdk.Error { func (msg MsgDelegate) ValidateBasic() sdk.Error {
if msg.DelegatorAddr == nil { if msg.DelegatorAddr.Empty() {
return ErrNilDelegatorAddr(DefaultCodespace) return ErrNilDelegatorAddr(DefaultCodespace)
} }
if msg.ValidatorAddr == nil { if msg.ValidatorAddr.Empty() {
return ErrNilValidatorAddr(DefaultCodespace) return ErrNilValidatorAddr(DefaultCodespace)
} }
if msg.Value.Amount.LTE(sdk.ZeroInt()) { if msg.Value.Amount.LTE(sdk.ZeroInt()) {
@ -285,13 +285,13 @@ func (msg MsgBeginRedelegate) GetSignBytes() []byte {
// quick validity check // quick validity check
func (msg MsgBeginRedelegate) ValidateBasic() sdk.Error { func (msg MsgBeginRedelegate) ValidateBasic() sdk.Error {
if msg.DelegatorAddr == nil { if msg.DelegatorAddr.Empty() {
return ErrNilDelegatorAddr(DefaultCodespace) return ErrNilDelegatorAddr(DefaultCodespace)
} }
if msg.ValidatorSrcAddr == nil { if msg.ValidatorSrcAddr.Empty() {
return ErrNilValidatorAddr(DefaultCodespace) return ErrNilValidatorAddr(DefaultCodespace)
} }
if msg.ValidatorDstAddr == nil { if msg.ValidatorDstAddr.Empty() {
return ErrNilValidatorAddr(DefaultCodespace) return ErrNilValidatorAddr(DefaultCodespace)
} }
if msg.SharesAmount.LTE(sdk.ZeroDec()) { if msg.SharesAmount.LTE(sdk.ZeroDec()) {
@ -328,10 +328,10 @@ func (msg MsgUndelegate) GetSignBytes() []byte {
// quick validity check // quick validity check
func (msg MsgUndelegate) ValidateBasic() sdk.Error { func (msg MsgUndelegate) ValidateBasic() sdk.Error {
if msg.DelegatorAddr == nil { if msg.DelegatorAddr.Empty() {
return ErrNilDelegatorAddr(DefaultCodespace) return ErrNilDelegatorAddr(DefaultCodespace)
} }
if msg.ValidatorAddr == nil { if msg.ValidatorAddr.Empty() {
return ErrNilValidatorAddr(DefaultCodespace) return ErrNilValidatorAddr(DefaultCodespace)
} }
if msg.SharesAmount.LTE(sdk.ZeroDec()) { if msg.SharesAmount.LTE(sdk.ZeroDec()) {