Skip to content
Snippets Groups Projects
Commit bf3bdadb authored by Hans Moog's avatar Hans Moog
Browse files

Feat: added a method to generate AggregatedBranchIDs

parent 768c4582
No related branches found
No related tags found
No related merge requests found
......@@ -354,6 +354,28 @@ func (branchManager *BranchManager) SetBranchFinalized(branchID BranchID) (modif
return branchManager.setBranchFinalized(branchManager.Branch(branchID))
}
// GenerateAggregatedBranchID generates an aggregated BranchID from the handed in BranchIDs.
func (branchManager *BranchManager) GenerateAggregatedBranchID(branchIDs ...BranchID) BranchID {
sort.Slice(branchIDs, func(i, j int) bool {
for k := 0; k < len(branchIDs[k]); k++ {
if branchIDs[i][k] < branchIDs[j][k] {
return true
} else if branchIDs[i][k] > branchIDs[j][k] {
return false
}
}
return false
})
marshalUtil := marshalutil.New(BranchIDLength * len(branchIDs))
for _, branchID := range branchIDs {
marshalUtil.WriteBytes(branchID.Bytes())
}
return blake2b.Sum256(marshalUtil.Bytes())
}
func (branchManager *BranchManager) setBranchFinalized(cachedBranch *CachedBranch) (modified bool, err error) {
defer cachedBranch.Release()
branch := cachedBranch.Unwrap()
......@@ -837,24 +859,7 @@ func (branchManager *BranchManager) generateAggregatedBranchID(aggregatedBranche
cachedBranch.Release()
}
sort.Slice(branchIDs, func(i, j int) bool {
for k := 0; k < len(branchIDs[k]); k++ {
if branchIDs[i][k] < branchIDs[j][k] {
return true
} else if branchIDs[i][k] > branchIDs[j][k] {
return false
}
}
return false
})
marshalUtil := marshalutil.New(BranchIDLength * len(branchIDs))
for _, branchID := range branchIDs {
marshalUtil.WriteBytes(branchID.Bytes())
}
return blake2b.Sum256(marshalUtil.Bytes())
return branchManager.GenerateAggregatedBranchID(branchIDs...)
}
func (branchManager *BranchManager) collectClosestConflictAncestors(branch *Branch, closestConflictAncestors CachedBranches) (err error) {
......
......@@ -916,19 +916,55 @@ func (tangle *Tangle) deleteTransactionFutureCone(transactionID transaction.ID)
// process attachments
tangle.Attachments(currentTransactionID).Consume(func(attachment *Attachment) {
// mark attachment as deleted
attachment.Delete()
// remove payload future cone
tangle.deletePayloadFutureCone(attachment.PayloadID())
})
}
}
func (tangle *Tangle) deleteTransaction(transactionID transaction.ID) (consumers []transaction.ID, attachments []payload.ID) {
// TODO: IMPLEMENT METHOD
return
}
// deletePayloadFutureCone removes a payload and its whole future cone from the database (including all of the reference
// models).
func (tangle *Tangle) deletePayloadFutureCone(payloadID payload.ID) {
// TODO: FINISH IMPLEMENTATION
// initialize stack with current transaction
deleteStack := list.New()
deleteStack.PushBack(payloadID)
// iterate through stack
for deleteStack.Len() >= 1 {
// pop first element from stack
currentTransactionIDEntry := deleteStack.Front()
deleteStack.Remove(currentTransactionIDEntry)
currentPayloadID := currentTransactionIDEntry.Value.(payload.ID)
// process payload
tangle.Payload(currentPayloadID).Consume(func(currentPayload *payload.Payload) {
// delete payload
currentPayload.Delete()
// delete approvers
tangle.approverStorage.Delete(marshalutil.New(2 * payload.IDLength).WriteBytes(currentPayload.BranchID().Bytes()).WriteBytes(currentPayloadID.Bytes()).Bytes())
if currentPayload.TrunkID() != currentPayload.BranchID() {
tangle.approverStorage.Delete(marshalutil.New(2 * payload.IDLength).WriteBytes(currentPayload.TrunkID().Bytes()).WriteBytes(currentPayloadID.Bytes()).Bytes())
}
// delete attachment
tangle.attachmentStorage.Delete(marshalutil.New(transaction.IDLength + payload.IDLength).WriteBytes(currentPayload.Transaction().ID().Bytes()).WriteBytes(currentPayloadID.Bytes()).Bytes())
})
// delete payload metadata
tangle.payloadMetadataStorage.Delete(currentPayloadID.Bytes())
// queue approvers
tangle.Approvers(currentPayloadID).Consume(func(approver *PayloadApprover) {
deleteStack.PushBack(approver.ApprovingPayloadID())
})
}
}
// processSolidificationStackEntry processes a single entry of the solidification stack and schedules its approvers and
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment