Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

stabilization-equivalent-proofs #6686

Merged
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
be02d30
use EpochNotifier instead of EpochStartNotifier to transition to the …
AdoAdoAdo Dec 19, 2024
97b9e06
trigger consensus version change as validator
AdoAdoAdo Dec 19, 2024
ccdd6cb
temp change of equivalent messages enable epoch to shorten transition…
AdoAdoAdo Dec 20, 2024
75e042a
fixes integration tests
AdoAdoAdo Dec 20, 2024
6092d21
Merge branch 'feat/equivalent-messages' into equivalent-proofs-feat-s…
AdoAdoAdo Dec 20, 2024
5cd3d46
fixes integration tests
AdoAdoAdo Dec 20, 2024
330eb4a
fixes check proof on first block after genesis
AdoAdoAdo Dec 23, 2024
7832305
fix header finality check for equivalent proofs
AdoAdoAdo Dec 23, 2024
60584a0
adapt integration tests
AdoAdoAdo Dec 23, 2024
a8fb6f1
adapt integration tests
AdoAdoAdo Dec 23, 2024
df47f28
fixes & debug logs
AdoAdoAdo Dec 23, 2024
492631c
fix eqv proofs epoch cfg for chain simulator tests
AdoAdoAdo Jan 8, 2025
84c0b98
fix interceptor save unit test
AdoAdoAdo Jan 8, 2025
700f252
fixes header prev proof verification
AdoAdoAdo Jan 8, 2025
b03af58
avoid deadlock when switching consensus
AdoAdoAdo Jan 8, 2025
b1be55c
remove check on first block after activation
ssd04 Jan 9, 2025
f695092
integrate header proof round
ssd04 Jan 9, 2025
13d6458
add test for equivalent proof on shard block sync
ssd04 Jan 9, 2025
bbbeb98
Merge pull request #6697 from multiversx/check-proof-on-activation-bl…
AdoAdoAdo Jan 9, 2025
5f650fb
adapt fork detector and highest probable nonce for equivalent proofs
AdoAdoAdo Jan 9, 2025
b7d1990
Merge branch 'equivalent-proofs-feat-stabilization' of github.com:mul…
AdoAdoAdo Jan 9, 2025
2211c74
add the round to the header info
AdoAdoAdo Jan 9, 2025
f1a55a9
update tests
AdoAdoAdo Jan 9, 2025
958bf29
update more tests
AdoAdoAdo Jan 9, 2025
1235b89
added checks on proofs parameters like epoch, nonce and shard
sstanculeanu Jan 9, 2025
d4243bc
fixes after review
sstanculeanu Jan 10, 2025
681f506
small refactor + extended checks
sstanculeanu Jan 10, 2025
68ec7b7
integrate fork detector process received proof
AdoAdoAdo Jan 13, 2025
a1cf4c8
further fixes after review
sstanculeanu Jan 13, 2025
3db5c03
fixed typo
sstanculeanu Jan 13, 2025
5495467
Merge pull request #6698 from multiversx/check_proof_validity
sstanculeanu Jan 13, 2025
9c0a622
fix base fork detector process received block
AdoAdoAdo Jan 13, 2025
be77f2d
fix fork detector with equivalent proofs
AdoAdoAdo Jan 14, 2025
c3333bb
Merge remote-tracking branch 'origin/equivalent-proofs-feat-stabiliza…
AdoAdoAdo Jan 14, 2025
828708c
fix intercepted proof checks
AdoAdoAdo Jan 14, 2025
747cd55
fixes after review
AdoAdoAdo Jan 14, 2025
6e25ca3
fix check for accepting a proof on interceptor
AdoAdoAdo Jan 14, 2025
25276b1
remove v1 consensus callbacks from worker after v2 activation
AdoAdoAdo Jan 15, 2025
f61ee57
consensus v2 fixes
AdoAdoAdo Jan 15, 2025
6a11dbe
move setting of prev proof in processor and fix rating update
AdoAdoAdo Jan 15, 2025
0abb837
fix checkProofsForShardData and shard transition trigger
AdoAdoAdo Jan 15, 2025
aef1bc8
update header validator to cross check proof
AdoAdoAdo Jan 17, 2025
281141b
update shard epoch strart trigger for consensus proofs
AdoAdoAdo Jan 17, 2025
3126444
fix linter issues
AdoAdoAdo Jan 20, 2025
30ba777
fix tests
AdoAdoAdo Jan 20, 2025
a8378a3
fix trigger registry test
AdoAdoAdo Jan 20, 2025
e63d4fe
remove unused storer in intercepted proofs, revert variables.sh chang…
AdoAdoAdo Jan 20, 2025
3bd8598
fixes after review
AdoAdoAdo Jan 20, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions epochStart/errors.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,9 @@ var ErrNilRequestHandler = errors.New("nil request handler")
// ErrNilMetaBlocksPool signals that nil metablock pools holder has been provided
var ErrNilMetaBlocksPool = errors.New("nil metablocks pool")

// ErrNilProofsPool signals that nil proofs pool has been provided
var ErrNilProofsPool = errors.New("nil proofs pool")

// ErrNilValidatorInfoProcessor signals that a nil validator info processor has been provided
var ErrNilValidatorInfoProcessor = errors.New("nil validator info processor")

Expand Down
97 changes: 86 additions & 11 deletions epochStart/shardchain/trigger.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,13 @@ import (
"github.com/multiversx/mx-chain-core-go/display"
"github.com/multiversx/mx-chain-core-go/hashing"
"github.com/multiversx/mx-chain-core-go/marshal"
"github.com/multiversx/mx-chain-logger-go"

"github.com/multiversx/mx-chain-go/common"
"github.com/multiversx/mx-chain-go/dataRetriever"
"github.com/multiversx/mx-chain-go/epochStart"
"github.com/multiversx/mx-chain-go/process"
"github.com/multiversx/mx-chain-go/storage"
"github.com/multiversx/mx-chain-logger-go"
)

var log = logger.GetOrCreate("epochStart/shardchain")
Expand Down Expand Up @@ -79,6 +80,7 @@ type trigger struct {
mapFinalizedEpochs map[uint32]string

headersPool dataRetriever.HeadersPool
proofsPool dataRetriever.ProofsPool
miniBlocksPool storage.Cacher
validatorInfoPool dataRetriever.ShardedDataCacherNotifier
currentEpochValidatorInfoPool epochStart.ValidatorInfoCacher
Expand Down Expand Up @@ -170,6 +172,9 @@ func NewEpochStartTrigger(args *ArgsShardEpochStartTrigger) (*trigger, error) {
if check.IfNil(args.DataPool.Headers()) {
return nil, epochStart.ErrNilMetaBlocksPool
}
if check.IfNil(args.DataPool.Proofs()) {
return nil, epochStart.ErrNilProofsPool
}
if check.IfNil(args.DataPool.MiniBlocks()) {
return nil, epochStart.ErrNilMiniBlockPool
}
Expand Down Expand Up @@ -247,6 +252,7 @@ func NewEpochStartTrigger(args *ArgsShardEpochStartTrigger) (*trigger, error) {
mapEpochStartHdrs: make(map[string]data.HeaderHandler),
mapFinalizedEpochs: make(map[uint32]string),
headersPool: args.DataPool.Headers(),
proofsPool: args.DataPool.Proofs(),
miniBlocksPool: args.DataPool.MiniBlocks(),
validatorInfoPool: args.DataPool.ValidatorsInfo(),
currentEpochValidatorInfoPool: args.DataPool.CurrentEpochValidatorInfo(),
Expand All @@ -270,7 +276,9 @@ func NewEpochStartTrigger(args *ArgsShardEpochStartTrigger) (*trigger, error) {
extraDelayForRequestBlockInfo: args.ExtraDelayForRequestBlockInfo,
}

// TODO: for equivalent messages this trigger needs to be changed, on start of epoch block proof instead
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is this comment still needed?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

no, removed

t.headersPool.RegisterHandler(t.receivedMetaBlock)
t.proofsPool.RegisterHandler(t.receivedProof)

err = t.saveState(t.triggerStateKey)
if err != nil {
Expand Down Expand Up @@ -555,12 +563,54 @@ func (t *trigger) changeEpochFinalityAttestingRoundIfNeeded(
t.epochFinalityAttestingRound = metaHdr.GetRound()
}

func (t *trigger) receivedProof(headerProof data.HeaderProofHandler) {
if check.IfNilReflect(headerProof) {
return
}
if headerProof.GetHeaderShardId() != core.MetachainShardId {
return
}
t.mutTrigger.Lock()
defer t.mutTrigger.Unlock()

header, err := t.headersPool.GetHeaderByHash(headerProof.GetHeaderHash())
if err != nil {
return
}

t.checkMetaHeaderForEpochTriggerEquivalentProofs(header, headerProof.GetHeaderHash())
}

// receivedMetaBlock is a callback function when a new metablock was received
// upon receiving checks if trigger can be updated
func (t *trigger) receivedMetaBlock(headerHandler data.HeaderHandler, metaBlockHash []byte) {
if t.enableEpochsHandler.IsFlagEnabledInEpoch(common.EquivalentMessagesFlag, headerHandler.GetEpoch()) {
return
}

t.mutTrigger.Lock()
defer t.mutTrigger.Unlock()

t.checkMetaHeaderForEpochTriggerLegacy(headerHandler, metaBlockHash)
}

func (t *trigger) checkMetaHeaderForEpochTriggerEquivalentProofs(headerHandler data.HeaderHandler, metaBlockHash []byte) {
metaHdr, ok := headerHandler.(*block.MetaBlock)
if !ok {
return
}
if !t.newEpochHdrReceived && !metaHdr.IsStartOfEpochBlock() {
return
}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not needed, already part of shouldUpdateTrigger

if !t.shouldUpdateTrigger(metaHdr, metaBlockHash) {
return
}

t.updateTriggerHeaderData(metaHdr, metaBlockHash)
t.updateTriggerFromMeta()
}

func (t *trigger) checkMetaHeaderForEpochTriggerLegacy(headerHandler data.HeaderHandler, metaBlockHash []byte) {
metaHdr, ok := headerHandler.(*block.MetaBlock)
if !ok {
return
Expand All @@ -574,28 +624,41 @@ func (t *trigger) receivedMetaBlock(headerHandler data.HeaderHandler, metaBlockH
}
}

if !t.newEpochHdrReceived && !metaHdr.IsStartOfEpochBlock() {
if !t.shouldUpdateTrigger(metaHdr, metaBlockHash) {
return
}

t.updateTriggerHeaderData(metaHdr, metaBlockHash)
t.updateTriggerFromMeta()
}

func (t *trigger) shouldUpdateTrigger(metaHdr *block.MetaBlock, metaBlockHash []byte) bool {
if !t.newEpochHdrReceived && !metaHdr.IsStartOfEpochBlock() {
return false
}

isMetaStartOfEpochForCurrentEpoch := metaHdr.Epoch == t.epoch && metaHdr.IsStartOfEpochBlock()
if isMetaStartOfEpochForCurrentEpoch {
return
return false
}

if _, ok = t.mapHashHdr[string(metaBlockHash)]; ok {
return
if _, ok := t.mapHashHdr[string(metaBlockHash)]; ok {
return false
}
if _, ok = t.mapEpochStartHdrs[string(metaBlockHash)]; ok {
return
if _, ok := t.mapEpochStartHdrs[string(metaBlockHash)]; ok {
return false
}

return true
}

func (t *trigger) updateTriggerHeaderData(metaHdr *block.MetaBlock, metaBlockHash []byte) {
if metaHdr.IsStartOfEpochBlock() {
t.newEpochHdrReceived = true
t.mapEpochStartHdrs[string(metaBlockHash)] = metaHdr
// waiting for late broadcast of mini blocks and transactions to be done and received
wait := t.extraDelayForRequestBlockInfo
roundDifferences := t.roundHandler.Index() - int64(headerHandler.GetRound())
roundDifferences := t.roundHandler.Index() - int64(metaHdr.GetRound())
if roundDifferences > 1 {
wait = 0
}
Expand All @@ -605,8 +668,6 @@ func (t *trigger) receivedMetaBlock(headerHandler data.HeaderHandler, metaBlockH

t.mapHashHdr[string(metaBlockHash)] = metaHdr
t.mapNonceHashes[metaHdr.Nonce] = append(t.mapNonceHashes[metaHdr.Nonce], string(metaBlockHash))

t.updateTriggerFromMeta()
}

// call only if mutex is locked before
Expand Down Expand Up @@ -722,10 +783,24 @@ func (t *trigger) isMetaBlockValid(hash string, metaHdr data.HeaderHandler) bool
return true
}

func (t *trigger) isMetaBlockFinal(_ string, metaHdr data.HeaderHandler) (bool, uint64) {
func (t *trigger) isMetaBlockFinal(hash string, metaHdr data.HeaderHandler) (bool, uint64) {
if !t.enableEpochsHandler.IsFlagEnabledInEpoch(common.EquivalentMessagesFlag, metaHdr.GetEpoch()) {
return t.isMetaBlockFinalLegacy(hash, metaHdr)
}

hasProof := t.proofsPool.HasProof(metaHdr.GetShardID(), []byte(hash))
if !hasProof {
return false, 0
}

return true, metaHdr.GetRound()
}

func (t *trigger) isMetaBlockFinalLegacy(_ string, metaHdr data.HeaderHandler) (bool, uint64) {
nextBlocksVerified := uint64(0)
finalityAttestingRound := metaHdr.GetRound()
currHdr := metaHdr

for nonce := metaHdr.GetNonce() + 1; nonce <= metaHdr.GetNonce()+t.finality; nonce++ {
currHash, err := core.CalculateHash(t.marshaller, t.hasher, currHdr)
if err != nil {
Expand Down
Loading