mirror of
https://source.quilibrium.com/quilibrium/ceremonyclient.git
synced 2024-11-20 15:15:18 +00:00
v1.4.6 (#115)
* v1.4.6 * adjust connection manager for bootstrappers, go back to autoscale for resource
This commit is contained in:
parent
1fc27018b5
commit
644500bc42
@ -887,11 +887,11 @@ func logoVersion(width int) string {
|
|||||||
out += " ''---.. ...---'' ##\n"
|
out += " ''---.. ...---'' ##\n"
|
||||||
out += " ''----------''\n"
|
out += " ''----------''\n"
|
||||||
out += " \n"
|
out += " \n"
|
||||||
out += " Quilibrium Node - v1.4.5 – Sunset\n"
|
out += " Quilibrium Node - v1.4.6 – Sunset\n"
|
||||||
out += " \n"
|
out += " \n"
|
||||||
out += " DB Console\n"
|
out += " DB Console\n"
|
||||||
} else {
|
} else {
|
||||||
out = "Quilibrium Node - v1.4.5 – Sunset - DB Console\n"
|
out = "Quilibrium Node - v1.4.6 – Sunset - DB Console\n"
|
||||||
}
|
}
|
||||||
return out
|
return out
|
||||||
}
|
}
|
||||||
|
@ -77,7 +77,7 @@ func (n *Node) RunRepair() {
|
|||||||
if err == nil && head != nil {
|
if err == nil && head != nil {
|
||||||
for head != nil && head.FrameNumber != 0 {
|
for head != nil && head.FrameNumber != 0 {
|
||||||
prev := head
|
prev := head
|
||||||
head, err = n.clockStore.GetParentDataClockFrame(
|
head, err = n.clockStore.GetStagedDataClockFrame(
|
||||||
intrinsicFilter,
|
intrinsicFilter,
|
||||||
head.FrameNumber-1,
|
head.FrameNumber-1,
|
||||||
head.ParentSelector,
|
head.ParentSelector,
|
||||||
@ -99,11 +99,11 @@ func (n *Node) RunRepair() {
|
|||||||
"repairing frame",
|
"repairing frame",
|
||||||
zap.Uint64("frame_number", head.FrameNumber),
|
zap.Uint64("frame_number", head.FrameNumber),
|
||||||
)
|
)
|
||||||
head, err = n.clockStore.GetParentDataClockFrame(
|
head, err = n.clockStore.GetStagedDataClockFrame(
|
||||||
intrinsicFilter,
|
intrinsicFilter,
|
||||||
prev.FrameNumber-1,
|
prev.FrameNumber-1,
|
||||||
prev.ParentSelector,
|
prev.ParentSelector,
|
||||||
false,
|
true,
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
@ -114,7 +114,19 @@ func (n *Node) RunRepair() {
|
|||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = n.clockStore.PutDataClockFrame(head, proverTrie, txn, true)
|
selector, err := head.GetSelector()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = n.clockStore.CommitDataClockFrame(
|
||||||
|
intrinsicFilter,
|
||||||
|
head.FrameNumber,
|
||||||
|
selector.FillBytes(make([]byte, 32)),
|
||||||
|
proverTrie,
|
||||||
|
txn,
|
||||||
|
true,
|
||||||
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
@ -145,6 +145,10 @@ func (e *CeremonyDataClockConsensusEngine) handleCeremonyPeerListAnnounce(
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !bytes.Equal(p.PeerId, peerID) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
if p.PublicKey == nil || p.Signature == nil || p.Version == nil {
|
if p.PublicKey == nil || p.Signature == nil || p.Version == nil {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@ -188,7 +192,7 @@ func (e *CeremonyDataClockConsensusEngine) handleCeremonyPeerListAnnounce(
|
|||||||
"peer provided outdated version, penalizing app score",
|
"peer provided outdated version, penalizing app score",
|
||||||
zap.Binary("peer_id", p.PeerId),
|
zap.Binary("peer_id", p.PeerId),
|
||||||
)
|
)
|
||||||
e.pubSub.SetPeerScore(p.PeerId, -100)
|
e.pubSub.SetPeerScore(p.PeerId, -10000)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -306,6 +306,11 @@ func (e *CeremonyDataClockConsensusEngine) Start() <-chan error {
|
|||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
e.logger.Info(
|
||||||
|
"preparing peer announce",
|
||||||
|
zap.Uint64("frame_number", frame.FrameNumber),
|
||||||
|
)
|
||||||
|
|
||||||
timestamp := time.Now().UnixMilli()
|
timestamp := time.Now().UnixMilli()
|
||||||
msg := binary.BigEndian.AppendUint64([]byte{}, frame.FrameNumber)
|
msg := binary.BigEndian.AppendUint64([]byte{}, frame.FrameNumber)
|
||||||
msg = append(msg, consensus.GetVersion()...)
|
msg = append(msg, consensus.GetVersion()...)
|
||||||
|
@ -292,7 +292,7 @@ func (e *CeremonyDataClockConsensusEngine) sync(
|
|||||||
parentSelector := make([]byte, 32)
|
parentSelector := make([]byte, 32)
|
||||||
|
|
||||||
for _, selector := range preflight.Preflight.RangeParentSelectors {
|
for _, selector := range preflight.Preflight.RangeParentSelectors {
|
||||||
match, err := e.clockStore.GetParentDataClockFrame(
|
match, err := e.clockStore.GetStagedDataClockFrame(
|
||||||
e.filter,
|
e.filter,
|
||||||
selector.FrameNumber,
|
selector.FrameNumber,
|
||||||
selector.ParentSelector,
|
selector.ParentSelector,
|
||||||
@ -309,11 +309,38 @@ func (e *CeremonyDataClockConsensusEngine) sync(
|
|||||||
if match != nil && found == 0 {
|
if match != nil && found == 0 {
|
||||||
found = match.FrameNumber
|
found = match.FrameNumber
|
||||||
parentSelector = match.ParentSelector
|
parentSelector = match.ParentSelector
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if found != 0 && !bytes.Equal(parentSelector, make([]byte, 32)) {
|
||||||
|
check, err := e.clockStore.GetStagedDataClockFrame(
|
||||||
|
e.filter,
|
||||||
|
found,
|
||||||
|
parentSelector,
|
||||||
|
true,
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
from = 1
|
||||||
|
} else {
|
||||||
|
e.logger.Info("checking interstitial continuity")
|
||||||
|
for check.FrameNumber > 1 {
|
||||||
|
check, err = e.clockStore.GetStagedDataClockFrame(
|
||||||
|
e.filter,
|
||||||
|
check.FrameNumber-1,
|
||||||
|
check.ParentSelector,
|
||||||
|
true,
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
from = 1
|
||||||
|
e.logger.Info(
|
||||||
|
"could not confirm interstitial continuity, setting search to 1",
|
||||||
|
)
|
||||||
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if found != 0 {
|
|
||||||
from = found
|
from = found
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
err = s.Send(&protobufs.CeremonyCompressedSyncRequestMessage{
|
err = s.Send(&protobufs.CeremonyCompressedSyncRequestMessage{
|
||||||
SyncMessage: &protobufs.CeremonyCompressedSyncRequestMessage_Request{
|
SyncMessage: &protobufs.CeremonyCompressedSyncRequestMessage_Request{
|
||||||
|
@ -300,8 +300,6 @@ func (e *CeremonyDataClockConsensusEngine) GetCompressedSyncFrames(
|
|||||||
|
|
||||||
return errors.Wrap(err, "get compressed sync frames")
|
return errors.Wrap(err, "get compressed sync frames")
|
||||||
} else {
|
} else {
|
||||||
frames, err := e.clockStore.GetCandidateDataClockFrames(e.filter, from)
|
|
||||||
if err != nil || len(frames) == 0 {
|
|
||||||
e.logger.Debug(
|
e.logger.Debug(
|
||||||
"peer asked for undiscovered frame",
|
"peer asked for undiscovered frame",
|
||||||
zap.Uint64("frame_number", request.FromFrameNumber),
|
zap.Uint64("frame_number", request.FromFrameNumber),
|
||||||
@ -320,9 +318,6 @@ func (e *CeremonyDataClockConsensusEngine) GetCompressedSyncFrames(
|
|||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
parent = nil
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if parent != nil {
|
if parent != nil {
|
||||||
@ -333,7 +328,7 @@ func (e *CeremonyDataClockConsensusEngine) GetCompressedSyncFrames(
|
|||||||
}
|
}
|
||||||
|
|
||||||
for !bytes.Equal(frame.ParentSelector, parent) {
|
for !bytes.Equal(frame.ParentSelector, parent) {
|
||||||
ours, err := e.clockStore.GetParentDataClockFrame(
|
ours, err := e.clockStore.GetStagedDataClockFrame(
|
||||||
e.filter,
|
e.filter,
|
||||||
frame.FrameNumber-1,
|
frame.FrameNumber-1,
|
||||||
frame.ParentSelector,
|
frame.ParentSelector,
|
||||||
@ -345,7 +340,7 @@ func (e *CeremonyDataClockConsensusEngine) GetCompressedSyncFrames(
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
theirs, err := e.clockStore.GetParentDataClockFrame(
|
theirs, err := e.clockStore.GetStagedDataClockFrame(
|
||||||
e.filter,
|
e.filter,
|
||||||
frame.FrameNumber-1,
|
frame.FrameNumber-1,
|
||||||
parent,
|
parent,
|
||||||
@ -365,7 +360,7 @@ func (e *CeremonyDataClockConsensusEngine) GetCompressedSyncFrames(
|
|||||||
|
|
||||||
if request.RangeParentSelectors != nil {
|
if request.RangeParentSelectors != nil {
|
||||||
for _, selector := range request.RangeParentSelectors {
|
for _, selector := range request.RangeParentSelectors {
|
||||||
frame, err := e.clockStore.GetParentDataClockFrame(
|
frame, err := e.clockStore.GetStagedDataClockFrame(
|
||||||
e.filter,
|
e.filter,
|
||||||
selector.FrameNumber,
|
selector.FrameNumber,
|
||||||
selector.ParentSelector,
|
selector.ParentSelector,
|
||||||
|
@ -59,5 +59,5 @@ func GetMinimumVersion() []byte {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func GetVersion() []byte {
|
func GetVersion() []byte {
|
||||||
return []byte{0x01, 0x04, 0x05}
|
return []byte{0x01, 0x04, 0x06}
|
||||||
}
|
}
|
||||||
|
@ -183,7 +183,7 @@ func (e *MasterClockConsensusEngine) handleSelfTestReport(
|
|||||||
)
|
)
|
||||||
|
|
||||||
if report.Cores < 3 || memory < 16000000000 {
|
if report.Cores < 3 || memory < 16000000000 {
|
||||||
e.logger.Info(
|
e.logger.Debug(
|
||||||
"peer reported invalid configuration",
|
"peer reported invalid configuration",
|
||||||
zap.String("peer_id", base58.Encode(peerID)),
|
zap.String("peer_id", base58.Encode(peerID)),
|
||||||
zap.Uint32("difficulty", report.Difficulty),
|
zap.Uint32("difficulty", report.Difficulty),
|
||||||
@ -208,7 +208,7 @@ func (e *MasterClockConsensusEngine) handleSelfTestReport(
|
|||||||
|
|
||||||
cc, err := e.pubSub.GetDirectChannel(peerID, "validation")
|
cc, err := e.pubSub.GetDirectChannel(peerID, "validation")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
e.logger.Error(
|
e.logger.Debug(
|
||||||
"could not connect for validation",
|
"could not connect for validation",
|
||||||
zap.String("peer_id", base58.Encode(peerID)),
|
zap.String("peer_id", base58.Encode(peerID)),
|
||||||
zap.Uint32("difficulty", report.Difficulty),
|
zap.Uint32("difficulty", report.Difficulty),
|
||||||
@ -245,7 +245,7 @@ func (e *MasterClockConsensusEngine) handleSelfTestReport(
|
|||||||
cc.Close()
|
cc.Close()
|
||||||
|
|
||||||
if !bytes.Equal(verification, validation.Validation) {
|
if !bytes.Equal(verification, validation.Validation) {
|
||||||
e.logger.Error(
|
e.logger.Debug(
|
||||||
"provided invalid verification",
|
"provided invalid verification",
|
||||||
zap.String("peer_id", base58.Encode(peerID)),
|
zap.String("peer_id", base58.Encode(peerID)),
|
||||||
zap.Uint32("difficulty", report.Difficulty),
|
zap.Uint32("difficulty", report.Difficulty),
|
||||||
@ -266,7 +266,7 @@ func (e *MasterClockConsensusEngine) handleSelfTestReport(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if end-start > 2000 {
|
if end-start > 2000 {
|
||||||
e.logger.Error(
|
e.logger.Debug(
|
||||||
"slow bandwidth, scoring out",
|
"slow bandwidth, scoring out",
|
||||||
zap.String("peer_id", base58.Encode(peerID)),
|
zap.String("peer_id", base58.Encode(peerID)),
|
||||||
zap.Uint32("difficulty", report.Difficulty),
|
zap.Uint32("difficulty", report.Difficulty),
|
||||||
|
@ -56,6 +56,8 @@ type MasterClockConsensusEngine struct {
|
|||||||
report *protobufs.SelfTestReport
|
report *protobufs.SelfTestReport
|
||||||
peerMapMx sync.Mutex
|
peerMapMx sync.Mutex
|
||||||
peerMap map[string]*protobufs.SelfTestReport
|
peerMap map[string]*protobufs.SelfTestReport
|
||||||
|
currentReceivingSyncPeers int
|
||||||
|
currentReceivingSyncPeersMx sync.Mutex
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ consensus.ConsensusEngine = (*MasterClockConsensusEngine)(nil)
|
var _ consensus.ConsensusEngine = (*MasterClockConsensusEngine)(nil)
|
||||||
|
@ -12,6 +12,22 @@ func (e *MasterClockConsensusEngine) Sync(
|
|||||||
request *protobufs.SyncRequest,
|
request *protobufs.SyncRequest,
|
||||||
server protobufs.ValidationService_SyncServer,
|
server protobufs.ValidationService_SyncServer,
|
||||||
) error {
|
) error {
|
||||||
|
e.currentReceivingSyncPeersMx.Lock()
|
||||||
|
if e.currentReceivingSyncPeers > 4 {
|
||||||
|
e.currentReceivingSyncPeersMx.Unlock()
|
||||||
|
|
||||||
|
e.logger.Debug("currently processing maximum sync requests, returning")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
e.currentReceivingSyncPeers++
|
||||||
|
e.currentReceivingSyncPeersMx.Unlock()
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
e.currentReceivingSyncPeersMx.Lock()
|
||||||
|
e.currentReceivingSyncPeers--
|
||||||
|
e.currentReceivingSyncPeersMx.Unlock()
|
||||||
|
}()
|
||||||
|
|
||||||
from := request.FramesRequest.FromFrameNumber
|
from := request.FramesRequest.FromFrameNumber
|
||||||
|
|
||||||
masterFrame, err := e.masterTimeReel.Head()
|
masterFrame, err := e.masterTimeReel.Head()
|
||||||
|
@ -127,6 +127,7 @@ func (d *DataTimeReel) Start() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if frame == nil {
|
if frame == nil {
|
||||||
|
|
||||||
d.head, d.proverTrie = d.createGenesisFrame()
|
d.head, d.proverTrie = d.createGenesisFrame()
|
||||||
d.totalDistance = big.NewInt(0)
|
d.totalDistance = big.NewInt(0)
|
||||||
d.headDistance = big.NewInt(0)
|
d.headDistance = big.NewInt(0)
|
||||||
@ -239,13 +240,30 @@ func (d *DataTimeReel) createGenesisFrame() (
|
|||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
selector, err := frame.GetSelector()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
txn, err := d.clockStore.NewTransaction()
|
txn, err := d.clockStore.NewTransaction()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := d.clockStore.PutDataClockFrame(
|
err = d.clockStore.StageDataClockFrame(
|
||||||
|
selector.FillBytes(make([]byte, 32)),
|
||||||
frame,
|
frame,
|
||||||
|
txn,
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
txn.Abort()
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := d.clockStore.CommitDataClockFrame(
|
||||||
|
d.filter,
|
||||||
|
0,
|
||||||
|
selector.FillBytes(make([]byte, 32)),
|
||||||
trie,
|
trie,
|
||||||
txn,
|
txn,
|
||||||
false,
|
false,
|
||||||
@ -294,7 +312,7 @@ func (d *DataTimeReel) runLoop() {
|
|||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
rawFrame, err := d.clockStore.GetParentDataClockFrame(
|
rawFrame, err := d.clockStore.GetStagedDataClockFrame(
|
||||||
d.filter,
|
d.filter,
|
||||||
frame.frameNumber,
|
frame.frameNumber,
|
||||||
frame.selector.FillBytes(make([]byte, 32)),
|
frame.selector.FillBytes(make([]byte, 32)),
|
||||||
@ -341,7 +359,7 @@ func (d *DataTimeReel) runLoop() {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
rawFrame, err := d.clockStore.GetParentDataClockFrame(
|
rawFrame, err := d.clockStore.GetStagedDataClockFrame(
|
||||||
d.filter,
|
d.filter,
|
||||||
frame.frameNumber,
|
frame.frameNumber,
|
||||||
frame.selector.FillBytes(make([]byte, 32)),
|
frame.selector.FillBytes(make([]byte, 32)),
|
||||||
@ -460,7 +478,7 @@ func (d *DataTimeReel) storePending(
|
|||||||
frame *protobufs.ClockFrame,
|
frame *protobufs.ClockFrame,
|
||||||
) {
|
) {
|
||||||
// avoid db thrashing
|
// avoid db thrashing
|
||||||
if existing, err := d.clockStore.GetParentDataClockFrame(
|
if existing, err := d.clockStore.GetStagedDataClockFrame(
|
||||||
frame.Filter,
|
frame.Filter,
|
||||||
frame.FrameNumber,
|
frame.FrameNumber,
|
||||||
selector.FillBytes(make([]byte, 32)),
|
selector.FillBytes(make([]byte, 32)),
|
||||||
@ -478,9 +496,7 @@ func (d *DataTimeReel) storePending(
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
err = d.clockStore.PutCandidateDataClockFrame(
|
err = d.clockStore.StageDataClockFrame(
|
||||||
parent.FillBytes(make([]byte, 32)),
|
|
||||||
distance.FillBytes(make([]byte, 32)),
|
|
||||||
selector.FillBytes(make([]byte, 32)),
|
selector.FillBytes(make([]byte, 32)),
|
||||||
frame,
|
frame,
|
||||||
txn,
|
txn,
|
||||||
@ -578,8 +594,15 @@ func (d *DataTimeReel) setHead(frame *protobufs.ClockFrame, distance *big.Int) {
|
|||||||
zap.String("distance", distance.Text(16)),
|
zap.String("distance", distance.Text(16)),
|
||||||
)
|
)
|
||||||
|
|
||||||
if err := d.clockStore.PutDataClockFrame(
|
selector, err := frame.GetSelector()
|
||||||
frame,
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := d.clockStore.CommitDataClockFrame(
|
||||||
|
d.filter,
|
||||||
|
frame.FrameNumber,
|
||||||
|
selector.FillBytes(make([]byte, 32)),
|
||||||
d.proverTrie,
|
d.proverTrie,
|
||||||
txn,
|
txn,
|
||||||
false,
|
false,
|
||||||
@ -607,7 +630,7 @@ func (d *DataTimeReel) getTotalDistance(frame *protobufs.ClockFrame) *big.Int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for index := frame; err == nil &&
|
for index := frame; err == nil &&
|
||||||
index.FrameNumber > 0; index, err = d.clockStore.GetParentDataClockFrame(
|
index.FrameNumber > 0; index, err = d.clockStore.GetStagedDataClockFrame(
|
||||||
d.filter,
|
d.filter,
|
||||||
index.FrameNumber-1,
|
index.FrameNumber-1,
|
||||||
index.ParentSelector,
|
index.ParentSelector,
|
||||||
@ -692,7 +715,7 @@ func (d *DataTimeReel) forkChoice(
|
|||||||
rightReplaySelectors...,
|
rightReplaySelectors...,
|
||||||
)
|
)
|
||||||
|
|
||||||
rightIndex, err = d.clockStore.GetParentDataClockFrame(
|
rightIndex, err = d.clockStore.GetStagedDataClockFrame(
|
||||||
d.filter,
|
d.filter,
|
||||||
rightIndex.FrameNumber-1,
|
rightIndex.FrameNumber-1,
|
||||||
rightIndex.ParentSelector,
|
rightIndex.ParentSelector,
|
||||||
@ -737,7 +760,7 @@ func (d *DataTimeReel) forkChoice(
|
|||||||
),
|
),
|
||||||
rightReplaySelectors...,
|
rightReplaySelectors...,
|
||||||
)
|
)
|
||||||
leftIndex, err = d.clockStore.GetParentDataClockFrame(
|
leftIndex, err = d.clockStore.GetStagedDataClockFrame(
|
||||||
d.filter,
|
d.filter,
|
||||||
leftIndex.FrameNumber-1,
|
leftIndex.FrameNumber-1,
|
||||||
leftIndex.ParentSelector,
|
leftIndex.ParentSelector,
|
||||||
@ -755,7 +778,7 @@ func (d *DataTimeReel) forkChoice(
|
|||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
rightIndex, err = d.clockStore.GetParentDataClockFrame(
|
rightIndex, err = d.clockStore.GetStagedDataClockFrame(
|
||||||
d.filter,
|
d.filter,
|
||||||
rightIndex.FrameNumber-1,
|
rightIndex.FrameNumber-1,
|
||||||
rightIndex.ParentSelector,
|
rightIndex.ParentSelector,
|
||||||
@ -810,23 +833,15 @@ func (d *DataTimeReel) forkChoice(
|
|||||||
rightReplaySelectors =
|
rightReplaySelectors =
|
||||||
rightReplaySelectors[1:]
|
rightReplaySelectors[1:]
|
||||||
|
|
||||||
rightIndex, err = d.clockStore.GetParentDataClockFrame(
|
|
||||||
d.filter,
|
|
||||||
frameNumber,
|
|
||||||
next,
|
|
||||||
false,
|
|
||||||
)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
txn, err := d.clockStore.NewTransaction()
|
txn, err := d.clockStore.NewTransaction()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := d.clockStore.PutDataClockFrame(
|
if err := d.clockStore.CommitDataClockFrame(
|
||||||
rightIndex,
|
d.filter,
|
||||||
|
frameNumber,
|
||||||
|
next,
|
||||||
d.proverTrie,
|
d.proverTrie,
|
||||||
txn,
|
txn,
|
||||||
rightIndex.FrameNumber < d.head.FrameNumber,
|
rightIndex.FrameNumber < d.head.FrameNumber,
|
||||||
@ -846,8 +861,10 @@ func (d *DataTimeReel) forkChoice(
|
|||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := d.clockStore.PutDataClockFrame(
|
if err := d.clockStore.CommitDataClockFrame(
|
||||||
frame,
|
d.filter,
|
||||||
|
frame.FrameNumber,
|
||||||
|
selector.FillBytes(make([]byte, 32)),
|
||||||
d.proverTrie,
|
d.proverTrie,
|
||||||
txn,
|
txn,
|
||||||
false,
|
false,
|
||||||
|
@ -1386,7 +1386,7 @@ func (e *CeremonyExecutionEngine) VerifyExecution(
|
|||||||
return errors.Wrap(err, "verify execution")
|
return errors.Wrap(err, "verify execution")
|
||||||
}
|
}
|
||||||
|
|
||||||
parent, err := e.clockStore.GetParentDataClockFrame(
|
parent, err := e.clockStore.GetStagedDataClockFrame(
|
||||||
append(
|
append(
|
||||||
p2p.GetBloomFilter(application.CEREMONY_ADDRESS, 256, 3),
|
p2p.GetBloomFilter(application.CEREMONY_ADDRESS, 256, 3),
|
||||||
p2p.GetBloomFilterIndices(
|
p2p.GetBloomFilterIndices(
|
||||||
|
@ -523,5 +523,5 @@ func printLogo() {
|
|||||||
|
|
||||||
func printVersion() {
|
func printVersion() {
|
||||||
fmt.Println(" ")
|
fmt.Println(" ")
|
||||||
fmt.Println(" Quilibrium Node - v1.4.5 – Sunset")
|
fmt.Println(" Quilibrium Node - v1.4.6 – Sunset")
|
||||||
}
|
}
|
||||||
|
@ -22,7 +22,6 @@ import (
|
|||||||
"github.com/libp2p/go-libp2p/core/protocol"
|
"github.com/libp2p/go-libp2p/core/protocol"
|
||||||
"github.com/libp2p/go-libp2p/p2p/discovery/routing"
|
"github.com/libp2p/go-libp2p/p2p/discovery/routing"
|
||||||
"github.com/libp2p/go-libp2p/p2p/discovery/util"
|
"github.com/libp2p/go-libp2p/p2p/discovery/util"
|
||||||
rcmgr "github.com/libp2p/go-libp2p/p2p/host/resource-manager"
|
|
||||||
"github.com/libp2p/go-libp2p/p2p/net/connmgr"
|
"github.com/libp2p/go-libp2p/p2p/net/connmgr"
|
||||||
"github.com/mr-tron/base58"
|
"github.com/mr-tron/base58"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
@ -108,24 +107,12 @@ func NewBlossomSub(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if isBootstrapPeer {
|
if isBootstrapPeer {
|
||||||
limits := rcmgr.DefaultLimits
|
mgr, err := connmgr.NewConnManager(512, 8192)
|
||||||
libp2p.SetDefaultServiceLimits(&limits)
|
|
||||||
limits.SystemBaseLimit.ConnsInbound = 2048
|
|
||||||
limits.SystemBaseLimit.StreamsInbound = 2048
|
|
||||||
rmgr, err := rcmgr.NewResourceManager(
|
|
||||||
rcmgr.NewFixedLimiter(limits.AutoScale()),
|
|
||||||
)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
mgr, err := connmgr.NewConnManager(512, 2048)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
opts = append(opts,
|
opts = append(opts,
|
||||||
libp2p.ResourceManager(rmgr),
|
|
||||||
libp2p.ConnectionManager(mgr),
|
libp2p.ConnectionManager(mgr),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -576,7 +563,7 @@ func discoverPeers(
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.Info("found peer", zap.String("peer_id", peer.ID.Pretty()))
|
logger.Debug("found peer", zap.String("peer_id", peer.ID.Pretty()))
|
||||||
err := h.Connect(ctx, peer)
|
err := h.Connect(ctx, peer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Debug(
|
logger.Debug(
|
||||||
@ -585,7 +572,7 @@ func discoverPeers(
|
|||||||
zap.Error(err),
|
zap.Error(err),
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
logger.Info(
|
logger.Debug(
|
||||||
"connected to peer",
|
"connected to peer",
|
||||||
zap.String("peer_id", peer.ID.Pretty()),
|
zap.String("peer_id", peer.ID.Pretty()),
|
||||||
)
|
)
|
||||||
|
@ -70,27 +70,6 @@ func (r *RPCServer) GetFrameInfo(
|
|||||||
ClockFrame: frame,
|
ClockFrame: frame,
|
||||||
}, nil
|
}, nil
|
||||||
} else {
|
} else {
|
||||||
frames, err := r.clockStore.GetCandidateDataClockFrames(
|
|
||||||
req.Filter,
|
|
||||||
req.FrameNumber,
|
|
||||||
)
|
|
||||||
if err != nil {
|
|
||||||
return nil, errors.Wrap(err, "get frame info")
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, frame := range frames {
|
|
||||||
selector, err := frame.GetSelector()
|
|
||||||
if err != nil {
|
|
||||||
return nil, errors.Wrap(err, "get frame info")
|
|
||||||
}
|
|
||||||
|
|
||||||
if bytes.Equal(selector.Bytes(), req.Selector) {
|
|
||||||
return &protobufs.FrameInfoResponse{
|
|
||||||
ClockFrame: frame,
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil, errors.Wrap(errors.New("not found"), "get frame info")
|
return nil, errors.Wrap(errors.New("not found"), "get frame info")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -151,44 +130,6 @@ func (r *RPCServer) GetFrames(
|
|||||||
return nil, errors.Wrap(err, "get frames")
|
return nil, errors.Wrap(err, "get frames")
|
||||||
}
|
}
|
||||||
|
|
||||||
if req.IncludeCandidates {
|
|
||||||
from := req.FromFrameNumber
|
|
||||||
if len(frames) > 0 {
|
|
||||||
from = frames[len(frames)-1].FrameNumber + 1
|
|
||||||
}
|
|
||||||
|
|
||||||
for from < req.ToFrameNumber {
|
|
||||||
iter, err := r.clockStore.RangeCandidateDataClockFrames(
|
|
||||||
req.Filter,
|
|
||||||
[]byte{
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
},
|
|
||||||
from,
|
|
||||||
)
|
|
||||||
if err != nil {
|
|
||||||
return nil, errors.Wrap(err, "get frames")
|
|
||||||
}
|
|
||||||
|
|
||||||
for iter.First(); iter.Valid(); iter.Next() {
|
|
||||||
frame, err := iter.TruncatedValue()
|
|
||||||
if err != nil {
|
|
||||||
iter.Close()
|
|
||||||
return nil, errors.Wrap(err, "get frames")
|
|
||||||
}
|
|
||||||
frames = append(frames, frame)
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := iter.Close(); err != nil {
|
|
||||||
return nil, errors.Wrap(err, "get frames")
|
|
||||||
}
|
|
||||||
|
|
||||||
from++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return &protobufs.FramesResponse{
|
return &protobufs.FramesResponse{
|
||||||
TruncatedClockFrames: frames,
|
TruncatedClockFrames: frames,
|
||||||
}, nil
|
}, nil
|
||||||
@ -289,17 +230,15 @@ func (r *RPCServer) GetTokenInfo(
|
|||||||
}
|
}
|
||||||
|
|
||||||
confirmedTotal := new(big.Int)
|
confirmedTotal := new(big.Int)
|
||||||
unconfirmedTotal := new(big.Int)
|
|
||||||
ownedTotal := new(big.Int)
|
ownedTotal := new(big.Int)
|
||||||
unconfirmedOwnedTotal := new(big.Int)
|
|
||||||
if confirmed.RewardTrie.Root == nil ||
|
if confirmed.RewardTrie.Root == nil ||
|
||||||
(confirmed.RewardTrie.Root.External == nil &&
|
(confirmed.RewardTrie.Root.External == nil &&
|
||||||
confirmed.RewardTrie.Root.Internal == nil) {
|
confirmed.RewardTrie.Root.Internal == nil) {
|
||||||
return &protobufs.TokenInfoResponse{
|
return &protobufs.TokenInfoResponse{
|
||||||
ConfirmedTokenSupply: confirmedTotal.FillBytes(make([]byte, 32)),
|
ConfirmedTokenSupply: confirmedTotal.FillBytes(make([]byte, 32)),
|
||||||
UnconfirmedTokenSupply: unconfirmedTotal.FillBytes(make([]byte, 32)),
|
UnconfirmedTokenSupply: confirmedTotal.FillBytes(make([]byte, 32)),
|
||||||
OwnedTokens: ownedTotal.FillBytes(make([]byte, 32)),
|
OwnedTokens: ownedTotal.FillBytes(make([]byte, 32)),
|
||||||
UnconfirmedOwnedTokens: unconfirmedOwnedTotal.FillBytes(make([]byte, 32)),
|
UnconfirmedOwnedTokens: ownedTotal.FillBytes(make([]byte, 32)),
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -358,78 +297,10 @@ func (r *RPCServer) GetTokenInfo(
|
|||||||
limbs = nextLimbs
|
limbs = nextLimbs
|
||||||
}
|
}
|
||||||
|
|
||||||
candidateFrame, err := r.clockStore.GetHighestCandidateDataClockFrame(
|
|
||||||
append(
|
|
||||||
p2p.GetBloomFilter(application.CEREMONY_ADDRESS, 256, 3),
|
|
||||||
p2p.GetBloomFilterIndices(application.CEREMONY_ADDRESS, 65536, 24)...,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrap(err, "get token info")
|
return nil, errors.Wrap(err, "get token info")
|
||||||
}
|
}
|
||||||
|
|
||||||
unconfirmed, err := application.MaterializeApplicationFromFrame(
|
|
||||||
candidateFrame,
|
|
||||||
)
|
|
||||||
if err != nil {
|
|
||||||
return nil, errors.Wrap(err, "get token info")
|
|
||||||
}
|
|
||||||
|
|
||||||
limbs = []*tries.RewardInternalNode{}
|
|
||||||
if unconfirmed.RewardTrie.Root.Internal != nil {
|
|
||||||
limbs = append(limbs, unconfirmed.RewardTrie.Root.Internal)
|
|
||||||
} else {
|
|
||||||
unconfirmedTotal = unconfirmedTotal.Add(
|
|
||||||
unconfirmedTotal,
|
|
||||||
new(big.Int).SetUint64(unconfirmed.RewardTrie.Root.External.Total),
|
|
||||||
)
|
|
||||||
if bytes.Equal(
|
|
||||||
unconfirmed.RewardTrie.Root.External.Key,
|
|
||||||
addrBytes,
|
|
||||||
) {
|
|
||||||
unconfirmedOwnedTotal = unconfirmedOwnedTotal.Add(
|
|
||||||
unconfirmedOwnedTotal,
|
|
||||||
new(big.Int).SetUint64(unconfirmed.RewardTrie.Root.External.Total),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for len(limbs) != 0 {
|
|
||||||
nextLimbs := []*tries.RewardInternalNode{}
|
|
||||||
for _, limb := range limbs {
|
|
||||||
for _, child := range limb.Child {
|
|
||||||
child := child
|
|
||||||
if child.Internal != nil {
|
|
||||||
nextLimbs = append(nextLimbs, child.Internal)
|
|
||||||
} else {
|
|
||||||
unconfirmedTotal = unconfirmedTotal.Add(
|
|
||||||
unconfirmedTotal,
|
|
||||||
new(big.Int).SetUint64(child.External.Total),
|
|
||||||
)
|
|
||||||
if bytes.Equal(
|
|
||||||
child.External.Key,
|
|
||||||
addrBytes,
|
|
||||||
) {
|
|
||||||
unconfirmedOwnedTotal = unconfirmedOwnedTotal.Add(
|
|
||||||
unconfirmedOwnedTotal,
|
|
||||||
new(big.Int).SetUint64(child.External.Total),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
if bytes.Equal(
|
|
||||||
child.External.Key,
|
|
||||||
peerAddrBytes,
|
|
||||||
) {
|
|
||||||
unconfirmedOwnedTotal = unconfirmedOwnedTotal.Add(
|
|
||||||
unconfirmedOwnedTotal,
|
|
||||||
new(big.Int).SetUint64(child.External.Total),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
limbs = nextLimbs
|
|
||||||
}
|
|
||||||
|
|
||||||
// 1 QUIL = 0x1DCD65000 units
|
// 1 QUIL = 0x1DCD65000 units
|
||||||
conversionFactor, ok := new(big.Int).SetString("1DCD65000", 16)
|
conversionFactor, ok := new(big.Int).SetString("1DCD65000", 16)
|
||||||
if !ok {
|
if !ok {
|
||||||
@ -437,18 +308,13 @@ func (r *RPCServer) GetTokenInfo(
|
|||||||
}
|
}
|
||||||
|
|
||||||
confirmedTotal = confirmedTotal.Mul(confirmedTotal, conversionFactor)
|
confirmedTotal = confirmedTotal.Mul(confirmedTotal, conversionFactor)
|
||||||
unconfirmedTotal = unconfirmedTotal.Mul(unconfirmedTotal, conversionFactor)
|
|
||||||
ownedTotal = ownedTotal.Mul(ownedTotal, conversionFactor)
|
ownedTotal = ownedTotal.Mul(ownedTotal, conversionFactor)
|
||||||
unconfirmedOwnedTotal = unconfirmedOwnedTotal.Mul(
|
|
||||||
unconfirmedOwnedTotal,
|
|
||||||
conversionFactor,
|
|
||||||
)
|
|
||||||
|
|
||||||
return &protobufs.TokenInfoResponse{
|
return &protobufs.TokenInfoResponse{
|
||||||
ConfirmedTokenSupply: confirmedTotal.FillBytes(make([]byte, 32)),
|
ConfirmedTokenSupply: confirmedTotal.FillBytes(make([]byte, 32)),
|
||||||
UnconfirmedTokenSupply: unconfirmedTotal.FillBytes(make([]byte, 32)),
|
UnconfirmedTokenSupply: confirmedTotal.FillBytes(make([]byte, 32)),
|
||||||
OwnedTokens: ownedTotal.FillBytes(make([]byte, 32)),
|
OwnedTokens: ownedTotal.FillBytes(make([]byte, 32)),
|
||||||
UnconfirmedOwnedTokens: unconfirmedOwnedTotal.FillBytes(make([]byte, 32)),
|
UnconfirmedOwnedTokens: ownedTotal.FillBytes(make([]byte, 32)),
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,9 +32,6 @@ type ClockStore interface {
|
|||||||
filter []byte,
|
filter []byte,
|
||||||
proverTrie *tries.RollingFrecencyCritbitTrie,
|
proverTrie *tries.RollingFrecencyCritbitTrie,
|
||||||
) (*protobufs.ClockFrame, error)
|
) (*protobufs.ClockFrame, error)
|
||||||
GetLatestCandidateDataClockFrame(
|
|
||||||
filter []byte,
|
|
||||||
) (*protobufs.ClockFrame, error)
|
|
||||||
GetEarliestDataClockFrame(filter []byte) (*protobufs.ClockFrame, error)
|
GetEarliestDataClockFrame(filter []byte) (*protobufs.ClockFrame, error)
|
||||||
GetDataClockFrame(
|
GetDataClockFrame(
|
||||||
filter []byte,
|
filter []byte,
|
||||||
@ -46,45 +43,25 @@ type ClockStore interface {
|
|||||||
startFrameNumber uint64,
|
startFrameNumber uint64,
|
||||||
endFrameNumber uint64,
|
endFrameNumber uint64,
|
||||||
) (*PebbleClockIterator, error)
|
) (*PebbleClockIterator, error)
|
||||||
PutDataClockFrame(
|
CommitDataClockFrame(
|
||||||
frame *protobufs.ClockFrame,
|
filter []byte,
|
||||||
|
frameNumber uint64,
|
||||||
|
selector []byte,
|
||||||
proverTrie *tries.RollingFrecencyCritbitTrie,
|
proverTrie *tries.RollingFrecencyCritbitTrie,
|
||||||
txn Transaction,
|
txn Transaction,
|
||||||
backfill bool,
|
backfill bool,
|
||||||
) error
|
) error
|
||||||
PutCandidateDataClockFrame(
|
StageDataClockFrame(
|
||||||
parentSelector []byte,
|
|
||||||
distance []byte,
|
|
||||||
selector []byte,
|
selector []byte,
|
||||||
frame *protobufs.ClockFrame,
|
frame *protobufs.ClockFrame,
|
||||||
txn Transaction,
|
txn Transaction,
|
||||||
) error
|
) error
|
||||||
GetCandidateDataClockFrame(
|
GetStagedDataClockFrame(
|
||||||
filter []byte,
|
|
||||||
frameNumber uint64,
|
|
||||||
parentSelector []byte,
|
|
||||||
distance []byte,
|
|
||||||
) (*protobufs.ClockFrame, error)
|
|
||||||
GetCandidateDataClockFrames(
|
|
||||||
filter []byte,
|
|
||||||
frameNumber uint64,
|
|
||||||
) ([]*protobufs.ClockFrame, error)
|
|
||||||
GetParentDataClockFrame(
|
|
||||||
filter []byte,
|
filter []byte,
|
||||||
frameNumber uint64,
|
frameNumber uint64,
|
||||||
parentSelector []byte,
|
parentSelector []byte,
|
||||||
truncate bool,
|
truncate bool,
|
||||||
) (*protobufs.ClockFrame, error)
|
) (*protobufs.ClockFrame, error)
|
||||||
RangeCandidateDataClockFrames(
|
|
||||||
filter []byte,
|
|
||||||
parent []byte,
|
|
||||||
frameNumber uint64,
|
|
||||||
) (*PebbleCandidateClockIterator, error)
|
|
||||||
GetLeadingCandidateDataClockFrame(
|
|
||||||
filter []byte,
|
|
||||||
parent []byte,
|
|
||||||
frameNumber uint64,
|
|
||||||
) (*protobufs.ClockFrame, error)
|
|
||||||
Deduplicate(filter []byte) error
|
Deduplicate(filter []byte) error
|
||||||
GetCompressedDataClockFrames(
|
GetCompressedDataClockFrames(
|
||||||
filter []byte,
|
filter []byte,
|
||||||
@ -95,14 +72,6 @@ type ClockStore interface {
|
|||||||
filter []byte,
|
filter []byte,
|
||||||
frameNumber uint64,
|
frameNumber uint64,
|
||||||
) error
|
) error
|
||||||
DeleteCandidateDataClockFrameRange(
|
|
||||||
filter []byte,
|
|
||||||
fromFrameNumber uint64,
|
|
||||||
toFrameNumber uint64,
|
|
||||||
) error
|
|
||||||
GetHighestCandidateDataClockFrame(
|
|
||||||
filter []byte,
|
|
||||||
) (*protobufs.ClockFrame, error)
|
|
||||||
ResetMasterClockFrames(filter []byte) error
|
ResetMasterClockFrames(filter []byte) error
|
||||||
ResetDataClockFrames(filter []byte) error
|
ResetDataClockFrames(filter []byte) error
|
||||||
Compact(
|
Compact(
|
||||||
@ -127,14 +96,8 @@ type PebbleClockIterator struct {
|
|||||||
db *PebbleClockStore
|
db *PebbleClockStore
|
||||||
}
|
}
|
||||||
|
|
||||||
type PebbleCandidateClockIterator struct {
|
|
||||||
i Iterator
|
|
||||||
db *PebbleClockStore
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ TypedIterator[*protobufs.ClockFrame] = (*PebbleMasterClockIterator)(nil)
|
var _ TypedIterator[*protobufs.ClockFrame] = (*PebbleMasterClockIterator)(nil)
|
||||||
var _ TypedIterator[*protobufs.ClockFrame] = (*PebbleClockIterator)(nil)
|
var _ TypedIterator[*protobufs.ClockFrame] = (*PebbleClockIterator)(nil)
|
||||||
var _ TypedIterator[*protobufs.ClockFrame] = (*PebbleCandidateClockIterator)(nil)
|
|
||||||
|
|
||||||
func (p *PebbleMasterClockIterator) First() bool {
|
func (p *PebbleMasterClockIterator) First() bool {
|
||||||
return p.i.First()
|
return p.i.First()
|
||||||
@ -247,7 +210,7 @@ func (p *PebbleClockIterator) Value() (*protobufs.ClockFrame, error) {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := p.db.fillAggregateProofs(frame); err != nil {
|
if err := p.db.fillAggregateProofs(frame, false); err != nil {
|
||||||
return nil, errors.Wrap(
|
return nil, errors.Wrap(
|
||||||
errors.Wrap(err, ErrInvalidData.Error()),
|
errors.Wrap(err, ErrInvalidData.Error()),
|
||||||
"get clock frame iterator value",
|
"get clock frame iterator value",
|
||||||
@ -261,66 +224,6 @@ func (p *PebbleClockIterator) Close() error {
|
|||||||
return errors.Wrap(p.i.Close(), "closing clock frame iterator")
|
return errors.Wrap(p.i.Close(), "closing clock frame iterator")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *PebbleCandidateClockIterator) First() bool {
|
|
||||||
return p.i.First()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *PebbleCandidateClockIterator) Next() bool {
|
|
||||||
return p.i.Next()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *PebbleCandidateClockIterator) Valid() bool {
|
|
||||||
return p.i.Valid()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *PebbleCandidateClockIterator) TruncatedValue() (
|
|
||||||
*protobufs.ClockFrame,
|
|
||||||
error,
|
|
||||||
) {
|
|
||||||
if !p.i.Valid() {
|
|
||||||
return nil, ErrNotFound
|
|
||||||
}
|
|
||||||
|
|
||||||
value := p.i.Value()
|
|
||||||
frame := &protobufs.ClockFrame{}
|
|
||||||
if err := proto.Unmarshal(value, frame); err != nil {
|
|
||||||
return nil, errors.Wrap(
|
|
||||||
errors.Wrap(err, ErrInvalidData.Error()),
|
|
||||||
"get candidate clock frame iterator value",
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
return frame, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *PebbleCandidateClockIterator) Value() (*protobufs.ClockFrame, error) {
|
|
||||||
if !p.i.Valid() {
|
|
||||||
return nil, ErrNotFound
|
|
||||||
}
|
|
||||||
|
|
||||||
value := p.i.Value()
|
|
||||||
frame := &protobufs.ClockFrame{}
|
|
||||||
if err := proto.Unmarshal(value, frame); err != nil {
|
|
||||||
return nil, errors.Wrap(
|
|
||||||
errors.Wrap(err, ErrInvalidData.Error()),
|
|
||||||
"get candidate clock frame iterator value",
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := p.db.fillAggregateProofs(frame); err != nil {
|
|
||||||
return nil, errors.Wrap(
|
|
||||||
errors.Wrap(err, ErrInvalidData.Error()),
|
|
||||||
"get clock frame iterator value",
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
return frame, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *PebbleCandidateClockIterator) Close() error {
|
|
||||||
return errors.Wrap(p.i.Close(), "closing candidate clock frame iterator")
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewPebbleClockStore(db KVDB, logger *zap.Logger) *PebbleClockStore {
|
func NewPebbleClockStore(db KVDB, logger *zap.Logger) *PebbleClockStore {
|
||||||
return &PebbleClockStore{
|
return &PebbleClockStore{
|
||||||
db,
|
db,
|
||||||
@ -419,6 +322,7 @@ func clockDataEarliestIndex(filter []byte) []byte {
|
|||||||
return clockEarliestIndex(filter, CLOCK_DATA_FRAME_INDEX_EARLIEST)
|
return clockEarliestIndex(filter, CLOCK_DATA_FRAME_INDEX_EARLIEST)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Produces an index key of size: len(filter) + 42
|
||||||
func clockParentIndexKey(
|
func clockParentIndexKey(
|
||||||
filter []byte,
|
filter []byte,
|
||||||
frameNumber uint64,
|
frameNumber uint64,
|
||||||
@ -639,17 +543,38 @@ func (p *PebbleClockStore) GetDataClockFrame(
|
|||||||
return nil, nil, errors.Wrap(err, "get data clock frame")
|
return nil, nil, errors.Wrap(err, "get data clock frame")
|
||||||
}
|
}
|
||||||
|
|
||||||
defer closer.Close()
|
|
||||||
frame := &protobufs.ClockFrame{}
|
frame := &protobufs.ClockFrame{}
|
||||||
|
genesisFramePreIndex := false
|
||||||
|
|
||||||
|
// We do a bit of a cheap trick here while things are still stuck in the old
|
||||||
|
// ways: we use the size of the parent index key to determine if it's the new
|
||||||
|
// format, or the old raw frame
|
||||||
|
if len(value) == (len(filter) + 42) {
|
||||||
|
frameValue, frameCloser, err := p.db.Get(value)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, errors.Wrap(err, "get data clock frame")
|
||||||
|
}
|
||||||
|
if err := proto.Unmarshal(frameValue, frame); err != nil {
|
||||||
|
return nil, nil, errors.Wrap(
|
||||||
|
errors.Wrap(err, ErrInvalidData.Error()),
|
||||||
|
"get data clock frame",
|
||||||
|
)
|
||||||
|
}
|
||||||
|
closer.Close()
|
||||||
|
defer frameCloser.Close()
|
||||||
|
} else {
|
||||||
|
genesisFramePreIndex = frameNumber == 0
|
||||||
if err := proto.Unmarshal(value, frame); err != nil {
|
if err := proto.Unmarshal(value, frame); err != nil {
|
||||||
return nil, nil, errors.Wrap(
|
return nil, nil, errors.Wrap(
|
||||||
errors.Wrap(err, ErrInvalidData.Error()),
|
errors.Wrap(err, ErrInvalidData.Error()),
|
||||||
"get data clock frame",
|
"get data clock frame",
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
defer closer.Close()
|
||||||
|
}
|
||||||
|
|
||||||
if !truncate {
|
if !truncate {
|
||||||
if err = p.fillAggregateProofs(frame); err != nil {
|
if err = p.fillAggregateProofs(frame, genesisFramePreIndex); err != nil {
|
||||||
return nil, nil, errors.Wrap(
|
return nil, nil, errors.Wrap(
|
||||||
errors.Wrap(err, ErrInvalidData.Error()),
|
errors.Wrap(err, ErrInvalidData.Error()),
|
||||||
"get data clock frame",
|
"get data clock frame",
|
||||||
@ -677,8 +602,9 @@ func (p *PebbleClockStore) GetDataClockFrame(
|
|||||||
|
|
||||||
func (p *PebbleClockStore) fillAggregateProofs(
|
func (p *PebbleClockStore) fillAggregateProofs(
|
||||||
frame *protobufs.ClockFrame,
|
frame *protobufs.ClockFrame,
|
||||||
|
genesisFramePreIndex bool,
|
||||||
) error {
|
) error {
|
||||||
if frame.FrameNumber == 0 {
|
if frame.FrameNumber == 0 && genesisFramePreIndex {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -809,72 +735,21 @@ func (p *PebbleClockStore) GetLatestDataClockFrame(
|
|||||||
return frame, nil
|
return frame, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *PebbleClockStore) GetLatestCandidateDataClockFrame(
|
// GetStagedDataClockFrame implements ClockStore.
|
||||||
filter []byte,
|
func (p *PebbleClockStore) GetStagedDataClockFrame(
|
||||||
) (*protobufs.ClockFrame, error) {
|
|
||||||
idxValue, closer, err := p.db.Get(clockDataCandidateLatestIndex(filter))
|
|
||||||
if err != nil {
|
|
||||||
if errors.Is(err, pebble.ErrNotFound) {
|
|
||||||
return nil, ErrNotFound
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil, errors.Wrap(err, "get latest candidate data clock frame")
|
|
||||||
}
|
|
||||||
|
|
||||||
frameNumber := binary.BigEndian.Uint64(idxValue)
|
|
||||||
frames, err := p.GetCandidateDataClockFrames(filter, frameNumber)
|
|
||||||
if err != nil {
|
|
||||||
return nil, errors.Wrap(err, "get latest candidate data clock frame")
|
|
||||||
}
|
|
||||||
|
|
||||||
closer.Close()
|
|
||||||
|
|
||||||
if len(frames) == 0 {
|
|
||||||
return nil, ErrNotFound
|
|
||||||
}
|
|
||||||
|
|
||||||
return frames[0], nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetLeadingCandidateDataClockFrame implements ClockStore.
|
|
||||||
func (p *PebbleClockStore) GetLeadingCandidateDataClockFrame(
|
|
||||||
filter []byte,
|
|
||||||
parent []byte,
|
|
||||||
frameNumber uint64,
|
|
||||||
) (*protobufs.ClockFrame, error) {
|
|
||||||
iter, err := p.RangeCandidateDataClockFrames(filter, parent, frameNumber)
|
|
||||||
if err != nil {
|
|
||||||
return nil, errors.Wrap(err, "get leading candidate data clock frame")
|
|
||||||
}
|
|
||||||
|
|
||||||
if !iter.First() {
|
|
||||||
return nil, ErrNotFound
|
|
||||||
}
|
|
||||||
|
|
||||||
defer iter.Close()
|
|
||||||
frame, err := iter.Value()
|
|
||||||
return frame, errors.Wrap(err, "get leading candidate data clock frame")
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetParentDataClockFrame implements ClockStore.
|
|
||||||
func (p *PebbleClockStore) GetParentDataClockFrame(
|
|
||||||
filter []byte,
|
filter []byte,
|
||||||
frameNumber uint64,
|
frameNumber uint64,
|
||||||
parentSelector []byte,
|
parentSelector []byte,
|
||||||
truncate bool,
|
truncate bool,
|
||||||
) (*protobufs.ClockFrame, error) {
|
) (*protobufs.ClockFrame, error) {
|
||||||
check := false
|
|
||||||
data, closer, err := p.db.Get(
|
data, closer, err := p.db.Get(
|
||||||
clockDataParentIndexKey(filter, frameNumber, parentSelector),
|
clockDataParentIndexKey(filter, frameNumber, parentSelector),
|
||||||
)
|
)
|
||||||
if err != nil && !errors.Is(err, pebble.ErrNotFound) {
|
|
||||||
return nil, errors.Wrap(err, "get parent data clock frame")
|
|
||||||
} else if err != nil && errors.Is(err, pebble.ErrNotFound) {
|
|
||||||
data, closer, err = p.db.Get(clockDataFrameKey(filter, frameNumber))
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
if errors.Is(err, pebble.ErrNotFound) {
|
||||||
return nil, errors.Wrap(ErrNotFound, "get parent data clock frame")
|
return nil, errors.Wrap(ErrNotFound, "get parent data clock frame")
|
||||||
}
|
}
|
||||||
check = true
|
return nil, errors.Wrap(err, "get parent data clock frame")
|
||||||
}
|
}
|
||||||
|
|
||||||
parent := &protobufs.ClockFrame{}
|
parent := &protobufs.ClockFrame{}
|
||||||
@ -882,18 +757,8 @@ func (p *PebbleClockStore) GetParentDataClockFrame(
|
|||||||
return nil, errors.Wrap(err, "get parent data clock frame")
|
return nil, errors.Wrap(err, "get parent data clock frame")
|
||||||
}
|
}
|
||||||
|
|
||||||
if check {
|
|
||||||
selector, err := parent.GetSelector()
|
|
||||||
if err != nil {
|
|
||||||
return nil, errors.Wrap(err, "get parent data clock frame")
|
|
||||||
}
|
|
||||||
if !bytes.Equal(selector.FillBytes(make([]byte, 32)), parentSelector) {
|
|
||||||
return nil, errors.Wrap(ErrNotFound, "get parent data clock frame")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if !truncate {
|
if !truncate {
|
||||||
if err := p.fillAggregateProofs(parent); err != nil {
|
if err := p.fillAggregateProofs(parent, false); err != nil {
|
||||||
return nil, errors.Wrap(
|
return nil, errors.Wrap(
|
||||||
errors.Wrap(err, ErrInvalidData.Error()),
|
errors.Wrap(err, ErrInvalidData.Error()),
|
||||||
"get clock frame iterator value",
|
"get clock frame iterator value",
|
||||||
@ -908,10 +773,8 @@ func (p *PebbleClockStore) GetParentDataClockFrame(
|
|||||||
return parent, nil
|
return parent, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// PutCandidateDataClockFrame implements ClockStore.
|
// StageDataClockFrame implements ClockStore.
|
||||||
func (p *PebbleClockStore) PutCandidateDataClockFrame(
|
func (p *PebbleClockStore) StageDataClockFrame(
|
||||||
parentSelector []byte,
|
|
||||||
distance []byte,
|
|
||||||
selector []byte,
|
selector []byte,
|
||||||
frame *protobufs.ClockFrame,
|
frame *protobufs.ClockFrame,
|
||||||
txn Transaction,
|
txn Transaction,
|
||||||
@ -919,7 +782,7 @@ func (p *PebbleClockStore) PutCandidateDataClockFrame(
|
|||||||
if err := p.saveAggregateProofs(txn, frame); err != nil {
|
if err := p.saveAggregateProofs(txn, frame); err != nil {
|
||||||
return errors.Wrap(
|
return errors.Wrap(
|
||||||
errors.Wrap(err, ErrInvalidData.Error()),
|
errors.Wrap(err, ErrInvalidData.Error()),
|
||||||
"put candidate data clock frame",
|
"stage data clock frame",
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -933,24 +796,12 @@ func (p *PebbleClockStore) PutCandidateDataClockFrame(
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(
|
return errors.Wrap(
|
||||||
errors.Wrap(err, ErrInvalidData.Error()),
|
errors.Wrap(err, ErrInvalidData.Error()),
|
||||||
"put candidate data clock frame",
|
"stage data clock frame",
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
frame.AggregateProofs = temp
|
frame.AggregateProofs = temp
|
||||||
|
|
||||||
if err = txn.Set(
|
|
||||||
clockDataCandidateFrameKey(
|
|
||||||
frame.Filter,
|
|
||||||
frame.FrameNumber,
|
|
||||||
frame.ParentSelector,
|
|
||||||
distance,
|
|
||||||
),
|
|
||||||
data,
|
|
||||||
); err != nil {
|
|
||||||
return errors.Wrap(err, "put candidate data clock frame")
|
|
||||||
}
|
|
||||||
|
|
||||||
if err = txn.Set(
|
if err = txn.Set(
|
||||||
clockDataParentIndexKey(
|
clockDataParentIndexKey(
|
||||||
frame.Filter,
|
frame.Filter,
|
||||||
@ -959,118 +810,54 @@ func (p *PebbleClockStore) PutCandidateDataClockFrame(
|
|||||||
),
|
),
|
||||||
data,
|
data,
|
||||||
); err != nil {
|
); err != nil {
|
||||||
return errors.Wrap(err, "put candidate data clock frame")
|
return errors.Wrap(err, "stage data clock frame")
|
||||||
}
|
|
||||||
|
|
||||||
numberBytes, closer, err := p.db.Get(clockDataCandidateLatestIndex(frame.Filter))
|
|
||||||
if err != nil && !errors.Is(err, pebble.ErrNotFound) {
|
|
||||||
return errors.Wrap(err, "put candidate data clock frame")
|
|
||||||
}
|
|
||||||
|
|
||||||
existingNumber := uint64(0)
|
|
||||||
|
|
||||||
if numberBytes != nil {
|
|
||||||
existingNumber = binary.BigEndian.Uint64(numberBytes)
|
|
||||||
closer.Close()
|
|
||||||
}
|
|
||||||
|
|
||||||
if frame.FrameNumber > existingNumber {
|
|
||||||
frameNumberBytes := make([]byte, 8)
|
|
||||||
binary.BigEndian.PutUint64(frameNumberBytes, frame.FrameNumber)
|
|
||||||
if err = txn.Set(
|
|
||||||
clockDataCandidateLatestIndex(frame.Filter),
|
|
||||||
frameNumberBytes,
|
|
||||||
); err != nil {
|
|
||||||
return errors.Wrap(err, "put candidate data clock frame")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// PutDataClockFrame implements ClockStore.
|
// CommitDataClockFrame implements ClockStore.
|
||||||
func (p *PebbleClockStore) PutDataClockFrame(
|
func (p *PebbleClockStore) CommitDataClockFrame(
|
||||||
frame *protobufs.ClockFrame,
|
filter []byte,
|
||||||
|
frameNumber uint64,
|
||||||
|
selector []byte,
|
||||||
proverTrie *tries.RollingFrecencyCritbitTrie,
|
proverTrie *tries.RollingFrecencyCritbitTrie,
|
||||||
txn Transaction,
|
txn Transaction,
|
||||||
backfill bool,
|
backfill bool,
|
||||||
) error {
|
) error {
|
||||||
if frame.FrameNumber != 0 {
|
|
||||||
if err := p.saveAggregateProofs(txn, frame); err != nil {
|
|
||||||
return errors.Wrap(
|
|
||||||
errors.Wrap(err, ErrInvalidData.Error()),
|
|
||||||
"put candidate data clock frame",
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
temp := append(
|
|
||||||
[]*protobufs.InclusionAggregateProof{},
|
|
||||||
frame.AggregateProofs...,
|
|
||||||
)
|
|
||||||
if frame.FrameNumber != 0 {
|
|
||||||
frame.AggregateProofs = []*protobufs.InclusionAggregateProof{}
|
|
||||||
}
|
|
||||||
data, err := proto.Marshal(frame)
|
|
||||||
if err != nil {
|
|
||||||
return errors.Wrap(
|
|
||||||
errors.Wrap(err, ErrInvalidData.Error()),
|
|
||||||
"put data clock frame",
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
if frame.FrameNumber != 0 {
|
|
||||||
frame.AggregateProofs = temp
|
|
||||||
}
|
|
||||||
frameNumberBytes := make([]byte, 8)
|
frameNumberBytes := make([]byte, 8)
|
||||||
binary.BigEndian.PutUint64(frameNumberBytes, frame.FrameNumber)
|
binary.BigEndian.PutUint64(frameNumberBytes, frameNumber)
|
||||||
|
|
||||||
if err = txn.Set(
|
if err := txn.Set(
|
||||||
clockDataFrameKey(frame.Filter, frame.FrameNumber),
|
clockDataFrameKey(filter, frameNumber),
|
||||||
data,
|
clockDataParentIndexKey(filter, frameNumber, selector),
|
||||||
); err != nil {
|
); err != nil {
|
||||||
return errors.Wrap(err, "put data clock frame")
|
return errors.Wrap(err, "commit data clock frame")
|
||||||
}
|
|
||||||
|
|
||||||
selector, err := frame.GetSelector()
|
|
||||||
if err != nil {
|
|
||||||
return errors.Wrap(err, "put data clock frame")
|
|
||||||
}
|
|
||||||
|
|
||||||
if err = txn.Set(
|
|
||||||
clockDataParentIndexKey(
|
|
||||||
frame.Filter,
|
|
||||||
frame.FrameNumber,
|
|
||||||
selector.FillBytes(make([]byte, 32)),
|
|
||||||
),
|
|
||||||
data,
|
|
||||||
); err != nil {
|
|
||||||
return errors.Wrap(err, "put data clock frame")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
proverData, err := proverTrie.Serialize()
|
proverData, err := proverTrie.Serialize()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "put data clock frame")
|
return errors.Wrap(err, "commit data clock frame")
|
||||||
}
|
}
|
||||||
|
|
||||||
if err = txn.Set(
|
if err = txn.Set(
|
||||||
clockProverTrieKey(frame.Filter, frame.FrameNumber),
|
clockProverTrieKey(filter, frameNumber),
|
||||||
proverData,
|
proverData,
|
||||||
); err != nil {
|
); err != nil {
|
||||||
return errors.Wrap(err, "put data clock frame")
|
return errors.Wrap(err, "commit data clock frame")
|
||||||
}
|
}
|
||||||
|
|
||||||
_, closer, err := p.db.Get(clockDataEarliestIndex(frame.Filter))
|
_, closer, err := p.db.Get(clockDataEarliestIndex(filter))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if !errors.Is(err, pebble.ErrNotFound) {
|
if !errors.Is(err, pebble.ErrNotFound) {
|
||||||
return errors.Wrap(err, "put data clock frame")
|
return errors.Wrap(err, "commit data clock frame")
|
||||||
}
|
}
|
||||||
|
|
||||||
if err = txn.Set(
|
if err = txn.Set(
|
||||||
clockDataEarliestIndex(frame.Filter),
|
clockDataEarliestIndex(filter),
|
||||||
frameNumberBytes,
|
frameNumberBytes,
|
||||||
); err != nil {
|
); err != nil {
|
||||||
return errors.Wrap(err, "put data clock frame")
|
return errors.Wrap(err, "commit data clock frame")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1080,172 +867,16 @@ func (p *PebbleClockStore) PutDataClockFrame(
|
|||||||
|
|
||||||
if !backfill {
|
if !backfill {
|
||||||
if err = txn.Set(
|
if err = txn.Set(
|
||||||
clockDataLatestIndex(frame.Filter),
|
clockDataLatestIndex(filter),
|
||||||
frameNumberBytes,
|
frameNumberBytes,
|
||||||
); err != nil {
|
); err != nil {
|
||||||
return errors.Wrap(err, "put data clock frame")
|
return errors.Wrap(err, "commit data clock frame")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *PebbleClockStore) GetCandidateDataClockFrame(
|
|
||||||
filter []byte,
|
|
||||||
frameNumber uint64,
|
|
||||||
parentSelector []byte,
|
|
||||||
distance []byte,
|
|
||||||
) (*protobufs.ClockFrame, error) {
|
|
||||||
value, closer, err := p.db.Get(clockDataCandidateFrameKey(
|
|
||||||
filter,
|
|
||||||
frameNumber,
|
|
||||||
parentSelector,
|
|
||||||
distance,
|
|
||||||
))
|
|
||||||
if err != nil {
|
|
||||||
if errors.Is(err, pebble.ErrNotFound) {
|
|
||||||
return nil, ErrNotFound
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil, errors.Wrap(err, "get candidate data clock frame")
|
|
||||||
}
|
|
||||||
|
|
||||||
defer closer.Close()
|
|
||||||
frame := &protobufs.ClockFrame{}
|
|
||||||
if err := proto.Unmarshal(value, frame); err != nil {
|
|
||||||
return nil, errors.Wrap(
|
|
||||||
errors.Wrap(err, ErrInvalidData.Error()),
|
|
||||||
"get candidate data clock frame",
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
if err = p.fillAggregateProofs(frame); err != nil {
|
|
||||||
return nil, errors.Wrap(
|
|
||||||
errors.Wrap(err, ErrInvalidData.Error()),
|
|
||||||
"get candidate data clock frame",
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
return frame, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetCandidateDataClockFrames implements ClockStore.
|
|
||||||
// Distance is 32-byte aligned, so we just use a 0x00 * 32 -> 0xff * 32 range
|
|
||||||
func (p *PebbleClockStore) GetCandidateDataClockFrames(
|
|
||||||
filter []byte,
|
|
||||||
frameNumber uint64,
|
|
||||||
) ([]*protobufs.ClockFrame, error) {
|
|
||||||
iter, err := p.db.NewIter(
|
|
||||||
clockDataCandidateFrameKey(
|
|
||||||
filter,
|
|
||||||
frameNumber,
|
|
||||||
[]byte{
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
},
|
|
||||||
[]byte{
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
},
|
|
||||||
),
|
|
||||||
clockDataCandidateFrameKey(
|
|
||||||
filter,
|
|
||||||
frameNumber,
|
|
||||||
[]byte{
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
},
|
|
||||||
[]byte{
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
},
|
|
||||||
),
|
|
||||||
)
|
|
||||||
if err != nil {
|
|
||||||
return nil, errors.Wrap(err, "get candidate data clock frames")
|
|
||||||
}
|
|
||||||
|
|
||||||
frames := []*protobufs.ClockFrame{}
|
|
||||||
i := &PebbleCandidateClockIterator{i: iter, db: p}
|
|
||||||
|
|
||||||
for i.First(); i.Valid(); i.Next() {
|
|
||||||
value, err := i.Value()
|
|
||||||
if err != nil {
|
|
||||||
return nil, errors.Wrap(err, "get candidate data clock frames")
|
|
||||||
}
|
|
||||||
|
|
||||||
frames = append(frames, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := i.Close(); err != nil {
|
|
||||||
return nil, errors.Wrap(err, "get candidate data clock frames")
|
|
||||||
}
|
|
||||||
|
|
||||||
return frames, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// RangeCandidateDataClockFrames implements ClockStore.
|
|
||||||
// Distance is 32-byte aligned, so we just use a 0x00 * 32 -> 0xff * 32 range
|
|
||||||
func (p *PebbleClockStore) RangeCandidateDataClockFrames(
|
|
||||||
filter []byte,
|
|
||||||
parent []byte,
|
|
||||||
frameNumber uint64,
|
|
||||||
) (*PebbleCandidateClockIterator, error) {
|
|
||||||
fromParent := rightAlign(parent, 32)
|
|
||||||
toParent := rightAlign(parent, 32)
|
|
||||||
|
|
||||||
if bytes.Equal(parent, []byte{
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
}) {
|
|
||||||
toParent = []byte{
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
iter, err := p.db.NewIter(
|
|
||||||
clockDataCandidateFrameKey(
|
|
||||||
filter,
|
|
||||||
frameNumber,
|
|
||||||
fromParent,
|
|
||||||
[]byte{
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
},
|
|
||||||
),
|
|
||||||
clockDataCandidateFrameKey(
|
|
||||||
filter,
|
|
||||||
frameNumber,
|
|
||||||
toParent,
|
|
||||||
[]byte{
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
},
|
|
||||||
),
|
|
||||||
)
|
|
||||||
if err != nil {
|
|
||||||
return nil, errors.Wrap(err, "range candidate data clock frames")
|
|
||||||
}
|
|
||||||
|
|
||||||
return &PebbleCandidateClockIterator{i: iter, db: p}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// RangeDataClockFrames implements ClockStore.
|
// RangeDataClockFrames implements ClockStore.
|
||||||
func (p *PebbleClockStore) RangeDataClockFrames(
|
func (p *PebbleClockStore) RangeDataClockFrames(
|
||||||
filter []byte,
|
filter []byte,
|
||||||
@ -1469,6 +1100,33 @@ func (p *PebbleClockStore) GetCompressedDataClockFrames(
|
|||||||
for iter.First(); iter.Valid(); iter.Next() {
|
for iter.First(); iter.Valid(); iter.Next() {
|
||||||
value := iter.Value()
|
value := iter.Value()
|
||||||
frame := &protobufs.ClockFrame{}
|
frame := &protobufs.ClockFrame{}
|
||||||
|
genesisFramePreIndex := false
|
||||||
|
|
||||||
|
// We do a bit of a cheap trick here while things are still stuck in the old
|
||||||
|
// ways: we use the size of the parent index key to determine if it's the new
|
||||||
|
// format, or the old raw frame
|
||||||
|
if len(value) == (len(filter) + 42) {
|
||||||
|
frameValue, frameCloser, err := p.db.Get(value)
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.Wrap(err, "get compressed data clock frames")
|
||||||
|
}
|
||||||
|
if err := proto.Unmarshal(frameValue, frame); err != nil {
|
||||||
|
return nil, errors.Wrap(
|
||||||
|
errors.Wrap(err, ErrInvalidData.Error()),
|
||||||
|
"get compressed data clock frames",
|
||||||
|
)
|
||||||
|
}
|
||||||
|
frameCloser.Close()
|
||||||
|
} else {
|
||||||
|
if err := proto.Unmarshal(value, frame); err != nil {
|
||||||
|
return nil, errors.Wrap(
|
||||||
|
errors.Wrap(err, ErrInvalidData.Error()),
|
||||||
|
"get compressed data clock frames",
|
||||||
|
)
|
||||||
|
}
|
||||||
|
genesisFramePreIndex = frame.FrameNumber == 0
|
||||||
|
}
|
||||||
|
|
||||||
if err := proto.Unmarshal(value, frame); err != nil {
|
if err := proto.Unmarshal(value, frame); err != nil {
|
||||||
return nil, errors.Wrap(err, "get compressed data clock frames")
|
return nil, errors.Wrap(err, "get compressed data clock frames")
|
||||||
}
|
}
|
||||||
@ -1477,7 +1135,7 @@ func (p *PebbleClockStore) GetCompressedDataClockFrames(
|
|||||||
syncMessage.TruncatedClockFrames,
|
syncMessage.TruncatedClockFrames,
|
||||||
frame,
|
frame,
|
||||||
)
|
)
|
||||||
if frame.FrameNumber == 0 {
|
if frame.FrameNumber == 0 && genesisFramePreIndex {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
for i := 0; i < len(frame.Input[516:])/74; i++ {
|
for i := 0; i < len(frame.Input[516:])/74; i++ {
|
||||||
@ -1620,48 +1278,6 @@ func (p *PebbleClockStore) SetLatestDataClockFrameNumber(
|
|||||||
return errors.Wrap(err, "set latest data clock frame number")
|
return errors.Wrap(err, "set latest data clock frame number")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *PebbleClockStore) DeleteCandidateDataClockFrameRange(
|
|
||||||
filter []byte,
|
|
||||||
fromFrameNumber uint64,
|
|
||||||
toFrameNumber uint64,
|
|
||||||
) error {
|
|
||||||
err := p.db.DeleteRange(
|
|
||||||
clockDataCandidateFrameKey(
|
|
||||||
filter,
|
|
||||||
fromFrameNumber,
|
|
||||||
[]byte{
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
},
|
|
||||||
[]byte{
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
},
|
|
||||||
),
|
|
||||||
clockDataCandidateFrameKey(
|
|
||||||
filter,
|
|
||||||
toFrameNumber,
|
|
||||||
[]byte{
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
},
|
|
||||||
[]byte{
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
},
|
|
||||||
),
|
|
||||||
)
|
|
||||||
return errors.Wrap(err, "delete candidate data clock frame range")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *PebbleClockStore) DeleteDataClockFrameRange(
|
func (p *PebbleClockStore) DeleteDataClockFrameRange(
|
||||||
filter []byte,
|
filter []byte,
|
||||||
fromFrameNumber uint64,
|
fromFrameNumber uint64,
|
||||||
@ -1680,16 +1296,6 @@ func (p *PebbleClockStore) DeleteDataClockFrameRange(
|
|||||||
return errors.Wrap(err, "delete data clock frame range")
|
return errors.Wrap(err, "delete data clock frame range")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *PebbleClockStore) GetHighestCandidateDataClockFrame(
|
|
||||||
filter []byte,
|
|
||||||
) (*protobufs.ClockFrame, error) {
|
|
||||||
frame, err := p.GetLatestCandidateDataClockFrame(filter)
|
|
||||||
if err != nil {
|
|
||||||
return nil, errors.Wrap(err, "get highest candidate data clock frame")
|
|
||||||
}
|
|
||||||
|
|
||||||
return frame, nil
|
|
||||||
}
|
|
||||||
func (p *PebbleClockStore) ResetMasterClockFrames(filter []byte) error {
|
func (p *PebbleClockStore) ResetMasterClockFrames(filter []byte) error {
|
||||||
if err := p.db.DeleteRange(
|
if err := p.db.DeleteRange(
|
||||||
clockMasterFrameKey(filter, 0),
|
clockMasterFrameKey(filter, 0),
|
||||||
@ -1741,7 +1347,60 @@ func (p *PebbleClockStore) Compact(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If this node has been around since the early days, this is going to free
|
||||||
|
// up a lot of cruft.
|
||||||
|
if err := p.db.DeleteRange(
|
||||||
|
clockDataCandidateFrameKey(
|
||||||
|
make([]byte, 32),
|
||||||
|
0,
|
||||||
|
make([]byte, 32),
|
||||||
|
make([]byte, 32),
|
||||||
|
),
|
||||||
|
clockDataCandidateFrameKey(
|
||||||
|
bytes.Repeat([]byte{0xff}, 32),
|
||||||
|
1000000,
|
||||||
|
bytes.Repeat([]byte{0xff}, 32),
|
||||||
|
bytes.Repeat([]byte{0xff}, 32),
|
||||||
|
),
|
||||||
|
); err != nil {
|
||||||
|
return errors.Wrap(err, "compact")
|
||||||
|
}
|
||||||
|
if err := p.db.Compact(
|
||||||
|
clockDataCandidateFrameKey(
|
||||||
|
make([]byte, 32),
|
||||||
|
0,
|
||||||
|
make([]byte, 32),
|
||||||
|
make([]byte, 32),
|
||||||
|
),
|
||||||
|
clockDataCandidateFrameKey(
|
||||||
|
bytes.Repeat([]byte{0xff}, 32),
|
||||||
|
1000000,
|
||||||
|
bytes.Repeat([]byte{0xff}, 32),
|
||||||
|
bytes.Repeat([]byte{0xff}, 32),
|
||||||
|
),
|
||||||
|
true,
|
||||||
|
); err != nil {
|
||||||
|
return errors.Wrap(err, "compact")
|
||||||
|
}
|
||||||
|
|
||||||
if dataFilter != nil {
|
if dataFilter != nil {
|
||||||
|
if err := p.db.DeleteRange(
|
||||||
|
clockDataCandidateFrameKey(
|
||||||
|
dataFilter,
|
||||||
|
0,
|
||||||
|
make([]byte, 32),
|
||||||
|
make([]byte, 32),
|
||||||
|
),
|
||||||
|
clockDataCandidateFrameKey(
|
||||||
|
dataFilter,
|
||||||
|
1000000,
|
||||||
|
bytes.Repeat([]byte{0xff}, 32),
|
||||||
|
bytes.Repeat([]byte{0xff}, 32),
|
||||||
|
),
|
||||||
|
); err != nil {
|
||||||
|
return errors.Wrap(err, "compact")
|
||||||
|
}
|
||||||
|
|
||||||
if err := p.db.Compact(
|
if err := p.db.Compact(
|
||||||
clockDataFrameKey(dataFilter, 0),
|
clockDataFrameKey(dataFilter, 0),
|
||||||
clockDataFrameKey(dataFilter, 1000000),
|
clockDataFrameKey(dataFilter, 1000000),
|
||||||
@ -1767,6 +1426,22 @@ func (p *PebbleClockStore) Compact(
|
|||||||
); err != nil {
|
); err != nil {
|
||||||
return errors.Wrap(err, "compact")
|
return errors.Wrap(err, "compact")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if err := p.db.Compact(
|
||||||
|
clockDataParentIndexKey(
|
||||||
|
dataFilter,
|
||||||
|
0,
|
||||||
|
make([]byte, 32),
|
||||||
|
),
|
||||||
|
clockDataParentIndexKey(
|
||||||
|
dataFilter,
|
||||||
|
1000000,
|
||||||
|
bytes.Repeat([]byte{0xff}, 32),
|
||||||
|
),
|
||||||
|
true,
|
||||||
|
); err != nil {
|
||||||
|
return errors.Wrap(err, "compact")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
Loading…
Reference in New Issue
Block a user