forked from iost-official/go-iost
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathconsensus.go
110 lines (93 loc) · 1.92 KB
/
consensus.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
/*
The protocol of iost consensus
*/
package protocol
import (
"github.com/iost-official/Go-IOS-Protocol/iosbase"
)
type Character int
const (
Primary Character = iota
Backup
Idle
)
const (
Version = 1
Port = 12306
)
type ConsensusImpl struct {
iosbase.Member
recorder, replica Component
db Database
router Router
}
func (c *ConsensusImpl) Init(bc iosbase.BlockChain, sp iosbase.StatePool, network iosbase.Network) error {
var err error
c.db, err = DatabaseFactory("base", bc, sp)
if err != nil {
return err
}
c.router, err = RouterFactory("base")
if err != nil {
return err
}
err = c.router.Init(network, Port)
if err != nil {
return err
}
c.recorder, err = RecorderFactory("base")
if err != nil {
return err
}
err = c.recorder.Init(c.Member, c.db, c.router)
if err != nil {
return err
}
pool := &iosbase.TxPoolImpl{}
c.replica, err = ReplicaFactory("pbft", pool)
if err != nil {
return err
}
err = c.replica.Init(c.Member, c.db, c.router)
if err != nil {
return err
}
return nil
}
func (c *ConsensusImpl) Run() {
go c.router.Run()
go c.replica.Run()
go c.recorder.Run()
}
func (c *ConsensusImpl) Stop() {
c.replica.Stop()
c.recorder.Stop()
c.router.Stop()
}
func (c *ConsensusImpl) PublishTx(tx iosbase.Tx) error {
req := iosbase.Request{
From: c.ID,
To: c.ID,
ReqType: int(ReqPublishTx),
Body: tx.Encode(),
}
c.router.Send(req)
return nil
}
func (c *ConsensusImpl) CheckTx(tx iosbase.Tx) (iosbase.TxStatus, error) {
return iosbase.POOL, nil // TODO not complete
}
func (c *ConsensusImpl) GetStatus() (iosbase.BlockChain, iosbase.StatePool, error) {
bc, err := c.db.GetBlockChain()
if err != nil {
return nil, nil, err
}
sp, err := c.db.GetStatePool()
if err != nil {
return nil, nil, err
}
return bc, sp, nil
}
func (c *ConsensusImpl) GetCachedStatus() (iosbase.BlockChain, iosbase.StatePool, error) {
return c.GetStatus()
}