IPFS Key Value Store

github.com/nanoswap/ipfskvs

Installation

pip install ipfskvs

Wrappers for IPFS RPC endpoints

    from ipfskvs.ipfs import Ipfs

    client = ipfs.Ipfs()  # defaults to http://127.0.0.1:5001/api/v0
    client.mkdir("my_dir")
    client.add("my_dir/my_file", b"my_contents")

Read and write protobuf contents

Reading:

    from ipfskvs.index import Index
    from ipfskvs.ipfs import Ipfs
    from ipfskvs.store import Store
    from myprotobuf_pb2 import MyProtobuf

    store = Store(
        Index.from_filename("myfile.txt"),
        ipfs=Ipfs(host="127.0.0.1", port="5001"),
        reader=MyProtobuf()
    )

    store.read()
    print(store.reader)

Writing:

    from ipfskvs.index import Index
    from ipfskvs.ipfs import Ipfs
    from ipfskvs.store import Store
    from myprotobuf_pb2 import MyProtobuf

    store = Store(
        Index.from_filename("myfile.txt"),
        ipfs=Ipfs(host="127.0.0.1", port="5001"),
        writer=MyProtobuf()
    )
    store.add()

Overhead for nested directories

Write with multiple indexes

Create a tiered file structure based on IDs, ex:

    ├── fashion/
        ├── designer_1.manufacturer_1
        ├── designer_2.manufacturer_1
            ├── deal_16.data
        ├── designer_4.manufacturer_3
            ├── deal_1.data
            ├── deal_2.data
    from ipfskvs.index import Index
    from ipfskvs.ipfs import Ipfs
    from ipfskvs.store import Store
    from deal_pb2 import Deal

    index = Index(
        prefix="fashion",
        index={
            "designer": str(uuid.uuid4()),
            "manufacturer": str(uuid.uuid4())
        }, subindex=Index(
            index={
                "deal":  str(uuid.uuid4())
            }
        )
    )

    data = Deal(type=Type.BUZZ, content="fizz")
    store = Store(index=index, ipfs=Ipfs(), writer=data)
    store.add()

Query the multiple indexes

Ex: get all deals with designer id "123"

    from ipfskvs.index import Index
    from ipfskvs.ipfs import Ipfs
    from ipfskvs.store import Store
    from deal_pb2 import Deal

    query_index = Index(
        prefix="fashion",
        index={
            "designer": "123"
        }
    )

    reader = Deal()
    query_results = Store.query(query_index, ipfs, reader)
    print(Store.to_dataframe(query_results))