diff --git a/cmd/blockchaincmd/deploy.go b/cmd/blockchaincmd/deploy.go index 57b9e0913..20b6c7e05 100644 --- a/cmd/blockchaincmd/deploy.go +++ b/cmd/blockchaincmd/deploy.go @@ -12,12 +12,14 @@ import ( "time" "github.com/ava-labs/avalanche-cli/pkg/node" + "github.com/ava-labs/avalanchego/network/peer" "github.com/ava-labs/avalanchego/vms/platformvm/warp/message" "github.com/ethereum/go-ethereum/common" "github.com/ava-labs/avalanche-cli/pkg/contract" "github.com/ava-labs/avalanche-cli/pkg/utils" + "github.com/ava-labs/avalanchego/api/info" "github.com/ava-labs/avalanchego/utils/formatting/address" "github.com/ava-labs/avalanchego/vms/platformvm/fx" "github.com/ava-labs/avalanchego/vms/platformvm/signer" @@ -700,9 +702,12 @@ func deployBlockchain(cmd *cobra.Command, args []string) error { } if !generateNodeID { - clusterName, err := node.GetClusterNameFromList(app) - if err != nil { - return err + clusterName := network.ClusterName + if clusterName == "" { + clusterName, err = node.GetClusterNameFromList(app) + if err != nil { + return err + } } if err = node.SyncSubnet(app, clusterName, blockchainName, true, nil); err != nil { @@ -734,6 +739,10 @@ func deployBlockchain(cmd *cobra.Command, args []string) error { if err != nil { return err } + extraAggregatorPeers, err := GetAggregatorExtraPeerEndpoints(network) + if err != nil { + return err + } if err := validatormanager.SetupPoA( app, network, @@ -744,6 +753,7 @@ func deployBlockchain(cmd *cobra.Command, args []string) error { genesisPrivateKey, common.HexToAddress(sidecar.PoAValidatorManagerOwner), avaGoBootstrapValidators, + extraAggregatorPeers, ); err != nil { return err } @@ -1016,3 +1026,71 @@ func LoadBootstrapValidator(filepath string) ([]models.SubnetValidator, error) { } return subnetValidators, nil } + +func UrisToPeers(uris []string) ([]info.Peer, error) { + peers := []info.Peer{} + ctx, cancel := utils.GetAPIContext() + defer cancel() + for _, uri := range uris { + client := info.NewClient(uri) + nodeID, _, err := client.GetNodeID(ctx) + if err != nil { + return nil, err + } + ip, err := client.GetNodeIP(ctx) + if err != nil { + return nil, err + } + peers = append(peers, info.Peer{ + Info: peer.Info{ + ID: nodeID, + PublicIP: ip, + }, + }) + } + return peers, nil +} + +func GetAggregatorExtraPeerEndpoints(network models.Network) ([]info.Peer, error) { + aggregatorExtraPeerEndpointsUris, err := GetAggregatorExtraPeerEndpointsUris(network) + if err != nil { + return nil, err + } + aggregatorPeers, err := UrisToPeers(aggregatorExtraPeerEndpointsUris) + if err != nil { + return nil, err + } + for _, uri := range aggregatorExtraPeerEndpointsUris { + infoClient := info.NewClient(uri) + ctx, cancel := utils.GetAPILargeContext() + defer cancel() + peers, err := infoClient.Peers(ctx) + if err != nil { + return nil, err + } + aggregatorPeers = append(aggregatorPeers, peers...) + } + return aggregatorPeers, nil +} + +func GetAggregatorExtraPeerEndpointsUris(network models.Network) ([]string, error) { + aggregatorExtraPeerEndpointsUris := []string{} + if network.ClusterName != "" { + clusterConfig, err := app.GetClusterConfig(network.ClusterName) + if err != nil { + return nil, err + } + // support etna devnet + if clusterConfig.Network.Kind == models.EtnaDevnet { + for _, node := range clusterConfig.Nodes { + nodeConfig, err := app.LoadClusterNodeConfig(node) + if err != nil { + return nil, err + } + uri := fmt.Sprintf("http://%s:%d", nodeConfig.ElasticIP, constants.AvalanchegoAPIPort) + aggregatorExtraPeerEndpointsUris = append(aggregatorExtraPeerEndpointsUris, uri) + } + } + } + return aggregatorExtraPeerEndpointsUris, nil +} diff --git a/cmd/contractcmd/init_poa_validator_manager.go b/cmd/contractcmd/init_poa_validator_manager.go index 940f56290..42fd033fe 100644 --- a/cmd/contractcmd/init_poa_validator_manager.go +++ b/cmd/contractcmd/init_poa_validator_manager.go @@ -116,6 +116,10 @@ func initPOAManager(_ *cobra.Command, args []string) error { if err != nil { return err } + extraAggregatorPeers, err := blockchaincmd.GetAggregatorExtraPeerEndpoints(network) + if err != nil { + return err + } if err := validatormanager.SetupPoA( app, network, @@ -124,6 +128,7 @@ func initPOAManager(_ *cobra.Command, args []string) error { privateKey, common.HexToAddress(sc.PoAValidatorManagerOwner), avaGoBootstrapValidators, + extraAggregatorPeers, ); err != nil { return err } diff --git a/cmd/nodecmd/create.go b/cmd/nodecmd/create.go index 706cba2af..c6cb55612 100644 --- a/cmd/nodecmd/create.go +++ b/cmd/nodecmd/create.go @@ -280,6 +280,9 @@ func createNodes(cmd *cobra.Command, args []string) error { createSupportedNetworkOptions, "", ) + if err := preCreateChecks(clusterName); err != nil { + return err + } if network.Kind == models.EtnaDevnet { publicHTTPPortAccess = true // public http port access for etna devnet api for PoAManagerDeployment bootstrapIDs = constants.EtnaDevnetBootstrapNodeIDs @@ -315,9 +318,6 @@ func createNodes(cmd *cobra.Command, args []string) error { _ = os.Remove(upgradeTmpFile.Name()) }() } - if err := preCreateChecks(clusterName); err != nil { - return err - } network = models.NewNetworkFromCluster(network, clusterName) globalNetworkFlags.UseDevnet = network.Kind == models.Devnet // set globalNetworkFlags.UseDevnet to true if network is devnet for further use avalancheGoVersion, err := getAvalancheGoVersion() diff --git a/go.mod b/go.mod index 743d658dc..05f501cb2 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/ava-labs/apm v1.0.0 github.com/ava-labs/avalanche-network-runner v1.8.4-0.20241005224128-cc3c07bb1344 github.com/ava-labs/avalanchego v1.12.0-initial-poc.5 - github.com/ava-labs/awm-relayer v1.4.1-0.20241003162124-807fd305670f + github.com/ava-labs/awm-relayer v1.4.1-0.20241014222901-4b34ab86afd0 github.com/ava-labs/coreth v0.13.8 github.com/ava-labs/subnet-evm v0.6.10 github.com/aws/aws-sdk-go-v2 v1.31.0 diff --git a/go.sum b/go.sum index fec835498..909dff78d 100644 --- a/go.sum +++ b/go.sum @@ -87,8 +87,8 @@ github.com/ava-labs/avalanche-network-runner v1.8.4-0.20241005224128-cc3c07bb134 github.com/ava-labs/avalanche-network-runner v1.8.4-0.20241005224128-cc3c07bb1344/go.mod h1:l4QzFnujbyyyeq6oBQ4F6sw9TrTQCjD2V4vUd7ZBCCo= github.com/ava-labs/avalanchego v1.12.0-initial-poc.5 h1:gW4xAqZNvkA4gP8M9yDyd7YUzuwfQbbCR+hgd1ztOto= github.com/ava-labs/avalanchego v1.12.0-initial-poc.5/go.mod h1:qSHmog3wMVjo/ruIAQo0ppXAilyni07NIu5K88RyhWE= -github.com/ava-labs/awm-relayer v1.4.1-0.20241003162124-807fd305670f h1:YUQF1wQJeEcTMC5W/OrwgSFTFMS4zeCM8O02rLeEDow= -github.com/ava-labs/awm-relayer v1.4.1-0.20241003162124-807fd305670f/go.mod h1:K01Md6zPkOFRWeQyxmZ/t9HJfoNgUGqa1L8rOp35GXw= +github.com/ava-labs/awm-relayer v1.4.1-0.20241014222901-4b34ab86afd0 h1:zsoK+TbXg/XOTXd+PXRrF6aGmpilcunfpcw/McPVBho= +github.com/ava-labs/awm-relayer v1.4.1-0.20241014222901-4b34ab86afd0/go.mod h1:K01Md6zPkOFRWeQyxmZ/t9HJfoNgUGqa1L8rOp35GXw= github.com/ava-labs/coreth v0.13.8 h1:f14X3KgwHl9LwzfxlN6S4bbn5VA2rhEsNnHaRLSTo/8= github.com/ava-labs/coreth v0.13.8/go.mod h1:t3BSv/eQv0AlDPMfEDCMMoD/jq1RkUsbFzQAFg5qBcE= github.com/ava-labs/ledger-avalanche/go v0.0.0-20240610153809-9c955cc90a95 h1:dOVbtdnZL++pENdTCNZ1nu41eYDQkTML4sWebDnnq8c= diff --git a/pkg/validatormanager/validatormanager.go b/pkg/validatormanager/validatormanager.go index 05f61f80b..0b0e1eb07 100644 --- a/pkg/validatormanager/validatormanager.go +++ b/pkg/validatormanager/validatormanager.go @@ -13,6 +13,7 @@ import ( "github.com/ava-labs/avalanche-cli/pkg/evm" "github.com/ava-labs/avalanche-cli/pkg/models" "github.com/ava-labs/avalanche-cli/sdk/interchain" + "github.com/ava-labs/avalanchego/api/info" "github.com/ava-labs/avalanchego/ids" avagoconstants "github.com/ava-labs/avalanchego/utils/constants" "github.com/ava-labs/avalanchego/utils/logging" @@ -102,6 +103,7 @@ func PoaValidatorManagerGetPChainSubnetConversionWarpMessage( managerBlockchainID ids.ID, managerAddress common.Address, convertSubnetValidators []*txs.ConvertSubnetValidator, + extraAggregatorPeers []info.Peer, ) (*warp.Message, error) { validators := []warpMessage.SubnetConversionValidatorData{} for _, convertSubnetValidator := range convertSubnetValidators { @@ -146,6 +148,7 @@ func PoaValidatorManagerGetPChainSubnetConversionWarpMessage( aggregatorLogLevel, subnetID, aggregatorQuorumPercentage, + extraAggregatorPeers, ) if err != nil { return nil, err @@ -216,6 +219,7 @@ func SetupPoA( privateKey string, ownerAddress common.Address, convertSubnetValidators []*txs.ConvertSubnetValidator, + extraAggregatorPeers []info.Peer, ) error { if err := evm.SetupProposerVM( rpcURL, @@ -259,6 +263,7 @@ func SetupPoA( blockchainID, managerAddress, convertSubnetValidators, + extraAggregatorPeers, ) if err != nil { return fmt.Errorf("failure signing subnet conversion warp message: %w", err) diff --git a/sdk/interchain/signature-aggregator.go b/sdk/interchain/signature-aggregator.go index 00d8840dc..8bbb09a56 100644 --- a/sdk/interchain/signature-aggregator.go +++ b/sdk/interchain/signature-aggregator.go @@ -8,6 +8,7 @@ import ( "time" "github.com/ava-labs/avalanche-cli/pkg/models" + "github.com/ava-labs/avalanchego/api/info" "github.com/ava-labs/avalanchego/ids" "github.com/ava-labs/avalanchego/message" "github.com/ava-labs/avalanchego/utils/constants" @@ -45,11 +46,17 @@ type SignatureAggregator struct { // Returns: // - peers.AppRequestNetwork: The created AppRequestNetwork, or nil if an error occurred. // - error: An error if the creation of the AppRequestNetwork failed. -func createAppRequestNetwork(network models.Network, logLevel logging.Level) (peers.AppRequestNetwork, error) { +func createAppRequestNetwork( + network models.Network, + logLevel logging.Level, + registerer prometheus.Registerer, + extraPeerEndpoints []info.Peer, +) (peers.AppRequestNetwork, error) { peerNetwork, err := peers.NewNetwork( logLevel, - prometheus.DefaultRegisterer, + registerer, nil, + extraPeerEndpoints, &config.Config{ PChainAPI: &apiConfig.APIConfig{ BaseURL: network.Endpoint, @@ -76,6 +83,7 @@ func createAppRequestNetwork(network models.Network, logLevel logging.Level) (pe func initSignatureAggregator( network peers.AppRequestNetwork, logger logging.Logger, + registerer prometheus.Registerer, subnetID ids.ID, quorumPercentage uint64, ) (*SignatureAggregator, error) { @@ -91,7 +99,7 @@ func initSignatureAggregator( messageCreator, err := message.NewCreator( logger, - prometheus.DefaultRegisterer, + registerer, constants.DefaultNetworkCompressionType, constants.DefaultNetworkMaximumInboundTimeout, ) @@ -99,7 +107,7 @@ func initSignatureAggregator( return nil, fmt.Errorf("failed to create message creator: %w", err) } - metricsInstance := metrics.NewSignatureAggregatorMetrics(prometheus.DefaultRegisterer) + metricsInstance := metrics.NewSignatureAggregatorMetrics(registerer) signatureAggregator, err := aggregator.NewSignatureAggregator( network, logger, @@ -130,12 +138,14 @@ func NewSignatureAggregator( logLevel logging.Level, subnetID ids.ID, quorumPercentage uint64, + extraPeerEndpoints []info.Peer, ) (*SignatureAggregator, error) { - peerNetwork, err := createAppRequestNetwork(network, logLevel) + registerer := prometheus.NewRegistry() + peerNetwork, err := createAppRequestNetwork(network, logLevel, registerer, extraPeerEndpoints) if err != nil { return nil, err } - return initSignatureAggregator(peerNetwork, logger, subnetID, quorumPercentage) + return initSignatureAggregator(peerNetwork, logger, registerer, subnetID, quorumPercentage) } // AggregateSignatures aggregates signatures for a given message and justification. diff --git a/sdk/interchain/signature-aggregator_test.go b/sdk/interchain/signature-aggregator_test.go index 1e3284768..d4dba68de 100644 --- a/sdk/interchain/signature-aggregator_test.go +++ b/sdk/interchain/signature-aggregator_test.go @@ -9,6 +9,7 @@ import ( "github.com/ava-labs/avalanchego/utils/logging" "github.com/ava-labs/avalanchego/vms/platformvm/warp" "github.com/ava-labs/awm-relayer/peers/mocks" + "github.com/prometheus/client_golang/prometheus" "github.com/stretchr/testify/require" "go.uber.org/mock/gomock" ) @@ -25,6 +26,7 @@ func instantiateAggregator(t *testing.T) ( aggregator, err := initSignatureAggregator( mockNetwork, logging.NoLog{}, + prometheus.NewRegistry(), subnetID, DefaultQuorumPercentage, )