X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=node%2Fnode.go;h=531ff832df9f5aeac94949016bfcb9be281a64ee;hb=60d1d8f9290cc8269ba2a764fbe48ef940b42614;hp=4d32a592e931471b15e45064e536997d35c72ef8;hpb=2d27cad41ef79da3a46142401b5efcf92133ea1a;p=bytom%2Fvapor.git diff --git a/node/node.go b/node/node.go index 4d32a592..531ff832 100644 --- a/node/node.go +++ b/node/node.go @@ -1,13 +1,14 @@ package node import ( - "context" + "encoding/hex" "errors" "net" "net/http" _ "net/http/pprof" "os" "path/filepath" + "reflect" "github.com/prometheus/prometheus/util/flock" log "github.com/sirupsen/logrus" @@ -19,17 +20,17 @@ import ( "github.com/vapor/api" "github.com/vapor/asset" "github.com/vapor/blockchain/pseudohsm" - "github.com/vapor/blockchain/txfeed" cfg "github.com/vapor/config" "github.com/vapor/consensus" "github.com/vapor/database" dbm "github.com/vapor/database/leveldb" "github.com/vapor/env" "github.com/vapor/event" - "github.com/vapor/proposal/blockproposer" "github.com/vapor/net/websocket" "github.com/vapor/netsync" + "github.com/vapor/proposal/blockproposer" "github.com/vapor/protocol" + "github.com/vapor/protocol/bc/types" w "github.com/vapor/wallet" ) @@ -51,22 +52,32 @@ type Node struct { notificationMgr *websocket.WSNotificationManager api *api.API chain *protocol.Chain - txfeed *txfeed.Tracker cpuMiner *blockproposer.BlockProposer miningEnable bool } // NewNode create bytom node func NewNode(config *cfg.Config) *Node { - ctx := context.Background() if err := lockDataDirectory(config); err != nil { cmn.Exit("Error: " + err.Error()) } + if err := cfg.LoadFederationFile(config.FederationFile(), config); err != nil { cmn.Exit(cmn.Fmt("Failed to load federated information:[%s]", err.Error())) } + + log.WithFields(log.Fields{ + "module": logModule, + "pubkey": config.PrivateKey().XPub(), + "fed_xpubs": config.Federation.Xpubs, + "fed_quorum": config.Federation.Quorum, + "fed_controlprogram": hex.EncodeToString(cfg.FederationWScript(config)), + }).Info() + initLogFile(config) - initActiveNetParams(config) + if err := consensus.InitActiveNetParams(config.ChainID); err != nil { + log.Fatalf("Failed to init ActiveNetParams:[%s]", err.Error()) + } initCommonConfig(config) // Get store @@ -86,18 +97,13 @@ func NewNode(config *cfg.Config) *Node { cmn.Exit(cmn.Fmt("Failed to create chain structure: %v", err)) } + if err := checkConfig(chain, config); err != nil { + panic(err) + } + var accounts *account.Manager var assets *asset.Registry var wallet *w.Wallet - var txFeed *txfeed.Tracker - - txFeedDB := dbm.NewDB("txfeeds", config.DBBackend, config.DBDir()) - txFeed = txfeed.NewTracker(txFeedDB, chain) - - if err = txFeed.Prepare(ctx); err != nil { - log.WithFields(log.Fields{"module": logModule, "error": err}).Error("start txfeed") - return nil - } hsm, err := pseudohsm.New(config.KeysDir()) if err != nil { @@ -106,9 +112,11 @@ func NewNode(config *cfg.Config) *Node { if !config.Wallet.Disable { walletDB := dbm.NewDB("wallet", config.DBBackend, config.DBDir()) - accounts = account.NewManager(walletDB, chain) + walletStore := database.NewWalletStore(walletDB) + accountStore := database.NewAccountStore(walletDB) + accounts = account.NewManager(accountStore, chain) assets = asset.NewRegistry(walletDB, chain) - wallet, err = w.NewWallet(walletDB, accounts, assets, hsm, chain, dispatcher, config.Wallet.TxIndex) + wallet, err = w.NewWallet(walletStore, accounts, assets, hsm, chain, dispatcher, config.Wallet.TxIndex) if err != nil { log.WithFields(log.Fields{"module": logModule, "error": err}).Error("init NewWallet") } @@ -118,8 +126,8 @@ func NewNode(config *cfg.Config) *Node { wallet.RescanBlocks() } } - - syncManager, err := netsync.NewSyncManager(config, chain, txPool, dispatcher) + fastSyncDB := dbm.NewDB("fastsync", config.DBBackend, config.DBDir()) + syncManager, err := netsync.NewSyncManager(config, chain, txPool, dispatcher, fastSyncDB) if err != nil { cmn.Exit(cmn.Fmt("Failed to create sync manager: %v", err)) } @@ -129,7 +137,7 @@ func NewNode(config *cfg.Config) *Node { // run the profile server profileHost := config.ProfListenAddress if profileHost != "" { - // Profiling bytomd programs.see (https://blog.golang.org/profiling-go-programs) + // Profiling vapord programs.see (https://blog.golang.org/profiling-go-programs) // go tool pprof http://profileHose/debug/pprof/heap go func() { if err = http.ListenAndServe(profileHost, nil); err != nil { @@ -145,7 +153,6 @@ func NewNode(config *cfg.Config) *Node { accessTokens: accessTokens, wallet: wallet, chain: chain, - txfeed: txFeed, miningEnable: config.Mining, notificationMgr: notificationMgr, @@ -156,6 +163,22 @@ func NewNode(config *cfg.Config) *Node { return node } +// find whether config xpubs equal genesis block xpubs +func checkConfig(chain *protocol.Chain, config *cfg.Config) error { + fedpegScript := cfg.FederationWScript(config) + genesisBlock, err := chain.GetBlockByHeight(0) + if err != nil { + return err + } + typedInput := genesisBlock.Transactions[0].Inputs[0].TypedInput + if v, ok := typedInput.(*types.CoinbaseInput); ok { + if !reflect.DeepEqual(fedpegScript, v.Arbitrary) { + return errors.New("config xpubs don't equal genesis block xpubs.") + } + } + return nil +} + // Lock data directory after daemonization func lockDataDirectory(config *cfg.Config) error { _, _, err := flock.New(filepath.Join(config.RootDir, "LOCK")) @@ -165,14 +188,6 @@ func lockDataDirectory(config *cfg.Config) error { return nil } -func initActiveNetParams(config *cfg.Config) { - var exist bool - consensus.ActiveNetParams, exist = consensus.NetParams[config.ChainID] - if !exist { - cmn.Exit(cmn.Fmt("chain_id[%v] don't exist", config.ChainID)) - } -} - func initLogFile(config *cfg.Config) { if config.LogFile == "" { return @@ -202,7 +217,7 @@ func launchWebBrowser(port string) { } func (n *Node) initAndstartAPIServer() { - n.api = api.NewAPI(n.syncManager, n.wallet, n.txfeed, n.cpuMiner, n.chain, n.config, n.accessTokens, n.eventDispatcher, n.notificationMgr) + n.api = api.NewAPI(n.syncManager, n.wallet, n.cpuMiner, n.chain, n.config, n.accessTokens, n.eventDispatcher, n.notificationMgr) listenAddr := env.String("LISTEN", n.config.ApiAddress) env.Parse()