ceremonyclient/node/consensus/master/consensus_frames.go
2024-10-16 23:51:27 -05:00

82 lines
1.7 KiB
Go

package master
import (
"bytes"
"time"
"github.com/pkg/errors"
"source.quilibrium.com/quilibrium/monorepo/node/consensus"
"source.quilibrium.com/quilibrium/monorepo/node/p2p"
"source.quilibrium.com/quilibrium/monorepo/node/protobufs"
)
func (e *MasterClockConsensusEngine) prove(
previousFrame *protobufs.ClockFrame,
) (*protobufs.ClockFrame, error) {
if bytes.Equal(e.pubSub.GetPeerID(), []byte(e.beacon)) {
e.logger.Debug("proving new frame")
e.collectedProverSlotsMx.Lock()
collectedProverSlots := e.collectedProverSlots
e.collectedProverSlots = []*protobufs.InclusionAggregateProof{}
e.collectedProverSlotsMx.Unlock()
frame, err := e.frameProver.ProveMasterClockFrame(
previousFrame,
time.Now().UnixMilli(),
e.difficulty,
collectedProverSlots,
)
if err != nil {
return nil, errors.Wrap(err, "prove")
}
e.state = consensus.EngineStatePublishing
e.logger.Debug("returning new proven frame")
return frame, nil
}
return previousFrame, nil
}
func (e *MasterClockConsensusEngine) GetMostAheadPeers() (
[][]byte,
error,
) {
frame, err := e.masterTimeReel.Head()
if err != nil {
panic(err)
}
// Needs to be enough to make the sync worthwhile:
max := frame.FrameNumber + 10
var peers [][]byte = [][]byte{}
peerMap := e.peerInfoManager.GetPeerMap()
for peerId, v := range peerMap {
if v.MasterHeadFrame > max {
peers = append(peers, []byte(peerId))
}
if len(peers) >= 30 {
break
}
}
if len(peers) == 0 {
return nil, p2p.ErrNoPeersAvailable
}
return peers, nil
}
func (e *MasterClockConsensusEngine) collect(
currentFramePublished *protobufs.ClockFrame,
) (*protobufs.ClockFrame, error) {
latest, err := e.masterTimeReel.Head()
if err != nil {
panic(err)
}
return latest, nil
}