Skip to content

Commit

Permalink
Incorrect block number for epoch ending exit events (0xPolygon#1299)
Browse files Browse the repository at this point in the history
* Bug fix

* Add logs
  • Loading branch information
goran-ethernal authored Mar 15, 2023
1 parent 11486cc commit 0ff272a
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 21 deletions.
36 changes: 34 additions & 2 deletions consensus/polybft/checkpoint_manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
bls "github.com/0xPolygon/polygon-edge/consensus/polybft/signer"
"github.com/0xPolygon/polygon-edge/contracts"
"github.com/0xPolygon/polygon-edge/helper/hex"
"github.com/0xPolygon/polygon-edge/merkle-tree"
"github.com/0xPolygon/polygon-edge/txrelayer"
"github.com/0xPolygon/polygon-edge/types"
metrics "github.com/armon/go-metrics"
Expand Down Expand Up @@ -272,19 +273,29 @@ func (c *checkpointManager) isCheckpointBlock(blockNumber uint64, isEpochEndingB
// PostBlock is called on every insert of finalized block (either from consensus or syncer)
// It will read any exit event that happened in block and insert it to state boltDb
func (c *checkpointManager) PostBlock(req *PostBlockRequest) error {
epoch := req.Epoch
var (
epoch = req.Epoch
block = req.FullBlock.Block.Number()
)

if req.IsEpochEndingBlock {
// exit events that happened in epoch ending blocks,
// should be added to the tree of the next epoch
epoch++
block++
}

// commit exit events only when we finalize a block
events, err := getExitEventsFromReceipts(epoch, req.FullBlock.Block.Number(), req.FullBlock.Receipts)
events, err := getExitEventsFromReceipts(epoch, block, req.FullBlock.Receipts)
if err != nil {
return err
}

if len(events) > 0 {
c.logger.Debug("Gotten exit events from logs on block",
"eventsNum", len(events), "block", req.FullBlock.Block.Number())
}

if err := c.state.CheckpointStore.insertExitEvents(events); err != nil {
return err
}
Expand Down Expand Up @@ -327,6 +338,8 @@ func (c *checkpointManager) BuildEventRoot(epoch uint64) (types.Hash, error) {

// GenerateExitProof generates proof of exit event
func (c *checkpointManager) GenerateExitProof(exitID uint64) (types.Proof, error) {
c.logger.Debug("Generating proof for exit", "exitID", exitID)

exitEvent, err := c.state.CheckpointStore.getExitEvent(exitID)
if err != nil {
return types.Proof{}, err
Expand Down Expand Up @@ -409,6 +422,8 @@ func (c *checkpointManager) GenerateExitProof(exitID uint64) (types.Proof, error
return types.Proof{}, err
}

c.logger.Debug("Generated proof for exit", "exitID", exitID, "leafIndex", leafIndex, "proofLen", len(proof))

return types.Proof{
Data: proof,
Metadata: map[string]interface{}{
Expand Down Expand Up @@ -454,3 +469,20 @@ func getExitEventsFromReceipts(epoch, block uint64, receipts []*types.Receipt) (

return events, nil
}

// createExitTree creates an exit event merkle tree from provided exit events
func createExitTree(exitEvents []*ExitEvent) (*merkle.MerkleTree, error) {
numOfEvents := len(exitEvents)
data := make([][]byte, numOfEvents)

for i := 0; i < numOfEvents; i++ {
b, err := ExitEventInputsABIType.Encode(exitEvents[i])
if err != nil {
return nil, err
}

data[i] = b
}

return merkle.NewMerkleTree(data)
}
3 changes: 2 additions & 1 deletion consensus/polybft/checkpoint_manager_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -325,11 +325,12 @@ func TestCheckpointManager_PostBlock(t *testing.T) {
require.NoError(t, checkpointManager.PostBlock(req))

exitEvents, err := state.CheckpointStore.getExitEvents(epoch+1, func(exitEvent *ExitEvent) bool {
return exitEvent.BlockNumber == block
return exitEvent.BlockNumber == block+1
})

require.NoError(t, err)
require.Len(t, exitEvents, numOfReceipts)
require.Equal(t, uint64(block+1), exitEvents[0].BlockNumber)
require.Equal(t, uint64(epoch+1), exitEvents[0].EpochNumber)
})
}
Expand Down
18 changes: 0 additions & 18 deletions consensus/polybft/consensus_runtime.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import (

"github.com/0xPolygon/polygon-edge/consensus/polybft/contractsapi"
"github.com/0xPolygon/polygon-edge/consensus/polybft/wallet"
"github.com/0xPolygon/polygon-edge/merkle-tree"
"github.com/0xPolygon/polygon-edge/txrelayer"
"github.com/0xPolygon/polygon-edge/types"

Expand Down Expand Up @@ -952,23 +951,6 @@ func (c *consensusRuntime) getFirstBlockOfEpoch(epochNumber uint64, latestHeader
return firstBlockInEpoch, nil
}

// createExitTree creates an exit event merkle tree from provided exit events
func createExitTree(exitEvents []*ExitEvent) (*merkle.MerkleTree, error) {
numOfEvents := len(exitEvents)
data := make([][]byte, numOfEvents)

for i := 0; i < numOfEvents; i++ {
b, err := ExitEventInputsABIType.Encode(exitEvents[i])
if err != nil {
return nil, err
}

data[i] = b
}

return merkle.NewMerkleTree(data)
}

// getSealersForBlock checks who sealed a given block and updates the counter
func getSealersForBlock(sealersCounter map[types.Address]uint64,
blockExtra *Extra, validators AccountSet) error {
Expand Down

0 comments on commit 0ff272a

Please sign in to comment.