Deterministic contract author guide
Writing Borz contracts for the Ephernity ledger requires two guarantees beyond a plain Borz program: compile-time determinism enforcement and declared resource bounds. This guide covers both.
Guide in preparation
The full guide covers @deterministic compile-time
enforcement, @meter_budget resource envelopes,
the EXT-001..011 stdlib surface available to contract authors, and the three
known dialect ergonomics. It is being prepared for publication.
Full spec reference: /spec.md
§7 (Annotations) + §15.6 (stdlib).
@deterministic
Placing @deterministic on an actor tells the
compiler to reject any handler that calls wall clocks, f64
literals, unordered map iteration, random functions, cross-actor sends, or
inline FFI. Every replica that runs the same handler on the same state must
produce an identical state transition.
@meter_budget
@meter_budget(cpu_us=N, mem_kb=N) declares the
per-call resource envelope. The DELIGHT KVM supervisor enforces these limits
at runtime — a handler that exceeds its declared budget is terminated and the
call is rejected before it can affect ledger state.
EXT-001..011 — what contract authors may use
The eleven language extensions shipped as of Borz v0.9.5 define the stdlib surface
available inside a @deterministic actor:
bytes for binary payloads (EXT-001),
Decimal / BigInt for
currency and crypto counters without float loss (EXT-002..003), three-source time
including ledger_now() (EXT-004), deterministic sorted
map/set iteration (EXT-005..006), @canonical for
byte-identical cross-target encoding (EXT-007..008), DENSE C++ backend for
bytes/u32 on the ledger
(EXT-009), std/blake3 + Ed25519 signing with
byte-identical DENSE/native output (EXT-010), and the
@deterministic decorator itself (EXT-011).