diff --git a/cmd/geth/chaincmd.go b/cmd/geth/chaincmd.go index 613ac253c8..1de2b2674f 100644 --- a/cmd/geth/chaincmd.go +++ b/cmd/geth/chaincmd.go @@ -479,7 +479,7 @@ func initNetwork(ctx *cli.Context) error { staticConnect = true } - configs, enodes, err := createConfigs(config, initDir, "node", ips, ports, sentryEnodes, connectOneExtraEnodes, staticConnect) + configs, enodes, accounts, err := createConfigs(config, initDir, "node", ips, ports, sentryEnodes, connectOneExtraEnodes, staticConnect) if err != nil { utils.Fatalf("Failed to create node configs: %v", err) } @@ -489,6 +489,11 @@ func initNetwork(ctx *cli.Context) error { nodeIDs[i] = enodes[i].ID() } // add more feature configs + if enableSentryNode { + for i := 0; i < len(sentryConfigs); i++ { + sentryConfigs[i].Node.P2P.ProxyedValidatorAddresses = accounts[i] + } + } if ctx.Bool(utils.InitEVNValidatorWhitelist.Name) { for i := 0; i < size; i++ { configs[i].Node.P2P.EVNNodeIdsWhitelist = nodeIDs @@ -501,7 +506,10 @@ func initNetwork(ctx *cli.Context) error { } if enableSentryNode && ctx.Bool(utils.InitEVNSentryWhitelist.Name) { for i := 0; i < len(sentryConfigs); i++ { - sentryConfigs[i].Node.P2P.EVNNodeIdsWhitelist = sentryNodeIDs + // whitelist all sentry nodes + proxyed validator NodeID + wlNodeIDs := []enode.ID{nodeIDs[i]} + wlNodeIDs = append(wlNodeIDs, sentryNodeIDs...) + sentryConfigs[i].Node.P2P.EVNNodeIdsWhitelist = wlNodeIDs } } if enableSentryNode && ctx.Bool(utils.InitEVNSentryRegister.Name) { @@ -555,8 +563,11 @@ func createSentryNodeConfigs(ctx *cli.Context, baseConfig gethConfig, initDir st if err != nil { utils.Fatalf("Failed to parse ports: %v", err) } - - return createConfigs(baseConfig, initDir, "sentry", ips, ports, nil, false, true) + configs, enodes, _, err := createConfigs(baseConfig, initDir, "sentry", ips, ports, nil, false, true) + if err != nil { + utils.Fatalf("Failed to create config: %v", err) + } + return configs, enodes, nil } func createAndSaveFullNodeConfigs(ctx *cli.Context, inGenesisFile *os.File, baseConfig gethConfig, initDir string, extraEnodes []*enode.Node) ([]gethConfig, []*enode.Node, error) { @@ -575,7 +586,7 @@ func createAndSaveFullNodeConfigs(ctx *cli.Context, inGenesisFile *os.File, base utils.Fatalf("Failed to parse ports: %v", err) } - configs, enodes, err := createConfigs(baseConfig, initDir, "fullnode", ips, ports, extraEnodes, false, false) + configs, enodes, _, err := createConfigs(baseConfig, initDir, "fullnode", ips, ports, extraEnodes, false, false) if err != nil { utils.Fatalf("Failed to create config: %v", err) } @@ -590,19 +601,24 @@ func createAndSaveFullNodeConfigs(ctx *cli.Context, inGenesisFile *os.File, base return configs, enodes, nil } -func createConfigs(base gethConfig, initDir string, prefix string, ips []string, ports []int, extraEnodes []*enode.Node, connectOneExtraEnodes bool, staticConnect bool) ([]gethConfig, []*enode.Node, error) { +func createConfigs(base gethConfig, initDir string, prefix string, ips []string, ports []int, extraEnodes []*enode.Node, connectOneExtraEnodes bool, staticConnect bool) ([]gethConfig, []*enode.Node, [][]common.Address, error) { if len(ips) != len(ports) { - return nil, nil, errors.New("mismatch of size and length of ports") + return nil, nil, nil, errors.New("mismatch of size and length of ports") } size := len(ips) enodes := make([]*enode.Node, size) + accounts := make([][]common.Address, size) for i := 0; i < size; i++ { nodeConfig := base.Node nodeConfig.DataDir = path.Join(initDir, fmt.Sprintf("%s%d", prefix, i)) stack, err := node.New(&nodeConfig) if err != nil { - return nil, nil, err + return nil, nil, nil, err } + if err := setAccountManagerBackends(stack.Config(), stack.AccountManager(), stack.KeyStoreDir()); err != nil { + utils.Fatalf("Failed to set account manager backends: %v", err) + } + accounts[i] = stack.AccountManager().Accounts() pk := stack.Config().NodeKey() enodes[i] = enode.NewV4(&pk.PublicKey, net.ParseIP(ips[i]), ports[i], ports[i]) } @@ -618,7 +634,7 @@ func createConfigs(base gethConfig, initDir string, prefix string, ips []string, } configs[i] = createNodeConfig(base, ips[i], ports[i], allEnodes, index, staticConnect) } - return configs, enodes, nil + return configs, enodes, accounts, nil } func writeConfig(inGenesisFile *os.File, config gethConfig, dir string) error { diff --git a/eth/backend.go b/eth/backend.go index 43bf10a425..2da780feab 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -377,22 +377,22 @@ func New(stack *node.Node, config *ethconfig.Config) (*Ethereum, error) { // Permit the downloader to use the trie cache allowance during fast sync cacheLimit := cacheConfig.TrieCleanLimit + cacheConfig.TrieDirtyLimit + cacheConfig.SnapshotLimit if eth.handler, err = newHandler(&handlerConfig{ - NodeID: eth.p2pServer.Self().ID(), - Database: chainDb, - Chain: eth.blockchain, - TxPool: eth.txPool, - Network: networkID, - Sync: config.SyncMode, - BloomCache: uint64(cacheLimit), - EventMux: eth.eventMux, - RequiredBlocks: config.RequiredBlocks, - DirectBroadcast: config.DirectBroadcast, - EnableEVNFeatures: stack.Config().EnableEVNFeatures, - EVNNodeIdsWhitelist: stack.Config().P2P.EVNNodeIdsWhitelist, - ProxyedValidatorNodeIDs: stack.Config().P2P.ProxyedValidatorNodeIDs, - DisablePeerTxBroadcast: config.DisablePeerTxBroadcast, - PeerSet: peers, - EnableQuickBlockFetching: stack.Config().EnableQuickBlockFetching, + NodeID: eth.p2pServer.Self().ID(), + Database: chainDb, + Chain: eth.blockchain, + TxPool: eth.txPool, + Network: networkID, + Sync: config.SyncMode, + BloomCache: uint64(cacheLimit), + EventMux: eth.eventMux, + RequiredBlocks: config.RequiredBlocks, + DirectBroadcast: config.DirectBroadcast, + EnableEVNFeatures: stack.Config().EnableEVNFeatures, + EVNNodeIdsWhitelist: stack.Config().P2P.EVNNodeIdsWhitelist, + ProxyedValidatorAddresses: stack.Config().P2P.ProxyedValidatorAddresses, + DisablePeerTxBroadcast: config.DisablePeerTxBroadcast, + PeerSet: peers, + EnableQuickBlockFetching: stack.Config().EnableQuickBlockFetching, }); err != nil { return nil, err } diff --git a/eth/handler.go b/eth/handler.go index 0e435837f1..2800918ea0 100644 --- a/eth/handler.go +++ b/eth/handler.go @@ -115,33 +115,33 @@ type votePool interface { // handlerConfig is the collection of initialization parameters to create a full // node network handler. type handlerConfig struct { - NodeID enode.ID // P2P node ID used for tx propagation topology - Database ethdb.Database // Database for direct sync insertions - Chain *core.BlockChain // Blockchain to serve data from - TxPool txPool // Transaction pool to propagate from - VotePool votePool - Network uint64 // Network identifier to adfvertise - Sync ethconfig.SyncMode // Whether to snap or full sync - BloomCache uint64 // Megabytes to alloc for snap sync bloom - EventMux *event.TypeMux // Legacy event mux, deprecate for `feed` - RequiredBlocks map[uint64]common.Hash // Hard coded map of required block hashes for sync challenges - DirectBroadcast bool - DisablePeerTxBroadcast bool - PeerSet *peerSet - EnableQuickBlockFetching bool - EnableEVNFeatures bool - EVNNodeIdsWhitelist []enode.ID - ProxyedValidatorNodeIDs []enode.ID + NodeID enode.ID // P2P node ID used for tx propagation topology + Database ethdb.Database // Database for direct sync insertions + Chain *core.BlockChain // Blockchain to serve data from + TxPool txPool // Transaction pool to propagate from + VotePool votePool + Network uint64 // Network identifier to adfvertise + Sync ethconfig.SyncMode // Whether to snap or full sync + BloomCache uint64 // Megabytes to alloc for snap sync bloom + EventMux *event.TypeMux // Legacy event mux, deprecate for `feed` + RequiredBlocks map[uint64]common.Hash // Hard coded map of required block hashes for sync challenges + DirectBroadcast bool + DisablePeerTxBroadcast bool + PeerSet *peerSet + EnableQuickBlockFetching bool + EnableEVNFeatures bool + EVNNodeIdsWhitelist []enode.ID + ProxyedValidatorAddresses []common.Address } type handler struct { - nodeID enode.ID - networkID uint64 - forkFilter forkid.Filter // Fork ID filter, constant across the lifetime of the node - disablePeerTxBroadcast bool - enableEVNFeatures bool - evnNodeIdsWhitelistMap map[enode.ID]struct{} - proxyedValidatorNodeIDMap map[enode.ID]struct{} + nodeID enode.ID + networkID uint64 + forkFilter forkid.Filter // Fork ID filter, constant across the lifetime of the node + disablePeerTxBroadcast bool + enableEVNFeatures bool + evnNodeIdsWhitelistMap map[enode.ID]struct{} + proxyedValidatorAddressMap map[common.Address]struct{} snapSync atomic.Bool // Flag whether snap sync is enabled (gets disabled if we already have blocks) synced atomic.Bool // Flag whether we're considered synchronised (enables transaction processing) @@ -196,32 +196,32 @@ func newHandler(config *handlerConfig) (*handler, error) { config.PeerSet = newPeerSet() // Nicety initialization for tests } h := &handler{ - nodeID: config.NodeID, - networkID: config.Network, - forkFilter: forkid.NewFilter(config.Chain), - disablePeerTxBroadcast: config.DisablePeerTxBroadcast, - eventMux: config.EventMux, - database: config.Database, - txpool: config.TxPool, - votepool: config.VotePool, - chain: config.Chain, - peers: config.PeerSet, - peersPerIP: make(map[string]int), - requiredBlocks: config.RequiredBlocks, - directBroadcast: config.DirectBroadcast, - enableEVNFeatures: config.EnableEVNFeatures, - evnNodeIdsWhitelistMap: make(map[enode.ID]struct{}), - proxyedValidatorNodeIDMap: make(map[enode.ID]struct{}), - quitSync: make(chan struct{}), - handlerDoneCh: make(chan struct{}), - handlerStartCh: make(chan struct{}), - stopCh: make(chan struct{}), + nodeID: config.NodeID, + networkID: config.Network, + forkFilter: forkid.NewFilter(config.Chain), + disablePeerTxBroadcast: config.DisablePeerTxBroadcast, + eventMux: config.EventMux, + database: config.Database, + txpool: config.TxPool, + votepool: config.VotePool, + chain: config.Chain, + peers: config.PeerSet, + peersPerIP: make(map[string]int), + requiredBlocks: config.RequiredBlocks, + directBroadcast: config.DirectBroadcast, + enableEVNFeatures: config.EnableEVNFeatures, + evnNodeIdsWhitelistMap: make(map[enode.ID]struct{}), + proxyedValidatorAddressMap: make(map[common.Address]struct{}), + quitSync: make(chan struct{}), + handlerDoneCh: make(chan struct{}), + handlerStartCh: make(chan struct{}), + stopCh: make(chan struct{}), } for _, nodeID := range config.EVNNodeIdsWhitelist { h.evnNodeIdsWhitelistMap[nodeID] = struct{}{} } - for _, nodeID := range config.ProxyedValidatorNodeIDs { - h.proxyedValidatorNodeIDMap[nodeID] = struct{}{} + for _, address := range config.ProxyedValidatorAddresses { + h.proxyedValidatorAddressMap[address] = struct{}{} } if config.Sync == ethconfig.FullSync { // The database seems empty as the current block is the genesis. Yet the snap @@ -333,6 +333,7 @@ func newHandler(config *handlerConfig) (*handler, error) { block := types.NewBlockWithHeader(item.Header).WithBody(types.Body{Transactions: item.Txs, Uncles: item.Uncles}) block = block.WithSidecars(item.Sidecars) block.ReceivedAt = time.Now() + block.ReceivedFrom = p.ID() if err := block.SanityCheck(); err != nil { return nil, err } @@ -399,7 +400,7 @@ func (h *handler) protoTracker() { if h.enableEVNFeatures { // add onchain validator p2p node list later, it will enable the direct broadcast + no tx broadcast feature // here check & enable peer broadcast features periodically, and it's a simple way to handle the peer change and the list change scenarios. - h.peers.enableEVNFeatures(h.queryValidatorNodeIDsMap(), h.evnNodeIdsWhitelistMap, h.proxyedValidatorNodeIDMap) + h.peers.enableEVNFeatures(h.queryValidatorNodeIDsMap(), h.evnNodeIdsWhitelistMap) } case <-h.quitSync: // Wait for all active handlers to finish. @@ -833,38 +834,34 @@ func (h *handler) BroadcastBlock(block *types.Block, propagate bool) { } for _, peer := range transfer { - log.Debug("broadcast block to peer", "hash", hash, "peer", peer.ID(), "ProxyedValidatorFlag", peer.ProxyedValidatorFlag.Load(), "EVNPeerFlag", peer.EVNPeerFlag.Load()) + log.Debug("broadcast block to peer", "hash", hash, "peer", peer.ID(), "EVNPeerFlag", peer.EVNPeerFlag.Load()) peer.AsyncSendNewBlock(block, td) } // check if the block should be broadcast to more peers in EVN - fullBroadcastInEVN := h.needFullBroadcastInEVN(block) var morePeers []*ethPeer - for i := len(transfer); i < len(peers); i++ { - if peers[i].ProxyedValidatorFlag.Load() { - morePeers = append(morePeers, peers[i]) - continue + if h.needFullBroadcastInEVN(block) { + for i := len(transfer); i < len(peers); i++ { + if peers[i].EVNPeerFlag.Load() { + morePeers = append(morePeers, peers[i]) + } } - if fullBroadcastInEVN && peers[i].EVNPeerFlag.Load() { - morePeers = append(morePeers, peers[i]) - continue + for _, peer := range morePeers { + log.Debug("broadcast block to extra peer", "hash", hash, "peer", peer.ID(), "EVNPeerFlag", peer.EVNPeerFlag.Load()) + peer.AsyncSendNewBlock(block, td) } } - for _, peer := range morePeers { - log.Debug("broadcast block to extra peer", "hash", hash, "peer", peer.ID(), "ProxyedValidatorFlag", peer.ProxyedValidatorFlag.Load(), "EVNPeerFlag", peer.EVNPeerFlag.Load()) - peer.AsyncSendNewBlock(block, td) - } - log.Trace("Propagated block", "hash", hash, "recipients", len(transfer), "extra", len(morePeers), "duration", common.PrettyDuration(time.Since(block.ReceivedAt))) + log.Debug("Propagated block", "hash", hash, "recipients", len(transfer), "extra", len(morePeers), "duration", common.PrettyDuration(time.Since(block.ReceivedAt))) return } // Otherwise if the block is indeed in our own chain, announce it if h.chain.HasBlock(hash, block.NumberU64()) { for _, peer := range peers { - log.Debug("Announced block to peer", "hash", hash, "peer", peer.ID(), "ProxyedValidatorFlag", peer.ProxyedValidatorFlag.Load(), "EVNPeerFlag", peer.EVNPeerFlag.Load()) + log.Debug("Announced block to peer", "hash", hash, "peer", peer.ID(), "EVNPeerFlag", peer.EVNPeerFlag.Load()) peer.AsyncSendNewBlockHash(block) } - log.Trace("Announced block", "hash", hash, "recipients", len(peers), "duration", common.PrettyDuration(time.Since(block.ReceivedAt))) + log.Debug("Announced block", "hash", hash, "recipients", len(peers), "duration", common.PrettyDuration(time.Since(block.ReceivedAt))) } } @@ -875,15 +872,19 @@ func (h *handler) needFullBroadcastInEVN(block *types.Block) bool { if !h.enableEVNFeatures { return false } + parlia, ok := h.chain.Engine().(*parlia.Parlia) if !ok { return false } - if parlia.ConsensusAddress() == block.Coinbase() { + coinbase := block.Coinbase() + // check whether the block is created by self + if parlia.ConsensusAddress() == coinbase { + log.Debug("full broadcast mined block to EVN", "coinbase", coinbase) return true } - return h.peers.isProxyedValidator(block.Coinbase(), h.proxyedValidatorNodeIDMap) + return h.peers.isProxyedValidator(coinbase, h.proxyedValidatorAddressMap) } func (h *handler) queryValidatorNodeIDsMap() map[common.Address][]enode.ID { diff --git a/eth/peerset.go b/eth/peerset.go index 706cd36bdf..d3617ec892 100644 --- a/eth/peerset.go +++ b/eth/peerset.go @@ -72,7 +72,6 @@ const ( ) var ( - evnProxedPeerGuage = metrics.NewRegisteredGauge("evn/peer/proxed", nil) evnWhiteListPeerGuage = metrics.NewRegisteredGauge("evn/peer/whiteList", nil) evnOnchainValidatorPeerGuage = metrics.NewRegisteredGauge("evn/peer/onchainValidator", nil) ) @@ -445,7 +444,7 @@ func (ps *peerSet) peer(id string) *ethPeer { } // enableEVNFeatures enables the given features for the given peers. -func (ps *peerSet) enableEVNFeatures(validatorNodeIDsMap map[common.Address][]enode.ID, evnWhitelistMap map[enode.ID]struct{}, proxyedNodeIDMap map[enode.ID]struct{}) { +func (ps *peerSet) enableEVNFeatures(validatorNodeIDsMap map[common.Address][]enode.ID, evnWhitelistMap map[enode.ID]struct{}) { // clone current all peers, and update the validatorNodeIDsMap ps.lock.Lock() peers := make([]*ethPeer, 0, len(ps.peers)) @@ -464,7 +463,6 @@ func (ps *peerSet) enableEVNFeatures(validatorNodeIDsMap map[common.Address][]en } var ( - proxyedPeerCnt int64 = 0 whiteListPeerCnt int64 = 0 onchainValidatorPeerCnt int64 = 0 ) @@ -472,35 +470,13 @@ func (ps *peerSet) enableEVNFeatures(validatorNodeIDsMap map[common.Address][]en nodeID := peer.NodeID() _, isValidatorPeer := valNodeIDMap[nodeID] _, isWhitelistPeer := evnWhitelistMap[nodeID] - _, isProxyedPeer := proxyedNodeIDMap[nodeID] - - if isProxyedPeer { - log.Debug("enable ProxyedValidatorFlag for", "peer", nodeID) - peer.ProxyedValidatorFlag.Store(true) - proxyedPeerCnt++ - } else { - peer.ProxyedValidatorFlag.Store(false) - } if isValidatorPeer || isWhitelistPeer { - log.Debug("enable EVNPeerFlag for", "peer", nodeID) + log.Debug("enable EVNPeerFlag & NoTxBroadcastFlag for", "peer", nodeID) peer.EVNPeerFlag.Store(true) } else { peer.EVNPeerFlag.Store(false) } - // if the peer is in the valNodeIDs and not in the proxyedList, enable the no tx broadcast feature - // the node also need to forward tx to the proxyedList - if isValidatorPeer && !isProxyedPeer { - log.Debug("enable NoTxBroadcastFlag for", "peer", nodeID) - peer.NoTxBroadcastFlag.Store(true) - } else { - peer.NoTxBroadcastFlag.Store(false) - } - - // Note: In the future, it need to check proxyed validator whether belong to EnhancedValidatorNetwork or not. - if isProxyedPeer && isValidatorPeer { - log.Warn("proyxed validator is registered on-chain", "id", nodeID) - } if isValidatorPeer { onchainValidatorPeerCnt++ @@ -509,31 +485,26 @@ func (ps *peerSet) enableEVNFeatures(validatorNodeIDsMap map[common.Address][]en whiteListPeerCnt++ } } - evnProxedPeerGuage.Update(proxyedPeerCnt) evnWhiteListPeerGuage.Update(whiteListPeerCnt) evnOnchainValidatorPeerGuage.Update(onchainValidatorPeerCnt) - log.Info("enable EVN features", "total", len(peers), "proxyedPeerCnt", proxyedPeerCnt, "whiteListPeerCnt", whiteListPeerCnt, "onchainValidatorPeerCnt", onchainValidatorPeerCnt) + log.Info("enable EVN features", "total", len(peers), "whiteListPeerCnt", whiteListPeerCnt, "onchainValidatorPeerCnt", onchainValidatorPeerCnt) } -// isProxyedValidator checks if the given address is a connected proxyed validator. -func (ps *peerSet) isProxyedValidator(address common.Address, proxyedNodeIDMap map[enode.ID]struct{}) bool { +// isProxyedValidator checks if the received block from the proxyed validator. +func (ps *peerSet) isProxyedValidator(validator common.Address, proxyedAddressMap map[common.Address]struct{}) bool { ps.lock.RLock() defer ps.lock.RUnlock() - if ps.validatorNodeIDsMap == nil { + if len(proxyedAddressMap) == 0 { return false } + log.Debug("check whether received block from proxyed peer", "validator", validator, "proxyedAddressMap", proxyedAddressMap) - nodeIDs := ps.validatorNodeIDsMap[address] - for _, id := range nodeIDs { - if ps.peers[id.String()] == nil { - continue - } - if _, ok := proxyedNodeIDMap[id]; ok { - return true - } + // check whether the validator is proxyed validator + if _, ok := proxyedAddressMap[validator]; !ok { + return false } - return false + return true } // headPeers retrieves a specified number list of peers. @@ -567,6 +538,7 @@ func (ps *peerSet) peersWithoutBlock(hash common.Hash) []*ethPeer { list = append(list, p) } } + log.Debug("get peers without block", "hash", hash, "total", len(ps.peers), "unknonw", len(list)) return list } @@ -578,8 +550,9 @@ func (ps *peerSet) peersWithoutTransaction(hash common.Hash) []*ethPeer { list := make([]*ethPeer, 0, len(ps.peers)) for _, p := range ps.peers { - if p.NoTxBroadcastFlag.Load() { - log.Debug("skip peer with no tx broadcast feature", "peer", p.ID()) + // it can be optimized in the future, to make it more clear that only when both peers of a connection are EVN nodes, will enable no tx broadcast. + if p.EVNPeerFlag.Load() { + log.Debug("skip EVN peer with no tx forwarding feature", "peer", p.ID()) continue } if !p.KnownTransaction(hash) { diff --git a/p2p/config.go b/p2p/config.go index 476a4510cc..7b5945fed6 100644 --- a/p2p/config.go +++ b/p2p/config.go @@ -20,6 +20,7 @@ import ( "crypto/ecdsa" "fmt" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/mclock" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/p2p/enode" @@ -91,9 +92,9 @@ type Config struct { // the list is another choice for non-validator nodes to get block quickly EVNNodeIdsWhitelist []enode.ID `toml:",omitempty"` - // ProxyedValidatorNodeIDs is a list of validator NodeIDs that the local node proxies, + // ProxyedValidatorAddresses is a list of validator addresses that the local node proxies, // it usually used for sentry nodes - ProxyedValidatorNodeIDs []enode.ID `toml:",omitempty"` + ProxyedValidatorAddresses []common.Address `toml:",omitempty"` // Connectivity can be restricted to certain IP networks. // If this option is set to a non-nil value, only hosts which match one of the diff --git a/p2p/config_toml.go b/p2p/config_toml.go index 2264ab2584..805dc67b74 100644 --- a/p2p/config_toml.go +++ b/p2p/config_toml.go @@ -5,6 +5,7 @@ package p2p import ( "crypto/ecdsa" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/p2p/enode" "github.com/ethereum/go-ethereum/p2p/nat" @@ -16,33 +17,33 @@ var _ = (*configMarshaling)(nil) // MarshalTOML marshals as TOML. func (c Config) MarshalTOML() (interface{}, error) { type Config struct { - PrivateKey *ecdsa.PrivateKey `toml:"-"` - MaxPeers int - MaxPeersPerIP int `toml:",omitempty"` - MaxPendingPeers int `toml:",omitempty"` - DialRatio int `toml:",omitempty"` - NoDiscovery bool - DiscoveryV4 bool `toml:",omitempty"` - DiscoveryV5 bool `toml:",omitempty"` - Name string `toml:"-"` - BootstrapNodes []*enode.Node - BootstrapNodesV5 []*enode.Node `toml:",omitempty"` - StaticNodes []*enode.Node - VerifyNodes []*enode.Node - TrustedNodes []*enode.Node - EVNNodeIdsWhitelist []enode.ID `toml:",omitempty"` - ProxyedValidatorNodeIDs []enode.ID `toml:",omitempty"` - NetRestrict *netutil.Netlist `toml:",omitempty"` - NodeDatabase string `toml:",omitempty"` - Protocols []Protocol `toml:"-" json:"-"` - ListenAddr string - DiscAddr string - NAT nat.Interface `toml:",omitempty"` - Dialer NodeDialer `toml:"-"` - NoDial bool `toml:",omitempty"` - EnableMsgEvents bool - Logger log.Logger `toml:"-"` - PeerFilterPatterns []string + PrivateKey *ecdsa.PrivateKey `toml:"-"` + MaxPeers int + MaxPeersPerIP int `toml:",omitempty"` + MaxPendingPeers int `toml:",omitempty"` + DialRatio int `toml:",omitempty"` + NoDiscovery bool + DiscoveryV4 bool `toml:",omitempty"` + DiscoveryV5 bool `toml:",omitempty"` + Name string `toml:"-"` + BootstrapNodes []*enode.Node + BootstrapNodesV5 []*enode.Node `toml:",omitempty"` + StaticNodes []*enode.Node + VerifyNodes []*enode.Node + TrustedNodes []*enode.Node + EVNNodeIdsWhitelist []enode.ID `toml:",omitempty"` + ProxyedValidatorAddresses []common.Address `toml:",omitempty"` + NetRestrict *netutil.Netlist `toml:",omitempty"` + NodeDatabase string `toml:",omitempty"` + Protocols []Protocol `toml:"-" json:"-"` + ListenAddr string + DiscAddr string + NAT nat.Interface `toml:",omitempty"` + Dialer NodeDialer `toml:"-"` + NoDial bool `toml:",omitempty"` + EnableMsgEvents bool + Logger log.Logger `toml:"-"` + PeerFilterPatterns []string } var enc Config enc.PrivateKey = c.PrivateKey @@ -60,7 +61,7 @@ func (c Config) MarshalTOML() (interface{}, error) { enc.VerifyNodes = c.VerifyNodes enc.TrustedNodes = c.TrustedNodes enc.EVNNodeIdsWhitelist = c.EVNNodeIdsWhitelist - enc.ProxyedValidatorNodeIDs = c.ProxyedValidatorNodeIDs + enc.ProxyedValidatorAddresses = c.ProxyedValidatorAddresses enc.NetRestrict = c.NetRestrict enc.NodeDatabase = c.NodeDatabase enc.Protocols = c.Protocols @@ -78,33 +79,33 @@ func (c Config) MarshalTOML() (interface{}, error) { // UnmarshalTOML unmarshals from TOML. func (c *Config) UnmarshalTOML(unmarshal func(interface{}) error) error { type Config struct { - PrivateKey *ecdsa.PrivateKey `toml:"-"` - MaxPeers *int - MaxPeersPerIP *int `toml:",omitempty"` - MaxPendingPeers *int `toml:",omitempty"` - DialRatio *int `toml:",omitempty"` - NoDiscovery *bool - DiscoveryV4 *bool `toml:",omitempty"` - DiscoveryV5 *bool `toml:",omitempty"` - Name *string `toml:"-"` - BootstrapNodes []*enode.Node - BootstrapNodesV5 []*enode.Node `toml:",omitempty"` - StaticNodes []*enode.Node - VerifyNodes []*enode.Node - TrustedNodes []*enode.Node - EVNNodeIdsWhitelist []enode.ID `toml:",omitempty"` - ProxyedValidatorNodeIDs []enode.ID `toml:",omitempty"` - NetRestrict *netutil.Netlist `toml:",omitempty"` - NodeDatabase *string `toml:",omitempty"` - Protocols []Protocol `toml:"-" json:"-"` - ListenAddr *string - DiscAddr *string - NAT *configNAT `toml:",omitempty"` - Dialer NodeDialer `toml:"-"` - NoDial *bool `toml:",omitempty"` - EnableMsgEvents *bool - Logger log.Logger `toml:"-"` - PeerFilterPatterns []string + PrivateKey *ecdsa.PrivateKey `toml:"-"` + MaxPeers *int + MaxPeersPerIP *int `toml:",omitempty"` + MaxPendingPeers *int `toml:",omitempty"` + DialRatio *int `toml:",omitempty"` + NoDiscovery *bool + DiscoveryV4 *bool `toml:",omitempty"` + DiscoveryV5 *bool `toml:",omitempty"` + Name *string `toml:"-"` + BootstrapNodes []*enode.Node + BootstrapNodesV5 []*enode.Node `toml:",omitempty"` + StaticNodes []*enode.Node + VerifyNodes []*enode.Node + TrustedNodes []*enode.Node + EVNNodeIdsWhitelist []enode.ID `toml:",omitempty"` + ProxyedValidatorAddresses []common.Address `toml:",omitempty"` + NetRestrict *netutil.Netlist `toml:",omitempty"` + NodeDatabase *string `toml:",omitempty"` + Protocols []Protocol `toml:"-" json:"-"` + ListenAddr *string + DiscAddr *string + NAT *configNAT `toml:",omitempty"` + Dialer NodeDialer `toml:"-"` + NoDial *bool `toml:",omitempty"` + EnableMsgEvents *bool + Logger log.Logger `toml:"-"` + PeerFilterPatterns []string } var dec Config if err := unmarshal(&dec); err != nil { @@ -155,8 +156,8 @@ func (c *Config) UnmarshalTOML(unmarshal func(interface{}) error) error { if dec.EVNNodeIdsWhitelist != nil { c.EVNNodeIdsWhitelist = dec.EVNNodeIdsWhitelist } - if dec.ProxyedValidatorNodeIDs != nil { - c.ProxyedValidatorNodeIDs = dec.ProxyedValidatorNodeIDs + if dec.ProxyedValidatorAddresses != nil { + c.ProxyedValidatorAddresses = dec.ProxyedValidatorAddresses } if dec.NetRestrict != nil { c.NetRestrict = dec.NetRestrict diff --git a/p2p/peer.go b/p2p/peer.go index 1ad36fd5ce..8f9ba8e2bc 100644 --- a/p2p/peer.go +++ b/p2p/peer.go @@ -126,9 +126,9 @@ type Peer struct { latency atomic.Int64 // mill second latency, estimated by ping msg - EVNPeerFlag atomic.Bool // it indicates the peer is in the validator network, it will directly broadcast when miner/sentry broadcast mined block. - ProxyedValidatorFlag atomic.Bool // it indicates the peer is proxyed by sentry node, it will directly broadcast in any scenario. - NoTxBroadcastFlag atomic.Bool // it indicates the peer is connected by validator that registered on chain, it will not broadcast tx to other validator node. + // it indicates the peer is in the validator network, it will directly broadcast when miner/sentry broadcast mined block, + // and won't broadcast any txs between EVN peers. + EVNPeerFlag atomic.Bool } // NewPeer returns a peer for testing purposes. @@ -585,11 +585,9 @@ type PeerInfo struct { Trusted bool `json:"trusted"` Static bool `json:"static"` } `json:"network"` - Protocols map[string]interface{} `json:"protocols"` // Sub-protocol specific metadata fields - Latency int64 `json:"latency"` // the estimate latency from ping msg - EVNPeerFlag bool `json:"evnPeerFlag"` - ProxyedValidatorFlag bool `json:"proxyedValidatorFlag"` - NoTxBroadcastFlag bool `json:"noTxBroadcastFlag"` + Protocols map[string]interface{} `json:"protocols"` // Sub-protocol specific metadata fields + Latency int64 `json:"latency"` // the estimate latency from ping msg + EVNPeerFlag bool `json:"evnPeerFlag"` } // Info gathers and returns a collection of metadata known about a peer. @@ -601,15 +599,13 @@ func (p *Peer) Info() *PeerInfo { } // Assemble the generic peer metadata info := &PeerInfo{ - Enode: p.Node().URLv4(), - ID: p.ID().String(), - Name: p.Fullname(), - Caps: caps, - Protocols: make(map[string]interface{}, len(p.running)), - Latency: p.latency.Load(), - EVNPeerFlag: p.EVNPeerFlag.Load(), - ProxyedValidatorFlag: p.ProxyedValidatorFlag.Load(), - NoTxBroadcastFlag: p.NoTxBroadcastFlag.Load(), + Enode: p.Node().URLv4(), + ID: p.ID().String(), + Name: p.Fullname(), + Caps: caps, + Protocols: make(map[string]interface{}, len(p.running)), + Latency: p.latency.Load(), + EVNPeerFlag: p.EVNPeerFlag.Load(), } if p.Node().Seq() > 0 { info.ENR = p.Node().String()