// HaveBlock announces the existance of a block to BitSwap, potentially sending // it to peers (Partners) whose WantLists include it. func (bs *BitSwap) HaveBlock(blk *blocks.Block) error { go func() { for _, ledger := range bs.partners { if ledger.WantListContains(blk.Key()) { //send block to node if ledger.ShouldSend() { bs.SendBlock(ledger.Partner, blk) } } } }() return bs.routing.Provide(blk.Key()) }
// AddBlock adds a particular block to the service, Putting it into the datastore. func (s *BlockService) AddBlock(b *blocks.Block) (u.Key, error) { k := b.Key() dsk := ds.NewKey(string(k)) u.DOut("storing [%s] in datastore\n", k.Pretty()) err := s.Datastore.Put(dsk, b.Data) if err != nil { return k, err } if s.Remote != nil { err = s.Remote.HaveBlock(b) } return k, err }
func (bs *BitSwap) blockReceive(p *peer.Peer, blk *blocks.Block) { u.DOut("blockReceive: %s\n", blk.Key().Pretty()) err := bs.datastore.Put(ds.NewKey(string(blk.Key())), blk.Data) if err != nil { u.PErr("blockReceive error: %v\n", err) return } mes := &swarm.Message{ Peer: p, Data: blk.Data, } bs.listener.Respond(string(blk.Key()), mes) ledger := bs.getLedger(p) ledger.ReceivedBytes(len(blk.Data)) }