49 releases (12 breaking)

0.13.0 Oct 7, 2022
0.12.0 Mar 9, 2022
0.11.5 Mar 6, 2022
0.9.0 Dec 24, 2021
0.1.6 Dec 28, 2020

#589 in Database interfaces

Download history 439/week @ 2023-12-18 5/week @ 2023-12-25 137/week @ 2024-01-01 62/week @ 2024-01-08 44/week @ 2024-01-15 9/week @ 2024-01-22 7/week @ 2024-02-05 33/week @ 2024-02-12 24/week @ 2024-02-19 69/week @ 2024-02-26 31/week @ 2024-03-04 41/week @ 2024-03-11 62/week @ 2024-03-18 35/week @ 2024-03-25 91/week @ 2024-04-01

236 downloads per month
Used in 11 crates (7 directly)



IPFS sqlite block store   Latest Version Docs Badge

Sqlite based block store for content-addressed data like IPLD.

See the module level docs for more details.


IPFS sqlite block store

A block store for a rust implementation of ipfs.



An alias is a named pin of a root. When a root is aliased, none of the leaves of the dag pointed to by the root will be collected by gc. However, a root being aliased does not mean that the dag must be complete.

Temporary aliases

A temporary alias is an unnamed alias that is just for the purpose of protecting blocks from gc while a large tree is being constructed. While an alias maps a single name to a single root, a temporary alias can be assigned to an arbitary number of blocks before the dag is finished.

A temporary alias will be deleted as soon as the handle goes out of scope.

Garbage Collection (GC)

GC refers to the process of removing unpinned blocks. It runs only when the configured size targets are exceeded. Size targets contain both the total size of the store and the number of blocks.

GC will run incrementally, deleting blocks until the size targets are no longer exceeded. The order in which unpinned blocks will be deleted can be customized.


For unpinned blocks, it is possible to customize which blocks have the highest value using a CacheTracker. The default is to do nothing and has no performance overhead.

The most elaborate implemented strategy is to keep track of access times in a separate database, via the SqliteCacheTracker, which has a slight performance overhead.

The performance overhead of writing to an access tracking database on each block read can be mitigated by using the AsyncCacheTracker wrapper to perform the database writes on a different thread.



For blocking usage, use BlockStore. This is the most low level interface.

Major differences to the go-ipfs pinning concept

  • Pinning/aliasing a root does not require that the dag is complete
  • Aliases/named pins as opposed to unnamed and non-reference-counted pins
  • Temporary pins as a mechanism to keep blocks safe from gc while a tree is being constructed


~485K SLoC