Documentation ¶
Overview ¶
blockstore contains all the basic blockstore constructors used by lotus. Any blockstore not ultimately constructed out of the building blocks in this package may not work properly.
- This package correctly wraps blockstores with the IdBlockstore. This blockstore:
- Filters out all puts for blocks with CIDs using the "identity" hash function.
- Extracts inlined blocks from CIDs using the identity hash function and returns them on get/has, ignoring the contents of the blockstore.
- In the future, this package may enforce additional restrictions on block sizes, CID validity, etc.
To make auditing for misuse of blockstores tractable, this package re-exports parts of the go-ipfs-blockstore package such that no other package needs to import it directly.
Index ¶
- Constants
- Variables
- func CopyBlockstore(ctx context.Context, from, to Blockstore) error
- func CopyParticial(ctx context.Context, from, to Blockstore, root cid.Cid) error
- type AutobatchBlockstore
- func (bs *AutobatchBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error)
- func (bs *AutobatchBlockstore) DeleteBlock(context.Context, cid.Cid) error
- func (bs *AutobatchBlockstore) DeleteMany(ctx context.Context, cids []cid.Cid) error
- func (bs *AutobatchBlockstore) Flush(ctx context.Context) error
- func (bs *AutobatchBlockstore) Get(ctx context.Context, c cid.Cid) (block.Block, error)
- func (bs *AutobatchBlockstore) GetSize(ctx context.Context, c cid.Cid) (int, error)
- func (bs *AutobatchBlockstore) Has(ctx context.Context, c cid.Cid) (bool, error)
- func (bs *AutobatchBlockstore) HashOnRead(enabled bool)
- func (bs *AutobatchBlockstore) Put(ctx context.Context, blk block.Block) error
- func (bs *AutobatchBlockstore) PutMany(ctx context.Context, blks []block.Block) error
- func (bs *AutobatchBlockstore) Shutdown(ctx context.Context) error
- func (bs *AutobatchBlockstore) View(ctx context.Context, cid cid.Cid, callback func([]byte) error) error
- type BadgerBlockstore
- func (b *BadgerBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error)
- func (b *BadgerBlockstore) Close() error
- func (b *BadgerBlockstore) ConvertKey(cid cid.Cid) datastore.Key
- func (b *BadgerBlockstore) DeleteBlock(ctx context.Context, cid cid.Cid) error
- func (b *BadgerBlockstore) DeleteMany(ctx context.Context, cids []cid.Cid) error
- func (b *BadgerBlockstore) Get(ctx context.Context, cid cid.Cid) (blocks.Block, error)
- func (b *BadgerBlockstore) GetSize(ctx context.Context, cid cid.Cid) (int, error)
- func (b *BadgerBlockstore) Has(ctx context.Context, cid cid.Cid) (bool, error)
- func (b *BadgerBlockstore) HashOnRead(_ bool)
- func (b *BadgerBlockstore) Put(ctx context.Context, block blocks.Block) error
- func (b *BadgerBlockstore) PutMany(ctx context.Context, blks []blocks.Block) error
- func (b *BadgerBlockstore) ReadonlyDatastore() *TxBlockstore
- func (b *BadgerBlockstore) View(ctx context.Context, cid cid.Cid, fn func([]byte) error) error
- type BasicBlockstore
- type BatchDeleter
- type Blockstore
- func Adapt(bs blockstore.Blockstore) Blockstore
- func CachedBlockstore(ctx context.Context, bs blockstore.Blockstore, opts CacheOpts) (Blockstore, error)
- func FromDatastore(dstore ds.Batching) Blockstore
- func NewAPIBlockstore(cio ChainIO) Blockstore
- func NewBlockstore(dstore ds.Batching) Blockstore
- func WrapIDStore(bstore blockstore.Blockstore) Blockstore
- type BlockstoreGC
- type BlockstoreGCOption
- type BlockstoreGCOptions
- type BufferedBS
- func (bs *BufferedBS) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error)
- func (bs *BufferedBS) DeleteBlock(ctx context.Context, c cid.Cid) error
- func (bs *BufferedBS) DeleteMany(ctx context.Context, cids []cid.Cid) error
- func (bs *BufferedBS) Get(ctx context.Context, c cid.Cid) (block.Block, error)
- func (bs *BufferedBS) GetSize(ctx context.Context, c cid.Cid) (int, error)
- func (bs *BufferedBS) Has(ctx context.Context, c cid.Cid) (bool, error)
- func (bs *BufferedBS) HashOnRead(hor bool)
- func (bs *BufferedBS) Put(ctx context.Context, blk block.Block) error
- func (bs *BufferedBS) PutMany(ctx context.Context, blks []block.Block) error
- func (bs *BufferedBS) Read() Blockstore
- func (bs *BufferedBS) View(ctx context.Context, c cid.Cid, callback func([]byte) error) error
- func (bs *BufferedBS) Write() Blockstore
- type CacheOpts
- type ChainIO
- type GCBlockstore
- type GCLocker
- type IBlockCache
- type LruCache
- type MemBlockstore
- func (m MemBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error)
- func (m MemBlockstore) DeleteBlock(ctx context.Context, c cid.Cid) error
- func (m MemBlockstore) DeleteMany(ctx context.Context, ks []cid.Cid) error
- func (m MemBlockstore) Get(ctx context.Context, k cid.Cid) (blocks.Block, error)
- func (m MemBlockstore) GetSize(ctx context.Context, k cid.Cid) (int, error)
- func (m MemBlockstore) Has(ctx context.Context, k cid.Cid) (bool, error)
- func (m MemBlockstore) HashOnRead(enabled bool)
- func (m MemBlockstore) Put(ctx context.Context, b blocks.Block) error
- func (m MemBlockstore) PutMany(ctx context.Context, bs []blocks.Block) error
- func (m MemBlockstore) View(ctx context.Context, k cid.Cid, callback func([]byte) error) error
- type NetRPCErr
- type NetRPCErrType
- type NetRPCReq
- type NetRPCReqType
- type NetRPCResp
- type NetRPCRespType
- type NetworkStore
- func (n *NetworkStore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error)
- func (n *NetworkStore) DeleteBlock(ctx context.Context, c cid.Cid) error
- func (n *NetworkStore) DeleteMany(ctx context.Context, cids []cid.Cid) error
- func (n *NetworkStore) Get(ctx context.Context, c cid.Cid) (blocks.Block, error)
- func (n *NetworkStore) GetSize(ctx context.Context, c cid.Cid) (int, error)
- func (n *NetworkStore) Has(ctx context.Context, c cid.Cid) (bool, error)
- func (n *NetworkStore) HashOnRead(enabled bool)
- func (n *NetworkStore) OnClose(cb func())
- func (n *NetworkStore) Put(ctx context.Context, block blocks.Block) error
- func (n *NetworkStore) PutMany(ctx context.Context, blocks []blocks.Block) error
- func (n *NetworkStore) Stop(ctx context.Context) error
- func (n *NetworkStore) View(ctx context.Context, c cid.Cid, callback func([]byte) error) error
- type NetworkStoreHandler
- type Options
- type Set
- type SyncStore
- func (m *SyncStore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error)
- func (m *SyncStore) DeleteBlock(ctx context.Context, k cid.Cid) error
- func (m *SyncStore) DeleteMany(ctx context.Context, cids []cid.Cid) error
- func (m *SyncStore) Get(ctx context.Context, k cid.Cid) (blocks.Block, error)
- func (m *SyncStore) GetSize(ctx context.Context, k cid.Cid) (int, error)
- func (m *SyncStore) Has(ctx context.Context, k cid.Cid) (bool, error)
- func (m *SyncStore) HashOnRead(enabled bool)
- func (m *SyncStore) Put(ctx context.Context, b blocks.Block) error
- func (m *SyncStore) PutMany(ctx context.Context, bs []blocks.Block) error
- func (m *SyncStore) View(ctx context.Context, cid cid.Cid, callback func([]byte) error) error
- type TimeCache
- type TxBlockstore
- func (txBlockstore *TxBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error)
- func (txBlockstore *TxBlockstore) ConvertKey(cid cid.Cid) datastore.Key
- func (txBlockstore *TxBlockstore) DeleteBlock(ctx context.Context, cid cid.Cid) error
- func (txBlockstore *TxBlockstore) DeleteMany(ctx context.Context, cids []cid.Cid) error
- func (txBlockstore *TxBlockstore) Get(ctx context.Context, cid cid.Cid) (blocks.Block, error)
- func (txBlockstore *TxBlockstore) GetSize(ctx context.Context, cid cid.Cid) (int, error)
- func (txBlockstore *TxBlockstore) Has(ctx context.Context, cid cid.Cid) (bool, error)
- func (txBlockstore *TxBlockstore) HashOnRead(enabled bool)
- func (txBlockstore *TxBlockstore) Put(ctx context.Context, block blocks.Block) error
- func (txBlockstore *TxBlockstore) PutMany(ctx context.Context, blocks []blocks.Block) error
- func (txBlockstore *TxBlockstore) View(ctx context.Context, cid cid.Cid, callback func([]byte) error) error
- type Viewer
Constants ¶
const ( // FileIO is equivalent to badger/options.FileIO. FileIO = options.FileIO // MemoryMap is equivalent to badger/options.MemoryMap. MemoryMap = options.MemoryMap // LoadToRAM is equivalent to badger/options.LoadToRAM. LoadToRAM = options.LoadToRAM )
aliases to mask badger dependencies.
Variables ¶
var ( NewGCLocker = blockstore.NewGCLocker NewGCBlockstore = blockstore.NewGCBlockstore )
var ErrBlockstoreClosed = fmt.Errorf("badger blockstore closed")
ErrBlockstoreClosed is returned from blockstore operations after the blockstore has been closed.
Functions ¶
func CopyBlockstore ¶
func CopyBlockstore(ctx context.Context, from, to Blockstore) error
func CopyParticial ¶
func CopyParticial(ctx context.Context, from, to Blockstore, root cid.Cid) error
Types ¶
type AutobatchBlockstore ¶
type AutobatchBlockstore struct {
// contains filtered or unexported fields
}
func NewAutobatch ¶
func NewAutobatch(ctx context.Context, backingBs Blockstore, bufferCapacity int) *AutobatchBlockstore
func (*AutobatchBlockstore) AllKeysChan ¶
func (bs *AutobatchBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error)
func (*AutobatchBlockstore) DeleteBlock ¶
func (bs *AutobatchBlockstore) DeleteBlock(context.Context, cid.Cid) error
func (*AutobatchBlockstore) DeleteMany ¶
func (bs *AutobatchBlockstore) DeleteMany(ctx context.Context, cids []cid.Cid) error
func (*AutobatchBlockstore) Flush ¶
func (bs *AutobatchBlockstore) Flush(ctx context.Context) error
caller must NOT hold stateLock
func (*AutobatchBlockstore) GetSize ¶
func (bs *AutobatchBlockstore) GetSize(ctx context.Context, c cid.Cid) (int, error)
func (*AutobatchBlockstore) Has ¶
func (bs *AutobatchBlockstore) Has(ctx context.Context, c cid.Cid) (bool, error)
func (*AutobatchBlockstore) HashOnRead ¶
func (bs *AutobatchBlockstore) HashOnRead(enabled bool)
type BadgerBlockstore ¶
type BadgerBlockstore struct { DB *badger.DB // contains filtered or unexported fields }
blockstore is a badger-backed IPLD blockstore.
NOTE: once Close() is called, methods will try their best to return ErrBlockstoreClosed. This will guaranteed to happen for all subsequent operation calls after Close() has returned, but it may not happen for operations in progress. Those are likely to fail with a different error.
func Open ¶
func Open(opts Options) (*BadgerBlockstore, error)
Open creates a new badger-backed blockstore, with the supplied options.
func (*BadgerBlockstore) AllKeysChan ¶
func (b *BadgerBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error)
AllKeysChan implements blockstore.AllKeysChan.
func (*BadgerBlockstore) Close ¶
func (b *BadgerBlockstore) Close() error
Close closes the store. If the store has already been closed, this noops and returns an error, even if the first closure resulted in error.
func (*BadgerBlockstore) ConvertKey ¶
func (b *BadgerBlockstore) ConvertKey(cid cid.Cid) datastore.Key
func (*BadgerBlockstore) DeleteBlock ¶
func (b *BadgerBlockstore) DeleteBlock(ctx context.Context, cid cid.Cid) error
DeleteBlock implements blockstore.DeleteBlock.
func (*BadgerBlockstore) DeleteMany ¶
func (b *BadgerBlockstore) DeleteMany(ctx context.Context, cids []cid.Cid) error
func (*BadgerBlockstore) GetSize ¶
func (b *BadgerBlockstore) GetSize(ctx context.Context, cid cid.Cid) (int, error)
GetSize implements blockstore.GetSize.
func (*BadgerBlockstore) Has ¶
func (b *BadgerBlockstore) Has(ctx context.Context, cid cid.Cid) (bool, error)
Has implements blockstore.Has.
func (*BadgerBlockstore) HashOnRead ¶
func (b *BadgerBlockstore) HashOnRead(_ bool)
HashOnRead implements blockstore.HashOnRead. It is not supported by this blockstore.
func (*BadgerBlockstore) ReadonlyDatastore ¶
func (b *BadgerBlockstore) ReadonlyDatastore() *TxBlockstore
type BasicBlockstore ¶
type BasicBlockstore = blockstore.Blockstore
type BatchDeleter ¶
type Blockstore ¶
type Blockstore interface { blockstore.Blockstore blockstore.Viewer BatchDeleter }
Blockstore is the blockstore interface used by Lotus. It is the union of the basic go-ipfs blockstore, with other capabilities required by Lotus, e.g. View or Sync.
func Adapt ¶
func Adapt(bs blockstore.Blockstore) Blockstore
Adapt adapts a standard blockstore to a Lotus blockstore by enriching it with the extra methods that Lotus requires (e.g. View, Sync).
View proxies over to Get and calls the callback with the value supplied by Get. Sync noops.
func CachedBlockstore ¶
func CachedBlockstore(ctx context.Context, bs blockstore.Blockstore, opts CacheOpts) (Blockstore, error)
func FromDatastore ¶
func FromDatastore(dstore ds.Batching) Blockstore
FromDatastore creates a new blockstore backed by the given datastore.
func NewAPIBlockstore ¶
func NewAPIBlockstore(cio ChainIO) Blockstore
func NewBlockstore ¶
func NewBlockstore(dstore ds.Batching) Blockstore
NewBlockstore creates a new blockstore wrapped by the given datastore.
func WrapIDStore ¶
func WrapIDStore(bstore blockstore.Blockstore) Blockstore
WrapIDStore wraps the underlying blockstore in an "identity" blockstore.
type BlockstoreGC ¶
type BlockstoreGC interface {
CollectGarbage(options ...BlockstoreGCOption) error
}
BlockstoreGC is a trait for blockstores that support online garbage collection consider
type BlockstoreGCOption ¶
type BlockstoreGCOption = func(*BlockstoreGCOptions) error // nolint
BlockstoreGCOption is a functional interface for controlling blockstore GC options
func WithFullGC ¶
func WithFullGC(fullgc bool) BlockstoreGCOption
type BlockstoreGCOptions ¶
type BlockstoreGCOptions struct {
FullGC bool
}
BlockstoreGCOptions is a struct with GC options
type BufferedBS ¶
type BufferedBS struct {
// contains filtered or unexported fields
}
func NewBufferedBstore ¶
func NewBufferedBstore(base Blockstore) *BufferedBS
func NewTieredBstore ¶
func NewTieredBstore(r Blockstore, w Blockstore) *BufferedBS
func (*BufferedBS) AllKeysChan ¶
func (bs *BufferedBS) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error)
func (*BufferedBS) DeleteBlock ¶
func (bs *BufferedBS) DeleteBlock(ctx context.Context, c cid.Cid) error
func (*BufferedBS) DeleteMany ¶
func (bs *BufferedBS) DeleteMany(ctx context.Context, cids []cid.Cid) error
func (*BufferedBS) GetSize ¶
func (bs *BufferedBS) GetSize(ctx context.Context, c cid.Cid) (int, error)
func (*BufferedBS) HashOnRead ¶
func (bs *BufferedBS) HashOnRead(hor bool)
func (*BufferedBS) Read ¶
func (bs *BufferedBS) Read() Blockstore
func (*BufferedBS) Write ¶
func (bs *BufferedBS) Write() Blockstore
type CacheOpts ¶
type CacheOpts = blockstore.CacheOpts
Alias so other packages don't have to import go-ipfs-blockstore type Blockstore = blockstore.Blockstore
func DefaultCacheOpts ¶
func DefaultCacheOpts() CacheOpts
type GCBlockstore ¶
type GCBlockstore = blockstore.GCBlockstore
Alias so other packages don't have to import go-ipfs-blockstore type Blockstore = blockstore.Blockstore
type GCLocker ¶
type GCLocker = blockstore.GCLocker
Alias so other packages don't have to import go-ipfs-blockstore type Blockstore = blockstore.Blockstore
type IBlockCache ¶
type LruCache ¶
type LruCache struct {
// contains filtered or unexported fields
}
func NewLruCache ¶
func (LruCache) AddWithExpire ¶
type MemBlockstore ¶
MemBlockstore is a terminal blockstore that keeps blocks in memory.
func NewMemory ¶
func NewMemory() MemBlockstore
NewMemory returns a temporary memory-backed blockstore.
func (MemBlockstore) AllKeysChan ¶
func (m MemBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error)
AllKeysChan returns a channel from which the CIDs in the Blockstore can be read. It should respect the given context, closing the channel if it becomes Done.
func (MemBlockstore) DeleteBlock ¶
func (m MemBlockstore) DeleteBlock(ctx context.Context, c cid.Cid) error
func (MemBlockstore) DeleteMany ¶
func (m MemBlockstore) DeleteMany(ctx context.Context, ks []cid.Cid) error
func (MemBlockstore) GetSize ¶
func (m MemBlockstore) GetSize(ctx context.Context, k cid.Cid) (int, error)
GetSize returns the CIDs mapped BlockSize
func (MemBlockstore) HashOnRead ¶
func (m MemBlockstore) HashOnRead(enabled bool)
HashOnRead specifies if every read block should be rehashed to make sure it matches its CID.
type NetRPCErr ¶ added in v1.9.0
type NetRPCErr struct { Type NetRPCErrType Msg string // in case of NRpcErrNotFound Cid *cid.Cid }
type NetRPCErrType ¶ added in v1.9.0
type NetRPCErrType byte
const ( NRpcErrGeneric NetRPCErrType = iota NRpcErrNotFound )
type NetRPCReq ¶ added in v1.9.0
type NetRPCReq struct { Type NetRPCReqType ID uint64 Cid []cid.Cid // todo maxsize? Data [][]byte // todo maxsize? }
type NetRPCReqType ¶ added in v1.9.0
type NetRPCReqType byte
const ( NRpcHas NetRPCReqType = iota NRpcGet NRpcGetSize NRpcPut NRpcDelete )
type NetRPCResp ¶ added in v1.9.0
type NetRPCResp struct { Type NetRPCRespType ID uint64 // error or cids in allkeys Data []byte // todo maxsize? // contains filtered or unexported fields }
func (*NetRPCResp) MarshalCBOR ¶ added in v1.9.0
func (t *NetRPCResp) MarshalCBOR(w io.Writer) error
func (*NetRPCResp) UnmarshalCBOR ¶ added in v1.9.0
func (t *NetRPCResp) UnmarshalCBOR(r io.Reader) (err error)
type NetRPCRespType ¶ added in v1.9.0
type NetRPCRespType byte
const ( NRpcOK NetRPCRespType = iota NRpcErr NRpcMore )
type NetworkStore ¶ added in v1.9.0
type NetworkStore struct {
// contains filtered or unexported fields
}
func NewNetworkStore ¶ added in v1.9.0
func NewNetworkStore(mss msgio.ReadWriteCloser) *NetworkStore
func NewNetworkStoreWS ¶ added in v1.9.0
func NewNetworkStoreWS(wc *websocket.Conn) *NetworkStore
func (*NetworkStore) AllKeysChan ¶ added in v1.9.0
func (n *NetworkStore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error)
func (*NetworkStore) DeleteBlock ¶ added in v1.9.0
func (n *NetworkStore) DeleteBlock(ctx context.Context, c cid.Cid) error
func (*NetworkStore) DeleteMany ¶ added in v1.9.0
func (n *NetworkStore) DeleteMany(ctx context.Context, cids []cid.Cid) error
func (*NetworkStore) GetSize ¶ added in v1.9.0
func (n *NetworkStore) GetSize(ctx context.Context, c cid.Cid) (int, error)
func (*NetworkStore) Has ¶ added in v1.9.0
func (n *NetworkStore) Has(ctx context.Context, c cid.Cid) (bool, error)
func (*NetworkStore) HashOnRead ¶ added in v1.9.0
func (n *NetworkStore) HashOnRead(enabled bool)
func (*NetworkStore) OnClose ¶ added in v1.9.0
func (n *NetworkStore) OnClose(cb func())
type NetworkStoreHandler ¶ added in v1.9.0
type NetworkStoreHandler struct {
// contains filtered or unexported fields
}
func HandleNetBstoreStream ¶ added in v1.9.0
func HandleNetBstoreStream(ctx context.Context, bs Blockstore, mss msgio.ReadWriteCloser) *NetworkStoreHandler
NOTE: This code isn't yet hardened to accept untrusted input. See TODOs here and in net.go
func HandleNetBstoreWS ¶ added in v1.9.0
func HandleNetBstoreWS(ctx context.Context, bs Blockstore, wc *websocket.Conn) *NetworkStoreHandler
type Options ¶
type Options struct { badger.Options // Prefix is an optional prefix to prepend to keys. Default: "". Prefix string }
Options embeds the badger options themselves, and augments them with blockstore-specific options.
func BadgerBlockstoreOptions ¶
BadgerBlockstoreOptions returns the badger options to apply for the provided domain.
func DefaultOptions ¶
type Set ¶
type Set struct {
// contains filtered or unexported fields
}
Set is a implementation of a set of Cids, that is, a structure to which holds a single copy of every Cids that is added to it.
type SyncStore ¶
type SyncStore struct {
// contains filtered or unexported fields
}
func NewTemporarySync ¶
func NewTemporarySync() *SyncStore
NewTemporarySync returns a thread-safe temporary blockstore.
func (*SyncStore) AllKeysChan ¶
AllKeysChan returns a channel from which the CIDs in the blockstore can be read. It should respect the given context, closing the channel if it becomes Done.
func (*SyncStore) DeleteBlock ¶
func (*SyncStore) DeleteMany ¶
func (*SyncStore) HashOnRead ¶
HashOnRead specifies if every read block should be rehashed to make sure it matches its CID.
type TimeCache ¶
type TimeCache struct {
// contains filtered or unexported fields
}
func NewTimeCache ¶
func (TimeCache) AddWithExpire ¶
type TxBlockstore ¶
type TxBlockstore struct {
// contains filtered or unexported fields
}
func (*TxBlockstore) AllKeysChan ¶
func (txBlockstore *TxBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error)
func (*TxBlockstore) ConvertKey ¶
func (txBlockstore *TxBlockstore) ConvertKey(cid cid.Cid) datastore.Key
func (*TxBlockstore) DeleteBlock ¶
func (txBlockstore *TxBlockstore) DeleteBlock(ctx context.Context, cid cid.Cid) error
func (*TxBlockstore) DeleteMany ¶
func (txBlockstore *TxBlockstore) DeleteMany(ctx context.Context, cids []cid.Cid) error
func (*TxBlockstore) GetSize ¶
func (txBlockstore *TxBlockstore) GetSize(ctx context.Context, cid cid.Cid) (int, error)
func (*TxBlockstore) Has ¶
func (txBlockstore *TxBlockstore) Has(ctx context.Context, cid cid.Cid) (bool, error)
func (*TxBlockstore) HashOnRead ¶
func (txBlockstore *TxBlockstore) HashOnRead(enabled bool)
type Viewer ¶
type Viewer = blockstore.Viewer
Alias so other packages don't have to import go-ipfs-blockstore type Blockstore = blockstore.Blockstore