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

     1  package messages
     2  
     3  import (
     4  	"github.com/onflow/flow-go/model/cluster"
     5  	"github.com/onflow/flow-go/model/flow"
     6  )
     7  
     8  // SubmitCollectionGuarantee is a request to submit the given collection
     9  // guarantee to consensus nodes. Only valid as a node-local message.
    10  type SubmitCollectionGuarantee struct {
    11  	Guarantee flow.CollectionGuarantee
    12  }
    13  
    14  // CollectionRequest request all transactions from a collection with the given
    15  // fingerprint.
    16  type CollectionRequest struct {
    17  	ID    flow.Identifier
    18  	Nonce uint64 // so that we aren't deduplicated by the network layer
    19  }
    20  
    21  // CollectionResponse is a response to a request for a collection.
    22  type CollectionResponse struct {
    23  	Collection flow.Collection
    24  	Nonce      uint64 // so that we aren't deduplicated by the network layer
    25  }
    26  
    27  // UntrustedClusterBlockPayload is a duplicate of cluster.Payload used within
    28  // untrusted messages. It exists only to provide a memory-safe structure for
    29  // decoding messages and should be replaced in the future by updating the core
    30  // cluster.Payload type.
    31  // Deprecated: Please update cluster.Payload.Collection to use []flow.TransactionBody,
    32  // then replace instances of this type with cluster.Payload
    33  type UntrustedClusterBlockPayload struct {
    34  	Collection       []flow.TransactionBody
    35  	ReferenceBlockID flow.Identifier
    36  }
    37  
    38  // UntrustedClusterBlock is a duplicate of cluster.Block used within
    39  // untrusted messages. It exists only to provide a memory-safe structure for
    40  // decoding messages and should be replaced in the future by updating the core
    41  // cluster.Block type.
    42  // Deprecated: Please update cluster.Payload.Collection to use []flow.TransactionBody,
    43  // then replace instances of this type with cluster.Block
    44  type UntrustedClusterBlock struct {
    45  	Header  flow.Header
    46  	Payload UntrustedClusterBlockPayload
    47  }
    48  
    49  // ToInternal returns the internal representation of the type.
    50  func (ub *UntrustedClusterBlock) ToInternal() *cluster.Block {
    51  	block := &cluster.Block{
    52  		Header: &ub.Header,
    53  		Payload: &cluster.Payload{
    54  			ReferenceBlockID: ub.Payload.ReferenceBlockID,
    55  		},
    56  	}
    57  	for _, tx := range ub.Payload.Collection {
    58  		tx := tx
    59  		block.Payload.Collection.Transactions = append(block.Payload.Collection.Transactions, &tx)
    60  	}
    61  	return block
    62  }
    63  
    64  // UntrustedClusterBlockFromInternal converts the internal cluster.Block representation
    65  // to the representation used in untrusted messages.
    66  func UntrustedClusterBlockFromInternal(clusterBlock *cluster.Block) UntrustedClusterBlock {
    67  	block := UntrustedClusterBlock{
    68  		Header: *clusterBlock.Header,
    69  		Payload: UntrustedClusterBlockPayload{
    70  			ReferenceBlockID: clusterBlock.Payload.ReferenceBlockID,
    71  			Collection:       make([]flow.TransactionBody, 0, clusterBlock.Payload.Collection.Len()),
    72  		},
    73  	}
    74  	for _, tx := range clusterBlock.Payload.Collection.Transactions {
    75  		block.Payload.Collection = append(block.Payload.Collection, *tx)
    76  	}
    77  	return block
    78  }
    79  
    80  // ClusterBlockProposal is a proposal for a block in collection node cluster
    81  // consensus. The header contains information about consensus state and the
    82  // payload contains the proposed collection (may be empty).
    83  type ClusterBlockProposal struct {
    84  	Block UntrustedClusterBlock
    85  }
    86  
    87  func NewClusterBlockProposal(internal *cluster.Block) *ClusterBlockProposal {
    88  	return &ClusterBlockProposal{
    89  		Block: UntrustedClusterBlockFromInternal(internal),
    90  	}
    91  }
    92  
    93  // ClusterBlockVote is a vote for a proposed block in collection node cluster
    94  // consensus; effectively a vote for a particular collection.
    95  type ClusterBlockVote BlockVote
    96  
    97  // ClusterTimeoutObject is part of the collection cluster protocol and represents a collection node
    98  // timing out in given round. Contains a sequential number for deduplication purposes.
    99  type ClusterTimeoutObject TimeoutObject