github.com/celestiaorg/celestia-node@v0.15.0-beta.1/nodebuilder/share/share.go (about)

     1  package share
     2  
     3  import (
     4  	"context"
     5  
     6  	"github.com/celestiaorg/rsmt2d"
     7  
     8  	"github.com/celestiaorg/celestia-node/header"
     9  	"github.com/celestiaorg/celestia-node/share"
    10  )
    11  
    12  var _ Module = (*API)(nil)
    13  
    14  // Module provides access to any data square or block share on the network.
    15  //
    16  // All Get methods provided on Module follow the following flow:
    17  //  1. Check local storage for the requested Share.
    18  //  2. If exists
    19  //     * Load from disk
    20  //     * Return
    21  //  3. If not
    22  //     * Find provider on the network
    23  //     * Fetch the Share from the provider
    24  //     * Store the Share
    25  //     * Return
    26  //
    27  // Any method signature changed here needs to also be changed in the API struct.
    28  //
    29  //go:generate mockgen -destination=mocks/api.go -package=mocks . Module
    30  type Module interface {
    31  	// SharesAvailable subjectively validates if Shares committed to the given
    32  	// ExtendedHeader are available on the Network.
    33  	SharesAvailable(context.Context, *header.ExtendedHeader) error
    34  	// GetShare gets a Share by coordinates in EDS.
    35  	GetShare(ctx context.Context, header *header.ExtendedHeader, row, col int) (share.Share, error)
    36  	// GetEDS gets the full EDS identified by the given extended header.
    37  	GetEDS(ctx context.Context, header *header.ExtendedHeader) (*rsmt2d.ExtendedDataSquare, error)
    38  	// GetSharesByNamespace gets all shares from an EDS within the given namespace.
    39  	// Shares are returned in a row-by-row order if the namespace spans multiple rows.
    40  	GetSharesByNamespace(
    41  		ctx context.Context, header *header.ExtendedHeader, namespace share.Namespace,
    42  	) (share.NamespacedShares, error)
    43  }
    44  
    45  // API is a wrapper around Module for the RPC.
    46  // TODO(@distractedm1nd): These structs need to be autogenerated.
    47  type API struct {
    48  	Internal struct {
    49  		SharesAvailable func(context.Context, *header.ExtendedHeader) error `perm:"read"`
    50  		GetShare        func(
    51  			ctx context.Context,
    52  			header *header.ExtendedHeader,
    53  			row, col int,
    54  		) (share.Share, error) `perm:"read"`
    55  		GetEDS func(
    56  			ctx context.Context,
    57  			header *header.ExtendedHeader,
    58  		) (*rsmt2d.ExtendedDataSquare, error) `perm:"read"`
    59  		GetSharesByNamespace func(
    60  			ctx context.Context,
    61  			header *header.ExtendedHeader,
    62  			namespace share.Namespace,
    63  		) (share.NamespacedShares, error) `perm:"read"`
    64  	}
    65  }
    66  
    67  func (api *API) SharesAvailable(ctx context.Context, header *header.ExtendedHeader) error {
    68  	return api.Internal.SharesAvailable(ctx, header)
    69  }
    70  
    71  func (api *API) GetShare(ctx context.Context, header *header.ExtendedHeader, row, col int) (share.Share, error) {
    72  	return api.Internal.GetShare(ctx, header, row, col)
    73  }
    74  
    75  func (api *API) GetEDS(ctx context.Context, header *header.ExtendedHeader) (*rsmt2d.ExtendedDataSquare, error) {
    76  	return api.Internal.GetEDS(ctx, header)
    77  }
    78  
    79  func (api *API) GetSharesByNamespace(
    80  	ctx context.Context,
    81  	header *header.ExtendedHeader,
    82  	namespace share.Namespace,
    83  ) (share.NamespacedShares, error) {
    84  	return api.Internal.GetSharesByNamespace(ctx, header, namespace)
    85  }
    86  
    87  type module struct {
    88  	share.Getter
    89  	share.Availability
    90  }
    91  
    92  func (m module) SharesAvailable(ctx context.Context, header *header.ExtendedHeader) error {
    93  	return m.Availability.SharesAvailable(ctx, header)
    94  }