|
|
@@ -12,20 +12,19 @@ import (
|
|
|
"github.com/ethereum/go-ethereum/event"
|
|
|
ethlogger "github.com/ethereum/go-ethereum/logger"
|
|
|
"github.com/ethereum/go-ethereum/p2p"
|
|
|
+ "github.com/ethereum/go-ethereum/p2p/discover"
|
|
|
"github.com/ethereum/go-ethereum/pow/ezp"
|
|
|
"github.com/ethereum/go-ethereum/rpc"
|
|
|
"github.com/ethereum/go-ethereum/whisper"
|
|
|
)
|
|
|
|
|
|
type Config struct {
|
|
|
- Name string
|
|
|
- Version string
|
|
|
- Identifier string
|
|
|
- KeyStore string
|
|
|
- DataDir string
|
|
|
- LogFile string
|
|
|
- LogLevel int
|
|
|
- KeyRing string
|
|
|
+ Name string
|
|
|
+ KeyStore string
|
|
|
+ DataDir string
|
|
|
+ LogFile string
|
|
|
+ LogLevel int
|
|
|
+ KeyRing string
|
|
|
|
|
|
MaxPeers int
|
|
|
Port string
|
|
|
@@ -66,8 +65,7 @@ type Ethereum struct {
|
|
|
WsServer rpc.RpcServer
|
|
|
keyManager *crypto.KeyManager
|
|
|
|
|
|
- clientIdentity p2p.ClientIdentity
|
|
|
- logger ethlogger.LogSystem
|
|
|
+ logger ethlogger.LogSystem
|
|
|
|
|
|
synclock sync.Mutex
|
|
|
syncGroup sync.WaitGroup
|
|
|
@@ -103,21 +101,17 @@ func New(config *Config) (*Ethereum, error) {
|
|
|
// Initialise the keyring
|
|
|
keyManager.Init(config.KeyRing, 0, false)
|
|
|
|
|
|
- // Create a new client id for this instance. This will help identifying the node on the network
|
|
|
- clientId := p2p.NewSimpleClientIdentity(config.Name, config.Version, config.Identifier, keyManager.PublicKey())
|
|
|
-
|
|
|
saveProtocolVersion(db)
|
|
|
//ethutil.Config.Db = db
|
|
|
|
|
|
eth := &Ethereum{
|
|
|
- shutdownChan: make(chan bool),
|
|
|
- quit: make(chan bool),
|
|
|
- db: db,
|
|
|
- keyManager: keyManager,
|
|
|
- clientIdentity: clientId,
|
|
|
- blacklist: p2p.NewBlacklist(),
|
|
|
- eventMux: &event.TypeMux{},
|
|
|
- logger: logger,
|
|
|
+ shutdownChan: make(chan bool),
|
|
|
+ quit: make(chan bool),
|
|
|
+ db: db,
|
|
|
+ keyManager: keyManager,
|
|
|
+ blacklist: p2p.NewBlacklist(),
|
|
|
+ eventMux: &event.TypeMux{},
|
|
|
+ logger: logger,
|
|
|
}
|
|
|
|
|
|
eth.chainManager = core.NewChainManager(db, eth.EventMux())
|
|
|
@@ -132,21 +126,23 @@ func New(config *Config) (*Ethereum, error) {
|
|
|
|
|
|
ethProto := EthProtocol(eth.txPool, eth.chainManager, eth.blockPool)
|
|
|
protocols := []p2p.Protocol{ethProto, eth.whisper.Protocol()}
|
|
|
-
|
|
|
nat, err := p2p.ParseNAT(config.NATType, config.PMPGateway)
|
|
|
if err != nil {
|
|
|
return nil, err
|
|
|
}
|
|
|
-
|
|
|
+ netprv, err := crypto.GenerateKey()
|
|
|
+ if err != nil {
|
|
|
+ return nil, fmt.Errorf("could not generate server key: %v", err)
|
|
|
+ }
|
|
|
eth.net = &p2p.Server{
|
|
|
- Identity: clientId,
|
|
|
- MaxPeers: config.MaxPeers,
|
|
|
- Protocols: protocols,
|
|
|
- Blacklist: eth.blacklist,
|
|
|
- NAT: nat,
|
|
|
- NoDial: !config.Dial,
|
|
|
+ PrivateKey: netprv,
|
|
|
+ Name: config.Name,
|
|
|
+ MaxPeers: config.MaxPeers,
|
|
|
+ Protocols: protocols,
|
|
|
+ Blacklist: eth.blacklist,
|
|
|
+ NAT: nat,
|
|
|
+ NoDial: !config.Dial,
|
|
|
}
|
|
|
-
|
|
|
if len(config.Port) > 0 {
|
|
|
eth.net.ListenAddr = ":" + config.Port
|
|
|
}
|
|
|
@@ -162,8 +158,8 @@ func (s *Ethereum) Logger() ethlogger.LogSystem {
|
|
|
return s.logger
|
|
|
}
|
|
|
|
|
|
-func (s *Ethereum) ClientIdentity() p2p.ClientIdentity {
|
|
|
- return s.clientIdentity
|
|
|
+func (s *Ethereum) Name() string {
|
|
|
+ return s.net.Name
|
|
|
}
|
|
|
|
|
|
func (s *Ethereum) ChainManager() *core.ChainManager {
|
|
|
@@ -241,26 +237,17 @@ func (s *Ethereum) Start(seedNode string) error {
|
|
|
s.blockSub = s.eventMux.Subscribe(core.NewMinedBlockEvent{})
|
|
|
go s.blockBroadcastLoop()
|
|
|
|
|
|
- // TODO: read peers here
|
|
|
- if len(seedNode) > 0 {
|
|
|
- logger.Infof("Connect to seed node %v", seedNode)
|
|
|
- if err := s.SuggestPeer(seedNode); err != nil {
|
|
|
- logger.Infoln(err)
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
logger.Infoln("Server started")
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
-func (self *Ethereum) SuggestPeer(addr string) error {
|
|
|
+func (self *Ethereum) SuggestPeer(addr string, id discover.NodeID) error {
|
|
|
netaddr, err := net.ResolveTCPAddr("tcp", addr)
|
|
|
if err != nil {
|
|
|
logger.Errorf("couldn't resolve %s:", addr, err)
|
|
|
return err
|
|
|
}
|
|
|
-
|
|
|
- self.net.SuggestPeer(netaddr.IP, netaddr.Port, nil)
|
|
|
+ self.net.SuggestPeer(netaddr.IP, netaddr.Port, id)
|
|
|
return nil
|
|
|
}
|
|
|
|