diff --git a/cmd/blockchaincmd/add_validator.go b/cmd/blockchaincmd/add_validator.go index f9e414ed7..1cb20b136 100644 --- a/cmd/blockchaincmd/add_validator.go +++ b/cmd/blockchaincmd/add_validator.go @@ -8,6 +8,10 @@ import ( "strings" "time" + "github.com/ava-labs/avalanche-cli/pkg/signatureAggregator" + + "github.com/ava-labs/avalanche-cli/cmd/flags" + "github.com/ava-labs/avalanche-cli/pkg/blockchain" "github.com/ava-labs/avalanche-cli/pkg/cobrautils" "github.com/ava-labs/avalanche-cli/pkg/constants" @@ -52,25 +56,26 @@ var ( pop string remainingBalanceOwnerAddr string disableOwnerAddr string - rpcURL string - aggregatorLogLevel string - aggregatorLogToStdout bool delegationFee uint16 errNoSubnetID = errors.New("failed to find the subnet ID for this subnet, has it been deployed/created on this network?") errMutuallyExclusiveDurationOptions = errors.New("--use-default-duration/--use-default-validator-params and --staking-period are mutually exclusive") errMutuallyExclusiveStartOptions = errors.New("--use-default-start-time/--use-default-validator-params and --start-time are mutually exclusive") errMutuallyExclusiveWeightOptions = errors.New("--use-default-validator-params and --weight are mutually exclusive") ErrNotPermissionedSubnet = errors.New("subnet is not permissioned") - aggregatorExtraEndpoints []string - aggregatorAllowPrivatePeers bool clusterNameFlagValue string createLocalValidator bool externalValidatorManagerOwner bool validatorManagerOwner string httpPort uint32 stakingPort uint32 + addValidatorFlags BlockchainAddValidatorFlags ) +type BlockchainAddValidatorFlags struct { + RPC string + SigAggFlags flags.SignatureAggregatorFlags +} + const ( validatorWeightFlag = "weight" ) @@ -92,7 +97,8 @@ Testnet or Mainnet.`, Args: cobrautils.MaximumNArgs(1), } networkoptions.AddNetworkFlagsToCmd(cmd, &globalNetworkFlags, true, networkoptions.DefaultSupportedNetworkOptions) - + flags.AddRPCFlagToCmd(cmd, app, &addValidatorFlags.RPC) + flags.AddSignatureAggregatorFlagsToCmd(cmd, &addValidatorFlags.SigAggFlags) cmd.Flags().StringVarP(&keyName, "key", "k", "", "select the key to use [fuji/devnet only]") cmd.Flags().Float64Var( &balanceAVAX, @@ -111,11 +117,6 @@ Testnet or Mainnet.`, cmd.Flags().BoolVar(&createLocalValidator, "create-local-validator", false, "create additional local validator and add it to existing running local node") cmd.Flags().BoolVar(&partialSync, "partial-sync", true, "set primary network partial sync for new validators") cmd.Flags().StringVar(&nodeEndpoint, "node-endpoint", "", "gather node id/bls from publicly available avalanchego apis on the given endpoint") - cmd.Flags().StringSliceVar(&aggregatorExtraEndpoints, "aggregator-extra-endpoints", nil, "endpoints for extra nodes that are needed in signature aggregation") - cmd.Flags().BoolVar(&aggregatorAllowPrivatePeers, "aggregator-allow-private-peers", true, "allow the signature aggregator to connect to peers with private IP") - cmd.Flags().StringVar(&rpcURL, "rpc", "", "connect to validator manager at the given rpc endpoint") - cmd.Flags().StringVar(&aggregatorLogLevel, "aggregator-log-level", constants.DefaultAggregatorLogLevel, "log level to use with signature aggregator") - cmd.Flags().BoolVar(&aggregatorLogToStdout, "aggregator-log-to-stdout", false, "use stdout for signature aggregator logs") cmd.Flags().DurationVar(&duration, "staking-period", 0, "how long this validator will be staking") cmd.Flags().BoolVar(&useDefaultStartTime, "default-start-time", false, "(for Subnets, not L1s) use default start time for subnet validator (5 minutes later for fuji & mainnet, 30 seconds later for devnet)") cmd.Flags().StringVar(&startTimeStr, "start-time", "", "(for Subnets, not L1s) UTC start time when this validator starts validating, in 'YYYY-MM-DD HH:MM:SS' format") @@ -186,13 +187,7 @@ func addValidator(cmd *cobra.Command, args []string) error { } if len(args) == 0 { - if rpcURL == "" { - rpcURL, err = app.Prompt.CaptureURL("What is the RPC endpoint?", false) - if err != nil { - return err - } - } - sc, err = importL1(blockchainIDStr, rpcURL, network) + sc, err = importL1(blockchainIDStr, addValidatorFlags.RPC, network) if err != nil { return err } @@ -293,8 +288,6 @@ func addValidator(cmd *cobra.Command, args []string) error { if err != nil { return err } - // make sure extra validator endpoint added for the new node - aggregatorExtraEndpoints = append(aggregatorExtraEndpoints, constants.LocalAPIEndpoint) } if nodeIDStr == "" { @@ -340,6 +333,7 @@ func addValidator(cmd *cobra.Command, args []string) error { remainingBalanceOwnerAddr, disableOwnerAddr, sc, + addValidatorFlags.RPC, ); err != nil { return err } @@ -372,6 +366,7 @@ func CallAddValidator( remainingBalanceOwnerAddr string, disableOwnerAddr string, sc models.Sidecar, + rpcURL string, ) error { nodeID, err := ids.NodeIDFromString(nodeIDStr) if err != nil { @@ -514,18 +509,14 @@ func CallAddValidator( Threshold: 1, Addresses: disableOwnerAddrID, } - - extraAggregatorPeers, err := blockchain.GetAggregatorExtraPeers(app, clusterNameFlagValue, aggregatorExtraEndpoints) + extraAggregatorPeers, err := blockchain.GetAggregatorExtraPeers(app, clusterNameFlagValue) if err != nil { return err } - aggregatorLogger, err := utils.NewLogger( - constants.SignatureAggregatorLogName, - aggregatorLogLevel, - constants.DefaultAggregatorLogLevel, + aggregatorLogger, err := signatureAggregator.NewSignatureAggregatorLoggerNewLogger( + addValidatorFlags.SigAggFlags.AggregatorLogLevel, + addValidatorFlags.SigAggFlags.AggregatorLogToStdout, app.GetAggregatorLogDir(clusterNameFlagValue), - aggregatorLogToStdout, - ux.Logger.PrintToUser, ) if err != nil { return err @@ -548,7 +539,6 @@ func CallAddValidator( disableOwners, weight, extraAggregatorPeers, - aggregatorAllowPrivatePeers, aggregatorLogger, pos, delegationFee, @@ -593,7 +583,6 @@ func CallAddValidator( ownerPrivateKey, validationID, extraAggregatorPeers, - aggregatorAllowPrivatePeers, aggregatorLogger, validatorManagerAddress, ) diff --git a/cmd/blockchaincmd/change_weight.go b/cmd/blockchaincmd/change_weight.go index 69137a38d..a7f2db788 100644 --- a/cmd/blockchaincmd/change_weight.go +++ b/cmd/blockchaincmd/change_weight.go @@ -6,6 +6,10 @@ import ( "fmt" "strings" + "github.com/ava-labs/avalanche-cli/pkg/signatureAggregator" + + "github.com/ava-labs/avalanche-cli/cmd/flags" + "github.com/ava-labs/avalanche-cli/pkg/blockchain" "github.com/ava-labs/avalanche-cli/pkg/cobrautils" "github.com/ava-labs/avalanche-cli/pkg/constants" @@ -34,10 +38,16 @@ import ( ) var ( - newWeight uint64 - initiateTxHash string + newWeight uint64 + initiateTxHash string + changeWeightFlags BlockchainChangeWeightFlags ) +type BlockchainChangeWeightFlags struct { + RPC string + SigAggFlags flags.SignatureAggregatorFlags +} + // avalanche blockchain addValidator func newChangeWeightCmd() *cobra.Command { cmd := &cobra.Command{ @@ -50,7 +60,8 @@ The L1 has to be a Proof of Authority L1.`, Args: cobrautils.ExactArgs(1), } networkoptions.AddNetworkFlagsToCmd(cmd, &globalNetworkFlags, true, networkoptions.DefaultSupportedNetworkOptions) - + flags.AddRPCFlagToCmd(cmd, app, &changeWeightFlags.RPC) + flags.AddSignatureAggregatorFlagsToCmd(cmd, &changeWeightFlags.SigAggFlags) cmd.Flags().StringVarP(&keyName, "key", "k", "", "select the key to use [fuji/devnet only]") cmd.Flags().Uint64Var(&newWeight, "weight", 0, "set the new staking weight of the validator") cmd.Flags().BoolVarP(&useEwoq, "ewoq", "e", false, "use ewoq key [fuji/devnet only]") @@ -60,11 +71,6 @@ The L1 has to be a Proof of Authority L1.`, cmd.Flags().StringSliceVar(&ledgerAddresses, "ledger-addrs", []string{}, "use the given ledger addresses") cmd.Flags().BoolVar(&externalValidatorManagerOwner, "external-evm-signature", false, "set this value to true when signing validator manager tx outside of cli (for multisig or ledger)") cmd.Flags().StringVar(&validatorManagerOwner, "validator-manager-owner", "", "force using this address to issue transactions to the validator manager") - cmd.Flags().StringSliceVar(&aggregatorExtraEndpoints, "aggregator-extra-endpoints", nil, "endpoints for extra nodes that are needed in signature aggregation") - cmd.Flags().BoolVar(&aggregatorAllowPrivatePeers, "aggregator-allow-private-peers", true, "allow the signature aggregator to connect to peers with private IP") - cmd.Flags().StringVar(&aggregatorLogLevel, "aggregator-log-level", constants.DefaultAggregatorLogLevel, "log level to use with signature aggregator") - cmd.Flags().BoolVar(&aggregatorLogToStdout, "aggregator-log-to-stdout", false, "use stdout for signature aggregator logs") - cmd.Flags().StringVar(&rpcURL, "rpc", "", "connect to validator manager at the given rpc endpoint") cmd.Flags().StringVar(&initiateTxHash, "initiate-tx-hash", "", "initiate tx is already issued, with the given hash") return cmd } @@ -150,8 +156,8 @@ func setWeight(_ *cobra.Command, args []string) error { BlockchainName: blockchainName, } - if rpcURL == "" { - rpcURL, _, err = contract.GetBlockchainEndpoints( + if changeWeightFlags.RPC == "" { + changeWeightFlags.RPC, _, err = contract.GetBlockchainEndpoints( app, network, chainSpec, @@ -166,7 +172,7 @@ func setWeight(_ *cobra.Command, args []string) error { return fmt.Errorf("unable to find Validator Manager address") } validatorManagerAddress = sc.Networks[network.Name()].ValidatorManagerAddress - validationID, err := validator.GetValidationID(rpcURL, common.HexToAddress(validatorManagerAddress), nodeID) + validationID, err := validator.GetValidationID(changeWeightFlags.RPC, common.HexToAddress(validatorManagerAddress), nodeID) if err != nil { return err } @@ -274,6 +280,7 @@ func setWeight(_ *cobra.Command, args []string) error { 0, // automatic uptime isBootstrapValidatorForNetwork(nodeID, sc.Networks[network.Name()]), false, // don't force + changeWeightFlags.RPC, ) if err != nil { return err @@ -304,6 +311,7 @@ func setWeight(_ *cobra.Command, args []string) error { remainingBalanceOwnerAddr, disableOwnerAddr, sc, + changeWeightFlags.RPC, ) } @@ -350,20 +358,17 @@ func changeWeightACP99( } validatorManagerAddress = sc.Networks[network.Name()].ValidatorManagerAddress - ux.Logger.PrintToUser(logging.Yellow.Wrap("RPC Endpoint: %s"), rpcURL) + ux.Logger.PrintToUser(logging.Yellow.Wrap("RPC Endpoint: %s"), changeWeightFlags.RPC) clusterName := sc.Networks[network.Name()].ClusterName - extraAggregatorPeers, err := blockchain.GetAggregatorExtraPeers(app, clusterName, aggregatorExtraEndpoints) + extraAggregatorPeers, err := blockchain.GetAggregatorExtraPeers(app, clusterName) if err != nil { return err } - aggregatorLogger, err := utils.NewLogger( - constants.SignatureAggregatorLogName, - aggregatorLogLevel, - constants.DefaultAggregatorLogLevel, + aggregatorLogger, err := signatureAggregator.NewSignatureAggregatorLoggerNewLogger( + changeWeightFlags.SigAggFlags.AggregatorLogLevel, + changeWeightFlags.SigAggFlags.AggregatorLogToStdout, app.GetAggregatorLogDir(clusterName), - aggregatorLogToStdout, - ux.Logger.PrintToUser, ) if err != nil { return err @@ -377,14 +382,13 @@ func changeWeightACP99( ux.Logger.PrintToUser, app, network, - rpcURL, + changeWeightFlags.RPC, chainSpec, externalValidatorManagerOwner, validatorManagerOwner, ownerPrivateKey, nodeID, extraAggregatorPeers, - aggregatorAllowPrivatePeers, aggregatorLogger, validatorManagerAddress, weight, @@ -428,14 +432,13 @@ func changeWeightACP99( aggregatorCtx, app, network, - rpcURL, + changeWeightFlags.RPC, chainSpec, externalValidatorManagerOwner, validatorManagerOwner, ownerPrivateKey, validationID, extraAggregatorPeers, - aggregatorAllowPrivatePeers, aggregatorLogger, validatorManagerAddress, signedMessage, diff --git a/cmd/blockchaincmd/convert.go b/cmd/blockchaincmd/convert.go index c1588afa5..8b5fa204f 100644 --- a/cmd/blockchaincmd/convert.go +++ b/cmd/blockchaincmd/convert.go @@ -10,6 +10,10 @@ import ( "strings" "time" + "github.com/ava-labs/avalanche-cli/pkg/signatureAggregator" + + "github.com/ava-labs/avalanche-cli/cmd/flags" + "github.com/ava-labs/avalanche-cli/pkg/blockchain" "github.com/ava-labs/avalanche-cli/pkg/cobrautils" "github.com/ava-labs/avalanche-cli/pkg/constants" @@ -42,7 +46,14 @@ import ( "github.com/spf13/cobra" ) -var doStrongInputChecks bool +var ( + doStrongInputChecks bool + convertFlags BlockchainConvertFlags +) + +type BlockchainConvertFlags struct { + SigAggFlags flags.SignatureAggregatorFlags +} // avalanche blockchain convert func newConvertCmd() *cobra.Command { @@ -60,6 +71,7 @@ Sovereign L1s require bootstrap validators. avalanche blockchain convert command Args: cobrautils.ExactArgs(1), } networkoptions.AddNetworkFlagsToCmd(cmd, &globalNetworkFlags, true, networkoptions.DefaultSupportedNetworkOptions) + flags.AddSignatureAggregatorFlagsToCmd(cmd, &convertFlags.SigAggFlags) cmd.Flags().StringVarP(&keyName, "key", "k", "", "select the key to use [fuji/devnet convert to l1 tx only]") cmd.Flags().StringSliceVar(&subnetAuthKeys, "auth-keys", nil, "control keys that will be used to authenticate convert to L1 tx") cmd.Flags().StringVar(&outputTxPath, "output-tx-path", "", "file path of the convert to L1 tx (for multi-sig)") @@ -70,10 +82,6 @@ Sovereign L1s require bootstrap validators. avalanche blockchain convert command cmd.Flags().BoolVar(&generateNodeID, "generate-node-id", false, "whether to create new node id for bootstrap validators (Node-ID and BLS values in bootstrap JSON file will be overridden if --bootstrap-filepath flag is used)") cmd.Flags().StringSliceVar(&bootstrapEndpoints, "bootstrap-endpoints", nil, "take validator node info from the given endpoints") cmd.Flags().BoolVar(&convertOnly, "convert-only", false, "avoid node track, restart and poa manager setup") - cmd.Flags().StringVar(&aggregatorLogLevel, "aggregator-log-level", constants.DefaultAggregatorLogLevel, "log level to use with signature aggregator") - cmd.Flags().BoolVar(&aggregatorLogToStdout, "aggregator-log-to-stdout", false, "use stdout for signature aggregator logs") - cmd.Flags().StringSliceVar(&aggregatorExtraEndpoints, "aggregator-extra-endpoints", nil, "endpoints for extra nodes that are needed in signature aggregation") - cmd.Flags().BoolVar(&aggregatorAllowPrivatePeers, "aggregator-allow-private-peers", true, "allow the signature aggregator to connect to peers with private IP") cmd.Flags().BoolVar(&useLocalMachine, "use-local-machine", false, "use local machine as a blockchain validator") cmd.Flags().IntVar(&numBootstrapValidators, "num-bootstrap-validators", 0, "(only if --generate-node-id is true) number of bootstrap validators to set up in sovereign L1 validator)") cmd.Flags().Float64Var( @@ -269,6 +277,7 @@ func InitializeValidatorManager( validatorManagerAddrStr string, proxyContractOwner string, useACP99 bool, + signatureAggregatorFlags flags.SignatureAggregatorFlags, ) (bool, error) { if useACP99 { ux.Logger.PrintToUser(logging.Yellow.Wrap("Validator Manager Protocol: ACP99")) @@ -357,7 +366,7 @@ func InitializeValidatorManager( } } - extraAggregatorPeers, err := blockchain.GetAggregatorExtraPeers(app, clusterName, aggregatorExtraEndpoints) + extraAggregatorPeers, err := blockchain.GetAggregatorExtraPeers(app, clusterName) if err != nil { return tracked, err } @@ -370,13 +379,10 @@ func InitializeValidatorManager( RPC: rpcURL, BootstrapValidators: avaGoBootstrapValidators, } - aggregatorLogger, err := utils.NewLogger( - constants.SignatureAggregatorLogName, - aggregatorLogLevel, - constants.DefaultAggregatorLogLevel, + aggregatorLogger, err := signatureAggregator.NewSignatureAggregatorLoggerNewLogger( + signatureAggregatorFlags.AggregatorLogLevel, + signatureAggregatorFlags.AggregatorLogToStdout, app.GetAggregatorLogDir(clusterName), - aggregatorLogToStdout, - ux.Logger.PrintToUser, ) if err != nil { return tracked, err @@ -391,7 +397,6 @@ func InitializeValidatorManager( network.SDKNetwork(), genesisPrivateKey, extraAggregatorPeers, - aggregatorAllowPrivatePeers, aggregatorLogger, validatorManagerSDK.PoSParams{ MinimumStakeAmount: big.NewInt(int64(poSMinimumStakeAmount)), @@ -416,7 +421,6 @@ func InitializeValidatorManager( network.SDKNetwork(), genesisPrivateKey, extraAggregatorPeers, - aggregatorAllowPrivatePeers, aggregatorLogger, validatorManagerAddrStr, useACP99, @@ -794,6 +798,7 @@ func convertBlockchain(_ *cobra.Command, args []string) error { validatorManagerAddress, sidecar.ProxyContractOwner, sidecar.UseACP99, + convertFlags.SigAggFlags, ); err != nil { return err } diff --git a/cmd/blockchaincmd/deploy.go b/cmd/blockchaincmd/deploy.go index ad813f04f..e8c00cf7f 100644 --- a/cmd/blockchaincmd/deploy.go +++ b/cmd/blockchaincmd/deploy.go @@ -10,6 +10,7 @@ import ( "os" "path/filepath" + "github.com/ava-labs/avalanche-cli/cmd/flags" "github.com/ava-labs/avalanche-cli/cmd/interchaincmd/messengercmd" "github.com/ava-labs/avalanche-cli/cmd/interchaincmd/relayercmd" "github.com/ava-labs/avalanche-cli/cmd/networkcmd" @@ -93,12 +94,17 @@ var ( poSWeightToValueFactor uint64 deployBalanceAVAX float64 validatorManagerAddress string + deployFlags BlockchainDeployFlags errMutuallyExlusiveControlKeys = errors.New("--control-keys and --same-control-key are mutually exclusive") ErrMutuallyExlusiveKeyLedger = errors.New("key source flags --key, --ledger/--ledger-addrs are mutually exclusive") ErrStoredKeyOnMainnet = errors.New("key --key is not available for mainnet operations") errMutuallyExlusiveSubnetFlags = errors.New("--subnet-only and --subnet-id are mutually exclusive") ) +type BlockchainDeployFlags struct { + SigAggFlags flags.SignatureAggregatorFlags +} + // avalanche blockchain deploy func newDeployCmd() *cobra.Command { cmd := &cobra.Command{ @@ -119,6 +125,7 @@ so you can take your locally tested Blockchain and deploy it on Fuji or Mainnet. Args: cobrautils.ExactArgs(1), } networkoptions.AddNetworkFlagsToCmd(cmd, &globalNetworkFlags, true, networkoptions.DefaultSupportedNetworkOptions) + flags.AddSignatureAggregatorFlagsToCmd(cmd, &deployFlags.SigAggFlags) cmd.Flags().StringVar( &userProvidedAvagoVersion, "avalanchego-version", @@ -178,10 +185,6 @@ so you can take your locally tested Blockchain and deploy it on Fuji or Mainnet. cmd.Flags().BoolVar(&generateNodeID, "generate-node-id", false, "whether to create new node id for bootstrap validators (Node-ID and BLS values in bootstrap JSON file will be overridden if --bootstrap-filepath flag is used)") cmd.Flags().StringSliceVar(&bootstrapEndpoints, "bootstrap-endpoints", nil, "take validator node info from the given endpoints") cmd.Flags().BoolVar(&convertOnly, "convert-only", false, "avoid node track, restart and poa manager setup") - cmd.Flags().StringVar(&aggregatorLogLevel, "aggregator-log-level", constants.DefaultAggregatorLogLevel, "log level to use with signature aggregator") - cmd.Flags().BoolVar(&aggregatorLogToStdout, "aggregator-log-to-stdout", false, "use stdout for signature aggregator logs") - cmd.Flags().StringSliceVar(&aggregatorExtraEndpoints, "aggregator-extra-endpoints", nil, "endpoints for extra nodes that are needed in signature aggregation") - cmd.Flags().BoolVar(&aggregatorAllowPrivatePeers, "aggregator-allow-private-peers", true, "allow the signature aggregator to connect to peers with private IP") cmd.Flags().BoolVar(&useLocalMachine, "use-local-machine", false, "use local machine as a blockchain validator") cmd.Flags().IntVar(&numBootstrapValidators, "num-bootstrap-validators", 0, "(only if --generate-node-id is true) number of bootstrap validators to set up in sovereign L1 validator)") cmd.Flags().Float64Var( @@ -830,6 +833,7 @@ func deployBlockchain(cmd *cobra.Command, args []string) error { validatorManagerStr, sidecar.ProxyContractOwner, sidecar.UseACP99, + deployFlags.SigAggFlags, ) if err != nil { return err diff --git a/cmd/blockchaincmd/remove_validator.go b/cmd/blockchaincmd/remove_validator.go index 89f42f8c2..7f07a948a 100644 --- a/cmd/blockchaincmd/remove_validator.go +++ b/cmd/blockchaincmd/remove_validator.go @@ -8,6 +8,10 @@ import ( "os" "strings" + "github.com/ava-labs/avalanche-cli/pkg/signatureAggregator" + + "github.com/ava-labs/avalanche-cli/cmd/flags" + "github.com/ava-labs/avalanche-cli/pkg/blockchain" "github.com/ava-labs/avalanche-cli/pkg/cobrautils" "github.com/ava-labs/avalanche-cli/pkg/constants" @@ -34,10 +38,16 @@ import ( ) var ( - uptimeSec uint64 - force bool + uptimeSec uint64 + force bool + removeValidatorFlags BlockchainRemoveValidatorFlags ) +type BlockchainRemoveValidatorFlags struct { + RPC string + SigAggFlags flags.SignatureAggregatorFlags +} + // avalanche blockchain removeValidator func newRemoveValidatorCmd() *cobra.Command { cmd := &cobra.Command{ @@ -52,6 +62,8 @@ these prompts by providing the values with flags.`, Args: cobrautils.ExactArgs(1), } networkoptions.AddNetworkFlagsToCmd(cmd, &globalNetworkFlags, false, networkoptions.DefaultSupportedNetworkOptions) + flags.AddRPCFlagToCmd(cmd, app, &removeValidatorFlags.RPC) + flags.AddSignatureAggregatorFlagsToCmd(cmd, &removeValidatorFlags.SigAggFlags) cmd.Flags().StringVarP(&keyName, "key", "k", "", "select the key to use [fuji deploy only]") cmd.Flags().StringSliceVar(&subnetAuthKeys, "auth-keys", nil, "(for non-SOV blockchain only) control keys that will be used to authenticate the removeValidator tx") cmd.Flags().StringVar(&outputTxPath, "output-tx-path", "", "(for non-SOV blockchain only) file path of the removeValidator tx") @@ -59,11 +71,6 @@ these prompts by providing the values with flags.`, cmd.Flags().StringSliceVar(&ledgerAddresses, "ledger-addrs", []string{}, "use the given ledger addresses") cmd.Flags().StringVar(&nodeIDStr, "node-id", "", "node-id of the validator") cmd.Flags().StringVar(&nodeEndpoint, "node-endpoint", "", "remove validator that responds to the given endpoint") - cmd.Flags().StringSliceVar(&aggregatorExtraEndpoints, "aggregator-extra-endpoints", nil, "endpoints for extra nodes that are needed in signature aggregation") - cmd.Flags().BoolVar(&aggregatorAllowPrivatePeers, "aggregator-allow-private-peers", true, "allow the signature aggregator to connect to peers with private IP") - cmd.Flags().StringVar(&rpcURL, "rpc", "", "connect to validator manager at the given rpc endpoint") - cmd.Flags().StringVar(&aggregatorLogLevel, "aggregator-log-level", constants.DefaultAggregatorLogLevel, "log level to use with signature aggregator") - cmd.Flags().BoolVar(&aggregatorLogToStdout, "aggregator-log-to-stdout", false, "use stdout for signature aggregator logs") cmd.Flags().Uint64Var(&uptimeSec, "uptime", 0, "validator's uptime in seconds. If not provided, it will be automatically calculated") cmd.Flags().BoolVar(&force, "force", false, "force validator removal even if it's not getting rewarded") cmd.Flags().BoolVar(&externalValidatorManagerOwner, "external-evm-signature", false, "set this value to true when signing validator manager tx outside of cli (for multisig or ledger)") @@ -145,6 +152,21 @@ func removeValidator(_ *cobra.Command, args []string) error { } } + if sc.Sovereign && removeValidatorFlags.RPC == "" { + removeValidatorFlags.RPC, _, err = contract.GetBlockchainEndpoints( + app, + network, + contract.ChainSpec{ + BlockchainName: blockchainName, + }, + true, + false, + ) + if err != nil { + return err + } + } + validatorKind, err := validatorsdk.IsSovereignValidator(network.SDKNetwork(), subnetID, nodeID) if err != nil { return err @@ -152,23 +174,9 @@ func removeValidator(_ *cobra.Command, args []string) error { if validatorKind == validatorsdk.NonValidator { // it may be unregistered from P-Chain, but registered on validator manager // due to a previous partial removal operation - if rpcURL == "" { - rpcURL, _, err = contract.GetBlockchainEndpoints( - app, - network, - contract.ChainSpec{ - BlockchainName: blockchainName, - }, - true, - false, - ) - if err != nil { - return err - } - } validatorManagerAddress = sc.Networks[network.Name()].ValidatorManagerAddress validationID, err := validatorsdk.GetValidationID( - rpcURL, + removeValidatorFlags.RPC, common.HexToAddress(validatorManagerAddress), nodeID, ) @@ -221,6 +229,7 @@ func removeValidator(_ *cobra.Command, args []string) error { uptimeSec, isBootstrapValidatorForNetwork(nodeID, scNetwork), force, + removeValidatorFlags.RPC, ); err != nil { return err } @@ -258,6 +267,7 @@ func removeValidatorSOV( uptimeSec uint64, isBootstrapValidator bool, force bool, + rpcURL string, ) error { chainSpec := contract.ChainSpec{ BlockchainName: blockchainName, @@ -302,32 +312,17 @@ func removeValidatorSOV( } validatorManagerAddress = sc.Networks[network.Name()].ValidatorManagerAddress - if rpcURL == "" { - rpcURL, _, err = contract.GetBlockchainEndpoints( - app, - network, - chainSpec, - true, - false, - ) - if err != nil { - return err - } - } ux.Logger.PrintToUser(logging.Yellow.Wrap("RPC Endpoint: %s"), rpcURL) clusterName := sc.Networks[network.Name()].ClusterName - extraAggregatorPeers, err := blockchain.GetAggregatorExtraPeers(app, clusterName, aggregatorExtraEndpoints) + extraAggregatorPeers, err := blockchain.GetAggregatorExtraPeers(app, clusterName) if err != nil { return err } - aggregatorLogger, err := utils.NewLogger( - constants.SignatureAggregatorLogName, - aggregatorLogLevel, - constants.DefaultAggregatorLogLevel, + aggregatorLogger, err := signatureAggregator.NewSignatureAggregatorLoggerNewLogger( + removeValidatorFlags.SigAggFlags.AggregatorLogLevel, + removeValidatorFlags.SigAggFlags.AggregatorLogToStdout, app.GetAggregatorLogDir(clusterName), - aggregatorLogToStdout, - ux.Logger.PrintToUser, ) if err != nil { return err @@ -351,7 +346,6 @@ func removeValidatorSOV( ownerPrivateKey, nodeID, extraAggregatorPeers, - aggregatorAllowPrivatePeers, aggregatorLogger, sc.PoS(), uptimeSec, @@ -382,7 +376,6 @@ func removeValidatorSOV( ownerPrivateKey, nodeID, extraAggregatorPeers, - aggregatorAllowPrivatePeers, aggregatorLogger, sc.PoS(), uptimeSec, @@ -430,7 +423,6 @@ func removeValidatorSOV( ownerPrivateKey, validationID, extraAggregatorPeers, - aggregatorAllowPrivatePeers, aggregatorLogger, validatorManagerAddress, sc.PoA() && sc.UseACP99, diff --git a/cmd/contractcmd/init_validator_manager.go b/cmd/contractcmd/init_validator_manager.go index 438603df9..a0b7a3601 100644 --- a/cmd/contractcmd/init_validator_manager.go +++ b/cmd/contractcmd/init_validator_manager.go @@ -6,6 +6,10 @@ import ( "fmt" "math/big" + "github.com/ava-labs/avalanche-cli/pkg/signatureAggregator" + + "github.com/ava-labs/avalanche-cli/cmd/flags" + "github.com/ava-labs/avalanche-cli/pkg/blockchain" "github.com/ava-labs/avalanche-cli/cmd/blockchaincmd" @@ -15,7 +19,6 @@ import ( "github.com/ava-labs/avalanche-cli/pkg/models" "github.com/ava-labs/avalanche-cli/pkg/networkoptions" "github.com/ava-labs/avalanche-cli/pkg/prompts" - "github.com/ava-labs/avalanche-cli/pkg/utils" "github.com/ava-labs/avalanche-cli/pkg/ux" "github.com/ava-labs/avalanche-cli/pkg/validatormanager" blockchainSDK "github.com/ava-labs/avalanche-cli/sdk/blockchain" @@ -28,16 +31,6 @@ import ( "github.com/spf13/cobra" ) -type ValidatorManagerFlags struct { - Network networkoptions.NetworkFlags - PrivateKeyFlags contract.PrivateKeyFlags - rpcEndpoint string - aggregatorLogLevel string - aggregatorLogToStdout bool - aggregatorExtraEndpoints []string - aggregatorAllowPrivatePeers bool -} - type POSManagerSpecFlags struct { rewardCalculatorAddress string minimumStakeAmount uint64 // big.Int @@ -49,11 +42,18 @@ type POSManagerSpecFlags struct { } var ( - validatorManagerFlags ValidatorManagerFlags - initPOSManagerFlags POSManagerSpecFlags - validatorManagerAddress string + initPOSManagerFlags POSManagerSpecFlags + validatorManagerAddress string + network networkoptions.NetworkFlags + privateKeyFlags contract.PrivateKeyFlags + initValidatorManagerFlags ContractInitValidatorManagerFlags ) +type ContractInitValidatorManagerFlags struct { + RPC string + SigAggFlags flags.SignatureAggregatorFlags +} + // avalanche contract initValidatorManager func newInitValidatorManagerCmd() *cobra.Command { cmd := &cobra.Command{ @@ -63,13 +63,10 @@ func newInitValidatorManagerCmd() *cobra.Command { RunE: initValidatorManager, Args: cobrautils.ExactArgs(1), } - networkoptions.AddNetworkFlagsToCmd(cmd, &validatorManagerFlags.Network, true, networkoptions.DefaultSupportedNetworkOptions) - validatorManagerFlags.PrivateKeyFlags.AddToCmd(cmd, "as contract deployer") - cmd.Flags().StringVar(&validatorManagerFlags.rpcEndpoint, "rpc", "", "deploy the contract into the given rpc endpoint") - cmd.Flags().StringSliceVar(&validatorManagerFlags.aggregatorExtraEndpoints, "aggregator-extra-endpoints", nil, "endpoints for extra nodes that are needed in signature aggregation") - cmd.Flags().BoolVar(&validatorManagerFlags.aggregatorAllowPrivatePeers, "aggregator-allow-private-peers", true, "allow the signature aggregator to connect to peers with private IP") - cmd.Flags().StringVar(&validatorManagerFlags.aggregatorLogLevel, "aggregator-log-level", constants.DefaultAggregatorLogLevel, "log level to use with signature aggregator") - cmd.Flags().BoolVar(&validatorManagerFlags.aggregatorLogToStdout, "aggregator-log-to-stdout", false, "dump signature aggregator logs to stdout") + networkoptions.AddNetworkFlagsToCmd(cmd, &network, true, networkoptions.DefaultSupportedNetworkOptions) + privateKeyFlags.AddToCmd(cmd, "as contract deployer") + flags.AddRPCFlagToCmd(cmd, app, &initValidatorManagerFlags.RPC) + flags.AddSignatureAggregatorFlagsToCmd(cmd, &initValidatorManagerFlags.SigAggFlags) cmd.Flags().StringVar(&initPOSManagerFlags.rewardCalculatorAddress, "pos-reward-calculator-address", "", "(PoS only) initialize the ValidatorManager with reward calculator address") cmd.Flags().Uint64Var(&initPOSManagerFlags.minimumStakeAmount, "pos-minimum-stake-amount", 1, "(PoS only) minimum stake amount") @@ -89,7 +86,7 @@ func initValidatorManager(_ *cobra.Command, args []string) error { network, err := networkoptions.GetNetworkFromCmdLineFlags( app, "", - validatorManagerFlags.Network, + network, true, false, networkoptions.DefaultSupportedNetworkOptions, @@ -101,8 +98,8 @@ func initValidatorManager(_ *cobra.Command, args []string) error { if network.ClusterName != "" { network = models.ConvertClusterToNetwork(network) } - if validatorManagerFlags.rpcEndpoint == "" { - validatorManagerFlags.rpcEndpoint, _, err = contract.GetBlockchainEndpoints( + if initValidatorManagerFlags.RPC == "" { + initValidatorManagerFlags.RPC, _, err = contract.GetBlockchainEndpoints( app, network, chainSpec, @@ -113,7 +110,7 @@ func initValidatorManager(_ *cobra.Command, args []string) error { return err } } - ux.Logger.PrintToUser(logging.Yellow.Wrap("RPC Endpoint: %s"), validatorManagerFlags.rpcEndpoint) + ux.Logger.PrintToUser(logging.Yellow.Wrap("RPC Endpoint: %s"), initValidatorManagerFlags.RPC) genesisAddress, genesisPrivateKey, err := contract.GetEVMSubnetPrefundedKey( app, network, @@ -122,7 +119,7 @@ func initValidatorManager(_ *cobra.Command, args []string) error { if err != nil { return err } - privateKey, err := validatorManagerFlags.PrivateKeyFlags.GetPrivateKey(app, genesisPrivateKey) + privateKey, err := privateKeyFlags.GetPrivateKey(app, genesisPrivateKey) if err != nil { return err } @@ -157,17 +154,14 @@ func initValidatorManager(_ *cobra.Command, args []string) error { return err } clusterName := scNetwork.ClusterName - extraAggregatorPeers, err := blockchain.GetAggregatorExtraPeers(app, clusterName, validatorManagerFlags.aggregatorExtraEndpoints) + extraAggregatorPeers, err := blockchain.GetAggregatorExtraPeers(app, clusterName) if err != nil { return err } - aggregatorLogger, err := utils.NewLogger( - constants.SignatureAggregatorLogName, - validatorManagerFlags.aggregatorLogLevel, - constants.DefaultAggregatorLogLevel, + aggregatorLogger, err := signatureAggregator.NewSignatureAggregatorLoggerNewLogger( + initValidatorManagerFlags.SigAggFlags.AggregatorLogLevel, + initValidatorManagerFlags.SigAggFlags.AggregatorLogToStdout, app.GetAggregatorLogDir(clusterName), - validatorManagerFlags.aggregatorLogToStdout, - ux.Logger.PrintToUser, ) if err != nil { return err @@ -194,13 +188,14 @@ func initValidatorManager(_ *cobra.Command, args []string) error { BlockchainID: blockchainID, BootstrapValidators: avaGoBootstrapValidators, OwnerAddress: &ownerAddress, - RPC: validatorManagerFlags.rpcEndpoint, + RPC: initValidatorManagerFlags.RPC, } aggregatorCtx, aggregatorCancel := sdkutils.GetTimedContext(constants.SignatureAggregatorTimeout) defer aggregatorCancel() switch { case sc.PoA(): // PoA ux.Logger.PrintToUser(logging.Yellow.Wrap("Initializing Proof of Authority Validator Manager contract on blockchain %s"), blockchainName) + if err := validatormanager.SetupPoA( aggregatorCtx, app.Log, @@ -208,7 +203,6 @@ func initValidatorManager(_ *cobra.Command, args []string) error { network, privateKey, extraAggregatorPeers, - validatorManagerFlags.aggregatorAllowPrivatePeers, aggregatorLogger, validatorManagerAddress, sc.UseACP99, @@ -217,7 +211,7 @@ func initValidatorManager(_ *cobra.Command, args []string) error { } ux.Logger.GreenCheckmarkToUser("Proof of Authority Validator Manager contract successfully initialized on blockchain %s", blockchainName) case sc.PoS(): // PoS - deployed, err := validatormanager.ProxyHasValidatorManagerSet(validatorManagerFlags.rpcEndpoint) + deployed, err := validatormanager.ProxyHasValidatorManagerSet(initValidatorManagerFlags.RPC) if err != nil { return err } @@ -234,7 +228,7 @@ func initValidatorManager(_ *cobra.Command, args []string) error { return err } if _, err := validatormanager.DeployAndRegisterPoSValidatorManagerContrac( - validatorManagerFlags.rpcEndpoint, + initValidatorManagerFlags.RPC, genesisPrivateKey, proxyOwnerPrivateKey, ); err != nil { @@ -252,7 +246,6 @@ func initValidatorManager(_ *cobra.Command, args []string) error { network, privateKey, extraAggregatorPeers, - validatorManagerFlags.aggregatorAllowPrivatePeers, aggregatorLogger, validatorManagerSDK.PoSParams{ MinimumStakeAmount: big.NewInt(int64(initPOSManagerFlags.minimumStakeAmount)), diff --git a/cmd/flags/blockchain.go b/cmd/flags/blockchain.go new file mode 100644 index 000000000..29c465d2e --- /dev/null +++ b/cmd/flags/blockchain.go @@ -0,0 +1,49 @@ +// Copyright (C) 2022, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. +package flags + +import ( + "github.com/ava-labs/avalanche-cli/pkg/application" + "github.com/ava-labs/avalanche-cli/pkg/prompts" + "github.com/spf13/cobra" +) + +const ( + rpcURLFLag = "rpc" +) + +func AddRPCFlagToCmd(cmd *cobra.Command, app *application.Avalanche, rpc *string) { + cmd.Flags().StringVar(rpc, rpcURLFLag, "", "blockchain rpc endpoint") + + rpcPreRun := func(cmd *cobra.Command, args []string) error { + if err := ValidateRPC(app, rpc, cmd, args); err != nil { + return err + } + return nil + } + + existingPreRunE := cmd.PreRunE + cmd.PreRunE = func(cmd *cobra.Command, args []string) error { + if existingPreRunE != nil { + if err := existingPreRunE(cmd, args); err != nil { + return err + } + } + return rpcPreRun(cmd, args) + } +} + +func ValidateRPC(app *application.Avalanche, rpc *string, cmd *cobra.Command, args []string) error { + var err error + // TODO: modify check below to extend prompting for rpc to commands other than addValidator + if *rpc == "" { + if cmd.Name() == "addValidator" && len(args) == 0 { + *rpc, err = app.Prompt.CaptureURL("What is the RPC endpoint?", false) + if err != nil { + return err + } + } + return nil + } + return prompts.ValidateURLFormat(*rpc) +} diff --git a/cmd/flags/blockchain_test.go b/cmd/flags/blockchain_test.go new file mode 100644 index 000000000..97d0753c4 --- /dev/null +++ b/cmd/flags/blockchain_test.go @@ -0,0 +1,165 @@ +// Copyright (C) 2022, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. +package flags + +import ( + "fmt" + "testing" + + "github.com/ava-labs/avalanche-cli/internal/mocks" + "github.com/ava-labs/avalanche-cli/pkg/application" + "github.com/spf13/cobra" + "github.com/stretchr/testify/require" +) + +func TestValidateRPC(t *testing.T) { + tests := []struct { + name string + rpcURL string + cmdName string + args []string + promptURL string + promptError error + wantError bool + shouldPrompt bool + expectedRPCURL string + }{ + // URL validation test cases + { + name: "Valid HTTP URL", + rpcURL: "http://localhost:9650", + cmdName: "testcmd", + args: []string{}, + wantError: false, + shouldPrompt: false, + expectedRPCURL: "http://localhost:9650", + }, + { + name: "Valid HTTPS URL", + rpcURL: "https://api.avax.network:9650", + cmdName: "testcmd", + args: []string{}, + wantError: false, + shouldPrompt: false, + expectedRPCURL: "https://api.avax.network:9650", + }, + { + name: "Invalid URL - no protocol", + rpcURL: "localhost:9650", + cmdName: "testcmd", + args: []string{}, + wantError: false, + shouldPrompt: false, + expectedRPCURL: "localhost:9650", + }, + { + name: "Invalid URL - malformed", + rpcURL: "http://invalid url", + cmdName: "testcmd", + args: []string{}, + wantError: true, + shouldPrompt: false, + expectedRPCURL: "http://invalid url", + }, + // Command-specific test cases + { + name: "addValidator command with empty URL - valid prompt response", + rpcURL: "", + cmdName: "addValidator", + args: []string{}, + promptURL: "https://api.avax.network:9650", + promptError: nil, + wantError: false, + shouldPrompt: true, + expectedRPCURL: "https://api.avax.network:9650", + }, + { + name: "addValidator command with empty URL - invalid prompt response", + rpcURL: "", + cmdName: "addValidator", + args: []string{}, + promptURL: "invalid-url", + promptError: fmt.Errorf("invalid URL"), + wantError: true, + shouldPrompt: true, + expectedRPCURL: "invalid-url", + }, + { + name: "addValidator command with args", + rpcURL: "", + cmdName: "addValidator", + args: []string{"arg1"}, + wantError: false, + shouldPrompt: false, + expectedRPCURL: "", + }, + { + name: "addValidator command with valid URL", + rpcURL: "https://api.avax.network:9650", + cmdName: "addValidator", + args: []string{}, + wantError: false, + shouldPrompt: false, + expectedRPCURL: "https://api.avax.network:9650", + }, + { + name: "non-addValidator command with empty URL", + rpcURL: "", + cmdName: "otherCommand", + args: []string{}, + wantError: false, + shouldPrompt: false, + expectedRPCURL: "", + }, + { + name: "non-addValidator command with valid URL", + rpcURL: "https://api.avax.network:9650", + cmdName: "otherCommand", + args: []string{}, + wantError: false, + shouldPrompt: false, + expectedRPCURL: "https://api.avax.network:9650", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + require := require.New(t) + + // Create and configure mock prompter if needed + mockPrompter := mocks.Prompter{} + if tt.cmdName == "addValidator" && len(tt.args) == 0 && tt.rpcURL == "" { + mockPrompter.On("CaptureURL", "What is the RPC endpoint?", false). + Return(tt.promptURL, tt.promptError) + } + + app := &application.Avalanche{ + Prompt: &mockPrompter, + } + cmd := &cobra.Command{Use: tt.cmdName} + + rpcValue := tt.rpcURL + err := ValidateRPC(app, &rpcValue, cmd, tt.args) + + // Check error expectation + if tt.wantError { + require.Error(err) + } else { + require.NoError(err) + } + + // Verify prompt expectations + mockPrompter.AssertExpectations(t) + + // Verify prompt calls + if tt.shouldPrompt { + mockPrompter.AssertCalled(t, "CaptureURL", "What is the RPC endpoint?", false) + } else { + mockPrompter.AssertNotCalled(t, "CaptureURL", "What is the RPC endpoint?", false) + } + + // Verify final RPC URL value + require.Equal(tt.expectedRPCURL, rpcValue, "RPC URL value mismatch") + }) + } +} diff --git a/cmd/flags/signature_aggregator.go b/cmd/flags/signature_aggregator.go new file mode 100644 index 000000000..7b906bfbc --- /dev/null +++ b/cmd/flags/signature_aggregator.go @@ -0,0 +1,61 @@ +// Copyright (C) 2022, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. +package flags + +import ( + "fmt" + + "github.com/ava-labs/avalanche-cli/pkg/constants" + "github.com/ava-labs/avalanchego/utils/logging" + "github.com/spf13/cobra" +) + +const ( + aggregatorLogLevelFlag = "aggregator-log-level" + aggregatorLogToStdoutFlag = "aggregator-log-to-stdout" +) + +type SignatureAggregatorFlags struct { + AggregatorLogLevel string + AggregatorLogToStdout bool +} + +func validateSignatureAggregatorFlags(sigAggFlags SignatureAggregatorFlags) error { + if _, err := logging.ToLevel(sigAggFlags.AggregatorLogLevel); err != nil { + return fmt.Errorf( + "invalid log level: %q. Available values: %s, %s, %s, %s, %s, %s, %s, %s", + sigAggFlags.AggregatorLogLevel, + logging.Info.LowerString(), + logging.Warn.LowerString(), + logging.Error.LowerString(), + logging.Off.LowerString(), + logging.Fatal.LowerString(), + logging.Debug.LowerString(), + logging.Trace.LowerString(), + logging.Verbo.LowerString(), + ) + } + return nil +} + +func AddSignatureAggregatorFlagsToCmd(cmd *cobra.Command, sigAggFlags *SignatureAggregatorFlags) { + cmd.Flags().StringVar(&sigAggFlags.AggregatorLogLevel, aggregatorLogLevelFlag, constants.DefaultAggregatorLogLevel, "log level to use with signature aggregator") + sigAggPreRun := func(_ *cobra.Command, _ []string) error { + if err := validateSignatureAggregatorFlags(*sigAggFlags); err != nil { + return err + } + return nil + } + + existingPreRunE := cmd.PreRunE + cmd.PreRunE = func(cmd *cobra.Command, args []string) error { + if existingPreRunE != nil { + if err := existingPreRunE(cmd, args); err != nil { + return err + } + } + return sigAggPreRun(cmd, args) + } + + cmd.Flags().BoolVar(&sigAggFlags.AggregatorLogToStdout, aggregatorLogToStdoutFlag, false, "use stdout for signature aggregator logs") +} diff --git a/cmd/nodecmd/local.go b/cmd/nodecmd/local.go index f71d8f7ce..9832d7bd7 100644 --- a/cmd/nodecmd/local.go +++ b/cmd/nodecmd/local.go @@ -8,6 +8,9 @@ import ( "strings" "time" + "github.com/ava-labs/avalanche-cli/pkg/signatureAggregator" + + "github.com/ava-labs/avalanche-cli/cmd/flags" "github.com/ava-labs/avalanche-cli/pkg/blockchain" "github.com/ava-labs/avalanche-cli/pkg/cobrautils" "github.com/ava-labs/avalanche-cli/pkg/constants" @@ -50,12 +53,9 @@ var ( nodeConfigPath string partialSync bool stakeAmount uint64 - rpcURL string balanceAVAX float64 remainingBalanceOwnerAddr string disableOwnerAddr string - aggregatorLogLevel string - aggregatorLogToStdout bool delegationFee uint16 minimumStakeDuration uint64 latestAvagoReleaseVersion bool @@ -64,6 +64,7 @@ var ( useACP99 bool httpPorts []uint stakingPorts []uint + localValidateFlags NodeLocalValidateFlags ) // const snapshotName = "local_snapshot" @@ -346,6 +347,11 @@ func notImplementedForLocal(what string) error { return nil } +type NodeLocalValidateFlags struct { + RPC string + SigAggFlags flags.SignatureAggregatorFlags +} + func newLocalValidateCmd() *cobra.Command { cmd := &cobra.Command{ Use: "validate [clusterName]", @@ -357,15 +363,13 @@ This command can only be used to validate Proof of Stake L1.`, Args: cobra.ExactArgs(1), RunE: localValidate, } - + flags.AddRPCFlagToCmd(cmd, app, &localValidateFlags.RPC) + flags.AddSignatureAggregatorFlagsToCmd(cmd, &localValidateFlags.SigAggFlags) cmd.Flags().StringVar(&blockchainName, "l1", "", "specify the blockchain the node is syncing with") cmd.Flags().StringVar(&blockchainName, "blockchain", "", "specify the blockchain the node is syncing with") cmd.Flags().Uint64Var(&stakeAmount, "stake-amount", 0, "amount of tokens to stake") - cmd.Flags().StringVar(&rpcURL, "rpc", "", "connect to validator manager at the given rpc endpoint") cmd.Flags().Float64Var(&balanceAVAX, "balance", 0, "amount of AVAX to increase validator's balance by") cmd.Flags().Uint16Var(&delegationFee, "delegation-fee", 100, "delegation fee (in bips)") - cmd.Flags().StringVar(&aggregatorLogLevel, "aggregator-log-level", constants.DefaultAggregatorLogLevel, "log level to use with signature aggregator") - cmd.Flags().BoolVar(&aggregatorLogToStdout, "aggregator-log-to-stdout", false, "use stdout for signature aggregator logs") cmd.Flags().StringVar(&remainingBalanceOwnerAddr, "remaining-balance-owner", "", "P-Chain address that will receive any leftover AVAX from the validator when it is removed from Subnet") cmd.Flags().StringVar(&disableOwnerAddr, "disable-owner", "", "P-Chain address that will able to disable the validator with a P-Chain transaction") cmd.Flags().Uint64Var(&minimumStakeDuration, "minimum-stake-duration", constants.PoSL1MinimumStakeDurationSeconds, "minimum stake duration (in seconds)") @@ -435,13 +439,13 @@ func localValidate(_ *cobra.Command, args []string) error { } } - if rpcURL == "" { - rpcURL, err = app.Prompt.CaptureURL("What is the RPC endpoint?", false) + if localValidateFlags.RPC == "" { + localValidateFlags.RPC, err = app.Prompt.CaptureURL("What is the RPC endpoint?", false) if err != nil { return err } } - _, blockchainID, err := utils.SplitAvalanchegoRPCURI(rpcURL) + _, blockchainID, err := utils.SplitAvalanchegoRPCURI(localValidateFlags.RPC) // if there is error that means RPC URL did not contain blockchain in it // RPC might be in the format of something like https://etna.avax-dev.network // We will prompt for blockchainID in that case @@ -528,17 +532,14 @@ func localValidate(_ *cobra.Command, args []string) error { return err } - extraAggregatorPeers, err := blockchain.GetAggregatorExtraPeers(app, clusterName, []string{}) + extraAggregatorPeers, err := blockchain.GetAggregatorExtraPeers(app, clusterName) if err != nil { return err } - aggregatorLogger, err := utils.NewLogger( - constants.SignatureAggregatorLogName, - aggregatorLogLevel, - constants.DefaultAggregatorLogLevel, + aggregatorLogger, err := signatureAggregator.NewSignatureAggregatorLoggerNewLogger( + localValidateFlags.SigAggFlags.AggregatorLogLevel, + localValidateFlags.SigAggFlags.AggregatorLogToStdout, app.GetAggregatorLogDir(clusterName), - aggregatorLogToStdout, - ux.Logger.PrintToUser, ) if err != nil { return err @@ -622,7 +623,7 @@ func addAsValidator( aggregatorCtx, app, network, - rpcURL, + localValidateFlags.RPC, chainSpec, false, "", @@ -634,7 +635,6 @@ func addAsValidator( disableOwners, 0, extraAggregatorPeers, - true, aggregatorLogger, true, delegationFee, @@ -670,14 +670,13 @@ func addAsValidator( aggregatorCtx, app, network, - rpcURL, + localValidateFlags.RPC, chainSpec, false, "", payerPrivateKey, validationID, extraAggregatorPeers, - true, aggregatorLogger, validatorManagerAddress, ); err != nil { diff --git a/pkg/blockchain/helper.go b/pkg/blockchain/helper.go index f96a370d1..871b14e2a 100644 --- a/pkg/blockchain/helper.go +++ b/pkg/blockchain/helper.go @@ -25,13 +25,11 @@ import ( func GetAggregatorExtraPeers( app *application.Avalanche, clusterName string, - extraURIs []string, ) ([]info.Peer, error) { uris, err := GetAggregatorNetworkUris(app, clusterName) if err != nil { return nil, err } - uris = append(uris, extraURIs...) urisSet := set.Of(uris...) uris = urisSet.List() return UrisToPeers(uris) diff --git a/pkg/prompts/prompts.go b/pkg/prompts/prompts.go index a8342e607..21fb59c7b 100644 --- a/pkg/prompts/prompts.go +++ b/pkg/prompts/prompts.go @@ -700,7 +700,7 @@ func (*realPrompter) CaptureURL(promptStr string, validateConnection bool) (stri for { prompt := promptui.Prompt{ Label: promptStr, - Validate: validateURLFormat, + Validate: ValidateURLFormat, } str, err := prompt.Run() if err != nil { @@ -783,7 +783,7 @@ func (*realPrompter) CaptureValidatedString(promptStr string, validator func(str func (*realPrompter) CaptureGitURL(promptStr string) (*url.URL, error) { prompt := promptui.Prompt{ Label: promptStr, - Validate: validateURLFormat, + Validate: ValidateURLFormat, } str, err := prompt.Run() diff --git a/pkg/prompts/validations.go b/pkg/prompts/validations.go index 144befeee..6f9fbf76d 100644 --- a/pkg/prompts/validations.go +++ b/pkg/prompts/validations.go @@ -179,7 +179,7 @@ func validateBiggerThanZero(input string) error { return nil } -func validateURLFormat(input string) error { +func ValidateURLFormat(input string) error { _, err := url.ParseRequestURI(input) if err != nil { return err @@ -355,7 +355,7 @@ func RequestURL(url string) (*http.Response, error) { } func ValidateURL(url string) error { - if err := validateURLFormat(url); err != nil { + if err := ValidateURLFormat(url); err != nil { return err } resp, err := RequestURL(url) diff --git a/pkg/signatureAggregator/signature-aggregator.go b/pkg/signatureAggregator/signature-aggregator.go new file mode 100644 index 000000000..a2c9ff587 --- /dev/null +++ b/pkg/signatureAggregator/signature-aggregator.go @@ -0,0 +1,25 @@ +// Copyright (C) 2022, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. +package signatureAggregator + +import ( + "github.com/ava-labs/avalanche-cli/pkg/constants" + "github.com/ava-labs/avalanche-cli/pkg/utils" + "github.com/ava-labs/avalanche-cli/pkg/ux" + "github.com/ava-labs/avalanchego/utils/logging" +) + +func NewSignatureAggregatorLoggerNewLogger( + aggregatorLogLevel string, + aggregatorLogToStdout bool, + logDir string, +) (logging.Logger, error) { + return utils.NewLogger( + constants.SignatureAggregatorLogName, + aggregatorLogLevel, + constants.DefaultAggregatorLogLevel, + logDir, + aggregatorLogToStdout, + ux.Logger.PrintToUser, + ) +} diff --git a/pkg/validatormanager/registration.go b/pkg/validatormanager/registration.go index ed08f0c96..c949393cf 100644 --- a/pkg/validatormanager/registration.go +++ b/pkg/validatormanager/registration.go @@ -180,7 +180,6 @@ func GetRegisterL1ValidatorMessage( network models.Network, aggregatorLogger logging.Logger, aggregatorQuorumPercentage uint64, - aggregatorAllowPrivateIPs bool, aggregatorExtraPeerEndpoints []info.Peer, subnetID ids.ID, blockchainID ids.ID, @@ -275,7 +274,6 @@ func GetRegisterL1ValidatorMessage( aggregatorLogger, subnetID, aggregatorQuorumPercentage, - aggregatorAllowPrivateIPs, aggregatorExtraPeerEndpoints, ) if err != nil { @@ -308,7 +306,6 @@ func GetPChainL1ValidatorRegistrationMessage( rpcURL string, aggregatorLogger logging.Logger, aggregatorQuorumPercentage uint64, - aggregatorAllowPrivateIPs bool, aggregatorExtraPeerEndpoints []info.Peer, subnetID ids.ID, validationID ids.ID, @@ -339,7 +336,6 @@ func GetPChainL1ValidatorRegistrationMessage( aggregatorLogger, subnetID, aggregatorQuorumPercentage, - aggregatorAllowPrivateIPs, aggregatorExtraPeerEndpoints, ) if err != nil { @@ -395,7 +391,6 @@ func InitValidatorRegistration( disableOwners warpMessage.PChainOwner, weight uint64, aggregatorExtraPeerEndpoints []info.Peer, - aggregatorAllowPrivatePeers bool, aggregatorLogger logging.Logger, isPos bool, delegationFee uint16, @@ -506,7 +501,6 @@ func InitValidatorRegistration( network, aggregatorLogger, 0, - aggregatorAllowPrivatePeers, aggregatorExtraPeerEndpoints, subnetID, blockchainID, @@ -536,7 +530,6 @@ func FinishValidatorRegistration( privateKey string, validationID ids.ID, aggregatorExtraPeerEndpoints []info.Peer, - aggregatorAllowPrivatePeers bool, aggregatorLogger logging.Logger, validatorManagerAddressStr string, ) (*types.Transaction, error) { @@ -555,7 +548,6 @@ func FinishValidatorRegistration( rpcURL, aggregatorLogger, 0, - aggregatorAllowPrivatePeers, aggregatorExtraPeerEndpoints, subnetID, validationID, diff --git a/pkg/validatormanager/removal.go b/pkg/validatormanager/removal.go index f7bf4ca03..904ea399c 100644 --- a/pkg/validatormanager/removal.go +++ b/pkg/validatormanager/removal.go @@ -137,7 +137,6 @@ func GetUptimeProofMessage( aggregatorLogger, subnetID, aggregatorQuorumPercentage, - true, // allow private peers aggregatorExtraPeerEndpoints, ) if err != nil { @@ -157,7 +156,6 @@ func InitValidatorRemoval( ownerPrivateKey string, nodeID ids.NodeID, aggregatorExtraPeerEndpoints []info.Peer, - aggregatorAllowPrivatePeers bool, aggregatorLogger logging.Logger, isPoS bool, uptimeSec uint64, @@ -280,7 +278,6 @@ func InitValidatorRemoval( network, aggregatorLogger, 0, - aggregatorAllowPrivatePeers, aggregatorExtraPeerEndpoints, unsignedMessage, subnetID, @@ -343,7 +340,6 @@ func FinishValidatorRemoval( privateKey string, validationID ids.ID, aggregatorExtraPeerEndpoints []info.Peer, - aggregatorAllowPrivatePeers bool, aggregatorLogger logging.Logger, validatorManagerAddressStr string, useACP99 bool, @@ -363,7 +359,6 @@ func FinishValidatorRemoval( rpcURL, aggregatorLogger, 0, - aggregatorAllowPrivatePeers, aggregatorExtraPeerEndpoints, subnetID, validationID, diff --git a/pkg/validatormanager/validatormanager.go b/pkg/validatormanager/validatormanager.go index c68c2a374..49837468a 100644 --- a/pkg/validatormanager/validatormanager.go +++ b/pkg/validatormanager/validatormanager.go @@ -200,7 +200,6 @@ func SetupPoA( network models.Network, privateKey string, aggregatorExtraPeerEndpoints []info.Peer, - aggregatorAllowPrivatePeers bool, aggregatorLogger logging.Logger, validatorManagerAddressStr string, useACP99 bool, @@ -211,7 +210,6 @@ func SetupPoA( network.SDKNetwork(), privateKey, aggregatorExtraPeerEndpoints, - aggregatorAllowPrivatePeers, aggregatorLogger, validatorManagerAddressStr, useACP99, @@ -230,7 +228,6 @@ func SetupPoS( network models.Network, privateKey string, aggregatorExtraPeerEndpoints []info.Peer, - aggregatorAllowPrivatePeers bool, aggregatorLogger logging.Logger, posParams validatorManagerSDK.PoSParams, validatorManagerAddressStr string, @@ -241,7 +238,6 @@ func SetupPoS( network.SDKNetwork(), privateKey, aggregatorExtraPeerEndpoints, - aggregatorAllowPrivatePeers, aggregatorLogger, posParams, validatorManagerAddressStr, diff --git a/pkg/validatormanager/weight_update.go b/pkg/validatormanager/weight_update.go index b5151f0a3..f2b39e7b9 100644 --- a/pkg/validatormanager/weight_update.go +++ b/pkg/validatormanager/weight_update.go @@ -67,7 +67,6 @@ func InitValidatorWeightChange( ownerPrivateKey string, nodeID ids.NodeID, aggregatorExtraPeerEndpoints []info.Peer, - aggregatorAllowPrivatePeers bool, aggregatorLogger logging.Logger, validatorManagerAddressStr string, weight uint64, @@ -164,7 +163,6 @@ func InitValidatorWeightChange( network, aggregatorLogger, 0, - aggregatorAllowPrivatePeers, aggregatorExtraPeerEndpoints, unsignedMessage, subnetID, @@ -211,7 +209,6 @@ func FinishValidatorWeightChange( privateKey string, validationID ids.ID, aggregatorExtraPeerEndpoints []info.Peer, - aggregatorAllowPrivatePeers bool, aggregatorLogger logging.Logger, validatorManagerAddressStr string, l1ValidatorRegistrationSignedMessage *warp.Message, @@ -238,7 +235,6 @@ func FinishValidatorWeightChange( network, aggregatorLogger, 0, - aggregatorAllowPrivatePeers, aggregatorExtraPeerEndpoints, subnetID, l1ValidatorRegistrationSignedMessage, @@ -280,7 +276,6 @@ func GetL1ValidatorWeightMessage( network models.Network, aggregatorLogger logging.Logger, aggregatorQuorumPercentage uint64, - aggregatorAllowPrivateIPs bool, aggregatorExtraPeerEndpoints []info.Peer, // message is given unsignedMessage *warp.UnsignedMessage, @@ -323,7 +318,6 @@ func GetL1ValidatorWeightMessage( aggregatorLogger, subnetID, aggregatorQuorumPercentage, - aggregatorAllowPrivateIPs, aggregatorExtraPeerEndpoints, ) if err != nil { @@ -337,7 +331,6 @@ func GetPChainL1ValidatorWeightMessage( network models.Network, aggregatorLogger logging.Logger, aggregatorQuorumPercentage uint64, - aggregatorAllowPrivateIPs bool, aggregatorExtraPeerEndpoints []info.Peer, subnetID ids.ID, // message is given @@ -389,7 +382,6 @@ func GetPChainL1ValidatorWeightMessage( aggregatorLogger, subnetID, aggregatorQuorumPercentage, - aggregatorAllowPrivateIPs, aggregatorExtraPeerEndpoints, ) if err != nil { diff --git a/sdk/blockchain/blockchain.go b/sdk/blockchain/blockchain.go index 29c4da5c7..26f8f5820 100644 --- a/sdk/blockchain/blockchain.go +++ b/sdk/blockchain/blockchain.go @@ -345,7 +345,6 @@ func (c *Subnet) InitializeProofOfAuthority( network network.Network, privateKey string, aggregatorExtraPeerEndpoints []info.Peer, - aggregatorAllowPrivatePeers bool, aggregatorLogger logging.Logger, validatorManagerAddressStr string, useACP99 bool, @@ -397,7 +396,6 @@ func (c *Subnet) InitializeProofOfAuthority( network, aggregatorLogger, 0, - aggregatorAllowPrivatePeers, aggregatorExtraPeerEndpoints, c.SubnetID, c.BlockchainID, @@ -430,7 +428,6 @@ func (c *Subnet) InitializeProofOfStake( network network.Network, privateKey string, aggregatorExtraPeerEndpoints []info.Peer, - aggregatorAllowPrivatePeers bool, aggregatorLogger logging.Logger, posParams validatormanager.PoSParams, validatorManagerAddressStr string, @@ -460,7 +457,6 @@ func (c *Subnet) InitializeProofOfStake( network, aggregatorLogger, 0, - aggregatorAllowPrivatePeers, aggregatorExtraPeerEndpoints, c.SubnetID, c.BlockchainID, diff --git a/sdk/interchain/signature-aggregator.go b/sdk/interchain/signature-aggregator.go index 4604d4289..f58550b85 100644 --- a/sdk/interchain/signature-aggregator.go +++ b/sdk/interchain/signature-aggregator.go @@ -51,7 +51,6 @@ func createAppRequestNetwork( network network.Network, logger logging.Logger, registerer prometheus.Registerer, - allowPrivatePeers bool, extraPeerEndpoints []info.Peer, trackedSubnetIDs []string, ) (peers.AppRequestNetwork, error) { @@ -62,7 +61,7 @@ func createAppRequestNetwork( InfoAPI: &apiConfig.APIConfig{ BaseURL: network.Endpoint, }, - AllowPrivateIPs: allowPrivatePeers, + AllowPrivateIPs: true, TrackedSubnetIDs: trackedSubnetIDs, } if err := networkConfig.Validate(); err != nil { @@ -147,7 +146,6 @@ func NewSignatureAggregator( logger logging.Logger, subnetID ids.ID, quorumPercentage uint64, - allowPrivatePeers bool, extraPeerEndpoints []info.Peer, ) (*SignatureAggregator, error) { registerer := prometheus.NewRegistry() @@ -155,7 +153,7 @@ func NewSignatureAggregator( if subnetID != constants.PrimaryNetworkID { trackedSubnetIDs = append(trackedSubnetIDs, subnetID.String()) } - peerNetwork, err := createAppRequestNetwork(network, logger, registerer, allowPrivatePeers, extraPeerEndpoints, trackedSubnetIDs) + peerNetwork, err := createAppRequestNetwork(network, logger, registerer, extraPeerEndpoints, trackedSubnetIDs) if err != nil { return nil, err } diff --git a/sdk/validatormanager/root.go b/sdk/validatormanager/root.go index 2ec5d5219..9f20f797a 100644 --- a/sdk/validatormanager/root.go +++ b/sdk/validatormanager/root.go @@ -196,7 +196,6 @@ func GetPChainSubnetToL1ConversionMessage( network network.Network, aggregatorLogger logging.Logger, aggregatorQuorumPercentage uint64, - aggregatorAllowPrivateIPs bool, aggregatorExtraPeerEndpoints []info.Peer, subnetID ids.ID, managerBlockchainID ids.ID, @@ -246,7 +245,6 @@ func GetPChainSubnetToL1ConversionMessage( aggregatorLogger, subnetID, aggregatorQuorumPercentage, - aggregatorAllowPrivateIPs, aggregatorExtraPeerEndpoints, ) if err != nil { diff --git a/tests/e2e/testcases/validatormanager/suite.go b/tests/e2e/testcases/validatormanager/suite.go index 68c9bba60..78b25f261 100644 --- a/tests/e2e/testcases/validatormanager/suite.go +++ b/tests/e2e/testcases/validatormanager/suite.go @@ -222,7 +222,6 @@ var _ = ginkgo.Describe("[Validator Manager POA Set Up]", ginkgo.Ordered, func() network.SDKNetwork(), k.PrivKeyHex(), extraAggregatorPeers, - true, logging.NoLog{}, ProxyContractAddress, true,