| 
									
										
										
										
											2015-11-05 23:57:57 +02:00
										 |  |  | // 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 ( | 
					
						
							| 
									
										
										
										
											2015-11-17 18:33:25 +02:00
										 |  |  | 	"reflect" | 
					
						
							| 
									
										
										
										
											2015-11-05 23:57:57 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-15 18:38:32 +02:00
										 |  |  | 	"github.com/ethereum/go-ethereum/accounts" | 
					
						
							| 
									
										
										
										
											2018-09-24 15:57:49 +03:00
										 |  |  | 	"github.com/ethereum/go-ethereum/core/rawdb" | 
					
						
							| 
									
										
										
										
											2015-11-05 23:57:57 +02:00
										 |  |  | 	"github.com/ethereum/go-ethereum/ethdb" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/event" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/p2p" | 
					
						
							| 
									
										
										
										
											2015-12-16 10:58:01 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/rpc" | 
					
						
							| 
									
										
										
										
											2015-11-05 23:57:57 +02:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // 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 { | 
					
						
							| 
									
										
										
										
											2016-08-18 13:28:17 +02:00
										 |  |  | 	config         *Config | 
					
						
							| 
									
										
										
										
											2016-08-15 18:38:32 +02:00
										 |  |  | 	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. | 
					
						
							| 
									
										
										
										
											2015-11-05 23:57:57 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-26 18:35:44 +02:00
										 |  |  | // 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. | 
					
						
							| 
									
										
										
										
											2018-09-24 15:57:49 +03:00
										 |  |  | func (ctx *ServiceContext) OpenDatabase(name string, cache int, handles int, namespace string) (ethdb.Database, error) { | 
					
						
							| 
									
										
										
										
											2016-08-18 13:28:17 +02:00
										 |  |  | 	if ctx.config.DataDir == "" { | 
					
						
							| 
									
										
										
										
											2018-09-24 15:57:49 +03:00
										 |  |  | 		return rawdb.NewMemoryDatabase(), nil | 
					
						
							| 
									
										
										
										
											2015-11-05 23:57:57 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-09-24 15:57:49 +03:00
										 |  |  | 	db, err := rawdb.NewLevelDBDatabase(ctx.config.ResolvePath(name), cache, handles, namespace) | 
					
						
							| 
									
										
										
										
											2017-06-23 09:56:30 +02:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return nil, err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return db, nil | 
					
						
							| 
									
										
										
										
											2015-11-17 18:33:25 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-06 11:37:32 +02:00
										 |  |  | // ResolvePath resolves a user path into the data directory if that was relative | 
					
						
							|  |  |  | // and if the user actually uses persistent storage. It will return an empty string | 
					
						
							|  |  |  | // for emphemeral storage and the user's own input for absolute paths. | 
					
						
							|  |  |  | func (ctx *ServiceContext) ResolvePath(path string) string { | 
					
						
							| 
									
										
										
											
												cmd, dashboard, log: log collection and exploration (#17097)
* cmd, dashboard, internal, log, node: logging feature
* cmd, dashboard, internal, log: requested changes
* dashboard, vendor: gofmt, govendor, use vendored file watcher
* dashboard, log: gofmt -s -w, goimports
* dashboard, log: gosimple
											
										 
											2018-07-11 10:59:04 +03:00
										 |  |  | 	return ctx.config.ResolvePath(path) | 
					
						
							| 
									
										
										
										
											2017-03-06 11:37:32 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-26 18:35:44 +02:00
										 |  |  | // 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 | 
					
						
							| 
									
										
										
										
											2015-11-17 18:33:25 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-11-26 18:35:44 +02:00
										 |  |  | 	return ErrServiceUnknown | 
					
						
							| 
									
										
										
										
											2015-11-05 23:57:57 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-04 19:03:10 +08:00
										 |  |  | // ExtRPCEnabled returns the indicator whether node enables the external | 
					
						
							|  |  |  | // RPC(http, ws or graphql). | 
					
						
							|  |  |  | func (ctx *ServiceContext) ExtRPCEnabled() bool { | 
					
						
							|  |  |  | 	return ctx.config.ExtRPCEnabled() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-05 23:57:57 +02:00
										 |  |  | // 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: | 
					
						
							| 
									
										
										
										
											2016-08-18 13:28:17 +02:00
										 |  |  | // | 
					
						
							|  |  |  | // • 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. | 
					
						
							| 
									
										
										
										
											2015-11-05 23:57:57 +02:00
										 |  |  | type Service interface { | 
					
						
							| 
									
										
										
										
											2016-04-28 12:00:11 +03:00
										 |  |  | 	// Protocols retrieves the P2P protocols the service wishes to start. | 
					
						
							| 
									
										
										
										
											2015-11-05 23:57:57 +02:00
										 |  |  | 	Protocols() []p2p.Protocol | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-15 16:07:19 +02:00
										 |  |  | 	// APIs retrieves the list of RPC descriptors the service provides | 
					
						
							|  |  |  | 	APIs() []rpc.API | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-17 18:33:25 +02:00
										 |  |  | 	// 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 | 
					
						
							| 
									
										
										
										
											2015-11-05 23:57:57 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Stop terminates all goroutines belonging to the service, blocking until they | 
					
						
							|  |  |  | 	// are all terminated. | 
					
						
							|  |  |  | 	Stop() error | 
					
						
							|  |  |  | } |