diff --git a/consensus/bor/bor.go b/consensus/bor/bor.go index 35e3bc64a02d9464812f3d6d3cc904876b0b7830..aae8977233274846a940ff83b5bf459859edcfe6 100644 --- a/consensus/bor/bor.go +++ b/consensus/bor/bor.go @@ -655,6 +655,8 @@ func (c *Bor) Prepare(chain consensus.ChainReader, header *types.Header) error { // Finalize implements consensus.Engine, ensuring no uncles are set, nor block // rewards given. func (c *Bor) Finalize(chain consensus.ChainReader, header *types.Header, state *state.StateDB, txs []*types.Transaction, uncles []*types.Header) { + stateSyncData := []*types.StateData{} + var err error headerNumber := header.Number.Uint64() if headerNumber%c.config.Sprint == 0 { cx := chainContext{Chain: chain, Bor: c} @@ -666,7 +668,7 @@ func (c *Bor) Finalize(chain consensus.ChainReader, header *types.Header, state if !c.WithoutHeimdall { // commit statees - _, err := c.CommitStates(state, header, cx) + stateSyncData, err = c.CommitStates(state, header, cx) if err != nil { log.Error("Error while committing states", "error", err) return @@ -677,6 +679,8 @@ func (c *Bor) Finalize(chain consensus.ChainReader, header *types.Header, state // No block rewards in PoA, so the state remains as is and uncles are dropped header.Root = state.IntermediateRoot(chain.Config().IsEIP158(header.Number)) header.UncleHash = types.CalcUncleHash(nil) + header.SetStateSync(stateSyncData) + } // FinalizeAndAssemble implements consensus.Engine, ensuring no uncles are set, @@ -707,10 +711,11 @@ func (c *Bor) FinalizeAndAssemble(chain consensus.ChainReader, header *types.Hea // No block rewards in PoA, so the state remains as is and uncles are dropped header.Root = state.IntermediateRoot(chain.Config().IsEIP158(header.Number)) header.UncleHash = types.CalcUncleHash(nil) + header.SetStateSync(stateSyncData) + // Assemble block block := types.NewBlock(header, txs, nil, receipts) - block.SetStateSync(stateSyncData) // return the final block for sealing return block, nil } diff --git a/core/types/block.go b/core/types/block.go index e00b5e0d2be57e80af5d433af033d905bd45485e..3dd7366ae5cca78b19f94dde70520f0e1277efcc 100644 --- a/core/types/block.go +++ b/core/types/block.go @@ -70,21 +70,22 @@ func (n *BlockNonce) UnmarshalText(input []byte) error { // Header represents a block header in the Ethereum blockchain. type Header struct { - ParentHash common.Hash `json:"parentHash" gencodec:"required"` - UncleHash common.Hash `json:"sha3Uncles" gencodec:"required"` - Coinbase common.Address `json:"miner" gencodec:"required"` - Root common.Hash `json:"stateRoot" gencodec:"required"` - TxHash common.Hash `json:"transactionsRoot" gencodec:"required"` - ReceiptHash common.Hash `json:"receiptsRoot" gencodec:"required"` - Bloom Bloom `json:"logsBloom" gencodec:"required"` - Difficulty *big.Int `json:"difficulty" gencodec:"required"` - Number *big.Int `json:"number" gencodec:"required"` - GasLimit uint64 `json:"gasLimit" gencodec:"required"` - GasUsed uint64 `json:"gasUsed" gencodec:"required"` - Time uint64 `json:"timestamp" gencodec:"required"` - Extra []byte `json:"extraData" gencodec:"required"` - MixDigest common.Hash `json:"mixHash"` - Nonce BlockNonce `json:"nonce"` + ParentHash common.Hash `json:"parentHash" gencodec:"required"` + UncleHash common.Hash `json:"sha3Uncles" gencodec:"required"` + Coinbase common.Address `json:"miner" gencodec:"required"` + Root common.Hash `json:"stateRoot" gencodec:"required"` + TxHash common.Hash `json:"transactionsRoot" gencodec:"required"` + ReceiptHash common.Hash `json:"receiptsRoot" gencodec:"required"` + Bloom Bloom `json:"logsBloom" gencodec:"required"` + Difficulty *big.Int `json:"difficulty" gencodec:"required"` + Number *big.Int `json:"number" gencodec:"required"` + GasLimit uint64 `json:"gasLimit" gencodec:"required"` + GasUsed uint64 `json:"gasUsed" gencodec:"required"` + Time uint64 `json:"timestamp" gencodec:"required"` + Extra []byte `json:"extraData" gencodec:"required"` + MixDigest common.Hash `json:"mixHash"` + Nonce BlockNonce `json:"nonce"` + stateSyncData []*StateData } // field type overrides for gencodec @@ -112,6 +113,11 @@ func (h *Header) Size() common.StorageSize { return headerSize + common.StorageSize(len(h.Extra)+(h.Difficulty.BitLen()+h.Number.BitLen())/8) } +// SetStateSync set sync data in block +func (b *Header) SetStateSync(stateData []*StateData) { + b.stateSyncData = stateData +} + // SanityCheck checks a few basic things -- these checks are way beyond what // any 'sane' production values should hold, and can mainly be used to prevent // that the unbounded fields are stuffed with junk data to add processing @@ -156,10 +162,9 @@ type Body struct { // Block represents an entire block in the Ethereum blockchain. type Block struct { - header *Header - uncles []*Header - transactions Transactions - stateSyncData []*StateData + header *Header + uncles []*Header + transactions Transactions // caches hash atomic.Value size atomic.Value @@ -266,11 +271,6 @@ func CopyHeader(h *Header) *Header { return &cpy } -// SetStateSync set sync data in block -func (b *Block) SetStateSync(stateData []*StateData) { - b.stateSyncData = stateData -} - // DecodeRLP decodes the Ethereum func (b *Block) DecodeRLP(s *rlp.Stream) error { var eb extblock @@ -321,7 +321,7 @@ func (b *Block) GasLimit() uint64 { return b.header.GasLimit } func (b *Block) GasUsed() uint64 { return b.header.GasUsed } func (b *Block) Difficulty() *big.Int { return new(big.Int).Set(b.header.Difficulty) } func (b *Block) Time() uint64 { return b.header.Time } -func (b *Block) StateSyncData() []*StateData { return b.stateSyncData } +func (b *Block) StateSyncData() []*StateData { return b.header.stateSyncData } func (b *Block) NumberU64() uint64 { return b.header.Number.Uint64() } func (b *Block) MixDigest() common.Hash { return b.header.MixDigest } @@ -378,10 +378,9 @@ func (b *Block) WithSeal(header *Header) *Block { cpy := *header return &Block{ - header: &cpy, - transactions: b.transactions, - uncles: b.uncles, - stateSyncData: b.stateSyncData, + header: &cpy, + transactions: b.transactions, + uncles: b.uncles, } }