Skip to documentation
SLOP

tiny.closure.ledger

Reference tiny.closure ledger

Defined in tiny.closure.

API (24)

Actions

Public operations.

Types and contracts

Public types and contracts.

Values and defaults

Public values and defaults.

No direct callersNo direct callstiny.closureledger
Static calls · unresolved targets: unknown · external targets: unknown.

Source

Source: lib/closure/src/ledger/store.zig:111

zig
pub const Ledger = struct {    phase: capacity.Phase,    capacity: Capacity,    storage: Storage,    pub const Limits: type = closure.Limits;    pub const Capacity: type = closure.Capacity;    pub const storage_alignment: usize = limits.storage_alignment;    pub const Storage = []align(storage_alignment) u8;    pub const Exhaustion: type = LedgerExhaustion;    pub const InitError: type =        Capacity.DeriveError || error{StorageTooShort};    pub const PrepareError: type =        OwnerError || ValidationError || Exhaustion || StagingError;    pub const PublishError: type = OwnerError || PublicationError;    pub const RecoveryError: type = OwnerError;    pub const SnapshotError: type = OwnerError;    pub const ScratchError: type = OwnerError;    pub const ProjectionScratch: type = ProjectionScratchModel;    pub const work_limits: capacity.WorkLimits = .{        .transition_steps_max = 4_000_000,        .cleanup_steps_per_call_max = 1,        .cleanup_calls_at_capacity_max = 1,    };    pub const claim: capacity.Declaration = .{        .source = .{            .id = "closure.ledger",            .kind = .startup_static,            .limit_source = .caller,            .storage = .{                .covered = &.{                    .{                        .id = "caller_provisioned_double_buffered_closure_ledger_storage",                        .lifetime = .steady,                        .detail = "caller-provisioned double-buffered closure ledger storage",                    },                },                .excluded = &.{                    "ledger owner handle",                    "borrowed GenerationInput source slices",                    "external artifact bytes",                },            },            .capacity = .{                .inputs = &.{                    capacity.bindInput(Limits, "artifacts", "artifacts"),                    capacity.bindInput(Limits, "authorities", "authorities"),                    capacity.bindInput(Limits, "build_records", "build_records"),                    capacity.bindInput(Limits, "claim_nodes", "claim_nodes"),                    capacity.bindInput(Limits, "claims", "claims"),                    capacity.bindInput(Limits, "digests", "digests"),                    capacity.bindInput(Limits, "edges", "edges"),                    capacity.bindInput(Limits, "lineage_references", "lineage_references"),                    capacity.bindInput(Limits, "nodes", "nodes"),                    capacity.bindInput(Limits, "provenance_parents", "provenance_parents"),                    capacity.bindInput(Limits, "ranges", "ranges"),                    capacity.bindInput(Limits, "receipt_bytes", "receipt_bytes"),                    capacity.bindInput(Limits, "residual_roots", "residual_roots"),                    capacity.bindInput(Limits, "service_descriptors", "service_descriptors"),                    capacity.bindInput(Limits, "source_records", "source_records"),                },                .type_selectors = &.{},                .nodes = &.{                    .{ .input = 0 },                    .{ .input = 1 },                    .{ .input = 2 },                    .{ .input = 3 },                    .{ .input = 4 },                    .{ .input = 5 },                    .{ .input = 6 },                    .{ .input = 7 },                    .{ .input = 8 },                    .{ .input = 9 },                    .{ .input = 10 },                    .{ .input = 11 },                    .{ .input = 12 },                    .{ .input = 13 },                    .{ .input = 14 },                    .{ .add = .{ .left = 0, .right = 1 } },                    .{ .add = .{ .left = 15, .right = 2 } },                    .{ .add = .{ .left = 16, .right = 3 } },                    .{ .add = .{ .left = 17, .right = 4 } },                    .{ .add = .{ .left = 18, .right = 5 } },                    .{ .add = .{ .left = 19, .right = 6 } },                    .{ .add = .{ .left = 20, .right = 7 } },                    .{ .add = .{ .left = 21, .right = 8 } },                    .{ .add = .{ .left = 22, .right = 9 } },                    .{ .add = .{ .left = 23, .right = 10 } },                    .{ .add = .{ .left = 24, .right = 11 } },                    .{ .add = .{ .left = 25, .right = 12 } },                    .{ .add = .{ .left = 26, .right = 13 } },                    .{ .add = .{ .left = 27, .right = 14 } },                },                .assertions = &.{.{                    .scope = .closure_total,                    .measure = .retained,                    .relation = .upper_bound,                    .expression = 28,                }},            },            .overload = .{                .kind = .reject_before_mutation,                .detail = "every record occupancy and generation overflow rejects before copy",            },            .risks = .{                .transitive = .{                    .status = .excluded,                    .detail = "ledger storage and validation retain no allocator capability",                },                .foreign = .{                    .status = .excluded,                    .detail = "ledger assembly reads only typed caller-owned records",                },            },            .work = .{ .equation = "prepare validation and copy <= 4000000 bounded steps" },            .obligations = &.{                .{ .key = "closure_ledger_capacity_capacity_model", .role = .capacity_model },                .{ .key = "closure_ledger_capacity_transitive_risk", .role = .transitive_risk },                .{ .key = "closure_ledger_overload", .role = .overload },                .{ .key = "closure_ledger_validation", .role = .foreign_risk },                .{ .key = "closure_ledger_recovery", .role = .custom },                .{ .key = "closure_ledger_work", .role = .work_bound },            },        },        .bindings = .{            .owner = @This(),        },    };    pub fn init(        storage: Storage,        requested: Limits,    ) InitError!Ledger {        const derived = try Capacity.derive(requested);        if (storage.len < derived.storage_bytes) {            return error.StorageTooShort;        }        @memset(storage[0..derived.storage_bytes], 0);        const header = pointerAt(Header, storage, derived.layout.header);        header.* = .{            .magic = header_magic,            .self_address = 0,            .slot_state = encodeSlots(null, null),            .phase = .initialization,            .reserved = @splat(0),        };        return .{            .phase = .initialization,            .capacity = derived,            .storage = storage,        };    }    pub fn activate(self: *Ledger) void {        const header = self.sharedHeader();        std.debug.assert(self.phase == .initialization);        std.debug.assert(header.phase == .initialization);        std.debug.assert(header.self_address == 0);        header.self_address = @intFromPtr(self);        header.phase = .steady;        self.phase = .steady;    }    pub fn prepare(        self: *Ledger,        input: schema.GenerationInput,    ) PrepareError!void {        try self.requireOwned();        const state = self.loadSlots();        if (stagedSlot(state) != null) {            return error.GenerationAlreadyStaged;        }        try validateOccupancy(self.capacity, input);        try self.validateGeneration(activeSlot(state), input.id);        try validateCanonical(input);        const target = inactiveSlot(activeSlot(state));        copyInput(self.storage, self.slotLayout(target), input);        self.storeSlots(encodeSlots(activeSlot(state), target));    }    pub fn publish(self: *Ledger) PublishError!void {        try self.requireOwned();        const state = self.loadSlots();        const staged = stagedSlot(state) orelse {            return error.NoStagedGeneration;        };        std.debug.assert(activeSlot(state) != staged);        self.storeSlots(encodeSlots(staged, null));    }    pub fn recover(self: *Ledger) RecoveryError!bool {        try self.requireOwned();        const state = self.loadSlots();        if (stagedSlot(state) == null) return false;        self.storeSlots(encodeSlots(activeSlot(state), null));        return true;    }    pub fn snapshot(        self: *const Ledger,    ) SnapshotError!?schema.GenerationInput {        try self.requireOwned();        const slot = activeSlot(self.loadSlots()) orelse return null;        return inputView(            self.storage,            self.slotLayout(slot),        );    }    pub fn projectionScratch(        self: *Ledger,    ) ScratchError!ProjectionScratch {        try self.requireOwned();        const visited_end = self.capacity.layout.visited +            self.capacity.nodes;        return .{            .visited = self.storage[self.capacity.layout.visited..visited_end],            .queue = sliceAt(                u32,                self.storage,                self.capacity.layout.queue,                self.capacity.nodes,            ),        };    }    pub fn receiptScratch(self: *Ledger) ScratchError![]u8 {        try self.requireOwned();        const end = self.capacity.layout.receipt +            self.capacity.receipt_bytes;        return self.storage[self.capacity.layout.receipt..end];    }    pub fn deinit(self: *Ledger) Storage {        self.requireOwned() catch unreachable;        const state = self.loadSlots();        if (stagedSlot(state) != null) {            self.storeSlots(encodeSlots(activeSlot(state), null));        }        self.sharedHeader().phase = .teardown;        self.phase = .teardown;        const storage = self.storage;        self.* = undefined;        return storage;    }    fn validateGeneration(        self: *const Ledger,        active: ?Slot,        generation: schema.GenerationId,    ) (ValidationError || Exhaustion)!void {        if (active) |slot| {            const current = self.slotHeader(slot).generation;            if (current == std.math.maxInt(schema.GenerationId)) {                return error.GenerationExhausted;            }            if (generation != current + 1) {                return error.GenerationOutOfOrder;            }            return;        }        if (generation == 0) return error.GenerationOutOfOrder;    }    fn requireOwned(self: *const Ledger) OwnerError!void {        const header = self.sharedHeaderConst();        if (self.phase != .steady or header.phase != .steady) {            return error.InvalidPhase;        }        std.debug.assert(header.magic == header_magic);        if (header.self_address != @intFromPtr(self)) {            return error.CopiedOwner;        }    }    fn sharedHeader(self: *Ledger) *Header {        return pointerAt(            Header,            self.storage,            self.capacity.layout.header,        );    }    fn sharedHeaderConst(self: *const Ledger) *const Header {        return constPointerAt(            Header,            self.storage,            self.capacity.layout.header,        );    }    fn slotHeader(self: *const Ledger, slot: Slot) *const SlotHeader {        return constPointerAt(            SlotHeader,            self.storage,            self.slotLayout(slot).header,        );    }    fn slotLayout(self: *const Ledger, slot: Slot) limits.SlotLayout {        return self.capacity.layout.slots[@backingInt(slot)];    }    fn loadSlots(self: *const Ledger) u8 {        return @atomicLoad(            u8,            &self.sharedHeaderConst().slot_state,            .acquire,        );    }    fn storeSlots(self: *Ledger, state: u8) void {        @atomicStore(            u8,            &self.sharedHeader().slot_state,            state,            .release,        );    }};
Called byCallstest sourcelib.closure.src.ledger.storetest: closure ledger accepts exact an...test sourcelib.closure.src.ledger.storetest: closure ledger copied owner and...test sourcelib.closure.src.ledger.storetest: closure ledger exposes disjoint...private sourcelib.closure.src.ledger.store.LedgersharedHeaderledger.Ledgeractivate
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.closure.src.ledger.storetest: closure ledger abandons staged ...test sourcelib.closure.src.ledger.storetest: closure ledger accepts exact an...test sourcelib.closure.src.ledger.storetest: closure ledger admits canonical...test sourcelib.closure.src.ledger.storetest: closure ledger admits every occ...test sourcelib.closure.src.ledger.storetest: closure ledger copied owner and...+10 moreprivate sourcelib.closure.src.ledger.store.LedgerloadSlotsprivate sourcelib.closure.src.ledger.store.LedgerrequireOwnedprivate sourcelib.closure.src.ledger.store.LedgersharedHeaderprivate sourcelib.closure.src.ledger.store.LedgerstoreSlotsprivate sourcelib.closure.src.ledger.storeactiveSlot+2 moreledger.Ledgerdeinit
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsprivate sourcelib.closure.src.ledger.storeinitializeTestLedgertest sourcelib.closure.src.ledger.storetest: closure ledger accepts exact an...test sourcelib.closure.src.ledger.storetest: closure ledger copied owner and...test sourcelib.closure.src.ledger.storetest: closure ledger exposes disjoint...private sourcelib.closure.src.ledger.storeencodeSlotsprivate sourcelib.closure.src.ledger.storepointerAtledger.Ledgerinit
Static calls · unresolved targets: 1 · external targets: 0.
Called byCallstest sourcelib.closure.src.ledger.storetest: closure ledger abandons staged ...test sourcelib.closure.src.ledger.storetest: closure ledger admits canonical...test sourcelib.closure.src.ledger.storetest: closure ledger admits every occ...test sourcelib.closure.src.ledger.storetest: closure ledger copied owner and...test sourcelib.closure.src.ledger.storetest: closure ledger generation rejec...+3 moreprivate sourcelib.closure.src.ledger.store.LedgerloadSlotsprivate sourcelib.closure.src.ledger.store.LedgerrequireOwnedprivate sourcelib.closure.src.ledger.store.LedgerslotLayoutprivate sourcelib.closure.src.ledger.store.LedgerstoreSlotsprivate sourcelib.closure.src.ledger.store.LedgervalidateGeneration+7 moreledger.Ledgerprepare
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.closure.src.ledger.storetest: closure ledger exposes disjoint...private sourcelib.closure.src.ledger.store.LedgerrequireOwnedprivate sourcelib.closure.src.ledger.storesliceAtledger.LedgerprojectionScratch
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.closure.src.ledger.storetest: closure ledger abandons staged ...test sourcelib.closure.src.ledger.storetest: closure ledger admits canonical...test sourcelib.closure.src.ledger.storetest: closure ledger admits every occ...test sourcelib.closure.src.ledger.storetest: closure ledger copied owner and...test sourcelib.closure.src.ledger.storetest: closure ledger generation rejec...+3 moreprivate sourcelib.closure.src.ledger.store.LedgerloadSlotsprivate sourcelib.closure.src.ledger.store.LedgerrequireOwnedprivate sourcelib.closure.src.ledger.store.LedgerstoreSlotsprivate sourcelib.closure.src.ledger.storeactiveSlotprivate sourcelib.closure.src.ledger.storeencodeSlotsprivate sourcelib.closure.src.ledger.storestagedSlotledger.Ledgerpublish
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.closure.src.ledger.storetest: closure ledger exposes disjoint...private sourcelib.closure.src.ledger.store.LedgerrequireOwnedledger.LedgerreceiptScratch
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.closure.src.ledger.storetest: closure ledger abandons staged ...test sourcelib.closure.src.ledger.storetest: closure ledger copied owner and...private sourcelib.closure.src.ledger.store.LedgerloadSlotsprivate sourcelib.closure.src.ledger.store.LedgerrequireOwnedprivate sourcelib.closure.src.ledger.store.LedgerstoreSlotsprivate sourcelib.closure.src.ledger.storeactiveSlotprivate sourcelib.closure.src.ledger.storeencodeSlotsprivate sourcelib.closure.src.ledger.storestagedSlotledger.Ledgerrecover
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.closure.src.ledger.storetest: closure ledger abandons staged ...test sourcelib.closure.src.ledger.storetest: closure ledger accepts exact an...test sourcelib.closure.src.ledger.storetest: closure ledger admits canonical...test sourcelib.closure.src.ledger.storetest: closure ledger admits every occ...test sourcelib.closure.src.ledger.storetest: closure ledger copied owner and...+3 moreprivate sourcelib.closure.src.ledger.store.LedgerloadSlotsprivate sourcelib.closure.src.ledger.store.LedgerrequireOwnedprivate sourcelib.closure.src.ledger.store.LedgerslotLayoutprivate sourcelib.closure.src.ledger.storeactiveSlotprivate sourcelib.closure.src.ledger.storeinputViewledger.Ledgersnapshot
Static calls · unresolved targets: 0 · external targets: 0.

Source: lib/closure/src/ledger/root.zig

zig
const store = @import("store.zig");pub const Ledger = store.Ledger;

Source: lib/closure/src/root.zig:14

zig
pub const ledger = @import("ledger/root.zig");

Complete caller list for ledger.Ledger.deinit

15 direct callers.

Complete call list for ledger.Ledger.deinit

7 direct calls.

Complete caller list for ledger.Ledger.prepare

8 direct callers.

Complete call list for ledger.Ledger.prepare

12 direct calls.

Complete caller list for ledger.Ledger.publish

8 direct callers.

Complete caller list for ledger.Ledger.snapshot

8 direct callers.

Audit

Definitions25
Public names25
Members3
Version26.7.0
Revisiondaab053ee433