github.com/core-coin/go-core/v2@v2.1.9/node/doc.go (about) 1 // Copyright 2016 by the Authors 2 // This file is part of the go-core library. 3 // 4 // The go-core library is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU Lesser General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // The go-core library is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU Lesser General Public License for more details. 13 // 14 // You should have received a copy of the GNU Lesser General Public License 15 // along with the go-core library. If not, see <http://www.gnu.org/licenses/>. 16 17 /* 18 Package node sets up multi-protocol Core nodes. 19 20 In the model exposed by this package, a node is a collection of services which use shared 21 resources to provide RPC APIs. Services can also offer devp2p protocols, which are wired 22 up to the devp2p network when the node instance is started. 23 24 # Node Lifecycle 25 26 The Node object has a lifecycle consisting of three basic states, INITIALIZING, RUNNING 27 and CLOSED. 28 29 ●───────┐ 30 New() 31 │ 32 ▼ 33 INITIALIZING ────Start()─┐ 34 │ │ 35 │ ▼ 36 Close() RUNNING 37 │ │ 38 ▼ │ 39 CLOSED ◀──────Close()─┘ 40 41 Creating a Node allocates basic resources such as the data directory and returns the node 42 in its INITIALIZING state. Lifecycle objects, RPC APIs and peer-to-peer networking 43 protocols can be registered in this state. Basic operations such as opening a key-value 44 database are permitted while initializing. 45 46 Once everything is registered, the node can be started, which moves it into the RUNNING 47 state. Starting the node starts all registered Lifecycle objects and enables RPC and 48 peer-to-peer networking. Note that no additional Lifecycles, APIs or p2p protocols can be 49 registered while the node is running. 50 51 Closing the node releases all held resources. The actions performed by Close depend on the 52 state it was in. When closing a node in INITIALIZING state, resources related to the data 53 directory are released. If the node was RUNNING, closing it also stops all Lifecycle 54 objects and shuts down RPC and peer-to-peer networking. 55 56 You must always call Close on Node, even if the node was not started. 57 58 # Resources Managed By Node 59 60 All file-system resources used by a node instance are located in a directory called the 61 data directory. The location of each resource can be overridden through additional node 62 configuration. The data directory is optional. If it is not set and the location of a 63 resource is otherwise unspecified, package node will create the resource in memory. 64 65 To access to the devp2p network, Node configures and starts p2p.Server. Each host on the 66 devp2p network has a unique identifier, the node key. The Node instance persists this key 67 across restarts. Node also loads static and trusted node lists and ensures that knowledge 68 about other hosts is persisted. 69 70 JSON-RPC servers which run HTTP, WebSocket or IPC can be started on a Node. RPC modules 71 offered by registered services will be offered on those endpoints. Users can restrict any 72 endpoint to a subset of RPC modules. Node itself offers the "debug", "admin" and "web3" 73 modules. 74 75 Service implementations can open LevelDB databases through the service context. Package 76 node chooses the file system location of each database. If the node is configured to run 77 without a data directory, databases are opened in memory instead. 78 79 Node also creates the shared store of encrypted Core account keys. Services can access 80 the account manager through the service context. 81 82 # Sharing Data Directory Among Instances 83 84 Multiple node instances can share a single data directory if they have distinct instance 85 names (set through the Name config option). Sharing behaviour depends on the type of 86 resource. 87 88 devp2p-related resources (node key, static/trusted node lists, known hosts database) are 89 stored in a directory with the same name as the instance. Thus, multiple node instances 90 using the same data directory will store this information in different subdirectories of 91 the data directory. 92 93 LevelDB databases are also stored within the instance subdirectory. If multiple node 94 instances use the same data directory, opening the databases with identical names will 95 create one database for each instance. 96 97 The account key store is shared among all node instances using the same data directory 98 unless its location is changed through the KeyStoreDir configuration option. 99 100 # Data Directory Sharing Example 101 102 In this example, two node instances named A and B are started with the same data 103 directory. Node instance A opens the database "db", node instance B opens the databases 104 "db" and "db-2". The following files will be created in the data directory: 105 106 data-directory/ 107 A/ 108 nodekey -- devp2p node key of instance A 109 nodes/ -- devp2p discovery knowledge database of instance A 110 db/ -- LevelDB content for "db" 111 A.ipc -- JSON-RPC UNIX domain socket endpoint of instance A 112 B/ 113 nodekey -- devp2p node key of node B 114 nodes/ -- devp2p discovery knowledge database of instance B 115 static-nodes.json -- devp2p static node list of instance B 116 db/ -- LevelDB content for "db" 117 db-2/ -- LevelDB content for "db-2" 118 B.ipc -- JSON-RPC UNIX domain socket endpoint of instance B 119 keystore/ -- account key store, used by both instances 120 */ 121 package node