/
tendermint.go
85 lines (71 loc) · 2.24 KB
/
tendermint.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
package byzantine
import (
"context"
"fmt"
"github.com/oasislabs/oasis-core/go/common/identity"
"github.com/oasislabs/oasis-core/go/consensus/tendermint"
"github.com/oasislabs/oasis-core/go/consensus/tendermint/service"
genesis "github.com/oasislabs/oasis-core/go/genesis/file"
"github.com/oasislabs/oasis-core/go/upgrade"
)
type honestTendermint struct {
service service.TendermintService
}
func newHonestTendermint() *honestTendermint {
return &honestTendermint{}
}
func (ht *honestTendermint) start(id *identity.Identity, dataDir string) error {
if ht.service != nil {
return fmt.Errorf("honest Tendermint service already started")
}
genesis, err := genesis.DefaultFileProvider()
if err != nil {
return fmt.Errorf("genesis DefaultFileProvider: %w", err)
}
// Retrieve the genesis document and use it to configure the ChainID for
// signature domain separation. We do this as early as possible.
genesisDoc, err := genesis.GetGenesisDocument()
if err != nil {
return err
}
genesisDoc.SetChainContext()
ht.service, err = tendermint.New(context.Background(), dataDir, id, upgrade.NewDummyUpgradeManager(), genesis)
if err != nil {
return fmt.Errorf("tendermint New: %w", err)
}
// Wait for height=1 to pass, during which mux apps perform deferred initialization.
blockOne := make(chan struct{})
blocksCh, blocksSub := ht.service.WatchTendermintBlocks()
go func() {
defer blocksSub.Close()
for {
block := <-blocksCh
if block.Header.Height > 1 {
break
}
}
close(blockOne)
}()
if err = ht.service.Start(); err != nil {
return fmt.Errorf("honest Tendermint service Start: %w", err)
}
logger.Debug("honest Tendermint service waiting for Tendermint start")
<-ht.service.Started()
logger.Debug("honest Tendermint service waiting for Tendermint sync")
<-ht.service.Synced()
logger.Debug("honest Tendermint service sync done")
<-blockOne
logger.Debug("honest Tendermint block one occurred")
return nil
}
func (ht honestTendermint) stop() error {
if ht.service == nil {
return fmt.Errorf("honest Tendermint service not started")
}
ht.service.Stop()
logger.Debug("honest Tendermint service waiting for quit")
<-ht.service.Quit()
logger.Debug("honest Tendermint service quit done")
ht.service = nil
return nil
}