Versioned Nodes Prior Art
There are a variety of similar systems and designs to versioned nodes. However, they all are designed for narrower applications, and do not quite implement the paradigm.
InterPlanetary File System
IPFS defines a blob-like “Object Merkle DAG”:
struct IPFSObject {
/// array of links
links: Vec<IPFSLink>,
/// opaque content data
data: Vec<u8>,
}
struct IPFSLink {
/// name or alias of this link
name: string,
/// cryptographic hash of target
hash: Multihash,
/// total size of target
size: usize,
}
The inclusion of names and sizes prevents IPFS from being an unencrypted blob-only format of versioned nodes. It does, however, come closest as it clearly separates links from data and allows both on all objects.
Encoding for Robust Immutable Storage
ERIS defines a multi-node format for encrypted content-addressed data. It contains a hierarchy of node types - leaf nodes (level 0) which contain data with no links and internal nodes (1 or greater) which contain no data with an ordered set of links to nodes of next level down.
struct Leaf {
/// Either 1 or 32kB of content.
content: Vec<u8>,
}
struct Internal {
links: Vec<Link>,
}
struct Link {
reference: [u8; 32],
key: [u8; 32],
}
Both the references and the keys are encrypted in intermediate nodes, requiring the nodes to be decrypted before child nodes can be fetched.
Hyphanet (was Freenet)
Hyphanet is an encrypted content-addressed data sharing protocol. They define four types of keys to access data, but the documentation is light on details. The source code for CHKBlocks and SSKBlocks seems to indicate that each block contains a fixed-size header and data, up to 1022 data bytes for a CHKBlock and four short of 32kB for a SSKBlock. Within these blocks are a number of built-in document types, which may include links to other blocks.
The reference implementation is a bit of a mess and there’s no clear specification, so take anything here with a grain of salt.
Tahoe-LAFS
Tahoe Least-Authority File Store is an encrypted file store with mutable files and directories. It, like Freenet, has verification, read, and write keys, and, unlike Freenet, refers to them specifically as capabilities, but does not separate them from the data.