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"
dbm "github.com/vapor/database/leveldb"
"github.com/vapor/env"
"github.com/vapor/event"
- "github.com/vapor/mining/cpuminer"
"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"
)
api *api.API
chain *protocol.Chain
txfeed *txfeed.Tracker
- cpuMiner *cpuminer.CPUMiner
+ 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.FederationProgrom(config)),
+ }).Info()
+
initLogFile(config)
initActiveNetParams(config)
initCommonConfig(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
notificationMgr: notificationMgr,
}
- node.cpuMiner = cpuminer.NewCPUMiner(chain, accounts, txPool, dispatcher)
+ node.cpuMiner = blockproposer.NewBlockProposer(chain, accounts, txPool, dispatcher)
node.BaseService = *cmn.NewBaseService(nil, "Node", node)
return node
}
+// find whether config xpubs equal genesis block xpubs
+func checkConfig(chain *protocol.Chain, config *cfg.Config) error {
+ fedpegScript := cfg.FederationProgrom(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"))