tiny.closure.ledger
Defined in tiny.closure.
API (24)
Actions
Public operations.
Ledger.activateLedger.deinitLedger.initLedger.prepareLedger.projectionScratchLedger.publishLedger.receiptScratchLedger.recoverLedger.snapshot
Types and contracts
Public types and contracts.
LedgerLedger.CapacityLedger.ExhaustionLedger.InitErrorLedger.LimitsLedger.PrepareErrorLedger.ProjectionScratchLedger.PublishErrorLedger.RecoveryErrorLedger.ScratchErrorLedger.SnapshotErrorLedger.Storage
Values and defaults
Public values and defaults.
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, ); }};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.
lib.closure.src.ledger.store.test_closure_ledger_abandons_staged_owner_death_exactly_once[function] — test source atlib/closure/src/ledger/store.zig:1866in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.test_closure_ledger_accepts_exact_and_extra_storage[function] — test source atlib/closure/src/ledger/store.zig:1432in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.test_closure_ledger_admits_canonical_required_profiles[function] — test source atlib/closure/src/ledger/store.zig:1755in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.test_closure_ledger_admits_every_occupancy_at_capacity[function] — test source atlib/closure/src/ledger/store.zig:1499in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.test_closure_ledger_copied_owner_and_invalid_phase_reject_atomically[function] — test source atlib/closure/src/ledger/store.zig:1835in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.test_closure_ledger_exposes_disjoint_bounded_projection_and_receipt_scratch[function] — test source atlib/closure/src/ledger/store.zig:1477in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.test_closure_ledger_generation_rejection_preserves_equivalent_state[function] — test source atlib/closure/src/ledger/store.zig:1803in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.test_closure_ledger_generation_slots_retain_stable_addresses[function] — test source atlib/closure/src/ledger/store.zig:1923in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.test_closure_ledger_prepare_and_publish_retain_the_prior_generation[function] — test source atlib/closure/src/ledger/store.zig:1775in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.test_closure_ledger_rejects_claims_profiles_and_byte_ranges_atomically[function] — test source atlib/closure/src/ledger/store.zig:1650in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.test_closure_ledger_rejects_every_occupancy_maximum_plus_one_atomically[function] — test source atlib/closure/src/ledger/store.zig:1517in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.test_closure_ledger_rejects_invalid_canonical_references_atomically[function] — test source atlib/closure/src/ledger/store.zig:1596in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.test_closure_ledger_rejects_malformed_text_masks_and_bindings_atomically[function] — test source atlib/closure/src/ledger/store.zig:1707in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.test_closure_ledger_rejects_noncanonical_table_records_atomically[function] — test source atlib/closure/src/ledger/store.zig:1563in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.test_closure_ledger_reports_generation_exhaustion_before_mutation[function] — test source atlib/closure/src/ledger/store.zig:1904in nearest public ownerlib.closure.src.ledger.store
Complete call list for ledger.Ledger.deinit
7 direct calls.
lib.closure.src.ledger.store.Ledger.loadSlots[method] — private source atlib/closure/src/ledger/store.zig:414in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.Ledger.requireOwned[method] — private source atlib/closure/src/ledger/store.zig:375in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.Ledger.sharedHeader[method] — private source atlib/closure/src/ledger/store.zig:386in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.Ledger.storeSlots[method] — private source atlib/closure/src/ledger/store.zig:422in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.activeSlot[function] — private source atlib/closure/src/ledger/store.zig:1092in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.encodeSlots[function] — private source atlib/closure/src/ledger/store.zig:1087in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.stagedSlot[function] — private source atlib/closure/src/ledger/store.zig:1096in nearest public ownerlib.closure.src.ledger.store
Complete caller list for ledger.Ledger.prepare
8 direct callers.
lib.closure.src.ledger.store.test_closure_ledger_abandons_staged_owner_death_exactly_once[function] — test source atlib/closure/src/ledger/store.zig:1866in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.test_closure_ledger_admits_canonical_required_profiles[function] — test source atlib/closure/src/ledger/store.zig:1755in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.test_closure_ledger_admits_every_occupancy_at_capacity[function] — test source atlib/closure/src/ledger/store.zig:1499in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.test_closure_ledger_copied_owner_and_invalid_phase_reject_atomically[function] — test source atlib/closure/src/ledger/store.zig:1835in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.test_closure_ledger_generation_rejection_preserves_equivalent_state[function] — test source atlib/closure/src/ledger/store.zig:1803in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.test_closure_ledger_generation_slots_retain_stable_addresses[function] — test source atlib/closure/src/ledger/store.zig:1923in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.test_closure_ledger_prepare_and_publish_retain_the_prior_generation[function] — test source atlib/closure/src/ledger/store.zig:1775in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.test_closure_ledger_reports_generation_exhaustion_before_mutation[function] — test source atlib/closure/src/ledger/store.zig:1904in nearest public ownerlib.closure.src.ledger.store
Complete call list for ledger.Ledger.prepare
12 direct calls.
lib.closure.src.ledger.store.Ledger.loadSlots[method] — private source atlib/closure/src/ledger/store.zig:414in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.Ledger.requireOwned[method] — private source atlib/closure/src/ledger/store.zig:375in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.Ledger.slotLayout[method] — private source atlib/closure/src/ledger/store.zig:410in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.Ledger.storeSlots[method] — private source atlib/closure/src/ledger/store.zig:422in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.Ledger.validateGeneration[method] — private source atlib/closure/src/ledger/store.zig:357in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.activeSlot[function] — private source atlib/closure/src/ledger/store.zig:1092in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.copyInput[function] — private source atlib/closure/src/ledger/store.zig:814in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.encodeSlots[function] — private source atlib/closure/src/ledger/store.zig:1087in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.inactiveSlot[function] — private source atlib/closure/src/ledger/store.zig:1080in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.stagedSlot[function] — private source atlib/closure/src/ledger/store.zig:1096in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.validateCanonical[function] — private source atlib/closure/src/ledger/store.zig:468in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.validateOccupancy[function] — private source atlib/closure/src/ledger/store.zig:432in nearest public ownerlib.closure.src.ledger.store
Complete caller list for ledger.Ledger.publish
8 direct callers.
lib.closure.src.ledger.store.test_closure_ledger_abandons_staged_owner_death_exactly_once[function] — test source atlib/closure/src/ledger/store.zig:1866in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.test_closure_ledger_admits_canonical_required_profiles[function] — test source atlib/closure/src/ledger/store.zig:1755in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.test_closure_ledger_admits_every_occupancy_at_capacity[function] — test source atlib/closure/src/ledger/store.zig:1499in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.test_closure_ledger_copied_owner_and_invalid_phase_reject_atomically[function] — test source atlib/closure/src/ledger/store.zig:1835in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.test_closure_ledger_generation_rejection_preserves_equivalent_state[function] — test source atlib/closure/src/ledger/store.zig:1803in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.test_closure_ledger_generation_slots_retain_stable_addresses[function] — test source atlib/closure/src/ledger/store.zig:1923in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.test_closure_ledger_prepare_and_publish_retain_the_prior_generation[function] — test source atlib/closure/src/ledger/store.zig:1775in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.test_closure_ledger_reports_generation_exhaustion_before_mutation[function] — test source atlib/closure/src/ledger/store.zig:1904in nearest public ownerlib.closure.src.ledger.store
Complete caller list for ledger.Ledger.snapshot
8 direct callers.
lib.closure.src.ledger.store.test_closure_ledger_abandons_staged_owner_death_exactly_once[function] — test source atlib/closure/src/ledger/store.zig:1866in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.test_closure_ledger_accepts_exact_and_extra_storage[function] — test source atlib/closure/src/ledger/store.zig:1432in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.test_closure_ledger_admits_canonical_required_profiles[function] — test source atlib/closure/src/ledger/store.zig:1755in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.test_closure_ledger_admits_every_occupancy_at_capacity[function] — test source atlib/closure/src/ledger/store.zig:1499in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.test_closure_ledger_copied_owner_and_invalid_phase_reject_atomically[function] — test source atlib/closure/src/ledger/store.zig:1835in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.test_closure_ledger_generation_rejection_preserves_equivalent_state[function] — test source atlib/closure/src/ledger/store.zig:1803in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.test_closure_ledger_generation_slots_retain_stable_addresses[function] — test source atlib/closure/src/ledger/store.zig:1923in nearest public ownerlib.closure.src.ledger.storelib.closure.src.ledger.store.test_closure_ledger_prepare_and_publish_retain_the_prior_generation[function] — test source atlib/closure/src/ledger/store.zig:1775in nearest public ownerlib.closure.src.ledger.store
Audit
| Definitions | 25 |
|---|---|
| Public names | 25 |
| Members | 3 |
| Version | 26.7.0 |
| Revision | daab053ee433 |