github.com/onflow/flow-go@v0.35.7-crescendo-preview.23-atree-inlining/model/chunks/chunkassignment.go (about)

     1  package chunks
     2  
     3  import (
     4  	"github.com/onflow/flow-go/model/flow"
     5  )
     6  
     7  // Assignment is assignment map of the chunks to the list of the verifier nodes
     8  type Assignment struct {
     9  	// TODO: use a slice here instead of a map, which will be more performant
    10  	verifiersForChunk map[uint64]map[flow.Identifier]struct{}
    11  }
    12  
    13  func NewAssignment() *Assignment {
    14  	return &Assignment{
    15  		verifiersForChunk: make(map[uint64]map[flow.Identifier]struct{}),
    16  	}
    17  }
    18  
    19  // Verifiers returns the list of verifier nodes assigned to a chunk
    20  func (a *Assignment) Verifiers(chunk *flow.Chunk) flow.IdentifierList {
    21  	v := make([]flow.Identifier, 0)
    22  	for id := range a.verifiersForChunk[chunk.Index] {
    23  		v = append(v, id)
    24  	}
    25  	return v
    26  }
    27  
    28  // HasVerifier checks if a chunk is assigned to the given verifier
    29  // TODO: method should probably error if chunk has unknown index
    30  func (a *Assignment) HasVerifier(chunk *flow.Chunk, identifier flow.Identifier) bool {
    31  	assignedVerifiers, found := a.verifiersForChunk[chunk.Index]
    32  	if !found {
    33  		// is verifier assigned to this chunk?
    34  		// No, because we only assign verifiers to existing chunks
    35  		return false
    36  	}
    37  	_, isAssigned := assignedVerifiers[identifier]
    38  	return isAssigned
    39  }
    40  
    41  // Add records the list of verifier nodes as the assigned verifiers of the chunk
    42  // it returns an error if the list of verifiers is empty or contains duplicate ids
    43  func (a *Assignment) Add(chunk *flow.Chunk, verifiers flow.IdentifierList) {
    44  	// sorts verifiers list based on their identifier
    45  	v := make(map[flow.Identifier]struct{})
    46  	for _, id := range verifiers {
    47  		v[id] = struct{}{}
    48  	}
    49  	a.verifiersForChunk[chunk.Index] = v
    50  }
    51  
    52  // ByNodeID returns the indices of all chunks assigned to the given verifierID
    53  func (a *Assignment) ByNodeID(verifierID flow.Identifier) []uint64 {
    54  	var chunks []uint64
    55  
    56  	// iterates over pairs of (chunk index, assigned verifiers)
    57  	for chunkIdx, assignedVerifiers := range a.verifiersForChunk {
    58  		_, isAssigned := assignedVerifiers[verifierID]
    59  		if isAssigned {
    60  			chunks = append(chunks, chunkIdx)
    61  		}
    62  	}
    63  	return chunks
    64  }
    65  
    66  // Len returns the number of chunks in the assignment
    67  func (a *Assignment) Len() int {
    68  	return len(a.verifiersForChunk)
    69  }
    70  
    71  // AssignmentDataPack
    72  //
    73  // AssignmentDataPack provides a storable representation of chunk assignments on
    74  // mempool
    75  type AssignmentDataPack struct {
    76  	assignment  *Assignment
    77  	fingerprint flow.Identifier
    78  }
    79  
    80  // NewAssignmentDataPack casts an assignment and its fingerprint into an assignment data pack
    81  func NewAssignmentDataPack(fingerprint flow.Identifier, assignment *Assignment) *AssignmentDataPack {
    82  	return &AssignmentDataPack{
    83  		assignment:  assignment,
    84  		fingerprint: fingerprint,
    85  	}
    86  }
    87  
    88  // ID returns the unique identifier for assignment data pack
    89  func (a *AssignmentDataPack) ID() flow.Identifier {
    90  	return a.fingerprint
    91  }
    92  
    93  // Checksum returns the checksum of the assignment data pack
    94  func (a *AssignmentDataPack) Checksum() flow.Identifier {
    95  	return flow.MakeID(a)
    96  }
    97  
    98  // Assignment returns the assignment part of the assignment data pack
    99  func (a *AssignmentDataPack) Assignment() *Assignment {
   100  	return a.assignment
   101  }