From 5fff217e9b5ccdfa665590e4ba6fdf2db1679e95 Mon Sep 17 00:00:00 2001 From: Rigel Date: Wed, 15 Aug 2018 09:04:01 -0400 Subject: [PATCH] Merge PR #2033: staking lcd uses owner address not pubkey address --- client/lcd/lcd_test.go | 5 +-- x/stake/client/rest/query.go | 29 +++++++++--- x/stake/client/rest/utils.go | 86 +++++++++--------------------------- 3 files changed, 44 insertions(+), 76 deletions(-) diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index c5d567e13c..db584834af 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -376,11 +376,8 @@ func TestValidatorQuery(t *testing.T) { require.Equal(t, 1, len(pks)) validator1Owner := sdk.AccAddress(pks[0].Address()) - validator := getValidator(t, port, validator1Owner) - bech32ValAddress, err := sdk.Bech32ifyValPub(pks[0]) - require.NoError(t, err) - assert.Equal(t, validator.PubKey, bech32ValAddress, "The returned validator does not hold the correct data") + assert.Equal(t, validator.Owner, validator1Owner, "The returned validator does not hold the correct data") } func TestBonding(t *testing.T) { diff --git a/x/stake/client/rest/query.go b/x/stake/client/rest/query.go index b7d2b10a45..4dfaa0f7fa 100644 --- a/x/stake/client/rest/query.go +++ b/x/stake/client/rest/query.go @@ -507,25 +507,40 @@ func validatorHandlerFn(cliCtx context.CLIContext, cdc *wire.Codec) http.Handler valAddress, err := sdk.AccAddressFromBech32(bech32validatorAddr) if err != nil { w.WriteHeader(http.StatusBadRequest) - w.Write([]byte(fmt.Sprintf("Error: %s", err.Error()))) + w.Write([]byte(fmt.Sprintf("error: %s", err.Error()))) return } - kvs, err := cliCtx.QuerySubspace(stake.ValidatorsKey, storeName) + key := stake.GetValidatorKey(valAddress) + + res, err := cliCtx.QueryStore(key, storeName) if err != nil { w.WriteHeader(http.StatusInternalServerError) - w.Write([]byte(fmt.Sprintf("Error: %s", err.Error()))) + w.Write([]byte(fmt.Sprintf("couldn't query validator, error: %s", err.Error()))) return } - validator, err := getValidator(valAddress, kvs, cdc) + // the query will return empty if there is no data for this record + if len(res) == 0 { + w.WriteHeader(http.StatusNoContent) + return + } + + validator, err := types.UnmarshalValidator(cdc, valAddress, res) if err != nil { - w.WriteHeader(http.StatusInternalServerError) - w.Write([]byte(fmt.Sprintf("couldn't query validator. Error: %s", err.Error()))) + w.WriteHeader(http.StatusBadRequest) + w.Write([]byte(err.Error())) return } - output, err = cdc.MarshalJSON(validator) + bech32Validator, err := validator.Bech32Validator() + if err != nil { + w.WriteHeader(http.StatusBadRequest) + w.Write([]byte(err.Error())) + return + } + + output, err = cdc.MarshalJSON(bech32Validator) if err != nil { w.WriteHeader(http.StatusInternalServerError) w.Write([]byte(fmt.Sprintf("Error: %s", err.Error()))) diff --git a/x/stake/client/rest/utils.go b/x/stake/client/rest/utils.go index 1a08090890..96588f73b5 100644 --- a/x/stake/client/rest/utils.go +++ b/x/stake/client/rest/utils.go @@ -1,7 +1,6 @@ package rest import ( - "bytes" "fmt" "net/http" @@ -12,7 +11,6 @@ import ( "github.com/cosmos/cosmos-sdk/x/stake" "github.com/cosmos/cosmos-sdk/x/stake/tags" "github.com/cosmos/cosmos-sdk/x/stake/types" - "github.com/pkg/errors" rpcclient "github.com/tendermint/tendermint/rpc/client" ) @@ -26,33 +24,36 @@ func contains(stringSlice []string, txType string) bool { return false } -func getDelegatorValidator(cliCtx context.CLIContext, cdc *wire.Codec, delegatorAddr sdk.AccAddress, validatorAccAddr sdk.AccAddress) ( - validator types.BechValidator, httpStatusCode int, errMsg string, err error) { +func getDelegatorValidator(cliCtx context.CLIContext, cdc *wire.Codec, delegatorAddr sdk.AccAddress, validatorAddr sdk.AccAddress) ( + bech32Validator types.BechValidator, httpStatusCode int, errMsg string, err error) { - keyDel := stake.GetDelegationKey(delegatorAddr, validatorAccAddr) - - res, err := cliCtx.QueryStore(keyDel, storeName) + key := stake.GetDelegationKey(delegatorAddr, validatorAddr) + res, err := cliCtx.QueryStore(key, storeName) if err != nil { return types.BechValidator{}, http.StatusInternalServerError, "couldn't query delegation. Error: ", err } - if len(res) == 0 { return types.BechValidator{}, http.StatusNoContent, "", nil } - kvs, err := cliCtx.QuerySubspace(stake.ValidatorsKey, storeName) + key = stake.GetValidatorKey(validatorAddr) + res, err = cliCtx.QueryStore(key, storeName) if err != nil { - return types.BechValidator{}, http.StatusInternalServerError, "Error: ", err + return types.BechValidator{}, http.StatusInternalServerError, "couldn't query validator. Error: ", err } - if len(kvs) == 0 { + if len(res) == 0 { return types.BechValidator{}, http.StatusNoContent, "", nil } - - validator, errVal := getValidatorFromAccAdrr(validatorAccAddr, kvs, cdc) - if errVal != nil { - return types.BechValidator{}, http.StatusInternalServerError, "Couldn't get info from validator. Error: ", errVal + validator, err := types.UnmarshalValidator(cdc, validatorAddr, res) + if err != nil { + return types.BechValidator{}, http.StatusBadRequest, "", err } - return validator, http.StatusOK, "", nil + bech32Validator, err = validator.Bech32Validator() + if err != nil { + return types.BechValidator{}, http.StatusBadRequest, "", err + } + + return bech32Validator, http.StatusOK, "", nil } func getDelegatorDelegations(cliCtx context.CLIContext, cdc *wire.Codec, delegatorAddr sdk.AccAddress, validatorAddr sdk.AccAddress) ( @@ -104,8 +105,8 @@ func getDelegatorUndelegations(cliCtx context.CLIContext, cdc *wire.Codec, deleg func getDelegatorRedelegations(cliCtx context.CLIContext, cdc *wire.Codec, delegatorAddr sdk.AccAddress, validatorAddr sdk.AccAddress) ( regelegations types.Redelegation, httpStatusCode int, errMsg string, err error) { - keyRedelegateTo := stake.GetREDsByDelToValDstIndexKey(delegatorAddr, validatorAddr) - marshalledRedelegations, err := cliCtx.QueryStore(keyRedelegateTo, storeName) + key := stake.GetREDsByDelToValDstIndexKey(delegatorAddr, validatorAddr) + marshalledRedelegations, err := cliCtx.QueryStore(key, storeName) if err != nil { return types.Redelegation{}, http.StatusInternalServerError, "couldn't query redelegation. Error: ", err } @@ -114,7 +115,7 @@ func getDelegatorRedelegations(cliCtx context.CLIContext, cdc *wire.Codec, deleg return types.Redelegation{}, http.StatusNoContent, "", nil } - redelegations, err := types.UnmarshalRED(cdc, keyRedelegateTo, marshalledRedelegations) + redelegations, err := types.UnmarshalRED(cdc, key, marshalledRedelegations) if err != nil { return types.Redelegation{}, http.StatusInternalServerError, "couldn't unmarshall redelegations. Error: ", err } @@ -156,55 +157,10 @@ func getValidators(validatorKVs []sdk.KVPair, cdc *wire.Codec) ([]types.BechVali return validators, nil } -// gets a validator given a ValAddress -func getValidator(address sdk.AccAddress, validatorKVs []sdk.KVPair, cdc *wire.Codec) (stake.BechValidator, error) { - // parse out the validators - for _, kv := range validatorKVs { - addr := kv.Key[1:] - validator, err := types.UnmarshalValidator(cdc, addr, kv.Value) - if err != nil { - return stake.BechValidator{}, err - } - - ownerAddress := validator.PubKey.Address() - if bytes.Equal(ownerAddress.Bytes(), address.Bytes()) { - bech32Validator, err := validator.Bech32Validator() - if err != nil { - return stake.BechValidator{}, err - } - - return bech32Validator, nil - } - } - return stake.BechValidator{}, errors.Errorf("Couldn't find validator") -} - -// gets a validator given an AccAddress -func getValidatorFromAccAdrr(address sdk.AccAddress, validatorKVs []sdk.KVPair, cdc *wire.Codec) (stake.BechValidator, error) { - // parse out the validators - for _, kv := range validatorKVs { - addr := kv.Key[1:] - validator, err := types.UnmarshalValidator(cdc, addr, kv.Value) - if err != nil { - return stake.BechValidator{}, err - } - - ownerAddress := validator.PubKey.Address() - if bytes.Equal(ownerAddress.Bytes(), address.Bytes()) { - bech32Validator, err := validator.Bech32Validator() - if err != nil { - return stake.BechValidator{}, err - } - - return bech32Validator, nil - } - } - return stake.BechValidator{}, errors.Errorf("Couldn't find validator") -} - // gets all Bech32 validators from a key func getBech32Validators(storeName string, cliCtx context.CLIContext, cdc *wire.Codec) ( validators []types.BechValidator, httpStatusCode int, errMsg string, err error) { + // Get all validators using key kvs, err := cliCtx.QuerySubspace(stake.ValidatorsKey, storeName) if err != nil {