-
Notifications
You must be signed in to change notification settings - Fork 1
/
main.go
145 lines (135 loc) · 3.53 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
package main
import (
"os"
"runtime"
"time"
"DNA_POW/account"
"DNA_POW/common/config"
"DNA_POW/common/log"
"DNA_POW/consensus/pow"
"DNA_POW/core/ledger"
"DNA_POW/core/store/ChainStore"
"DNA_POW/core/transaction"
"DNA_POW/crypto"
"DNA_POW/net"
"DNA_POW/net/httpjsonrpc"
"DNA_POW/net/httpnodeinfo"
"DNA_POW/net/httprestful"
"DNA_POW/net/httpwebsocket"
"DNA_POW/net/protocol"
)
const (
DefaultMultiCoreNum = 4
)
func init() {
log.Init(log.Path, log.Stdout)
var coreNum int
if config.Parameters.MultiCoreNum > DefaultMultiCoreNum {
coreNum = int(config.Parameters.MultiCoreNum)
} else {
coreNum = DefaultMultiCoreNum
}
log.Debug("The Core number is ", coreNum)
runtime.GOMAXPROCS(coreNum)
}
func handleLogFile(consensus string) {
switch consensus {
case "pow":
go func() {
for {
time.Sleep(6 * time.Second)
log.Trace("BlockHeight = ", ledger.DefaultLedger.Blockchain.BlockHeight)
ledger.DefaultLedger.Blockchain.DumpState()
bc := ledger.DefaultLedger.Blockchain
log.Info("[", len(bc.Index), len(bc.BlockCache), len(bc.Orphans), "]")
//ledger.DefaultLedger.Blockchain.DumpState()
isNeedNewFile := log.CheckIfNeedNewFile()
if isNeedNewFile == true {
log.ClosePrintLog()
log.Init(log.Path, os.Stdout)
}
} //for end
}()
}
}
func startConsensus(client account.Client, noder protocol.Noder) bool {
if protocol.SERVICENODENAME != config.Parameters.NodeType {
if config.Parameters.ConsensusType == "pow" &&
config.Parameters.PowConfiguration.Switch == "enable" {
log.Info("Start POW Services")
powServices := pow.NewPowService(client, "logPow", noder)
httpjsonrpc.RegistPowService(powServices)
isAuxPow := config.Parameters.PowConfiguration.CoMining
if !isAuxPow {
isAuto := config.Parameters.PowConfiguration.AutoMining
if isAuto {
go powServices.Start()
}
} else {
//aux pow
}
handleLogFile("pow")
time.Sleep(5 * time.Second)
return true
} else {
log.Fatal("Start consensus ERROR,consensusType is: ", config.Parameters.ConsensusType)
return false
}
}
return true
}
func main() {
var client account.Client
var acct *account.Account
//var blockChain *ledger.Blockchain
var err error
var noder protocol.Noder
log.Trace("Node version: ", config.Version)
log.Info("1. BlockChain init")
ledger.DefaultLedger = new(ledger.Ledger)
ledger.DefaultLedger.Store, err = ChainStore.NewLedgerStore()
defer ledger.DefaultLedger.Store.Close()
if err != nil {
log.Fatal("open LedgerStore err:", err)
os.Exit(1)
}
ledger.DefaultLedger.Store.InitLedgerStore(ledger.DefaultLedger)
transaction.TxStore = ledger.DefaultLedger.Store
crypto.SetAlg(config.Parameters.EncryptAlg)
_, err = ledger.NewBlockchainWithGenesisBlock()
if err != nil {
log.Fatal(err, "BlockChain generate failed")
goto ERROR
}
log.Info("2. Open the account")
client = account.GetClient()
if client == nil {
log.Fatal("Can't get local account.")
goto ERROR
}
acct, err = client.GetDefaultAccount()
if err != nil {
log.Fatal(err)
goto ERROR
}
httpjsonrpc.Wallet = client
log.Info("3. Start the P2P networks")
noder = net.StartProtocol(acct.PublicKey)
httpjsonrpc.RegistRpcNode(noder)
time.Sleep(10 * time.Second)
noder.StartSync()
noder.SyncNodeHeight()
if !startConsensus(client, noder) {
goto ERROR
}
log.Info("4. --Start the RPC service")
go httpjsonrpc.StartRPCServer()
go httprestful.StartServer(noder)
go httpwebsocket.StartServer(noder)
if config.Parameters.HttpInfoStart {
go httpnodeinfo.StartServer(noder)
}
select {}
ERROR:
os.Exit(1)
}