OSDN Git Service

feat: add processIssuing (#152)
[bytom/vapor.git] / node / node.go
index 628fab2..61f26b1 100644 (file)
@@ -2,12 +2,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"
@@ -26,10 +28,11 @@ import (
        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"
 )
 
@@ -52,19 +55,30 @@ type Node struct {
        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)
@@ -86,6 +100,10 @@ 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
@@ -151,11 +169,27 @@ func NewNode(config *cfg.Config) *Node {
                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"))