diff --git a/consensus/bor/bor.go b/consensus/bor/bor.go index a5469f7ffd04c06412738c1de825a9f86a30b5f2..12a3bcc76ea4a85cec3e200b24483b3d36561590 100644 --- a/consensus/bor/bor.go +++ b/consensus/bor/bor.go @@ -3,6 +3,7 @@ package bor import ( "bytes" "context" + "encoding/hex" "encoding/json" "errors" "fmt" @@ -247,7 +248,6 @@ type Bor struct { ethAPI *ethapi.PublicBlockChainAPI validatorSetABI abi.ABI - span *Span httpClient http.Client // The fields below are for testing only @@ -279,7 +279,6 @@ func New( ethAPI: ethAPI, recents: recents, signatures: signatures, - span: nil, validatorSetABI: vABI, httpClient: http.Client{ Timeout: time.Duration(5 * time.Second), @@ -662,12 +661,13 @@ 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) { - // // commit span - // err := c.checkAndCommitSpan(state, header, chainContext{Chain: chain, Bor: c}) - // if err != nil { - // fmt.Println("Error while committing span", err) - // // return nil, err - // } + // commit span + if header.Number.Uint64()%c.config.Sprint == 0 { + if err := c.checkAndCommitSpan(state, header, chainContext{Chain: chain, Bor: c}); err != nil { + fmt.Println("Error while committing span", err) + // return nil, err + } + } // No block rewards in PoA, so the state remains as is and uncles are dropped header.Root = state.IntermediateRoot(chain.Config().IsEIP158(header.Number)) @@ -678,10 +678,12 @@ func (c *Bor) Finalize(chain consensus.ChainReader, header *types.Header, state // nor block rewards given, and returns the final block. func (c *Bor) FinalizeAndAssemble(chain consensus.ChainReader, header *types.Header, state *state.StateDB, txs []*types.Transaction, uncles []*types.Header, receipts []*types.Receipt) (*types.Block, error) { // commit span - err := c.checkAndCommitSpan(state, header, chainContext{Chain: chain, Bor: c}) - if err != nil { - fmt.Println("Error while committing span", err) - // return nil, err + if header.Number.Uint64()%c.config.Sprint == 0 { + err := c.checkAndCommitSpan(state, header, chainContext{Chain: chain, Bor: c}) + if err != nil { + fmt.Println("Error while committing span", err) + // return nil, err + } } // No block rewards in PoA, so the state remains as is and uncles are dropped @@ -967,8 +969,7 @@ func (c *Bor) checkAndCommitSpan( chain core.ChainContext, ) error { var pending bool = false - var span *Span = c.span - + var span *Span = nil var wg sync.WaitGroup wg.Add(1) go func() { @@ -976,28 +977,45 @@ func (c *Bor) checkAndCommitSpan( wg.Done() }() - // fetch if span is nil - if span == nil { - wg.Add(1) - go func() { - fmt.Println("Fetching current span") - span, _ = c.GetCurrentSpan(header.Number.Uint64() - 1) - c.span = span // store in cache - wg.Done() - }() - } + wg.Add(1) + go func() { + span, _ = c.GetCurrentSpan(header.Number.Uint64() - 1) + wg.Done() + }() + wg.Wait() + fmt.Println("Span", span.ID, span.StartBlock, span.EndBlock, "number", header.Number, "needToCommitSpan", c.needToCommitSpan(span, header)) + // commit span if there is new span pending or span is ending or end block is not set - if pending || (span != nil && (span.EndBlock == 0 || span.EndBlock == header.Number.Uint64())) { + if pending || c.needToCommitSpan(span, header) { err := c.commitSpan(span, state, header, chain) - c.span = nil // reset cache return err } return nil } +func (c *Bor) needToCommitSpan(span *Span, header *types.Header) bool { + // if span is nil + if span == nil { + return false + } + + // check span is not set initially + if span.EndBlock == 0 { + return true + } + + // if current block is first block of last sprint in current span + h := header.Number.Uint64() + if span.EndBlock > c.config.Sprint && span.EndBlock-c.config.Sprint+1 == h { + return true + } + + return false +} + func (c *Bor) commitSpan( span *Span, state *state.StateDB, @@ -1019,7 +1037,7 @@ func (c *Bor) commitSpan( for _, val := range heimdallSpan.ValidatorSet.Validators { validators = append(validators, val.MinimalVal()) } - validatorsBytes, err := rlp.EncodeToBytes(validators) + validatorBytes, err := rlp.EncodeToBytes(validators) if err != nil { return err } @@ -1027,9 +1045,9 @@ func (c *Bor) commitSpan( // get producers bytes var producers []MinimalVal for _, val := range heimdallSpan.SelectedProducers { - producers = append(validators, val.MinimalVal()) + producers = append(producers, val.MinimalVal()) } - producersBytes, err := rlp.EncodeToBytes(producers) + producerBytes, err := rlp.EncodeToBytes(producers) if err != nil { return err } @@ -1037,13 +1055,21 @@ func (c *Bor) commitSpan( // method method := "commitSpan" + fmt.Println( + "id", heimdallSpan.ID, + "startBlock", heimdallSpan.StartBlock, + "endBlock", heimdallSpan.EndBlock, + "validatorBytes", hex.EncodeToString(validatorBytes), + "producerBytes", hex.EncodeToString(producerBytes), + ) + // get packed data data, err := c.validatorSetABI.Pack(method, - heimdallSpan.ID, - heimdallSpan.StartBlock, - heimdallSpan.EndBlock, - validatorsBytes, - producersBytes, + big.NewInt(0).SetUint64(heimdallSpan.ID), + big.NewInt(0).SetUint64(heimdallSpan.StartBlock), + big.NewInt(0).SetUint64(heimdallSpan.EndBlock), + validatorBytes, + producerBytes, ) if err != nil { fmt.Println("Unable to pack tx for commitSpan", "error", err) diff --git a/consensus/bor/rest.go b/consensus/bor/rest.go index d805f2c4193d2e834c9d75cbecf43751df10321c..f855adc99240e32279314520d3f9054be7706563 100644 --- a/consensus/bor/rest.go +++ b/consensus/bor/rest.go @@ -48,11 +48,9 @@ func FetchFromHeimdall(client http.Client, urlString string, paths ...string) (* // unmarshall data from buffer var response ResponseWithHeight - fmt.Println("body", string(body)) if err := json.Unmarshal(body, &response); err != nil { return nil, err } - fmt.Println("response", response.Result) return &response, nil } diff --git a/consensus/bor/snapshot.go b/consensus/bor/snapshot.go index 2583bd97b89da461295fd54dc75bdbcc6e49b958..19734062b4eda1fc6e9295436c69a54351b95d57 100644 --- a/consensus/bor/snapshot.go +++ b/consensus/bor/snapshot.go @@ -194,8 +194,6 @@ func (s *Snapshot) apply(headers []*types.Header) (*Snapshot, error) { return nil, err } - fmt.Println(" validator set change ", number) - // change validator set and change proposer if number > 0 && (number+1)%s.config.Sprint == 0 { validatorBytes := header.Extra[extraVanity : len(header.Extra)-extraSeal]