package p2p
import (
+ "encoding/binary"
"encoding/hex"
"encoding/json"
"fmt"
cfg "github.com/vapor/config"
"github.com/vapor/consensus"
"github.com/vapor/crypto/ed25519"
+ "github.com/vapor/crypto/sha3pool"
dbm "github.com/vapor/database/leveldb"
"github.com/vapor/errors"
"github.com/vapor/event"
minNumOutboundPeers = 4
maxNumLANPeers = 5
+ //magicNumber used to generate unique netID
+ magicNumber = uint64(0x054c5638)
)
//pre-define errors for connecting fail
var discv *dht.Network
var lanDiscv *mdns.LANDiscover
+ //generate unique netID
+ var data []byte
+ var h [32]byte
+ data = append(data, cfg.GenesisBlock().Hash().Bytes()...)
+ magic := make([]byte, 8)
+ binary.BigEndian.PutUint64(magic, magicNumber)
+ data = append(data, magic[:]...)
+ sha3pool.Sum256(h[:], data)
+ netID := binary.BigEndian.Uint64(h[:8])
+
blacklistDB := dbm.NewDB("trusthistory", config.DBBackend, config.DBDir())
config.P2P.PrivateKey, err = config.NodeKey()
if err != nil {
if !config.VaultMode {
// Create listener
l, listenAddr = GetListener(config.P2P)
- discv, err = dht.NewDiscover(config, ed25519.PrivateKey(bytes), l.ExternalAddress().Port)
+ discv, err = dht.NewDiscover(config, ed25519.PrivateKey(bytes), l.ExternalAddress().Port, netID)
if err != nil {
return nil, err
}
}
}
- return newSwitch(config, discv, lanDiscv, blacklistDB, l, privKey, listenAddr)
+ return newSwitch(config, discv, lanDiscv, blacklistDB, l, privKey, listenAddr, netID)
}
// newSwitch creates a new Switch with the given config.
-func newSwitch(config *cfg.Config, discv discv, lanDiscv lanDiscv, blacklistDB dbm.DB, l Listener, priv crypto.PrivKeyEd25519, listenAddr string) (*Switch, error) {
+func newSwitch(config *cfg.Config, discv discv, lanDiscv lanDiscv, blacklistDB dbm.DB, l Listener, priv crypto.PrivKeyEd25519, listenAddr string, netID uint64) (*Switch, error) {
sw := &Switch{
Config: config,
peerConfig: DefaultPeerConfig(config.P2P),
discv: discv,
lanDiscv: lanDiscv,
db: blacklistDB,
- nodeInfo: NewNodeInfo(config, priv.PubKey().Unwrap().(crypto.PubKeyEd25519), listenAddr),
+ nodeInfo: NewNodeInfo(config, priv.PubKey().Unwrap().(crypto.PubKeyEd25519), listenAddr, netID),
bannedPeer: make(map[string]time.Time),
}
if err := sw.loadBannedPeers(); err != nil {