add readme for bitswap
Jeromy committed
Dec 3, 2014 at 19:46 UTC
655216374098dec7781899d3e0dbc9cba8035a1d
2 files changed
+25
-1
exchange/bitswap/README.md
new
+24
@@ -0,0 +1,24 @@
1
+#Welcome to Bitswap
2
+
3
+Bitswap is the module that is responsible for requesting blocks over the
4
+network from other ipfs peers.
5
+
6
+##Main Operations
7
+Bitswap has three main operations:
8
+
9
+###GetBlocks
10
+`GetBlocks` is a bitswap method used to request multiple blocks that are likely to all be provided by the same peer (part of a single file, for example).
11
+
12
+###GetBlock
13
+`GetBlock` is a special case of `GetBlocks` that just requests a single block.
14
+
15
+###HasBlock
16
+`HasBlock` registers a local block with bitswap. Bitswap will then send that block to any connected peers who want it (strategy allowing), and announce to the DHT that the block is being provided.
17
+
18
+##Internal Details
19
+All `GetBlock` requests are relayed into a single for-select loop via channels. Calls to `GetBlocks` will have `FindProviders` called for only the first key in the set initially, This is an optimization attempting to cut down on the number of RPCs required. After a timeout (specified by the strategies `GetRebroadcastDelay`) Bitswap will iterate through all keys still in the local wantlist, perform a find providers call for each, and sent the wantlist out to those providers. This is the fallback behaviour for cases where our initial assumption about one peer potentially having multiple blocks in a set does not hold true.
20
+
21
+When receiving messages, Bitswaps `ReceiveMessage` method is called. A bitswap message may contain the wantlist of the peer who sent the message, and an array of blocks that were on our local wantlist. Any blocks we receive in a bitswap message will be passed to `HasBlock`, and the other peers wantlist gets updated in the strategy by `bs.strategy.MessageReceived`.
22
+
23
+##Outstanding TODOs:
24
+- Ensure only one request active per key
routing/dht/routing.go
+1
-1
@@ -126,7 +126,7 @@ func (dht *IpfsDHT) Provide(ctx context.Context, key u.Key) error {
126
}
127
128
func (dht *IpfsDHT) FindProvidersAsync(ctx context.Context, key u.Key, count int) <-chan peer.Peer {
129
- log.Debugf("Find Providers: %s", key)
129
+ log.Event(ctx, "findProviders", key)
130
peerOut := make(chan peer.Peer, count)
131
go func() {
132
ps := newPeerSet()