ZFast
A quick, decentralized JSON store perfect for quick web3 builders.
Redis + IPFS = zfast = 😍
git clone https://github.com/tanyaya94/zfast
npm run build
The quickest way to test out zfast is with the zfast sandbox server (example below). If you want to run a production instance of zfast, see the running your own server section.
...
// See encryption section below on how to enable encryption
const myJson = { hello: 'world' };
await ZFast.set('myJsonKey', myJson, { encrypt: false });
...
const { data } = await ZFast.get('myJsonKey');
...
// reclaims memory, but preserves data on IPFS
await ZFast.purge('myJsonKey');
The SQL database is a powerful tool unrivalled for storing and querying relational data.
BUT, I believe most dapps can live without a traditional SQL database in favor of something more light weight and decentralized.
Here are some problems with setting up a DB for your dapp
- There are already many great services which index blockchain data (why reinvent the wheel?)
- DBs are expensive to host
- Migrations are often a pain
- They tend to be centralized / treasure troves for attackers
- They usually don't give users provenance over their data
- Encryption / key management is a pain
Many web3 developers choose to store their data as JSON directly on IPFS rather than a traditional DB, but IPFS upload times can be slow and gateway timeouts are brutal.
If a traditional DB seems overkill for your use case and interacting directly with IPFS seems a bit too slow, zfast might be for you.
It gives you the speed of in memory-cache (Redis) but the decentralization of a global network (Filecoin + IPFS), with some other goodies like encryption.
zfast offers easy E2E encryption for user data via lit protocol. In order to use encryption, you will need to install the lit
javascript SDK.
> npm install lit-js-sdk
<script
onload="LitJsSdk.litJsSdkLoadedInALIT()"
src="https://jscdn.litgateway.com/index.web.js"
></script>
// Enable encryption during client initialization
// zfast will automatically use lit-js-sdk for encryption
const zfast = new RipClient({ zfastServerUrl, enableEncryption: true });
...
// you need a one-time wallet signature to
// prove identity for encryption and decryption
await zfast.signMessageForEncryption()
...
// make sure to pass encrypt: true option
const myJson = { hello: 'Encrypted zfast world' };
await zfast.set('myJsonKey', myJson, { encrypt: true });
...
// zfast automatically decrypts
const { data } = await zfast.get('myJsonKey');
For now, if you want to use zfast in production, you will need to run your own zfast server instance.
If you want to run a zfast instance on your own follow the below instructions
- Install and run redis (documentation here. You can run on your local or a cloud service of your choice.
- Acquire an NFT Storage API Key (found here)
- Clone the repo
git clone https://github.com/zdenham/redis-ipfs.git
> yarn install
> cd server
> yarn install
NOTE: you can see the redis URI syntax here
Under /server
directory if you are using a .env file.
REDIS_URL=redis://[[username:]password@]host[:port][/database]
IPFS_KEY=[YOUR_NFT STORAGE_KEY]
Under your environment variables you will need to set IPFS
> yarn start
Once your server is live, you can point your zfast client to the server by initializing it with zfastServerUrl
which points to your server instance URL.