diff --git a/bitswap/interface.go b/bitswap/interface.go
new file mode 100644
index 0000000000000000000000000000000000000000..0fcff88d660f861e6ad758c924d3a0cd184045df
--- /dev/null
+++ b/bitswap/interface.go
@@ -0,0 +1,23 @@
+package bitswap
+
+import (
+	"time"
+
+	blocks "github.com/jbenet/go-ipfs/blocks"
+	u "github.com/jbenet/go-ipfs/util"
+)
+
+type Exchange interface {
+
+	// Block returns the block associated with a given key.
+	// TODO(brian): pass a context instead of a timeout
+	// TODO(brian): rename -> Block
+	GetBlock(k u.Key, timeout time.Duration) (*blocks.Block, error)
+
+	// HasBlock asserts the existence of this block
+	// TODO(brian): rename -> HasBlock
+	// TODO(brian): accept a value, not a pointer
+	// TODO(brian): remove error return value. Should callers be concerned with
+	// whether the block was made available on the network?
+	HaveBlock(*blocks.Block) error
+}