Skip to content

Commit 16601d6

Browse files
envestccCoderZhi
andauthored
Forked ChainManager (#4593)
* chainmanager fork * split chainmgr and chain * refactor * move pool into chainmgr * impl factory StateReaderAt * address comment * address comment * add test --------- Co-authored-by: zhi <[email protected]>
1 parent 9f7af1a commit 16601d6

20 files changed

+999
-159
lines changed

blockchain/blockchain.go

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -454,10 +454,7 @@ func (bc *blockchain) MintNewBlock(timestamp time.Time, opts ...MintOption) (*bl
454454
ctx = bc.contextWithBlock(ctx, minterAddress, newblockHeight, timestamp, protocol.CalcBaseFee(genesis.MustExtractGenesisContext(ctx).Blockchain, &tip), protocol.CalcExcessBlobGas(tip.ExcessBlobGas, tip.BlobGasUsed))
455455
ctx = protocol.WithFeatureCtx(ctx)
456456
// run execution and update state trie root hash
457-
blk, err := bc.bbf.Mint(
458-
ctx,
459-
producerPrivateKey,
460-
)
457+
blk, err := bc.bbf.Mint(ctx, producerPrivateKey)
461458
if err != nil {
462459
return nil, errors.Wrapf(err, "failed to create block")
463460
}

chainservice/builder.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -513,8 +513,8 @@ func (builder *Builder) createBlockchain(forSubChain, forTest bool) blockchain.B
513513
if builder.cfg.Consensus.Scheme == config.RollDPoSScheme {
514514
mintOpts = append(mintOpts, factory.WithTimeoutOption(builder.cfg.Chain.MintTimeout))
515515
}
516-
minter := factory.NewMinter(builder.cs.factory, builder.cs.actpool, mintOpts...)
517-
return blockchain.NewBlockchain(builder.cfg.Chain, builder.cfg.Genesis, builder.cs.blockdao, minter, chainOpts...)
516+
builder.cs.minter = factory.NewMinter(builder.cs.factory, builder.cs.actpool, mintOpts...)
517+
return blockchain.NewBlockchain(builder.cfg.Chain, builder.cfg.Genesis, builder.cs.blockdao, builder.cs.minter, chainOpts...)
518518
}
519519

520520
func (builder *Builder) buildNodeInfoManager() error {
@@ -786,6 +786,7 @@ func (builder *Builder) buildConsensusComponent() error {
786786
}
787787
if rDPoSProtocol := rolldpos.FindProtocol(builder.cs.registry); rDPoSProtocol != nil {
788788
copts = append(copts, consensus.WithRollDPoSProtocol(rDPoSProtocol))
789+
copts = append(copts, consensus.WithBlockBuilderFactory(builder.cs.minter))
789790
}
790791
if pollProtocol := poll.FindProtocol(builder.cs.registry); pollProtocol != nil {
791792
copts = append(copts, consensus.WithPollProtocol(pollProtocol))

chainservice/chainservice.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ type ChainService struct {
7878
nodeInfoManager *nodeinfo.InfoManager
7979
apiStats *nodestats.APILocalStats
8080
actionsync *actsync.ActionSync
81+
minter *factory.Minter
8182
}
8283

8384
// Start starts the server

consensus/consensus.go

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"context"
1010

1111
"github.com/facebookgo/clock"
12+
"github.com/iotexproject/go-pkgs/hash"
1213
"github.com/iotexproject/iotex-proto/golang/iotextypes"
1314
"github.com/pkg/errors"
1415
"go.uber.org/zap"
@@ -24,7 +25,6 @@ import (
2425
"github.com/iotexproject/iotex-core/v2/pkg/lifecycle"
2526
"github.com/iotexproject/iotex-core/v2/pkg/log"
2627
"github.com/iotexproject/iotex-core/v2/state"
27-
"github.com/iotexproject/iotex-core/v2/state/factory"
2828
)
2929

3030
// Consensus is the interface for handling IotxConsensus view change.
@@ -49,6 +49,7 @@ type optionParams struct {
4949
broadcastHandler scheme.Broadcast
5050
pp poll.Protocol
5151
rp *rp.Protocol
52+
bbf rolldpos.BlockBuilderFactory
5253
}
5354

5455
// Option sets Consensus construction parameter.
@@ -78,11 +79,19 @@ func WithPollProtocol(pp poll.Protocol) Option {
7879
}
7980
}
8081

82+
// WithBlockBuilderFactory is an option to set block builder factory
83+
func WithBlockBuilderFactory(bbf rolldpos.BlockBuilderFactory) Option {
84+
return func(ops *optionParams) error {
85+
ops.bbf = bbf
86+
return nil
87+
}
88+
}
89+
8190
// NewConsensus creates a IotxConsensus struct.
8291
func NewConsensus(
8392
cfg rolldpos.BuilderConfig,
8493
bc blockchain.Blockchain,
85-
sf factory.Factory,
94+
sf rolldpos.StateReaderFactory,
8695
opts ...Option,
8796
) (Consensus, error) {
8897
var ops optionParams
@@ -100,7 +109,19 @@ func NewConsensus(
100109
var err error
101110
switch cfg.Scheme {
102111
case RollDPoSScheme:
103-
delegatesByEpochFunc := func(epochNum uint64) ([]string, error) {
112+
if ops.bbf == nil {
113+
return nil, errors.New("block builder factory is not set")
114+
}
115+
chainMgr := rolldpos.NewChainManager(bc, sf, ops.bbf)
116+
delegatesByEpochFunc := func(epochNum uint64, prevHash []byte) ([]string, error) {
117+
fork, err := chainMgr.Fork(hash.Hash256(prevHash))
118+
if err != nil {
119+
return nil, err
120+
}
121+
forkSF, err := fork.StateReader()
122+
if err != nil {
123+
return nil, err
124+
}
104125
re := protocol.NewRegistry()
105126
if err := ops.rp.Register(re); err != nil {
106127
return nil, err
@@ -110,15 +131,14 @@ func NewConsensus(
110131
cfg.Genesis,
111132
)
112133
ctx = protocol.WithFeatureWithHeightCtx(ctx)
113-
tipHeight := bc.TipHeight()
134+
tipHeight := fork.TipHeight()
114135
tipEpochNum := ops.rp.GetEpochNum(tipHeight)
115136
var candidatesList state.CandidateList
116-
var err error
117137
switch epochNum {
118138
case tipEpochNum:
119-
candidatesList, err = ops.pp.Delegates(ctx, sf)
139+
candidatesList, err = ops.pp.Delegates(ctx, forkSF)
120140
case tipEpochNum + 1:
121-
candidatesList, err = ops.pp.NextDelegates(ctx, sf)
141+
candidatesList, err = ops.pp.NextDelegates(ctx, forkSF)
122142
default:
123143
err = errors.Errorf("invalid epoch number %d compared to tip epoch number %d", epochNum, tipEpochNum)
124144
}
@@ -135,7 +155,7 @@ func NewConsensus(
135155
bd := rolldpos.NewRollDPoSBuilder().
136156
SetPriKey(cfg.Chain.ProducerPrivateKeys()...).
137157
SetConfig(cfg).
138-
SetChainManager(rolldpos.NewChainManager(bc)).
158+
SetChainManager(chainMgr).
139159
SetBlockDeserializer(block.NewDeserializer(bc.EvmNetworkID())).
140160
SetClock(clock).
141161
SetBroadcast(ops.broadcastHandler).

0 commit comments

Comments
 (0)