README
¶
Go Ethereum Dashboard
The dashboard is a data visualizer integrated into geth, intended to collect and visualize useful information of an Ethereum node. It consists of two parts:
- The client visualizes the collected data.
- The server collects the data, and updates the clients.
The client's UI uses React with JSX syntax, which is validated by the ESLint linter mostly according to the Airbnb React/JSX Style Guide. The style is defined in the .eslintrc
configuration file. The resources are bundled into a single bundle.js
file using Webpack, which relies on the webpack.config.js
. The bundled file is referenced from dashboard.html
and takes part in the assets.go
too. The necessary dependencies for the module bundler are gathered by Node.js.
Development and bundling
As the dashboard depends on certain NPM packages (which are not included in the go-ethereum
repo), these need to be installed first:
$ (cd dashboard/assets && npm install)
$ (cd dashboard/assets && ./node_modules/.bin/flow-typed install)
Normally the dashboard assets are bundled into GoChain via go-bindata
to avoid external dependencies. Rebuilding GoChain after each UI modification however is not feasible from a developer perspective. Instead, we can run webpack
in watch mode to automatically rebundle the UI, and ask geth
to use external assets to not rely on compiled resources:
$ (cd dashboard/assets && ./node_modules/.bin/webpack --watch)
$ geth --dashboard --dashboard.assets=dashboard/assets --vmodule=dashboard=5
To bundle up the final UI into GoChain, run go generate
:
$ go generate ./dashboard
Static type checking
Since JavaScript doesn't provide type safety, Flow is used to check types. These are only useful during development, so at the end of the process Babel will strip them.
To take advantage of static type checking, your IDE needs to be prepared for it. In case of Atom a configuration guide can be found here: Install the Nuclide package for Flow support, making sure it installs all of its support packages by enabling Install Recommended Packages on Startup
, and set the path of the flow-bin
which were installed previously by npm
.
For more IDE support install the linter-eslint
package too, which finds the .eslintrc
file, and provides real-time linting. Atom warns, that these two packages are incompatible, but they seem to work well together. For third-party library errors and auto-completion flow-typed is used.
Have fun
Webpack offers handy tools for visualizing the bundle's dependency tree and space usage.
- Generate the bundle's profile running
webpack --profile --json > stats.json
- For the dependency tree go to Webpack Analyze, and import
stats.json
- For the space usage go to Webpack Visualizer, and import
stats.json
Documentation
¶
Index ¶
- Variables
- func Asset(name string) ([]byte, error)
- func AssetDigest(name string) ([sha256.Size]byte, error)
- func AssetDir(name string) ([]string, error)
- func AssetInfo(name string) (os.FileInfo, error)
- func AssetNames() []string
- func AssetString(name string) (string, error)
- func Digests() (map[string][sha256.Size]byte, error)
- func MustAsset(name string) []byte
- func MustAssetString(name string) string
- func RestoreAsset(dir, name string) error
- func RestoreAssets(dir, name string) error
- type ChainMessage
- type ChartEntries
- type ChartEntry
- type Config
- type Dashboard
- type GeneralMessage
- type HomeMessage
- type LogsMessage
- type Message
- type NetworkMessage
- type SystemMessage
- type TxPoolMessage
Constants ¶
This section is empty.
Variables ¶
var DefaultConfig = Config{ Host: "localhost", Port: 8080, Refresh: 5 * time.Second, }
DefaultConfig contains default settings for the dashboard.
Functions ¶
func Asset ¶
Asset loads and returns the asset for the given name. It returns an error if the asset could not be found or could not be loaded.
func AssetDigest ¶
AssetDigest returns the digest of the file with the given name. It returns an error if the asset could not be found or the digest could not be loaded.
func AssetDir ¶
AssetDir returns the file names below a certain directory embedded in the file by go-bindata. For example if you run go-bindata on data/... and data contains the following hierarchy:
data/ foo.txt img/ a.png b.png
then AssetDir("data") would return []string{"foo.txt", "img"}, AssetDir("data/img") would return []string{"a.png", "b.png"}, AssetDir("foo.txt") and AssetDir("notexist") would return an error, and AssetDir("") will return []string{"data"}.
func AssetInfo ¶
AssetInfo loads and returns the asset info for the given name. It returns an error if the asset could not be found or could not be loaded.
func AssetString ¶
AssetString returns the asset contents as a string (instead of a []byte).
func MustAsset ¶
MustAsset is like Asset but panics when Asset would return an error. It simplifies safe initialization of global variables.
func MustAssetString ¶
MustAssetString is like AssetString but panics when Asset would return an error. It simplifies safe initialization of global variables.
func RestoreAsset ¶
RestoreAsset restores an asset under the given directory.
func RestoreAssets ¶
RestoreAssets restores an asset under the given directory recursively.
Types ¶
type ChainMessage ¶
type ChainMessage struct { }
type ChartEntries ¶
type ChartEntries []*ChartEntry
type ChartEntry ¶
type Config ¶
type Config struct { // Host is the host interface on which to start the dashboard server. If this // field is empty, no dashboard will be started. Host string `toml:",omitempty"` // Port is the TCP port number on which to start the dashboard server. The // default zero value is/ valid and will pick a port number randomly (useful // for ephemeral nodes). Port int `toml:",omitempty"` // Refresh is the refresh rate of the data updates, the chartEntry will be collected this often. Refresh time.Duration `toml:",omitempty"` // Assets offers a possibility to manually set the dashboard website's location on the server side. // It is useful for debugging, avoids the repeated generation of the binary. Assets string `toml:",omitempty"` }
Config contains the configuration parameters of the dashboard.
type Dashboard ¶
type Dashboard struct {
// contains filtered or unexported fields
}
Dashboard contains the dashboard internals.
type GeneralMessage ¶
type HomeMessage ¶
type HomeMessage struct { ActiveMemory ChartEntries `json:"activeMemory,omitempty"` VirtualMemory ChartEntries `json:"virtualMemory,omitempty"` NetworkIngress ChartEntries `json:"networkIngress,omitempty"` NetworkEgress ChartEntries `json:"networkEgress,omitempty"` ProcessCPU ChartEntries `json:"processCPU,omitempty"` SystemCPU ChartEntries `json:"systemCPU,omitempty"` DiskRead ChartEntries `json:"diskRead,omitempty"` DiskWrite ChartEntries `json:"diskWrite,omitempty"` }
type LogsMessage ¶
type LogsMessage struct {
Log []string `json:"log,omitempty"`
}
type Message ¶
type Message struct { General *GeneralMessage `json:"general,omitempty"` Home *HomeMessage `json:"home,omitempty"` Chain *ChainMessage `json:"chain,omitempty"` TxPool *TxPoolMessage `json:"txpool,omitempty"` Network *NetworkMessage `json:"network,omitempty"` System *SystemMessage `json:"system,omitempty"` Logs *LogsMessage `json:"logs,omitempty"` }
type NetworkMessage ¶
type NetworkMessage struct { }
type SystemMessage ¶
type SystemMessage struct { }
type TxPoolMessage ¶
type TxPoolMessage struct { }