Skip to content

Commit 90cc240

Browse files
feat: finality based on weight (#1183)
* first commit * first commit * first commit * adjusting threshold, iteration * adjusting threshold, iteration * adjusting threshold, iteration * refactor so it is all weight * refactor so it is all weight * changes after call * added backwards compatibility * added backwards compatibility * added backwards compatibility * added backwards compatibility * reverted tests * tests fixed * assuming finality after the transition period * fixed boundaries * minor change * tests started * more changes * added rest of the test * refactor * refactor * refactor, testgetvote not passing yet * refactor, testgetvote not passing yet * refactor, testgetvote not passing yet * refactor, testgetvote not passing yet * refactor, testgetvote not passing yet * fixed all tests * testjustifier, not passing yet * testjustifier, not passing yet * testjustifier, not passing yet * testjustifier, not passing yet * testjustifier, not passing yet * testjustifier, not passing yet * testjustifier tests passing * all tests passing * all tests passing * all tests passing * small refactor * small refactor * modified addvalidator since now it has less params * renaming so it matches with the existing attributes * renaming so it matches with the existing attributes * replace lookupNode with Get * using isposactive * using isposactive * using isposactive * using isposactive --------- Co-authored-by: paologalligit <paolo.galli@vechain.org>
1 parent 5616eea commit 90cc240

4 files changed

Lines changed: 562 additions & 196 deletions

File tree

bft/engine.go

Lines changed: 51 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package bft
66

77
import (
8+
"math/big"
89
"sort"
910
"sync/atomic"
1011

@@ -305,7 +306,6 @@ func (engine *Engine) computeState(header *block.Header) (*bftState, error) {
305306
js = (entry.Value).(*justifier)
306307
end = header.Number()
307308
} else {
308-
// create a new vote set if cache missed or new block is checkpoint
309309
var err error
310310
js, err = engine.newJustifier(header.ParentID())
311311
if err != nil {
@@ -317,17 +317,45 @@ func (engine *Engine) computeState(header *block.Header) (*bftState, error) {
317317
h := header
318318
for h.Number() >= engine.forkConfig.FINALITY {
319319
signer, _ := h.Signer()
320-
js.AddBlock(signer, h.COM())
320+
321+
var parentBlockSummary *chain.BlockSummary
322+
var err error
323+
324+
if h.Number() > engine.forkConfig.HAYABUSA+engine.forkConfig.HAYABUSA_TP {
325+
parentBlockSummary, err = engine.repo.GetBlockSummary(h.ParentID())
326+
if err != nil {
327+
return nil, err
328+
}
329+
state := engine.stater.NewState(parentBlockSummary.Root())
330+
staker := builtin.Staker.Native(state)
331+
332+
var weight *big.Int
333+
if posActive, _ := staker.IsPoSActive(); posActive {
334+
// PoS is active, get validator weight
335+
validator, err := staker.Get(signer)
336+
if err != nil {
337+
return nil, err
338+
}
339+
weight = validator.Weight
340+
}
341+
// If PoS is not active or error occurred, weight remains nil
342+
js.AddBlock(signer, h.COM(), weight)
343+
} else {
344+
js.AddBlock(signer, h.COM(), nil)
345+
}
321346

322347
if h.Number() <= end {
323348
break
324349
}
325350

326-
sum, err := engine.repo.GetBlockSummary(h.ParentID())
327-
if err != nil {
328-
return nil, err
351+
if parentBlockSummary == nil {
352+
parentBlockSummary, err = engine.repo.GetBlockSummary(h.ParentID())
353+
if err != nil {
354+
return nil, err
355+
}
329356
}
330-
h = sum.Header
357+
358+
h = parentBlockSummary.Header
331359
}
332360

333361
st := js.Summarize()
@@ -388,6 +416,23 @@ func (engine *Engine) findCheckpointByQuality(target uint32, finalized, headID t
388416
return c.GetBlockID(searchStart + uint32(num)*thor.CheckpointInterval)
389417
}
390418

419+
func (engine *Engine) getTotalWeight(sum *chain.BlockSummary) (*big.Int, error) {
420+
state := engine.stater.NewState(sum.Root())
421+
staker := builtin.Staker.Native(state)
422+
423+
// Get total weight including delegations
424+
_, totalWeight, err := staker.LockedVET()
425+
if err != nil {
426+
return nil, err
427+
}
428+
429+
if totalWeight == nil || totalWeight.Sign() == 0 {
430+
return nil, errors.New("total weight is zero or nil")
431+
}
432+
433+
return totalWeight, nil
434+
}
435+
391436
func (engine *Engine) getMaxBlockProposers(sum *chain.BlockSummary) (uint64, error) {
392437
state := engine.stater.NewState(sum.Root())
393438
params, err := builtin.Params.Native(state).Get(thor.KeyMaxBlockProposers)
@@ -398,7 +443,6 @@ func (engine *Engine) getMaxBlockProposers(sum *chain.BlockSummary) (uint64, err
398443
if mbp == 0 || mbp > thor.InitialMaxBlockProposers {
399444
mbp = thor.InitialMaxBlockProposers
400445
}
401-
402446
return mbp, nil
403447
}
404448

0 commit comments

Comments
 (0)