Skip to content

Commit 78ae5ff

Browse files
committed
reduce commit size
1 parent 4d27742 commit 78ae5ff

File tree

6 files changed

+69
-8
lines changed

6 files changed

+69
-8
lines changed

consensus/bihs/adapter/statedb.go

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,12 @@ func NewStateDB(chain *core.BlockChain, gov *gov.Governance, prepareEmptyHeaderF
3737

3838
func (db *StateDB) StoreBlock(blk bihs.Block, commitQC *bihs.QC) error {
3939

40+
if commitQC.Type != bihs.MTPreCommit {
41+
return fmt.Errorf("invalid type for commitQC")
42+
}
43+
4044
sink := common.NewZeroCopySink(nil)
41-
commitQC.Serialize(sink)
45+
commitQC.SerializeForHeader(sink)
4246

4347
block := blk.(*Block)
4448
header := block.header()
@@ -48,8 +52,17 @@ func (db *StateDB) StoreBlock(blk bihs.Block, commitQC *bihs.QC) error {
4852
return nil
4953
}
5054

51-
func (db *StateDB) Validate(blk bihs.Block) error {
52-
return db.verifyHeaderFunc(db.chain, blk.(*Block).header(), true)
55+
func (db *StateDB) Validate(blk bihs.Block) (err error) {
56+
block, ok := blk.(*Block)
57+
if !ok {
58+
err = fmt.Errorf("invalid block")
59+
return
60+
}
61+
err = db.verifyHeaderFunc(db.chain, block.header(), false)
62+
if err != nil {
63+
return
64+
}
65+
return db.chain.PreExecuteBlock((*types.Block)(block))
5366
}
5467

5568
func (db *StateDB) EmptyBlock(height uint64) (bihs.Block, error) {

consensus/bihs/engine.go

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
"github.com/ethereum/go-ethereum/params"
2727
"github.com/ethereum/go-ethereum/rpc"
2828
"github.com/ethereum/go-ethereum/trie"
29+
ocommon "github.com/ontio/ontology/common"
2930
"github.com/zhiqiangxu/bihs"
3031
"github.com/zhiqiangxu/util"
3132
)
@@ -38,6 +39,7 @@ type BiHS struct {
3839
signer *adapter.Signer
3940
db ethdb.Database
4041
core *bihs.HotStuff
42+
gov *gov.Governance
4143
p2p *adapter.P2P
4244

4345
chainHeadCh chan core.ChainHeadEvent
@@ -84,6 +86,7 @@ func (bh *BiHS) Init(chain *ethcore.BlockChain, bc adapter.Broadcaster, consensu
8486

8587
core := bihs.New(store, p2p, conf)
8688
bh.core = core
89+
bh.gov = governance
8790
bh.p2p = p2p
8891

8992
bh.chainHeadSub = chain.SubscribeChainHeadEvent(bh.chainHeadCh)
@@ -104,7 +107,7 @@ func (bh *BiHS) Author(header *types.Header) (common.Address, error) {
104107
}
105108

106109
func (bh *BiHS) VerifyHeader(chain consensus.ChainHeaderReader, header *types.Header, seal bool) error {
107-
return bh.verifyHeader(chain, header, nil)
110+
return bh.verifyHeader(chain, header, nil, seal)
108111
}
109112

110113
func (bh *BiHS) VerifyHeaders(chain consensus.ChainHeaderReader, headers []*types.Header, seals []bool) (chan<- struct{}, <-chan error) {
@@ -113,7 +116,7 @@ func (bh *BiHS) VerifyHeaders(chain consensus.ChainHeaderReader, headers []*type
113116

114117
go func() {
115118
for i, header := range headers {
116-
err := bh.verifyHeader(chain, header, headers[:i])
119+
err := bh.verifyHeader(chain, header, headers[:i], seals[i])
117120

118121
select {
119122
case <-abort:
@@ -132,7 +135,7 @@ func (bh *BiHS) VerifyUncles(chain consensus.ChainReader, block *types.Block) er
132135
return nil
133136
}
134137

135-
func (bh *BiHS) verifyHeader(chain consensus.ChainHeaderReader, header *types.Header, parents []*types.Header) error {
138+
func (bh *BiHS) verifyHeader(chain consensus.ChainHeaderReader, header *types.Header, parents []*types.Header, seal bool) error {
136139
if header.Number == nil {
137140
return errUnknownBlock
138141
}
@@ -203,14 +206,31 @@ func (bh *BiHS) verifyHeader(chain consensus.ChainHeaderReader, header *types.He
203206
return err
204207
}
205208

206-
// All basic checks passed, verify signatures fields
209+
if !seal {
210+
if len(header.Extra) != 0 {
211+
return fmt.Errorf("extra should be empty for non-seal header, #len %d", len(header.Extra))
212+
}
213+
} else {
214+
var qc bihs.QC
215+
hash := header.Hash()
216+
err := qc.DeserializeFromHeader(header.Number.Uint64(), hash[:], ocommon.NewZeroCopySource(header.Extra))
217+
if err != nil {
218+
return err
219+
}
220+
221+
ids := bh.gov.ValidatorIDs(header.Number.Uint64())
222+
if !qc.VerifyEC(bh.signer, ids) {
223+
return fmt.Errorf("qc.VerifyEC failed")
224+
}
225+
}
207226
return nil
208227
}
209228

210229
func (bh *BiHS) Prepare(chain consensus.ChainHeaderReader, header *types.Header) error {
211230
header.Coinbase = bh.signer.Address()
212231
header.Nonce = defaultNonce
213232
header.MixDigest = types.BiHSDigest
233+
header.Extra = nil
214234

215235
parent, err := bh.getParentHeader(chain, header)
216236
if err != nil {

core/blockchain.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2316,3 +2316,20 @@ func (bc *BlockChain) InsertHeaderChain(chain []*types.Header, checkFreq int) (i
23162316
_, err := bc.hc.InsertHeaderChain(chain, start, bc.forker)
23172317
return 0, err
23182318
}
2319+
2320+
func (bc *BlockChain) PreExecuteBlock(block *types.Block) error {
2321+
parent := bc.GetBlockByHash(block.ParentHash())
2322+
statedb, err := bc.StateAt(parent.Root())
2323+
if err != nil {
2324+
return err
2325+
}
2326+
2327+
receipts, _, usedGas, err := bc.processor.Process(block, statedb, bc.vmConfig)
2328+
if err != nil {
2329+
return err
2330+
}
2331+
if err := bc.validator.ValidateState(block, statedb, receipts, usedGas); err != nil {
2332+
return err
2333+
}
2334+
return nil
2335+
}

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ require (
5656
github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7
5757
github.com/tklauser/go-sysconf v0.3.5 // indirect
5858
github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef
59-
github.com/zhiqiangxu/bihs v0.0.0-20220220082638-37970b7e45b3
59+
github.com/zhiqiangxu/bihs v0.0.0-20220220105359-0df6181f96c6
6060
github.com/zhiqiangxu/util v0.0.0-20210608123940-8b5a9fec779f
6161
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2
6262
golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d // indirect

go.sum

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -541,6 +541,14 @@ github.com/zhiqiangxu/bihs v0.0.0-20220220074118-099a9e15a091 h1:bMtwWQXNa6CGg3v
541541
github.com/zhiqiangxu/bihs v0.0.0-20220220074118-099a9e15a091/go.mod h1:pQJtnkZtU04PYOihQ5/v2BzNCkTklfFqtHHmFMJqG3g=
542542
github.com/zhiqiangxu/bihs v0.0.0-20220220082638-37970b7e45b3 h1:PAhRf0aN9eZ2E5/OKdyPIn5VcRC1kWjXDDrLwuDfY9I=
543543
github.com/zhiqiangxu/bihs v0.0.0-20220220082638-37970b7e45b3/go.mod h1:pQJtnkZtU04PYOihQ5/v2BzNCkTklfFqtHHmFMJqG3g=
544+
github.com/zhiqiangxu/bihs v0.0.0-20220220102243-49afa4a8b4c7 h1:WDOsRbEGRa+ZhXfOqfC/z5e6FcE445omPAXJwnUGXrY=
545+
github.com/zhiqiangxu/bihs v0.0.0-20220220102243-49afa4a8b4c7/go.mod h1:pQJtnkZtU04PYOihQ5/v2BzNCkTklfFqtHHmFMJqG3g=
546+
github.com/zhiqiangxu/bihs v0.0.0-20220220104908-6751ab827174 h1:C4M3lrLjRqv1ZYczR9Kn1bIgBfA2akveVbXF2ahsnyk=
547+
github.com/zhiqiangxu/bihs v0.0.0-20220220104908-6751ab827174/go.mod h1:pQJtnkZtU04PYOihQ5/v2BzNCkTklfFqtHHmFMJqG3g=
548+
github.com/zhiqiangxu/bihs v0.0.0-20220220105201-7b93be2e78f3 h1:gLR/0h0pxnx4NTEHkFiGsE5q32LDN3FtWS30vUaYcF4=
549+
github.com/zhiqiangxu/bihs v0.0.0-20220220105201-7b93be2e78f3/go.mod h1:pQJtnkZtU04PYOihQ5/v2BzNCkTklfFqtHHmFMJqG3g=
550+
github.com/zhiqiangxu/bihs v0.0.0-20220220105359-0df6181f96c6 h1:DJx8j55Kq5VW3IhsYRzbswj4x7tWCXYwMPMUMMkTv28=
551+
github.com/zhiqiangxu/bihs v0.0.0-20220220105359-0df6181f96c6/go.mod h1:pQJtnkZtU04PYOihQ5/v2BzNCkTklfFqtHHmFMJqG3g=
544552
github.com/zhiqiangxu/rpheap v0.0.0-20191222053847-9002d7e5a1a1 h1:9i/8yn4zcZL85rmOMp9AskgJJhb2HzducF1EahdxEME=
545553
github.com/zhiqiangxu/rpheap v0.0.0-20191222053847-9002d7e5a1a1/go.mod h1:aYy7SAJP4LY667NfqoMR/ZJAy8HQ8KVtQTvEDrGS5ks=
546554
github.com/zhiqiangxu/util v0.0.0-20210608123940-8b5a9fec779f h1:Qj4r6VNJRHJOy50ixhmPerKf0r/qM+SSpuuIY5J/hiM=

miner/worker.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -981,6 +981,9 @@ func (w *worker) prepareHeaderLocked(parent *types.Block, timestamp int64) *type
981981
log.Error("Failed to prepare header for mining", "err", err)
982982
return nil
983983
}
984+
if header.Extra == nil {
985+
return header
986+
}
984987
// If we are care about TheDAO hard-fork check whether to override the extra-data or not
985988
if daoBlock := w.chainConfig.DAOForkBlock; daoBlock != nil {
986989
// Check whether the block is among the fork extra-override range

0 commit comments

Comments
 (0)