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 }