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
30 changes: 0 additions & 30 deletions consensus/spos/bls/v2/subroundBlock.go
Original file line number Diff line number Diff line change
Expand Up @@ -104,12 +104,6 @@ func (sr *subroundBlock) doBlockJob(ctx context.Context) bool {
return false
}

// This must be done after createBlock, in order to have the proper epoch set
wasProofAdded := sr.addProofOnHeader(header)
if !wasProofAdded {
return false
}

// block proof verification should be done over the header that contains the leader signature
leaderSignature, err := sr.signBlockHeader(header)
if err != nil {
Expand Down Expand Up @@ -359,30 +353,6 @@ func (sr *subroundBlock) createHeader() (data.HeaderHandler, error) {
return hdr, nil
}

func (sr *subroundBlock) addProofOnHeader(header data.HeaderHandler) bool {
prevBlockProof, err := sr.EquivalentProofsPool().GetProof(sr.ShardCoordinator().SelfId(), header.GetPrevHash())
if err != nil {
// for the first block after activation we won't add the proof
// TODO: fix this on verifications as well
return common.IsEpochChangeBlockForFlagActivation(header, sr.EnableEpochsHandler(), common.EquivalentMessagesFlag)
}

if !isProofEmpty(prevBlockProof) {
header.SetPreviousProof(prevBlockProof)
return true
}

log.Debug("addProofOnHeader: no proof found", "header hash", header.GetPrevHash())

return false
}

func isProofEmpty(proof data.HeaderProofHandler) bool {
return len(proof.GetAggregatedSignature()) == 0 ||
len(proof.GetPubKeysBitmap()) == 0 ||
len(proof.GetHeaderHash()) == 0
}

func (sr *subroundBlock) saveProofForPreviousHeaderIfNeeded(header data.HeaderHandler, prevHeader data.HeaderHandler) {
hasProof := sr.EquivalentProofsPool().HasProof(sr.ShardCoordinator().SelfId(), header.GetPrevHash())
if hasProof {
Expand Down
26 changes: 26 additions & 0 deletions process/block/baseProcess.go
Original file line number Diff line number Diff line change
Expand Up @@ -547,6 +547,7 @@ func checkProcessorParameters(arguments ArgBaseProcessor) error {
common.ScheduledMiniBlocksFlag,
common.StakingV2Flag,
common.CurrentRandomnessOnSortingFlag,
common.EquivalentMessagesFlag,
})
if err != nil {
return err
Expand Down Expand Up @@ -2200,3 +2201,28 @@ func (bp *baseProcessor) checkSentSignaturesAtCommitTime(header data.HeaderHandl

return nil
}

func isProofEmpty(proof data.HeaderProofHandler) bool {
Copy link
Contributor

Choose a reason for hiding this comment

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

we can add this check when adding a new proof, we should not add an empty proof to pool

Copy link
Contributor Author

@AdoAdoAdo AdoAdoAdo Jan 20, 2025

Choose a reason for hiding this comment

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

I think the check is already being done on the interceptor in the integrity check
func (iep *interceptedEquivalentProof) integrity() error

removed the check here

return len(proof.GetAggregatedSignature()) == 0 ||
len(proof.GetPubKeysBitmap()) == 0 ||
len(proof.GetHeaderHash()) == 0
}

func (bp *baseProcessor) addPrevProofIfNeeded(header data.HeaderHandler) error {
if !common.ShouldBlockHavePrevProof(header, bp.enableEpochsHandler, common.EquivalentMessagesFlag) {
return nil
}

prevBlockProof, err := bp.proofsPool.GetProof(bp.shardCoordinator.SelfId(), header.GetPrevHash())
if err != nil {
return err
}

if !isProofEmpty(prevBlockProof) {
header.SetPreviousProof(prevBlockProof)
return nil
}

log.Debug("addPrevProofIfNeeded: no proof found", "header hash", header.GetPrevHash())
return process.ErrNilHeaderProof
}
53 changes: 39 additions & 14 deletions process/block/metablock.go
Original file line number Diff line number Diff line change
Expand Up @@ -756,6 +756,33 @@ func (mp *metaProcessor) RestoreBlockIntoPools(headerHandler data.HeaderHandler,
return nil
}

func (mp *metaProcessor) updateHeaderForEpochStartIfNeeded(metaHdr *block.MetaBlock) error {
isEpochStart := mp.epochStartTrigger.IsEpochStart()
if !isEpochStart {
return nil
}
return mp.updateEpochStartHeader(metaHdr)
}

func (mp *metaProcessor) createBody(metaHdr *block.MetaBlock, haveTime func() bool) (data.BodyHandler, error) {
isEpochStart := mp.epochStartTrigger.IsEpochStart()
var body data.BodyHandler
var err error
if isEpochStart {
body, err = mp.createEpochStartBody(metaHdr)
if err != nil {
return nil, err
}
} else {
body, err = mp.createBlockBody(metaHdr, haveTime)
if err != nil {
return nil, err
}
}

return body, nil
}

// CreateBlock creates the final block and header for the current round
func (mp *metaProcessor) CreateBlock(
initialHdr data.HeaderHandler,
Expand Down Expand Up @@ -789,21 +816,19 @@ func (mp *metaProcessor) CreateBlock(
return nil, nil, err
}

if mp.epochStartTrigger.IsEpochStart() {
err = mp.updateEpochStartHeader(metaHdr)
if err != nil {
return nil, nil, err
}
err = mp.updateHeaderForEpochStartIfNeeded(metaHdr)
if err != nil {
return nil, nil, err
}

body, err = mp.createEpochStartBody(metaHdr)
if err != nil {
return nil, nil, err
}
} else {
body, err = mp.createBlockBody(metaHdr, haveTime)
if err != nil {
return nil, nil, err
}
err = mp.addPrevProofIfNeeded(metaHdr)
if err != nil {
return nil, nil, err
}

body, err = mp.createBody(metaHdr, haveTime)
if err != nil {
return nil, nil, err
}

body, err = mp.applyBodyToHeader(metaHdr, body)
Expand Down
5 changes: 5 additions & 0 deletions process/block/shardblock.go
Original file line number Diff line number Diff line change
Expand Up @@ -878,6 +878,11 @@ func (sp *shardProcessor) CreateBlock(
}
}

err = sp.addPrevProofIfNeeded(shardHdr)
if err != nil {
return nil, nil, err
}

sp.epochNotifier.CheckEpoch(shardHdr)
sp.blockChainHook.SetCurrentHeader(shardHdr)
body, processedMiniBlocksDestMeInfo, err := sp.createBlockBody(shardHdr, haveTime)
Expand Down
22 changes: 17 additions & 5 deletions process/peer/process.go
Original file line number Diff line number Diff line change
Expand Up @@ -406,10 +406,7 @@ func (vs *validatorStatistics) UpdatePeerState(header data.MetaHeaderHandler, ca
log.Debug("UpdatePeerState - registering meta previous leader fees", "metaNonce", previousHeader.GetNonce())
bitmap := previousHeader.GetPubKeysBitmap()
if vs.enableEpochsHandler.IsFlagEnabledInEpoch(common.EquivalentMessagesFlag, previousHeader.GetEpoch()) {
proof := previousHeader.GetPreviousProof()
if !check.IfNilReflect(proof) {
bitmap = proof.GetPubKeysBitmap()
}
bitmap = vs.getBitmapForFullConsensus(previousHeader.GetShardID(), previousHeader.GetEpoch())
}
err = vs.updateValidatorInfoOnSuccessfulBlock(
leader,
Expand Down Expand Up @@ -903,6 +900,17 @@ func (vs *validatorStatistics) RevertPeerState(header data.MetaHeaderHandler) er
return vs.peerAdapter.RecreateTrie(rootHashHolder)
}

// TODO: check if this can be taken from somewhere else
func (vs *validatorStatistics) getBitmapForFullConsensus(shardID uint32, epoch uint32) []byte {
consensusSize := vs.nodesCoordinator.ConsensusGroupSizeForShardAndEpoch(shardID, epoch)
bitmap := make([]byte, consensusSize/8+1)
for i := 0; i < consensusSize; i++ {
bitmap[i/8] |= 1 << (uint16(i) % 8)
}

return bitmap
}

func (vs *validatorStatistics) updateShardDataPeerState(
header data.HeaderHandler,
cacheMap map[string]data.HeaderHandler,
Expand Down Expand Up @@ -935,10 +943,14 @@ func (vs *validatorStatistics) updateShardDataPeerState(
}

log.Debug("updateShardDataPeerState - registering shard leader fees", "shard headerHash", h.HeaderHash, "accumulatedFees", h.AccumulatedFees.String(), "developerFees", h.DeveloperFees.String())
bitmap := h.PubKeysBitmap
if vs.enableEpochsHandler.IsFlagEnabledInEpoch(common.EquivalentMessagesFlag, h.Epoch) {
bitmap = vs.getBitmapForFullConsensus(h.ShardID, h.Epoch)
}
shardInfoErr = vs.updateValidatorInfoOnSuccessfulBlock(
leader,
shardConsensus,
h.PubKeysBitmap,
bitmap,
big.NewInt(0).Sub(h.AccumulatedFees, h.DeveloperFees),
h.ShardID,
)
Expand Down
Loading