Skip to content

Commit

Permalink
Merge pull request #142 from Fairblock/feat/add-deregister
Browse files Browse the repository at this point in the history
Add deregister msg & tests
  • Loading branch information
p0p3yee committed Mar 25, 2024
2 parents 36fd8d7 + 0254e30 commit 926a856
Show file tree
Hide file tree
Showing 12 changed files with 623 additions and 63 deletions.
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,7 @@ require (
github.com/prometheus/procfs v0.10.1 // indirect
github.com/rakyll/statik v0.1.7 // indirect
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect
github.com/regen-network/cosmos-proto v0.3.1 // indirect
github.com/rogpeppe/go-internal v1.11.0 // indirect
github.com/rs/cors v1.9.0 // indirect
github.com/rs/zerolog v1.30.0 // indirect
Expand Down
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -1335,6 +1335,8 @@ github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqn
github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM=
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
github.com/regen-network/cosmos-proto v0.3.1 h1:rV7iM4SSFAagvy8RiyhiACbWEGotmqzywPxOvwMdxcg=
github.com/regen-network/cosmos-proto v0.3.1/go.mod h1:jO0sVX6a1B36nmE8C9xBFXpNwWejXC7QqCOnH3O0+YM=
github.com/regen-network/protobuf v1.3.3-alpha.regen.1 h1:OHEc+q5iIAXpqiqFKeLpu5NwTIkVXUs48vFMwzqpqY4=
github.com/regen-network/protobuf v1.3.3-alpha.regen.1/go.mod h1:2DjTFR1HhMQhiWC5sZ4OhQ3+NtdbZ6oBDKQwq5Ou+FI=
github.com/remyoudompheng/go-dbus v0.0.0-20121104212943-b7232d34b1d5/go.mod h1:+u151txRmLpwxBmpYn9z3d1sdJdjRPQpsXuYeY9jNls=
Expand Down
9 changes: 9 additions & 0 deletions proto/fairyring/keyshare/tx.proto
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ option go_package = "github.com/Fairblock/fairyring/x/keyshare/types";
// Msg defines the Msg service.
service Msg {
rpc RegisterValidator (MsgRegisterValidator) returns (MsgRegisterValidatorResponse);
rpc DeRegisterValidator (MsgDeRegisterValidator) returns (MsgDeRegisterValidatorResponse);
rpc SendKeyshare (MsgSendKeyshare ) returns (MsgSendKeyshareResponse );

// this line is used by starport scaffolding # proto/tx/rpc
Expand All @@ -28,6 +29,14 @@ message MsgRegisterValidatorResponse {
string creator = 1;
}

message MsgDeRegisterValidator {
string creator = 1;
}

message MsgDeRegisterValidatorResponse {
string creator = 1;
}

message MsgSendKeyshare {
string creator = 1;
string message = 2;
Expand Down
39 changes: 39 additions & 0 deletions scripts/tests/keyshare.sh
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,17 @@ wait_for_tx () {
echo "$RESULT"
}

echo "Non Validator deregistering validator on chain fairyring_test_1"
RESULT=$($BINARY tx keyshare deregister-validator --from $VALIDATOR_1 --gas-prices 1ufairy --home $CHAIN_DIR/$CHAINID_1 --chain-id $CHAINID_1 --node tcp://localhost:16657 --broadcast-mode sync --keyring-backend test -o json -y)
check_tx_code $RESULT
RESULT=$(wait_for_tx $RESULT)
ERROR_MSG=$(echo "$RESULT" | jq -r '.raw_log')
if [[ "$ERROR_MSG" != *"validator not registered"* ]]; then
echo "ERROR: KeyShare module deregister validator error. Expected to get validator not registered error, got '$ERROR_MSG'"
echo "ERROR MESSAGE: $(echo "$RESULT" | jq -r '.raw_log')"
exit 1
fi

echo "Staked account registering as a validator on chain fairyring_test_1"
RESULT=$($BINARY tx keyshare register-validator --from $VALIDATOR_1 --gas-prices 1ufairy --home $CHAIN_DIR/$CHAINID_1 --chain-id $CHAINID_1 --node tcp://localhost:16657 --broadcast-mode sync --keyring-backend test -o json -y)
check_tx_code $RESULT
Expand All @@ -48,6 +59,34 @@ if [ "$VALIDATOR_ADDR" != "$VALIDATOR_1" ]; then
exit 1
fi

echo "Validator deregistering as a validator on chain fairyring_test_1"
RESULT=$($BINARY tx keyshare deregister-validator --from $VALIDATOR_1 --gas-prices 1ufairy --home $CHAIN_DIR/$CHAINID_1 --chain-id $CHAINID_1 --node tcp://localhost:16657 --broadcast-mode sync --keyring-backend test -o json -y)
check_tx_code $RESULT
RESULT=$(wait_for_tx $RESULT)
VALIDATOR_ADDR=$(echo "$RESULT" | jq -r '.logs[0].events[1].attributes[0].value')
if [ "$VALIDATOR_ADDR" != "$VALIDATOR_1" ]; then
echo "ERROR: KeyShare module deregister validator error. Expected deregistered validator address '$VALIDATOR_1', got '$VALIDATOR_ADDR'"
echo "ERROR MESSAGE: $(echo "$RESULT" | jq -r '.raw_log')"
exit 1
fi

RESULT=$($BINARY q keyshare list-validator-set --home $CHAIN_DIR/$CHAINID_1 --chain-id $CHAINID_1 --node tcp://localhost:16657 -o json)
CURRENT_SET_LEN=$(echo $RESULT | jq '.validatorSet | length')
if [ "$CURRENT_SET_LEN" != "0" ]; then
echo "ERROR: KeyShare module deregister validator error, Expected total validator set to be empty, got '$(echo $RESULT | jq '.validatorSet')'"
exit 1
fi

echo "Staked account registering as a validator on chain fairyring_test_1"
RESULT=$($BINARY tx keyshare register-validator --from $VALIDATOR_1 --gas-prices 1ufairy --home $CHAIN_DIR/$CHAINID_1 --chain-id $CHAINID_1 --node tcp://localhost:16657 --broadcast-mode sync --keyring-backend test -o json -y)
check_tx_code $RESULT
RESULT=$(wait_for_tx $RESULT)
VALIDATOR_ADDR=$(echo "$RESULT" | jq -r '.logs[0].events[1].attributes[0].value')
if [ "$VALIDATOR_ADDR" != "$VALIDATOR_1" ]; then
echo "ERROR: KeyShare module register validator error. Expected registered validator address '$VALIDATOR_1', got '$VALIDATOR_ADDR'"
echo "ERROR MESSAGE: $(echo "$RESULT" | jq -r '.raw_log')"
exit 1
fi

echo "Non staking account registering as a validator on chain fairyring_test_1"
RESULT=$($BINARY tx keyshare register-validator --from $WALLET_1 --gas-prices 1ufairy --home $CHAIN_DIR/$CHAINID_1 --chain-id $CHAINID_1 --node tcp://localhost:16657 --broadcast-mode sync --keyring-backend test -o json -y)
Expand Down
1 change: 1 addition & 0 deletions x/keyshare/client/cli/tx.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ func GetTxCmd() *cobra.Command {
}

cmd.AddCommand(CmdRegisterValidator())
cmd.AddCommand(CmdDeRegisterValidator())
cmd.AddCommand(CmdSendKeyshare())
cmd.AddCommand(CmdCreateLatestPubKey())
cmd.AddCommand(CmdCreateAuthorizedAddress())
Expand Down
38 changes: 38 additions & 0 deletions x/keyshare/client/cli/tx_deregister_validator.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package cli

import (
"strconv"

"github.com/Fairblock/fairyring/x/keyshare/types"

"github.com/cosmos/cosmos-sdk/client"
"github.com/cosmos/cosmos-sdk/client/flags"
"github.com/cosmos/cosmos-sdk/client/tx"
"github.com/spf13/cobra"
)

var _ = strconv.Itoa(0)

func CmdDeRegisterValidator() *cobra.Command {
cmd := &cobra.Command{
Use: "deregister-validator",
Short: "Deregister a validator for being eligible to send keyshares",
Args: cobra.ExactArgs(0),
RunE: func(cmd *cobra.Command, args []string) (err error) {

clientCtx, err := client.GetClientTxContext(cmd)
if err != nil {
return err
}

msg := types.NewMsgDeRegisterValidator(
clientCtx.GetFromAddress().String(),
)
return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg)
},
}

flags.AddTxFlagsToCmd(cmd)

return cmd
}
38 changes: 38 additions & 0 deletions x/keyshare/keeper/msg_server_deregister_validator.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package keeper

import (
"context"
"github.com/Fairblock/fairyring/x/keyshare/types"
sdk "github.com/cosmos/cosmos-sdk/types"
)

// DeRegisterValidator remove a validator in the validator set
func (k msgServer) DeRegisterValidator(goCtx context.Context, msg *types.MsgDeRegisterValidator) (*types.MsgDeRegisterValidatorResponse, error) {
ctx := sdk.UnwrapSDKContext(goCtx)

_, found := k.GetValidatorSet(ctx, msg.Creator)

if !found {
return nil, types.ErrValidatorNotRegistered.Wrap(msg.Creator)
}

for _, v := range k.GetAllAuthorizedAddress(ctx) {
if v.AuthorizedBy == msg.Creator {
k.RemoveAuthorizedAddress(ctx, v.Target)
k.DecreaseAuthorizedCount(ctx, msg.Creator)
break
}
}

k.RemoveValidatorSet(ctx, msg.Creator)

ctx.EventManager().EmitEvent(
sdk.NewEvent(types.DeRegisteredValidatorEventType,
sdk.NewAttribute(types.DeRegisteredValidatorEventCreator, msg.Creator),
),
)

return &types.MsgDeRegisterValidatorResponse{
Creator: msg.Creator,
}, nil
}
5 changes: 4 additions & 1 deletion x/keyshare/types/codec.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ func RegisterCodec(cdc *codec.LegacyAmino) {
cdc.RegisterConcrete(&MsgUpdateAuthorizedAddress{}, "keyshare/UpdateAuthorizedAddress", nil)
cdc.RegisterConcrete(&MsgDeleteAuthorizedAddress{}, "keyshare/DeleteAuthorizedAddress", nil)
cdc.RegisterConcrete(&MsgCreateGeneralKeyShare{}, "keyshare/CreateGeneralKeyShare", nil)

cdc.RegisterConcrete(&MsgDeRegisterValidator{}, "keyshare/DeRegisterValidator", nil)
// this line is used by starport scaffolding # 2
}

Expand All @@ -43,6 +43,9 @@ func RegisterInterfaces(registry cdctypes.InterfaceRegistry) {
registry.RegisterImplementations((*sdk.Msg)(nil),
&MsgCreateGeneralKeyShare{},
)
registry.RegisterImplementations((*sdk.Msg)(nil),
&MsgDeRegisterValidator{},
)
// this line is used by starport scaffolding # 3

msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc)
Expand Down
1 change: 1 addition & 0 deletions x/keyshare/types/errors.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ var (
ErrInvalidVersion = sdkerrors.Register(ModuleName, 1123, "invalid version")
ErrRequestNotFound = sdkerrors.Register(ModuleName, 1124, "no request found with this identity")
ErrInvalidNumberOfValidators = sdkerrors.Register(ModuleName, 1125, "invalid number of validators")
ErrAuthorizedAnotherAddr = sdkerrors.Register(ModuleName, 1126, "validator authorized another address, please remove authorized address before deregistering")
ErrAddressAlreadyAuthorized = sdkerrors.Register(ModuleName, 1900, "address is already authorized")
ErrAuthorizedAddrNotFound = sdkerrors.Register(ModuleName, 1901, "target authorized address not found")
ErrNotAuthorizedAddrCreator = sdkerrors.Register(ModuleName, 1902, "sender is not the creator of target authorized address")
Expand Down
6 changes: 5 additions & 1 deletion x/keyshare/types/keys.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ const (
)

const (
KeyAggregationThresholdPercentage = 2.0 / 3.0
KeyAggregationThresholdNumerator = 2
KeyAggregationThresholdDenominator = 3
)
Expand All @@ -38,6 +37,11 @@ const (
RegisteredValidatorEventCreator = "creator"
)

const (
DeRegisteredValidatorEventType = "validator-deregistered"
DeRegisteredValidatorEventCreator = "creator"
)

const (
SendKeyshareEventType = "keyshare-sent"
SendKeyshareEventValidator = "validator"
Expand Down
46 changes: 46 additions & 0 deletions x/keyshare/types/message_deregister_validator.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package types

import (
sdkerrors "cosmossdk.io/errors"
sdk "github.com/cosmos/cosmos-sdk/types"
cosmoserror "github.com/cosmos/cosmos-sdk/types/errors"
)

const TypeMsgDeRegisterValidator = "deregister_validator"

var _ sdk.Msg = &MsgRegisterValidator{}

func NewMsgDeRegisterValidator(creator string) *MsgDeRegisterValidator {
return &MsgDeRegisterValidator{
Creator: creator,
}
}

func (msg *MsgDeRegisterValidator) Route() string {
return RouterKey
}

func (msg *MsgDeRegisterValidator) Type() string {
return TypeMsgDeRegisterValidator
}

func (msg *MsgDeRegisterValidator) GetSigners() []sdk.AccAddress {
creator, err := sdk.AccAddressFromBech32(msg.Creator)
if err != nil {
panic(err)
}
return []sdk.AccAddress{creator}
}

func (msg *MsgDeRegisterValidator) GetSignBytes() []byte {
bz := ModuleCdc.MustMarshalJSON(msg)
return sdk.MustSortJSON(bz)
}

func (msg *MsgDeRegisterValidator) ValidateBasic() error {
_, err := sdk.AccAddressFromBech32(msg.Creator)
if err != nil {
return sdkerrors.Wrapf(cosmoserror.ErrInvalidAddress, "invalid creator address (%s)", err)
}
return nil
}
Loading

0 comments on commit 926a856

Please sign in to comment.