func Factomd() { log.Print("//////////////////////// Copyright 2015 Factom Foundation") log.Print("//////////////////////// Use of this source code is governed by the MIT") log.Print("//////////////////////// license that can be found in the LICENSE file.") log.Printf("Go compiler version: %s\n", runtime.Version()) log.Printf("Using build: %s\n", Build) if !isCompilerVersionOK() { for i := 0; i < 30; i++ { log.Println("!!! !!! !!! ERROR: unsupported compiler version !!! !!! !!!") } time.Sleep(3 * time.Second) os.Exit(1) } // Go Optimizations... runtime.GOMAXPROCS(runtime.NumCPU()) state0 := new(state.State) state0.SetLeaderTimestamp(primitives.NewTimestampFromMilliseconds(0)) fmt.Println("len(Args)", len(os.Args)) NetStart(state0) }
func Start(state interfaces.IState) { var server *web.Server if Servers == nil { Servers = make(map[int]*web.Server) } if Servers[state.GetPort()] == nil { server = web.NewServer() Servers[state.GetPort()] = server server.Env["state"] = state server.Post("/v1/factoid-submit/?", HandleFactoidSubmit) server.Post("/v1/commit-chain/?", HandleCommitChain) server.Post("/v1/reveal-chain/?", HandleRevealChain) server.Post("/v1/commit-entry/?", HandleCommitEntry) server.Post("/v1/reveal-entry/?", HandleRevealEntry) server.Get("/v1/directory-block-head/?", HandleDirectoryBlockHead) server.Get("/v1/get-raw-data/([^/]+)", HandleGetRaw) server.Get("/v1/directory-block-by-keymr/([^/]+)", HandleDirectoryBlock) server.Get("/v1/entry-block-by-keymr/([^/]+)", HandleEntryBlock) server.Get("/v1/entry-by-hash/([^/]+)", HandleEntry) server.Get("/v1/chain-head/([^/]+)", HandleChainHead) server.Get("/v1/entry-credit-balance/([^/]+)", HandleEntryCreditBalance) server.Get("/v1/factoid-balance/([^/]+)", HandleFactoidBalance) server.Get("/v1/factoid-get-fee/", HandleGetFee) log.Print("Starting server") go server.Run(fmt.Sprintf("localhost:%d", state.GetPort())) } }
func Start(state interfaces.IState) { var server *web.Server ServersMutex.Lock() defer ServersMutex.Unlock() if Servers == nil { Servers = make(map[int]*web.Server) } rpcUser := state.GetRpcUser() rpcPass := state.GetRpcPass() h := sha256.New() h.Write(httpBasicAuth(rpcUser, rpcPass)) state.SetRpcAuthHash(h.Sum(nil)) //set this in the beginning to prevent timing attacks if Servers[state.GetPort()] == nil { server = web.NewServer() Servers[state.GetPort()] = server server.Env["state"] = state server.Post("/v1/factoid-submit/?", HandleFactoidSubmit) server.Post("/v1/commit-chain/?", HandleCommitChain) server.Post("/v1/reveal-chain/?", HandleRevealChain) server.Post("/v1/commit-entry/?", HandleCommitEntry) server.Post("/v1/reveal-entry/?", HandleRevealEntry) server.Get("/v1/directory-block-head/?", HandleDirectoryBlockHead) server.Get("/v1/get-raw-data/([^/]+)", HandleGetRaw) server.Get("/v1/get-receipt/([^/]+)", HandleGetReceipt) server.Get("/v1/directory-block-by-keymr/([^/]+)", HandleDirectoryBlock) server.Get("/v1/directory-block-height/?", HandleDirectoryBlockHeight) server.Get("/v1/entry-block-by-keymr/([^/]+)", HandleEntryBlock) server.Get("/v1/entry-by-hash/([^/]+)", HandleEntry) server.Get("/v1/chain-head/([^/]+)", HandleChainHead) server.Get("/v1/entry-credit-balance/([^/]+)", HandleEntryCreditBalance) server.Get("/v1/factoid-balance/([^/]+)", HandleFactoidBalance) server.Get("/v1/factoid-get-fee/", HandleGetFee) server.Get("/v1/properties/", HandleProperties) server.Get("/v1/heights/", HandleHeights) server.Post("/v2", HandleV2) server.Get("/v2", HandleV2) tlsIsEnabled, tlsPrivate, tlsPublic := state.GetTlsInfo() if tlsIsEnabled { log.Print("Starting encrypted API server") if !fileExists(tlsPrivate) && !fileExists(tlsPublic) { err := genCertPair(tlsPublic, tlsPrivate, state.GetFactomdLocations()) if err != nil { panic(fmt.Sprintf("could not start encrypted API server with error: %v", err)) } } keypair, err := tls.LoadX509KeyPair(tlsPublic, tlsPrivate) if err != nil { panic(fmt.Sprintf("could not create TLS keypair with error: %v", err)) } tlsConfig := &tls.Config{ Certificates: []tls.Certificate{keypair}, MinVersion: tls.VersionTLS12, } go server.RunTLS(fmt.Sprintf(":%d", state.GetPort()), tlsConfig) } else { log.Print("Starting API server") go server.Run(fmt.Sprintf(":%d", state.GetPort())) } } }
func main() { log.Print("//////////////////////// Copyright 2015 Factom Foundation") log.Print("//////////////////////// Use of this source code is governed by the MIT") log.Print("//////////////////////// license that can be found in the LICENSE file.") log.Printf("Go compiler version: %s\n", runtime.Version()) log.Printf("Using build: %s\n", Build) if !isCompilerVersionOK() { for i := 0; i < 30; i++ { fmt.Println("!!! !!! !!! ERROR: unsupported compiler version !!! !!! !!!") } time.Sleep(3 * time.Second) os.Exit(1) } cfgFilename := "" state := new(state.State) state.Init(cfgFilename) runtime.GOMAXPROCS(runtime.NumCPU()) if err := limits.SetLimits(); err != nil { os.Exit(1) } btcd.AddInterruptHandler(func() { log.Printf("Gracefully shutting down the database...") state.GetDB().(interfaces.IDatabase).Close() }) log.Print("Starting server") server, _ := btcd.NewServer(state) btcd.AddInterruptHandler(func() { log.Printf("Gracefully shutting down the server...") server.Stop() server.WaitForShutdown() }) server.Start() state.SetServer(server) //factomForkInit(server) go NetworkProcessor(state) go Timer(state) go Validator(state) go Leader(state) go Follower(state) go wsapi.Start(state) shutdownChannel := make(chan struct{}) go func() { server.WaitForShutdown() log.Printf("Server shutdown complete") shutdownChannel <- struct{}{} }() // Wait for shutdown signal from either a graceful server stop or from // the interrupt handler. <-shutdownChannel log.Printf("Shutdown complete") }