DISOT

Decentralized Immutable Source Of Truth

Documents

A document is a finite sequence of bits. A hash is its immutable global name.

DocumentinputHash function: SHA-256producesHash value: abcd...identifies

The permanent link includes both the algorithm and the value: sha256:abcd....

The same document may have different filenames, URLs, or storage locations. Its content stays the same, and so does its hash for a given hash algorithm. The hash identifier can therefore serve as a permanent link without specifying a storage location or transport protocol.

Documents can reference other documents by hash:

2345...ef01...abcd...

This creates an immutable DAG.

History Without Mutation

Changing a document creates a new document. A metadocument connects revisions:

revision r002...revision d0c0...document bcd2...document abcd...
// r002...
export default {
    document: 'bcd2...',
    parents: ['d0c0...'],
}

Nothing is overwritten. Multiple parents represent a merge; multiple children represent forks.

Authorship + Trusted Time

Document ADID signatureTrusted timestamp

The timestamp covers the signed statement, not only the unsigned document:

A = document
B = signature(hash(A), author DID)
C = trusted timestamp(hash(B))

Merkle trees can batch many signed documents under one trusted timestamp.

Directories Are Documents

export default {
    'a.js': 'abcd...',
    'subdir/b.js': 'ef01...',
}
directorya.jssubdir/b.jsabcd...ef01...

Changing one path creates a new directory document. The old directory still exists.

Global Names

Immutable hash name

sha256:abcd...

It identifies exactly one document.

Evolving DID name

/did:example:alice/parser

The name can evolve, but the name history is immutable:

name revision r2/did:example:alice/parsername revision r1/did:example:alice/parsersha256:bcd2...sha256:abcd...

A name is not a mutable pointer. Renames, transfers, forks, and conflicting updates remain visible in history.

Relative Names

base          = /did:example:alice/
relative name = ./json
result        = /did:example:alice/json

A Web of Trust can provide the context:

~/alice/charlie/parser

~ is the reader's root. Another reader may resolve alice differently.

Relative-name mappings also evolve through immutable revisions.

Snapshots

Names evolve. Hashes do not.

./json/did:example:alice/jsonsha256:abcd...

A snapshot locks the resolution. Later name revisions do not change the dependency.

One History, Many Transports

The same immutable history can move between systems, independently of any storage format or hosting provider.

DISOT historyLocal filesystemUSB / sneakernetHosting providerIPFSNostrFuture transport

Backup, restore, and synchronization should not require the service that originally stored the data.

The transport can change. The documents, signatures, names, and history remain verifiable.

Projections

  • Git projection: Git objects, signatures, names, snapshots, and transport examples.

References