-
Notifications
You must be signed in to change notification settings - Fork 2
/
consensus_engine.go
130 lines (104 loc) · 5.68 KB
/
consensus_engine.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
package engine
import (
"math/big"
"github.com/PositionExchange/posichain/block"
"github.com/PositionExchange/posichain/consensus/reward"
"github.com/PositionExchange/posichain/core/state"
"github.com/PositionExchange/posichain/core/types"
"github.com/PositionExchange/posichain/crypto/bls"
"github.com/PositionExchange/posichain/internal/params"
"github.com/PositionExchange/posichain/shard"
"github.com/PositionExchange/posichain/shard/committee"
"github.com/PositionExchange/posichain/staking/slash"
staking "github.com/PositionExchange/posichain/staking/types"
"github.com/ethereum/go-ethereum/common"
)
// ChainReader defines a collection of methods needed to access the local
// blockchain during header and/or uncle verification.
// Note this reader interface is still in process of being integrated with the BFT consensus.
type ChainReader interface {
// Config retrieves the blockchain's chain configuration.
Config() *params.ChainConfig
// CurrentHeader retrieves the current header from the local chain.
CurrentHeader() *block.Header
// GetHeader retrieves a block header from the database by hash and number.
GetHeader(hash common.Hash, number uint64) *block.Header
// GetHeaderByNumber retrieves a block header from the database by number.
GetHeaderByNumber(number uint64) *block.Header
// GetHeaderByHash retrieves a block header from the database by its hash.
GetHeaderByHash(hash common.Hash) *block.Header
// ShardID returns shardID
ShardID() uint32
// GetBlock retrieves a block from the database by hash and number.
GetBlock(hash common.Hash, number uint64) *types.Block
// ReadShardState retrieves sharding state given the epoch number.
// This api reads the shard state cached or saved on the chaindb.
// Thus, only should be used to read the shard state of the current chain.
ReadShardState(epoch *big.Int) (*shard.State, error)
// ReadValidatorList retrieves the list of all validators
ReadValidatorList() ([]common.Address, error)
// Methods needed for EPoS committee assignment calculation
committee.StakingCandidatesReader
// Methods for reading right epoch snapshot
staking.ValidatorSnapshotReader
//ReadBlockRewardAccumulator is the block-reward given for block number
ReadBlockRewardAccumulator(uint64) (*big.Int, error)
// ReadValidatorStats retrieves the running stats for a validator
ReadValidatorStats(addr common.Address) (*staking.ValidatorStats, error)
// SuperCommitteeForNextEpoch calculates the next epoch's supper committee
// isVerify flag is to indicate which stage
// to call this function: true (verification stage), false(propose stage)
SuperCommitteeForNextEpoch(
beacon ChainReader, header *block.Header, isVerify bool,
) (*shard.State, error)
// ReadCommitSig read the commit sig of a given block number
ReadCommitSig(blockNum uint64) ([]byte, error)
}
// Engine is an algorithm agnostic consensus engine.
// Note this engine interface is still in process of being integrated with the BFT consensus.
type Engine interface {
// VerifyHeader checks whether a header conforms to the consensus rules of a
// given engine. Verifying the seal may be done optionally here, or explicitly
// via the VerifySeal method.
VerifyHeader(chain ChainReader, header *block.Header, seal bool) error
// Similiar to VerifyHeader, which is only for verifying the block headers of one's own chain, this verification
// is used for verifying "incoming" block header against commit signature and bitmap sent from the other chain cross-shard via libp2p.
// i.e. this header verification api is more flexible since the caller specifies which commit signature and bitmap to use
// for verifying the block header, which is necessary for cross-shard block header verification. Example of such is cross-shard transaction.
VerifyHeaderSignature(
chain ChainReader, header *block.Header, commitSig bls.SerializedSignature, commitBitmap []byte,
) error
// VerifyCrossLink verify cross link
VerifyCrossLink(ChainReader, types.CrossLink) error
// VerifyHeaders is similar to VerifyHeader, but verifies a batch of headers
// concurrently. The method returns a quit channel to abort the operations and
// a results channel to retrieve the async verifications (the order is that of
// the input slice).
VerifyHeaders(
chain ChainReader, headers []*block.Header, seals []bool,
) (chan<- struct{}, <-chan error)
// VerifySeal checks whether the crypto seal on a header is valid according to
// the consensus rules of the given engine.
VerifySeal(chain ChainReader, header *block.Header) error
// VerifyShardState verifies the shard state during epoch transition is valid
VerifyShardState(chain ChainReader, beacon ChainReader, header *block.Header) error
// VerifyVRF verifies the vrf of the block
VerifyVRF(chain ChainReader, header *block.Header) error
// Beaconchain provides the handle for Beaconchain
Beaconchain() ChainReader
// SetBeaconchain sets the beaconchain handler on engine
SetBeaconchain(ChainReader)
// Finalize runs any post-transaction state modifications (e.g. block rewards)
// and assembles the final block.
// Note: The block header and state database might be updated to reflect any
// consensus rules that happen at finalization (e.g. block rewards).
// sigsReady signal indicates whether the commit sigs are populated in the header object.
// Finalize() will block on sigsReady signal until the first value is send to the channel.
Finalize(
chain ChainReader, header *block.Header,
state *state.DB, txs []*types.Transaction,
receipts []*types.Receipt, outcxs []*types.CXReceipt,
incxs []*types.CXReceiptsProof, stks staking.StakingTransactions,
doubleSigners slash.Records, sigsReady chan bool, viewID func() uint64,
) (*types.Block, reward.Reader, error)
}