neoneo-go/server.go
2019-02-25 22:44:14 +00:00

178 lines
3.8 KiB
Go

package main
import (
"errors"
"fmt"
"net"
"github.com/CityOfZion/neo-go/pkg/blockchain"
"github.com/CityOfZion/neo-go/pkg/database"
"github.com/CityOfZion/neo-go/pkg/syncmanager"
"github.com/CityOfZion/neo-go/pkg/connmgr"
"github.com/CityOfZion/neo-go/pkg/peer"
"github.com/CityOfZion/neo-go/pkg/wire/payload"
"github.com/CityOfZion/neo-go/pkg/wire/protocol"
"github.com/CityOfZion/neo-go/pkg/wire/util"
"github.com/CityOfZion/neo-go/pkg/wire/util/io"
)
// this file will act as a stub server
// Will create a server package
type Server struct {
chain *blockchain.Chain
db *database.LDB // TODO(Kev) change to database.Database
sm *syncmanager.Syncmanager
cm *connmgr.Connmgr
peercfg peer.LocalConfig
latestHash util.Uint256
}
func (s *Server) setupConnMgr() error {
// Connection Manager - Integrate
s.cm = connmgr.New(connmgr.Config{
GetAddress: nil,
OnConnection: s.OnConn,
OnAccept: nil,
Port: "10333",
})
return nil
}
func (s *Server) setupDatabase() error {
// Database -- Integrate
s.db = database.New("test")
return nil
}
func (s *Server) setupChain() error {
// Blockchain - Integrate
s.chain = blockchain.New(s.db, protocol.MainNet)
if s.chain != nil {
table := database.NewTable(s.db, database.HEADER)
resa, err := table.Get(database.LATESTHEADER)
s.latestHash, err = util.Uint256DecodeBytes(resa)
if err != nil {
return errors.New("Failed to get LastHeader " + err.Error())
}
} else {
return errors.New("Failed to add genesis block")
}
return nil
}
func (s *Server) setupSyncManager() error {
// Sync Manager - Integrate
s.sm = syncmanager.New(syncmanager.Config{
Chain: s.chain,
BestHash: s.latestHash,
})
return nil
}
func (s *Server) setupPeerConfig() error {
// Peer config struct - Integrate
s.peercfg = peer.LocalConfig{
Net: protocol.MainNet,
UserAgent: "DIG",
Services: protocol.NodePeerService,
Nonce: 1200,
ProtocolVer: 0,
Relay: false,
Port: 10332,
StartHeight: LocalHeight,
OnHeader: s.sm.OnHeaders,
OnBlock: s.sm.OnBlock,
}
return nil
}
func (s *Server) Run() error {
// Add all other run based methods for modules
// Connmgr - Run
s.cm.Run()
// Initial hardcoded nodes to connect to
err := s.cm.Connect(&connmgr.Request{
Addr: "seed1.ngd.network:10333",
})
return err
}
func main() {
setup()
}
func setup() {
server := Server{}
fmt.Println(server.sm)
err := server.setupConnMgr()
err = server.setupDatabase()
err = server.setupChain()
err = server.setupSyncManager()
err = server.setupPeerConfig()
fmt.Println(server.sm)
err = server.Run()
if err != nil {
fmt.Println(err)
}
<-make(chan struct{})
}
func OnHeader(peer *peer.Peer, msg *payload.HeadersMessage) {
for _, header := range msg.Headers {
if err := fileutils.UpdateFile("headers.txt", []byte(header.Hash.String())); err != nil {
fmt.Println("Error writing headers to file")
break
}
}
if len(msg.Headers) == 2000 { // reached tip
lastHeader := msg.Headers[len(msg.Headers)-1]
fmt.Println("Latest hash is", lastHeader.Hash.String())
fmt.Println("Latest Header height is", lastHeader.Index)
err := peer.RequestHeaders(lastHeader.Hash.Reverse())
if err != nil {
fmt.Println("Error getting more headers", err)
}
}
}
func LocalHeight() uint32 {
return 10
}
// OnConn is called when a successful connection has been made
func (s *Server) OnConn(conn net.Conn, addr string) {
fmt.Println(conn.RemoteAddr().String())
fmt.Println(addr)
p := peer.NewPeer(conn, false, s.peercfg)
err := p.Run()
if err != nil {
fmt.Println("Error running peer" + err.Error())
}
if err == nil {
s.sm.AddPeer(p)
}
// This is here just to quickly test the system
err = p.RequestHeaders(s.latestHash)
fmt.Println("For tests, we are only fetching first 2k batch")
if err != nil {
fmt.Println(err.Error())
}
}