lib/machine/src/fabric/snapshot/schema.zig
daab053ee43316e1809a84551d573ddd1e5bf3d2
1 const fabric = @import("../root.zig");
2 const os = @import("os");
3 const std = @import("std");
4
5 pub const magic = [8]u8{ 'M', 'C', 'H', 'F', 'A', 'B', '1', 0 };
6 pub const version: u16 = 1;
7 pub const flags: u16 = 0;
8 pub const format: u16 = 1;
9 pub const stream_bytes: usize = 8192;
10 pub const digest_bytes: u16 = os.abi.wire.digest_bytes;
11 pub const root_bytes: u16 = 96;
12 pub const state_header_bytes: u16 = 160;
13 pub const node_bytes: u16 = 208;
14 pub const packet_bytes: u16 = 256;
15 pub const packet_payload_bytes: u16 = fabric.packet_bytes_max;
16
17 pub const Envelope = struct {
18 pub const magic_offset: usize = 0;
19 pub const version_offset: usize = 8;
20 pub const stream_bytes_offset: usize = 10;
21 pub const flags_offset: usize = 12;
22 pub const format_offset: usize = 14;
23 pub const dialect_offset: usize = 16;
24 pub const node_capacity_offset: usize = 18;
25 pub const packet_capacity_offset: usize = 20;
26 pub const node_bytes_offset: usize = 22;
27 pub const packet_bytes_offset: usize = 24;
28 pub const packet_payload_bytes_offset: usize = 26;
29 pub const digest_bytes_offset: usize = 28;
30 pub const root_bytes_offset: usize = 30;
31 pub const state_header_bytes_offset: usize = 32;
32 pub const reserved_offset: usize = 34;
33 pub const limit: usize = 64;
34 };
35
36 pub const RootLayout = struct {
37 pub const digest_offset: usize = Envelope.limit;
38 pub const contract_offset: usize = digest_offset + digest_bytes;
39 pub const entry_frontier_offset: usize = contract_offset + digest_bytes;
40 pub const admission_frontier_offset: usize = entry_frontier_offset + 8;
41 pub const fault_frontier_offset: usize = admission_frontier_offset + 8;
42 pub const dialect_offset: usize = fault_frontier_offset + 8;
43 pub const reserved_offset: usize = dialect_offset + 2;
44 pub const limit: usize = Envelope.limit + root_bytes;
45 };
46
47 pub const StateLayout = struct {
48 pub const world_offset: usize = RootLayout.limit;
49 pub const node_count_offset: usize = world_offset + 16;
50 pub const packet_count_offset: usize = node_count_offset + 1;
51 pub const partition_bits_offset: usize = packet_count_offset + 1;
52 pub const capacity_bits_offset: usize = partition_bits_offset + 1;
53 pub const first_reserved_offset: usize = capacity_bits_offset + 1;
54 pub const virtual_time_offset: usize = first_reserved_offset + 4;
55 pub const entropy_frontier_offset: usize = virtual_time_offset + 8;
56 pub const entropy_bytes_offset: usize = entropy_frontier_offset + 8;
57 pub const packet_next_id_offset: usize = entropy_bytes_offset + 8;
58 pub const entry_frontier_offset: usize = packet_next_id_offset + 8;
59 pub const admission_frontier_offset: usize = entry_frontier_offset + 8;
60 pub const fault_frontier_offset: usize = admission_frontier_offset + 8;
61 pub const admission_limit_offset: usize = fault_frontier_offset + 8;
62 pub const second_reserved_offset: usize = admission_limit_offset + 4;
63 pub const ledger_digest_offset: usize = second_reserved_offset + 4;
64 pub const fault_digest_offset: usize = ledger_digest_offset + digest_bytes;
65 pub const third_reserved_offset: usize = fault_digest_offset + digest_bytes;
66 pub const limit: usize = RootLayout.limit + state_header_bytes;
67 };
68
69 pub const NodeLayout = struct {
70 pub const id_offset: usize = 0;
71 pub const contract_offset: usize = id_offset + 16;
72 pub const source_root_offset: usize = contract_offset + digest_bytes;
73 pub const input_frontier_offset: usize = source_root_offset + digest_bytes;
74 pub const terminal_input_offset: usize = input_frontier_offset + 8;
75 pub const virtual_time_offset: usize = terminal_input_offset + 8;
76 pub const entropy_offset: usize = virtual_time_offset + 8;
77 pub const effect_offset: usize = entropy_offset + 8;
78 pub const request_present_offset: usize = effect_offset + 8;
79 pub const first_reserved_offset: usize = request_present_offset + 1;
80 pub const request_receipt_offset: usize = first_reserved_offset + 7;
81 pub const request_correlation_offset: usize = request_receipt_offset + digest_bytes;
82 pub const machine_kind_offset: usize = request_correlation_offset + 8;
83 pub const available_offset: usize = machine_kind_offset + 1;
84 pub const second_reserved_offset: usize = available_offset + 1;
85 pub const machine_digest_offset: usize = second_reserved_offset + 6;
86 pub const limit: usize = node_bytes;
87 };
88
89 pub const PacketLayout = struct {
90 pub const id_offset: usize = 0;
91 pub const source_offset: usize = id_offset + 8;
92 pub const destination_offset: usize = source_offset + 16;
93 pub const channel_offset: usize = destination_offset + 16;
94 pub const length_offset: usize = channel_offset + 2;
95 pub const ready_offset: usize = length_offset + 2;
96 pub const reserved_offset: usize = ready_offset + 1;
97 pub const request_receipt_offset: usize = reserved_offset + 3;
98 pub const request_correlation_offset: usize = request_receipt_offset + digest_bytes;
99 pub const ready_at_offset: usize = request_correlation_offset + 8;
100 pub const order_offset: usize = ready_at_offset + 8;
101 pub const digest_offset: usize = order_offset + 8;
102 pub const storage_offset: usize = digest_offset + digest_bytes;
103 pub const limit: usize = packet_bytes;
104 };
105
106 pub const nodes_offset: usize = StateLayout.limit;
107 pub const packets_offset: usize = nodes_offset + fabric.node_limit * node_bytes;
108 pub const material_limit: usize = packets_offset + fabric.packet_limit * packet_bytes;
109
110 comptime {
111 std.debug.assert(stream_bytes <= std.math.maxInt(u16));
112 std.debug.assert(fabric.node_limit <= std.math.maxInt(u16));
113 std.debug.assert(fabric.packet_limit <= std.math.maxInt(u16));
114 std.debug.assert(fabric.packet_bytes_max <= std.math.maxInt(u16));
115 std.debug.assert(@backingInt(fabric.Dialect.ordered_effect_fabric_v3) == 3);
116 std.debug.assert(RootLayout.reserved_offset == 154);
117 std.debug.assert(RootLayout.limit == 160);
118 std.debug.assert(StateLayout.third_reserved_offset == 312);
119 std.debug.assert(StateLayout.limit == 320);
120 std.debug.assert(NodeLayout.limit == 208);
121 std.debug.assert(PacketLayout.storage_offset + packet_payload_bytes == packet_bytes);
122 std.debug.assert(material_limit == 4992);
123 std.debug.assert(material_limit <= stream_bytes);
124 }