Skip to content

Instantly share code, notes, and snippets.

View Gozala's full-sized avatar
😱
Oh well

Irakli Gozalishvili Gozala

😱
Oh well
View GitHub Profile

Commit History Encoding

Goal

Supporting concurrent writes into database implies that multiple actors can create concurrent commits (containing assertions / retractions) than need to be reconciled by all partial replicas. Reconciliation requirements following:

  1. Identifying concurrent changes.
  2. Order all changes (including concurrent ones)

To make this more concrete, when query reads set of facts we need to identify if some facts are conflicting - updated same state via concurrent changes. This would enable projecting concurrent states that consumer could choose from.

@Gozala
Gozala / work.clj
Created April 11, 2024 18:35
Sketch of the workflow syntax
;; Type definition for the Blob. It has no inputs and two outputs
; `digest` and `size`. It is kind of like a rule without a body
(Blob : { :digest Bytes :size Int })
(Site : { :url String :headers (Map :key string :value string) })
;; ℹ️ Unlabelled parameter can be refereced by `.`
(Result :error : (:ok . :error .error))
;; Composed task is rule that maps input to tasks and maps task outputs
;; to the output of the composed task
(Multihash : Bytes)
(Blob : {:size Integer :digest Multihash })
(blob/add
:input {:sub DID :blob Blob }
:address (memory/allocate
:space .input.sub
:blob .input.blob)
:content (http/put
:url .address.out.ok.url
stateDiagram-v2
  add: πŸ‘©β€πŸ’» /space/content/add/blob πŸ€–
  add: 🧾 { ok {} }

  allocate: πŸ€– /service/blob/allocate πŸ€–
  allocate: 🧾 { ok { size 123 } }

  wait: πŸ€– /service/blob/receive πŸ€–
 wait: 🧾 { ok {} } 
flowchart LR
    Add[πŸ‘©β€πŸ’» store/add πŸ€–]
    Allocate[πŸ€– blob/allocate πŸ€–]
    Receive[πŸ€– blob/receive πŸ€–]
    Write[πŸ€– blob/write πŸ‘©β€πŸ’»]
    Close[πŸ€– blob/close πŸ€–]
    Claim[πŸ€– assert/location 🌐]

 Add --> Allocate
interface Account {
plan: AccountPlan
// ...
}
interface AccountPlan {
customer: AccountDID
request(): Plan
list(): Plan[]
interface Account {
subscriptions: AccountSubscriptions
// ...
}
interface AccountSubscriptions {
customer: AccountDID
request(): Subscription
list(): Subscription[]
@Gozala
Gozala / db.js
Last active December 14, 2023 19:34
import * as API from '@ucanto/interface'
/**
* @typedef {number} Integer
* @typedef {number} Float
* @typedef {Readonly<Uint8Array>} Bytes
* @typedef {string} UTF8
*
* @typedef {String} Entity
* @typedef {Integer|Float|Bytes|UTF8} Attribute
type ProviderDID =
| "did:web:web.storage"
| "did:web:nft.storage"
interface Principal {
did(): string
}
interface Space extends Principal {
stateDiagram-v2
direction TB

state scope {
  sig-->meta: 
  sig-->prf
  sig-->iss
  sig-->aud
  sig-->tasks