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

     1  package share
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  
     7  	"github.com/filecoin-project/dagstore"
     8  	"github.com/ipfs/boxo/blockservice"
     9  	"github.com/libp2p/go-libp2p/core/host"
    10  	"github.com/libp2p/go-libp2p/core/routing"
    11  	routingdisc "github.com/libp2p/go-libp2p/p2p/discovery/routing"
    12  
    13  	"github.com/celestiaorg/celestia-app/pkg/da"
    14  
    15  	"github.com/celestiaorg/celestia-node/share"
    16  	"github.com/celestiaorg/celestia-node/share/eds"
    17  	"github.com/celestiaorg/celestia-node/share/getters"
    18  	"github.com/celestiaorg/celestia-node/share/ipld"
    19  	disc "github.com/celestiaorg/celestia-node/share/p2p/discovery"
    20  	"github.com/celestiaorg/celestia-node/share/p2p/peers"
    21  )
    22  
    23  const (
    24  	// fullNodesTag is the tag used to identify full nodes in the discovery service.
    25  	fullNodesTag = "full"
    26  )
    27  
    28  func newDiscovery(cfg *disc.Parameters,
    29  ) func(routing.ContentRouting, host.Host, *peers.Manager) (*disc.Discovery, error) {
    30  	return func(
    31  		r routing.ContentRouting,
    32  		h host.Host,
    33  		manager *peers.Manager,
    34  	) (*disc.Discovery, error) {
    35  		return disc.NewDiscovery(
    36  			cfg,
    37  			h,
    38  			routingdisc.NewRoutingDiscovery(r),
    39  			fullNodesTag,
    40  			disc.WithOnPeersUpdate(manager.UpdateFullNodePool),
    41  		)
    42  	}
    43  }
    44  
    45  func newShareModule(getter share.Getter, avail share.Availability) Module {
    46  	return &module{getter, avail}
    47  }
    48  
    49  // ensureEmptyCARExists adds an empty EDS to the provided EDS store.
    50  func ensureEmptyCARExists(ctx context.Context, store *eds.Store) error {
    51  	emptyEDS := share.EmptyExtendedDataSquare()
    52  	emptyDAH, err := da.NewDataAvailabilityHeader(emptyEDS)
    53  	if err != nil {
    54  		return err
    55  	}
    56  
    57  	err = store.Put(ctx, emptyDAH.Hash(), emptyEDS)
    58  	if errors.Is(err, dagstore.ErrShardExists) {
    59  		return nil
    60  	}
    61  	return err
    62  }
    63  
    64  // ensureEmptyEDSInBS checks if the given DAG contains an empty block data square.
    65  // If it does not, it stores an empty block. This optimization exists to prevent
    66  // redundant storing of empty block data so that it is only stored once and returned
    67  // upon request for a block with an empty data square.
    68  func ensureEmptyEDSInBS(ctx context.Context, bServ blockservice.BlockService) error {
    69  	_, err := ipld.AddShares(ctx, share.EmptyBlockShares(), bServ)
    70  	return err
    71  }
    72  
    73  func lightGetter(
    74  	shrexGetter *getters.ShrexGetter,
    75  	ipldGetter *getters.IPLDGetter,
    76  	cfg Config,
    77  ) share.Getter {
    78  	var cascade []share.Getter
    79  	if cfg.UseShareExchange {
    80  		cascade = append(cascade, shrexGetter)
    81  	}
    82  	cascade = append(cascade, ipldGetter)
    83  	return getters.NewCascadeGetter(cascade)
    84  }
    85  
    86  // ShrexGetter is added to bridge nodes for the case that a shard is removed
    87  // after detected shard corruption. This ensures the block is fetched and stored
    88  // by shrex the next time the data is retrieved (meaning shard recovery is
    89  // manual after corruption is detected).
    90  func bridgeGetter(
    91  	storeGetter *getters.StoreGetter,
    92  	shrexGetter *getters.ShrexGetter,
    93  	cfg Config,
    94  ) share.Getter {
    95  	var cascade []share.Getter
    96  	cascade = append(cascade, storeGetter)
    97  	if cfg.UseShareExchange {
    98  		cascade = append(cascade, shrexGetter)
    99  	}
   100  	return getters.NewCascadeGetter(cascade)
   101  }
   102  
   103  func fullGetter(
   104  	storeGetter *getters.StoreGetter,
   105  	shrexGetter *getters.ShrexGetter,
   106  	ipldGetter *getters.IPLDGetter,
   107  	cfg Config,
   108  ) share.Getter {
   109  	var cascade []share.Getter
   110  	cascade = append(cascade, storeGetter)
   111  	if cfg.UseShareExchange {
   112  		cascade = append(cascade, shrexGetter)
   113  	}
   114  	cascade = append(cascade, ipldGetter)
   115  	return getters.NewCascadeGetter(cascade)
   116  }