From 82ae41f6d5d0d7454218d5907e648a90dbcfacc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?rich=CE=9Brd?= Date: Wed, 15 May 2024 19:15:22 -0400 Subject: [PATCH] feat(waku2)_: allow using an env variable to set the node's key (#5152) --- api/messenger_raw_message_resend_test.go | 2 +- node/status_node_services.go | 28 +++++++++++++++++++++++- protocol/waku_builder_test.go | 2 +- wakuv2/api_test.go | 2 +- wakuv2/waku.go | 20 +++++++---------- wakuv2/waku_test.go | 18 +++++++-------- 6 files changed, 47 insertions(+), 25 deletions(-) diff --git a/api/messenger_raw_message_resend_test.go b/api/messenger_raw_message_resend_test.go index 568422e1a..5926aebb3 100644 --- a/api/messenger_raw_message_resend_test.go +++ b/api/messenger_raw_message_resend_test.go @@ -54,7 +54,7 @@ func (s *MessengerRawMessageResendTest) SetupTest() { UseShardAsDefaultTopic: true, DefaultShardPubsubTopic: shard.DefaultShardPubsubTopic(), } - s.exchangeBootNode, err = wakuv2.New("", "", exchangeNodeConfig, logger.Named("pxServerNode"), nil, nil, nil, nil) + s.exchangeBootNode, err = wakuv2.New(nil, "", exchangeNodeConfig, logger.Named("pxServerNode"), nil, nil, nil, nil) s.Require().NoError(err) s.Require().NoError(s.exchangeBootNode.Start()) diff --git a/node/status_node_services.go b/node/status_node_services.go index ec2cb912f..98ad29264 100644 --- a/node/status_node_services.go +++ b/node/status_node_services.go @@ -1,10 +1,12 @@ package node import ( + "crypto/ecdsa" "database/sql" "encoding/json" "errors" "fmt" + "os" "reflect" "time" @@ -13,6 +15,7 @@ import ( "github.com/status-im/status-go/signal" "github.com/status-im/status-go/transactions" + "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/p2p/enode" gethrpc "github.com/ethereum/go-ethereum/rpc" @@ -20,6 +23,7 @@ import ( "github.com/status-im/status-go/appmetrics" "github.com/status-im/status-go/common" gethbridge "github.com/status-im/status-go/eth-node/bridge/geth" + "github.com/status-im/status-go/eth-node/crypto" "github.com/status-im/status-go/eth-node/types" "github.com/status-im/status-go/logutils" "github.com/status-im/status-go/mailserver" @@ -347,7 +351,29 @@ func (b *StatusNode) wakuV2Service(nodeConfig *params.NodeConfig, telemetryServe cfg.MaxMessageSize = nodeConfig.WakuV2Config.MaxMessageSize } - w, err := wakuv2.New(nodeConfig.NodeKey, nodeConfig.ClusterConfig.Fleet, cfg, logutils.ZapLogger(), b.appDB, b.timeSource(), signal.SendHistoricMessagesRequestFailed, signal.SendPeerStats) + var nodeKey *ecdsa.PrivateKey + var err error + if nodeConfig.NodeKey != "" { + nodeKey, err = crypto.HexToECDSA(nodeConfig.NodeKey) + if err != nil { + return nil, fmt.Errorf("could not convert nodekey into a valid private key: %v", err) + } + } else { + nodeKeyStr := os.Getenv("WAKUV2_NODE_KEY") + if nodeKeyStr != "" { + nodeKeyBytes, err := hexutil.Decode(nodeKeyStr) + if err != nil { + return nil, fmt.Errorf("failed to decode the go-waku private key: %v", err) + } + + nodeKey, err = crypto.ToECDSA(nodeKeyBytes) + if err != nil { + return nil, fmt.Errorf("could not convert nodekey into a valid private key: %v", err) + } + } + } + + w, err := wakuv2.New(nodeKey, nodeConfig.ClusterConfig.Fleet, cfg, logutils.ZapLogger(), b.appDB, b.timeSource(), signal.SendHistoricMessagesRequestFailed, signal.SendPeerStats) if err != nil { return nil, err diff --git a/protocol/waku_builder_test.go b/protocol/waku_builder_test.go index 89907bb15..35c1493a4 100644 --- a/protocol/waku_builder_test.go +++ b/protocol/waku_builder_test.go @@ -44,7 +44,7 @@ func NewTestWakuV2(s *suite.Suite, cfg testWakuV2Config) *waku2.Waku { } wakuNode, err := waku2.New( - "", + nil, "", wakuConfig, cfg.logger, diff --git a/wakuv2/api_test.go b/wakuv2/api_test.go index 63e0b9c09..6c1e8cc22 100644 --- a/wakuv2/api_test.go +++ b/wakuv2/api_test.go @@ -30,7 +30,7 @@ import ( ) func TestMultipleTopicCopyInNewMessageFilter(t *testing.T) { - w, err := New("", "", nil, nil, nil, nil, nil, nil) + w, err := New(nil, "", nil, nil, nil, nil, nil, nil) if err != nil { t.Fatalf("Error creating WakuV2 client: %v", err) } diff --git a/wakuv2/waku.go b/wakuv2/waku.go index 26e24e3f3..792750003 100644 --- a/wakuv2/waku.go +++ b/wakuv2/waku.go @@ -166,7 +166,7 @@ func newTTLCache() *ttlcache.Cache[gethcommon.Hash, *common.ReceivedMessage] { } // New creates a WakuV2 client ready to communicate through the LibP2P network. -func New(nodeKey string, fleet string, cfg *Config, logger *zap.Logger, appDB *sql.DB, ts *timesource.NTPTimeSource, onHistoricMessagesRequestFailed func([]byte, peer.ID, error), onPeerStats func(types.ConnStatus)) (*Waku, error) { +func New(nodeKey *ecdsa.PrivateKey, fleet string, cfg *Config, logger *zap.Logger, appDB *sql.DB, ts *timesource.NTPTimeSource, onHistoricMessagesRequestFailed func([]byte, peer.ID, error), onPeerStats func(types.ConnStatus)) (*Waku, error) { var err error if logger == nil { logger, err = zap.NewDevelopment() @@ -216,16 +216,12 @@ func New(nodeKey string, fleet string, cfg *Config, logger *zap.Logger, appDB *s waku.filters = common.NewFilters(waku.cfg.DefaultShardPubsubTopic, waku.logger) waku.bandwidthCounter = metrics.NewBandwidthCounter() - var privateKey *ecdsa.PrivateKey - if nodeKey != "" { - privateKey, err = crypto.HexToECDSA(nodeKey) - } else { - // If no nodekey is provided, create an ephemeral key - privateKey, err = crypto.GenerateKey() - } - - if err != nil { - return nil, fmt.Errorf("failed to setup the go-waku private key: %v", err) + if nodeKey == nil { + // No nodekey is provided, create an ephemeral key + nodeKey, err = crypto.GenerateKey() + if err != nil { + return nil, fmt.Errorf("failed to generate a random go-waku private key: %v", err) + } } hostAddr, err := net.ResolveTCPAddr("tcp", fmt.Sprint(cfg.Host, ":", cfg.Port)) @@ -243,7 +239,7 @@ func New(nodeKey string, fleet string, cfg *Config, logger *zap.Logger, appDB *s opts := []node.WakuNodeOption{ node.WithLibP2POptions(libp2pOpts...), - node.WithPrivateKey(privateKey), + node.WithPrivateKey(nodeKey), node.WithHostAddress(hostAddr), node.WithTopicHealthStatusChannel(waku.topicHealthStatusChan), node.WithKeepAlive(time.Duration(cfg.KeepAliveInterval) * time.Second), diff --git a/wakuv2/waku_test.go b/wakuv2/waku_test.go index 152d2c217..69facd8da 100644 --- a/wakuv2/waku_test.go +++ b/wakuv2/waku_test.go @@ -42,7 +42,7 @@ func TestDiscoveryV5(t *testing.T) { config.EnableDiscV5 = true config.DiscV5BootstrapNodes = []string{testENRBootstrap} config.DiscoveryLimit = 20 - w, err := New("", "", config, nil, nil, nil, nil, nil) + w, err := New(nil, "", config, nil, nil, nil, nil, nil) require.NoError(t, err) require.NoError(t, w.Start()) @@ -67,7 +67,7 @@ func TestRestartDiscoveryV5(t *testing.T) { config.DiscV5BootstrapNodes = []string{"enrtree://AOGECG2SPND25EEFMAJ5WF3KSGJNSGV356DSTL2YVLLZWIV6SAYBM@1.1.1.2"} config.DiscoveryLimit = 20 config.UDPPort = 9002 - w, err := New("", "", config, nil, nil, nil, nil, nil) + w, err := New(nil, "", config, nil, nil, nil, nil, nil) require.NoError(t, err) require.NoError(t, w.Start()) @@ -120,7 +120,7 @@ func TestBasicWakuV2(t *testing.T) { config.DiscV5BootstrapNodes = []string{enrTreeAddress} config.DiscoveryLimit = 20 config.WakuNodes = []string{enrTreeAddress} - w, err := New("", "", config, nil, nil, nil, nil, nil) + w, err := New(nil, "", config, nil, nil, nil, nil, nil) require.NoError(t, err) require.NoError(t, w.Start()) @@ -229,7 +229,7 @@ func TestPeerExchange(t *testing.T) { config.EnableDiscV5 = true config.EnablePeerExchangeServer = true config.EnablePeerExchangeClient = false - pxServerNode, err := New("", "", config, logger.Named("pxServerNode"), nil, nil, nil, nil) + pxServerNode, err := New(nil, "", config, logger.Named("pxServerNode"), nil, nil, nil, nil) require.NoError(t, err) require.NoError(t, pxServerNode.Start()) @@ -241,7 +241,7 @@ func TestPeerExchange(t *testing.T) { config.EnablePeerExchangeServer = false config.EnablePeerExchangeClient = false config.DiscV5BootstrapNodes = []string{pxServerNode.node.ENR().String()} - discV5Node, err := New("", "", config, logger.Named("discV5Node"), nil, nil, nil, nil) + discV5Node, err := New(nil, "", config, logger.Named("discV5Node"), nil, nil, nil, nil) require.NoError(t, err) require.NoError(t, discV5Node.Start()) @@ -259,7 +259,7 @@ func TestPeerExchange(t *testing.T) { config.Resolver = resolver config.WakuNodes = []string{url} - lightNode, err := New("", "", config, logger.Named("lightNode"), nil, nil, nil, nil) + lightNode, err := New(nil, "", config, logger.Named("lightNode"), nil, nil, nil, nil) require.NoError(t, err) require.NoError(t, lightNode.Start()) @@ -301,7 +301,7 @@ func TestWakuV2Filter(t *testing.T) { config.DiscoveryLimit = 20 config.WakuNodes = []string{enrTreeAddress} fleet := "status.test" // Need a name fleet so that LightClient is not set to false - w, err := New("", fleet, config, nil, nil, nil, nil, nil) + w, err := New(nil, fleet, config, nil, nil, nil, nil, nil) require.NoError(t, err) require.NoError(t, w.Start()) @@ -390,7 +390,7 @@ func TestWakuV2Store(t *testing.T) { w1PeersCh := make(chan []string, 100) // buffered not to block on the send side // Start the first Waku node - w1, err := New("", "", config1, nil, nil, nil, nil, func(cs types.ConnStatus) { + w1, err := New(nil, "", config1, nil, nil, nil, nil, func(cs types.ConnStatus) { w1PeersCh <- maps.Keys(cs.Peers) }) require.NoError(t, err) @@ -414,7 +414,7 @@ func TestWakuV2Store(t *testing.T) { } // Start the second Waku node - w2, err := New("", "", config2, nil, sql2, nil, nil, nil) + w2, err := New(nil, "", config2, nil, sql2, nil, nil, nil) require.NoError(t, err) require.NoError(t, w2.Start()) w2EnvelopeCh := make(chan common.EnvelopeEvent, 100)