package monitor
import (
- "io/ioutil"
+ // "encoding/binary"
+ // "io/ioutil"
+ "fmt"
"os"
+ "strings"
"time"
"github.com/jinzhu/gorm"
vaporCfg "github.com/vapor/config"
"github.com/vapor/p2p"
// conn "github.com/vapor/p2p/connection"
- // "github.com/vapor/p2p/signlib"
// "github.com/vapor/consensus"
+ // "github.com/vapor/crypto/sha3pool"
+ "github.com/vapor/p2p/discover/dht"
+ "github.com/vapor/p2p/discover/mdns"
+ "github.com/vapor/p2p/signlib"
"github.com/vapor/toolbar/precog/config"
"github.com/vapor/toolbar/precog/database/orm"
)
}
func NewMonitor(cfg *config.Config, db *gorm.DB) *monitor {
- dirPath, err := ioutil.TempDir(".", "")
- if err != nil {
- log.Fatal(err)
- }
-
nodeCfg := &vaporCfg.Config{
BaseConfig: vaporCfg.DefaultBaseConfig(),
P2P: vaporCfg.DefaultP2PConfig(),
Federation: vaporCfg.DefaultFederationConfig(),
}
- nodeCfg.DBPath = dirPath
+ nodeCfg.DBPath = "vapor_precog_data"
return &monitor{
cfg: cfg,
// create or update: https://github.com/jinzhu/gorm/issues/1307
func (m *monitor) updateBootstrapNodes() {
+ var seeds []string
for _, node := range m.cfg.Nodes {
ormNode := &orm.Node{
PublicKey: node.PublicKey.String(),
Host: node.Host,
Port: node.Port,
}
+ seeds = append(seeds, fmt.Sprintf("%s:%d", node.Host, node.Port))
if err := m.db.Where(&orm.Node{PublicKey: ormNode.PublicKey}).
Assign(&orm.Node{
continue
}
}
+ m.nodeCfg.P2P.Seeds = strings.Join(seeds, ",")
}
// TODO:
// /home/gavin/work/go/src/github.com/vapor/
// p2p/test_util.go
// p2p/switch_test.go
+// syncManager
+// notificationMgr
func (m *monitor) discovery() {
sw, err := m.makeSwitch()
if err != nil {
}
sw.Start()
- defer sw.Stop()
-}
-
-func (m *monitor) calcNetID() (*p2p.Switch, error) {
- var data []byte
- var h [32]byte
- data = append(data, m.nodeCfg.GenesisBlock().Hash().Bytes()...)
- magic := make([]byte, 8)
- magicNumber := uint64(0x054c5638)
- binary.BigEndian.PutUint64(magic, magicNumber)
- data = append(data, magic[:]...)
- sha3pool.Sum256(h[:], data)
- return binary.BigEndian.Uint64(h[:8])
}
func (m *monitor) makeSwitch() (*p2p.Switch, error) {
- // TODO: 包一下? common cfg 之类的?
-
- var err error
- var l Listener
- var listenAddr string
- var discv *dht.Network
- var lanDiscv *mdns.LANDiscover
-
- // swPrivKey, err := signlib.NewPrivKey()
- // if err != nil {
- // log.Fatal(err)
- // }
-
- // TODO: whatz that for
- // testDB := dbm.NewDB("testdb", "leveldb", dirPath)
- // TODO: clean up
- // log.Println("Federation.Xpubs", mCfg.Federation.Xpubs)
- sw, err := p2p.NewSwitch(mCfg)
+ swPrivKey, err := signlib.NewPrivKey()
+ if err != nil {
+ return nil, err
+ }
+
+ l, listenAddr := p2p.GetListener(m.nodeCfg.P2P)
+ discv, err := dht.NewDiscover(m.nodeCfg, swPrivKey, l.ExternalAddress().Port, m.cfg.NetworkID)
if err != nil {
return nil, err
}
- return sw, nil
+ lanDiscv := mdns.NewLANDiscover(mdns.NewProtocol(), int(l.ExternalAddress().Port))
+ return p2p.NewSwitch(m.nodeCfg, discv, lanDiscv, l, swPrivKey, listenAddr, m.cfg.NetworkID)
}
func (m *monitor) monitorRountine() error {