cmd/geth, cmd/mist, cmd/utils, eth, p2p: support trusted peers

This commit is contained in:
Péter Szilágyi
2015-04-29 18:04:08 +03:00
parent 3fef601903
commit de0549fabb
8 changed files with 146 additions and 27 deletions

View File

@ -2,7 +2,10 @@ package eth
import (
"crypto/ecdsa"
"encoding/json"
"fmt"
"io/ioutil"
"os"
"path"
"strings"
"time"
@ -56,10 +59,13 @@ type Config struct {
MaxPeers int
Port string
// This should be a space-separated list of
// discovery node URLs.
// Space-separated list of discovery node URLs
BootNodes string
// Either a space-separated list of discovery node URLs, or a path to a json
// file containing such a list.
TrustedNodes string
// This key is used to identify the node on the network.
// If nil, an ephemeral key is used.
NodeKey *ecdsa.PrivateKey
@ -96,6 +102,46 @@ func (cfg *Config) parseBootNodes() []*discover.Node {
return ns
}
// parseTrustedNodes parses a list of discovery node URLs either given literally,
// or loaded from a .json file.
func (cfg *Config) parseTrustedNodes() []*discover.Node {
// Short circuit if no trusted nodes were given
if cfg.TrustedNodes == "" {
return nil
}
// Try to interpret the trusted node config as a .json file
if _, err := os.Stat(cfg.TrustedNodes); err == nil {
// Load the file from disk
blob, err := ioutil.ReadFile(cfg.TrustedNodes)
if err != nil {
glog.V(logger.Error).Infof("Failed to access trusted nodes: %v", err)
return nil
}
// Interpret the json contents
list := []string{}
if err := json.Unmarshal(blob, &list); err != nil {
glog.V(logger.Error).Infof("Failed to load trusted nodes: %v", err)
return nil
}
// Swap out the configuration for the actual nodes
cfg.TrustedNodes = strings.Join(list, " ")
}
// Interpret the list as a discovery node array
var nodes []*discover.Node
for _, url := range strings.Split(cfg.TrustedNodes, " ") {
if url == "" {
continue
}
node, err := discover.ParseNode(url)
if err != nil {
glog.V(logger.Error).Infof("Trusted node URL %s: %v\n", url, err)
continue
}
nodes = append(nodes, node)
}
return nodes
}
func (cfg *Config) nodeKey() (*ecdsa.PrivateKey, error) {
// use explicit key from command line args if set
if cfg.NodeKey != nil {
@ -247,6 +293,7 @@ func New(config *Config) (*Ethereum, error) {
NAT: config.NAT,
NoDial: !config.Dial,
BootstrapNodes: config.parseBootNodes(),
TrustedNodes: config.parseTrustedNodes(),
NodeDatabase: nodeDb,
}
if len(config.Port) > 0 {
@ -442,12 +489,13 @@ func (s *Ethereum) StartForTest() {
s.txPool.Start()
}
func (self *Ethereum) SuggestPeer(nodeURL string) error {
// TrustPeer injects a new node into the list of privileged nodes.
func (self *Ethereum) TrustPeer(nodeURL string) error {
n, err := discover.ParseNode(nodeURL)
if err != nil {
return fmt.Errorf("invalid node URL: %v", err)
}
self.net.SuggestPeer(n)
self.net.TrustPeer(n)
return nil
}