312263c7d9
The account manager was previously created by packge cmd/utils as part of flag processing and then passed down into eth.Ethereum through its config struct. Since we are starting to create nodes which do not have eth.Ethereum as a registered service, the code was rearranged to register the account manager as its own service. Making it a service is ugly though and it doesn't really fix the root cause: creating nodes without eth.Ethereum requires duplicating lots of code. This commit splits utils.MakeSystemNode into three functions, making creation of other node/service configurations easier. It also moves the account manager into Node so it can be used by those configurations without requiring package eth.
87 lines
3.5 KiB
Go
87 lines
3.5 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 (
|
|
"path/filepath"
|
|
"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 {
|
|
datadir string // Data directory for protocol persistence
|
|
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.datadir == "" {
|
|
return ethdb.NewMemDatabase()
|
|
}
|
|
return ethdb.NewLDBDatabase(filepath.Join(ctx.datadir, 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
|
|
}
|