eeb322ae64
This change ensures that nodes started with different Name but same DataDir values don't use the same nodekey and IPC socket.
88 lines
3.4 KiB
Go
88 lines
3.4 KiB
Go
// Copyright 2015 The go-ethereum Authors
|
|
// This file is part of the go-ethereum library.
|
|
//
|
|
// The go-ethereum library is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU Lesser General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// The go-ethereum library is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU Lesser General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU Lesser General Public License
|
|
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
package node
|
|
|
|
import (
|
|
"reflect"
|
|
|
|
"github.com/ethereum/go-ethereum/accounts"
|
|
"github.com/ethereum/go-ethereum/ethdb"
|
|
"github.com/ethereum/go-ethereum/event"
|
|
"github.com/ethereum/go-ethereum/p2p"
|
|
"github.com/ethereum/go-ethereum/rpc"
|
|
)
|
|
|
|
// ServiceContext is a collection of service independent options inherited from
|
|
// the protocol stack, that is passed to all constructors to be optionally used;
|
|
// as well as utility methods to operate on the service environment.
|
|
type ServiceContext struct {
|
|
config *Config
|
|
services map[reflect.Type]Service // Index of the already constructed services
|
|
EventMux *event.TypeMux // Event multiplexer used for decoupled notifications
|
|
AccountManager *accounts.Manager // Account manager created by the node.
|
|
}
|
|
|
|
// OpenDatabase opens an existing database with the given name (or creates one
|
|
// if no previous can be found) from within the node's data directory. If the
|
|
// node is an ephemeral one, a memory database is returned.
|
|
func (ctx *ServiceContext) OpenDatabase(name string, cache int, handles int) (ethdb.Database, error) {
|
|
if ctx.config.DataDir == "" {
|
|
return ethdb.NewMemDatabase()
|
|
}
|
|
return ethdb.NewLDBDatabase(ctx.config.resolvePath(name), cache, handles)
|
|
}
|
|
|
|
// Service retrieves a currently running service registered of a specific type.
|
|
func (ctx *ServiceContext) Service(service interface{}) error {
|
|
element := reflect.ValueOf(service).Elem()
|
|
if running, ok := ctx.services[element.Type()]; ok {
|
|
element.Set(reflect.ValueOf(running))
|
|
return nil
|
|
}
|
|
return ErrServiceUnknown
|
|
}
|
|
|
|
// ServiceConstructor is the function signature of the constructors needed to be
|
|
// registered for service instantiation.
|
|
type ServiceConstructor func(ctx *ServiceContext) (Service, error)
|
|
|
|
// Service is an individual protocol that can be registered into a node.
|
|
//
|
|
// Notes:
|
|
//
|
|
// • Service life-cycle management is delegated to the node. The service is allowed to
|
|
// initialize itself upon creation, but no goroutines should be spun up outside of the
|
|
// Start method.
|
|
//
|
|
// • Restart logic is not required as the node will create a fresh instance
|
|
// every time a service is started.
|
|
type Service interface {
|
|
// Protocols retrieves the P2P protocols the service wishes to start.
|
|
Protocols() []p2p.Protocol
|
|
|
|
// APIs retrieves the list of RPC descriptors the service provides
|
|
APIs() []rpc.API
|
|
|
|
// Start is called after all services have been constructed and the networking
|
|
// layer was also initialized to spawn any goroutines required by the service.
|
|
Start(server *p2p.Server) error
|
|
|
|
// Stop terminates all goroutines belonging to the service, blocking until they
|
|
// are all terminated.
|
|
Stop() error
|
|
}
|