package node
import (
- "context"
"encoding/hex"
"errors"
"net"
_ "net/http/pprof"
"os"
"path/filepath"
+ "reflect"
"github.com/prometheus/prometheus/util/flock"
log "github.com/sirupsen/logrus"
"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"
"github.com/vapor/netsync"
"github.com/vapor/proposal/blockproposer"
"github.com/vapor/protocol"
+ "github.com/vapor/protocol/bc/types"
w "github.com/vapor/wallet"
)
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())
}
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.FederationProgrom(config)),
+ "fed_controlprogram": hex.EncodeToString(cfg.FederationWScript(config)),
}).Info()
initLogFile(config)
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 {
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")
}
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))
}
accessTokens: accessTokens,
wallet: wallet,
chain: chain,
- txfeed: txFeed,
miningEnable: config.Mining,
notificationMgr: notificationMgr,
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"))
}
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()