Node模块

以下代码位于node/node.go 文件中

1. node.New()

//New creates a new P2P node, ready for protocol registration.
func New(conf *Config) (*Node, error) {

	...

	node := &Node{
		config:        conf,
		inprocHandler: rpc.NewServer(),
		eventmux:      new(event.TypeMux),
		log:           conf.Logger,
		stop:          make(chan struct{}),
		server:        &p2p.Server{Config: conf.P2P},
		databases:     make(map[*closeTrackingDB]struct{}),
	}
		...

			// Initialize the p2p server. This creates the node key and discovery databases.
		node.server.Config.PrivateKey = node.config.NodeKey()
		node.server.Config.Name = node.config.NodeName()
		node.server.Config.Logger = node.log
		if node.server.Config.StaticNodes == nil {
			node.server.Config.StaticNodes = node.config.StaticNodes()
		}
		if node.server.Config.TrustedNodes == nil {
			node.server.Config.TrustedNodes = node.config.TrustedNodes()
		}
		if node.server.Config.NodeDatabase == "" {
			node.server.Config.NodeDatabase = node.config.NodeDB()
		}

		...
}

2. Node.Start()

执行过程:

  1. 检查runningState
  2. 开启p2pServer ⇒ err := n.openEndpoints()
  3. 依次执行n.lifecycles里的所有lifecycle
// Start starts all registered lifecycles, RPC services and p2p networking.
// Node can only be started once.
func (n *Node) Start() error {
	n.startStopLock.Lock()
	defer n.startStopLock.Unlock()

	n.lock.Lock()
	switch n.state {
	case runningState:
		n.lock.Unlock()
		return ErrNodeRunning
	case closedState:
		n.lock.Unlock()
		return ErrNodeStopped
	}
	n.state = runningState
	// open networking and RPC endpoints
	err := n.openEndpoints()
	lifecycles := make([]Lifecycle, len(n.lifecycles))
	copy(lifecycles, n.lifecycles)
	n.lock.Unlock()

	// Check if endpoint startup failed.
	if err != nil {
		n.doClose(nil)
		return err
	}
	// Start all registered lifecycles.
	var started []Lifecycle
	for _, lifecycle := range lifecycles {
		if err = lifecycle.Start(); err != nil {
			break
		}
		started = append(started, lifecycle)
	}
	// Check if any lifecycle failed to start.
	if err != nil {
		n.stopServices(started)
		n.doClose(nil)
	}
	return err
}

3. Node.RegisterProtocols()

注册protocol到p2p.server中

// RegisterProtocols adds backend's protocols to the node's p2p server.
func (n *Node) RegisterProtocols(protocols []p2p.Protocol) {
	n.lock.Lock()
	defer n.lock.Unlock()

	if n.state != initializingState {
		panic("can't register protocols on running/stopped node")
	}
	n.server.Protocols = append(n.server.Protocols, protocols...)
}

p2p模块

1. Server

Server.Start()

Server.Run()