The Network Behind the Specification
This editorial is an interpretation, and it is the second half of one. Our earlier reading sorted the 2020 Network of Momentum whitepaper into three bins and stopped there, closing with the line “it describes no implementation.” That was the honest limit of a paper-only reading. It is also the easier half. A specification that is never measured against a running network is a document, not a standard.
So this version keeps the extraction and adds the measurement. Every
mechanism the paper requires now carries a second badge recording what the
shipped Alphanet does about it, and every one of those verdicts names a path
in go-zenon that a reader can check. The reading is ours; the paper and the
code are the record.
ZENOAbout these notes — three bins meet a real spec
The Zeno spec (v1.6.0) specifies off-chain WASM execution on Zenon, and it was written the way the NOM above prescribes: specification first, normative, independent of any codebase. Zeno and Phase 1 are not synonyms: Zeno is the specification, laid out across a three-phase roadmap; Phase 1 — a single bonded executor, attestation only — is the one phase currently active, with every later capability specified but reserved. The spec carries its own three-way schema, and the mapping to this article’s bins is direct: OUTCOMES corresponds to the guarantees its trust model lists as executor-independent; ARCHITECTURE to its Normative clauses (RFC 2119 MUST / SHOULD / MAY); OPEN to its Informative commentary, Deferred items, reserved values, and pre-mainnet parameters. White notes like this one appear wherever Zeno makes a decision on something the whitepaper left open, diverges from it, or extends it.
ALPHANETAbout these notes — and how they were produced
Amber notes report what the running network does, against
go-zenon at tag v0.0.8-alphanet, commit 667a69d, read on 15-Aug-26.
The repository describes itself as “Reference Golang implementation of the
Alphanet - Network of Momentum Phase 0.”
Where a note says a mechanism is absent, that means a case-insensitive
search of the whole repository returns no occurrence of it. The terms
virtual voting, meta-dag, supermajority, quorum, coin round,
pow link, unikernel, sentry, bft and byzantine all return
nothing. The single hit for zapp is a coincidental substring inside a
genesis address.
This asymmetry is deliberate. A specification outranks any codebase, which is the NOM’s whole argument — so a claim about the codebase has to be falsifiable in a way a claim about the paper does not. Every verdict below names its path.
About this document
Why measure at all
A protocol implemented before it is independently specified can make its first implementation authoritative by accident. Undocumented behavior hardens into de facto rules, and the line between what the protocol requires, what a given implementation chose as policy, and what is mere implementation detail goes blurry.
Extraction is the first defense: fix the specification, so a codebase can be measured against the paper rather than the paper retrofitted to a codebase. But extraction alone leaves the second failure mode untouched. If nobody performs the comparison, a specification and an implementation can drift apart indefinitely while both remain in good standing — the paper describing a network that does not exist, the network running rules nobody wrote down. The measurement is what keeps the two honest about each other.
What follows finds that drift is wide. Read one way that is an indictment. Read another, and most of it is substitution rather than shortfall: the network kept the paper’s jobs and changed the machinery doing them, usually for something simpler. Both readings are available below. The distinction that matters is which clauses were substituted, which were left standing empty, and which were quietly answered by an implementation that got there first.
Bin one
Guaranteed outcomes
The paper states its guarantees as six theorems, proved in its appendix. It calls these the conformance surface: an implementation that fails any of them is not running the protocol, whatever else it does.
All but one of them are quantified over a supermajority of honest consensus nodes, ζ = 2N/3 + 1. That quantity does not exist in the shipped network. The second badge on each card below therefore records something narrower than pass or fail — whether the guarantee, as stated, is delivered by the mechanism the paper names for it.
A transaction submitted to any honest node reaches all honest nodes, absent an active denial of service.
No double spend settles while an honest supermajority of consensus nodes holds.
Once one honest node concludes on a transaction, every honest node reaches the same conclusion.
The network agrees on a total ordering of transactions as long as byzantine participants stay under one third.
Transaction processing time grows sublinearly as the number of consensus nodes grows.
A confirmed transaction remains confirmed forever, regardless of later byzantine action.
ALPHANETThe theorems are not failed — most are not evaluable
The network does not double-spend, does not stall, and has settled transactions continuously since 2021. T1 through T4 describe outcomes it broadly delivers.
But it does not deliver them the way the paper proves they are delivered.
The proofs range over a stake-weighted supermajority, and there is no
quorum anywhere in the implementation. Fork choice is longest-chain, with
a rollback cap of 30 momentums (protocol/chain_bridge.go:153-179), and
there is no finality gadget of any kind. So T6’s forever becomes
probabilistic confirmation depth — a weaker claim of a different type, not
a weaker version of the same claim. An operator choosing a confirmation
depth is making a risk judgment the paper says they should not have to
make.
T5 is the one that goes the other way: the implementation answers it, and answers it with the ledger rather than the consensus. The paper’s own scalability goal is non-degradation, not improvement — “optimal confirmation times for non-conflicting transactions, even if the number of nodes is constantly increasing.” That is what a block-lattice is for. Non-conflicting transactions sit on independent account chains and never contend; consensus settles the momentum chain, not the accounts. Adding pillars changes who produces, not how long a transaction takes. The mechanism the paper names for this theorem is also the one it built closest to the drawing.
System-wide posture
- Under the CAP constraint, the protocol chooses partition tolerance and eventual consistency over availability: a query may need retries before it returns the current state, but the state it returns converges for everyone.
- The hard operating condition: honest consensus nodes must number at least twice the malicious nodes plus one. The paper names this the vital condition for the network to function.
Bin two
Required mechanisms
The dual ledger
The paper requires two ledgers with distinct roles. Consensus data and transaction data never share a structure.
- Block-lattice stores settled transactions. Every account is its own chain, updated independently; send and receive are separate transactions that pair across chains.
- Meta-DAG carries the consensus record: the finishing-PoW transactions, epoch markers, and message history from which ordering is derived.
- Only full nodes hold both ledgers; light participants hold the transaction ledger or a pruned view of it.
ALPHANETOne ledger shipped as drawn; the other is a chain
The block-lattice is real and close to the specification
(chain/nom/account_block.go:82): independent per-account chains,
asymmetric send and receive block types, receives naming the send they
settle. It adds one thing the paper does not describe — every account
block carries a MomentumAcknowledged reference upward, which the
verifier requires to be monotonically non-decreasing
(verifier/account_block.go:282-320).
The meta-DAG did not ship at all. What sits in its place is a linear
blockchain: Momentum has a single PreviousHash and Height
(chain/nom/momentum.go:32), the verifier requires each momentum’s
previous to be the current frontier, and momentum content is a flat sorted
list of account-block references — no parent set, no graph edges.
The separation principle survives, which is what the paper was really after. The structure that was supposed to enforce it does not.
Node roles
- Sentries observe. They hold the transaction ledger or a pruned version and monitor traffic for specific accounts.
- Sentinels relay and protect. They build PoW links on user transactions and answer queries, without voting.
- Pillars order. They run the consensus algorithm and hold both ledgers. Roles are acquired by locking stake.
ALPHANETOf three roles, one shipped, one is a name, one was never written
Pillars are real and do order the ledger. The other two did not survive contact with the implementation.
Sentries do not exist. The word appears nowhere in the repository.
Sentinels are registered, collateralised, paid, and idle. The contract
exposes exactly six methods — register, revoke, update, deposit QSR,
withdraw QSR, collect reward (vm/embedded/implementation/sentinel.go) —
and sentinel identity is never referenced in p2p/, protocol/,
consensus/, or verifier/. There is no relay duty, no query service, no
PoW link, because there are no PoW links. Registration costs 5,000 ZNN and
50,000 QSR, and the tier collects 13% of ZNN and 25% of QSR emissions
(vm/constants/embedded.go:139,144).
One detail is worth reading closely. getWeightedSentinel
(sentinel.go:191-205) carries the comment “returns 0/1 depending on
whenever the sentinel has a 90% percent uptime,” but the function measures
only how much of the epoch the registration timestamp spans. No liveness
is sampled and no service is proven, so a sentinel that has never been
online is paid exactly what an attentive one is paid.
This is the clearest placeholder in the system: a funded tier holding a slot for a job the paper described and the network never assigned.
PoW links: spam and sybil defense at the edge
Before a transaction reaches consensus, sentinels must chain proof of work onto it:
- A user disseminates a transaction to a logarithmic number of sentinels, which defends against eclipse attacks.
- Each sentinel adds a small PoW computation plus its signature, then relays to another random sentinel. One signature per key pair per transaction.
- A minimum of three hops is required; relaying continues until accumulated weight clears a difficulty-set threshold, then the transaction goes to a pseudorandomly chosen pillar.
- The accumulated link weight also serves consensus: it is the first criterion for choosing between two conflicting transactions in a double spend.
ALPHANETPlasma is the PoW link with the hops removed
Plasma is usually described as one of Alphanet’s inventions. Read against this section it is better described as an inheritance.
The PoW link had three jobs: pay for admission, add sybil-resistant
weight, and break ties between conflicting transactions. Plasma does all
three. The work is the same kind of work — SHA3-256 over a nonce and a
hash of address and previous block (pow/pow.go:14-16) — moved from the
relay chain onto the sender’s own account block, with the hop count
collapsed to zero. A sender who would rather not compute fuses QSR
instead (vm/embedded/implementation/plasma.go), which is the genuinely
new part.
The third job survived almost verbatim. Conflicting account-chain blocks
are resolved on “biggest TotalPlasma/BasePlasma, then smallest hash”
(chain/interface.go:52-55) — the paper’s accumulated link weight, then
its hash tiebreak, under a different name.
Removing the hops is also what emptied the sentinel tier. Sentinels had exactly one protocol duty in the paper, and plasma absorbed it.
ZENOPlasma took the PoW link's job
The sentinel relay chain never shipped as drawn. On the network as built, admission cost is plasma — proof of work or fused QSR per account-block — and the Zeno spec builds on that instead: its inputs are ordinary account-blocks, “data + plasma only,” and a full 16 KiB input costs more plasma than PoW alone can supply, so it requires fused QSR — “feeless-but-rate-limited exactly like all L1 traffic.” The spec also splits what the paper’s single weight mechanism combined: L1 plasma pays for admission and is governed entirely by L1 rules, while L2 execution gas is a separate ledger metered off-chain, and the two must not be conflated — L1 cannot meter WASM without running it, which the spec forbids.
Consensus: epochs and virtual voting
Consensus is leaderless. No vote messages exist on the wire; each pillar derives the same ordering from the message history it has received.
- Time divides into epochs. During each epoch, every pillar computes a proof of work at adjustable difficulty while collecting transactions from sentinels.
- A pillar that finishes broadcasts a finishing-PoW transaction carrying everything it knows. A pillar advances to the next epoch after hearing finishing PoWs from a stake-weighted supermajority: ζ = 2N/3 + 1.
- A pillar that hears ζ before finishing its own PoW must abandon it, broadcast its transactions, and advance. This keeps epochs synchronized and rewards only competitive work.
- Once a pillar holds a supermajority view of an epoch’s transactions, it orders them by deterministic rules: PoW link weight, then arrival timestamp, then transaction hash. Identical inputs produce identical orderings at every honest node, which is the whole vote.
- Confirmation takes no fewer than three epochs from submission to settled order.
- If epochs stall without conclusion, honest pillars vote randomly in a shared coin round, which drives the probability of consensus to one against an attacker controlling the network.
ALPHANETA rota, not a vote
None of this shipped. There is no virtual voting, no epoch PoW, no finishing-PoW transaction, no supermajority, and no coin round. The mechanism in their place is a rota.
Time divides into ticks of 300 seconds, each holding thirty 10-second
slots (vm/constants/consensus.go:16-17). One pillar is assigned per slot,
and GetMomentumProducer returns exactly that one
(consensus/consensus.go:73-94); the verifier rejects a momentum signed
by anyone else (verifier/momentum.go:266-275). The producer set is
chosen by sorting pillars on delegated ZNN, taking 15 from the top 30 and
15 at random from everyone else, then shuffling into slot order
(consensus/election_algorithm.go).
The word epoch survives, attached to something else entirely: a 24-hour
reward accounting period (consensus/consensus.go:20). Nothing about it
is a consensus round.
What this buys is simplicity and a 10-second block time. What it gives up is the paper’s entire safety argument, which was the reason for the complexity.
ZENOThe ordering rule that actually shipped
The paper’s ordering rules are introduced with “such as” — link weight, then timestamp, then hash. The chain as built orders differently: momentum height ascending, then within a momentum the ascending lexicographic order of address ‖ height ‖ hash, an order already committed inside the momentum hash. The Zeno spec pins exactly that as canonical — verifiable from L1 with no new derivation — and forbids every alternative, “by account-block hash alone, fee, plasma, input type, or originator.” This is the reading note’s scenario arriving on schedule: an illustrative clause got its ruling from the implementation, and the spec’s job was to write the ruling down and freeze it. The confirmation discipline carries over too: the executor may consume inputs only from confirmed momenta, so an L1 reorganization can never reorder its stream.
The seed the schedule turns on
Half of each tick’s producer slots are drawn at random, which makes the source of that randomness a protocol-critical parameter. The paper does not specify one, because it has no producer schedule to seed. The 2018 lightpaper does: it calls for VRF-based, bias-resistant committee selection.
ALPHANETmath/rand, seeded on the block height
findSeed (consensus/election_algorithm.go:38-40) returns
int64(context.hashH.Height) and that value is passed to Go’s
math/rand. There is no VRF and no hash mixing. The comment directly
above the function states that the formula “depends on seed, weights and
momentumHeight”; the code depends on the height alone.
The election also runs on a two-tick lookback — roughly ten minutes of
advance notice (consensus/election.go:139-145) — so the seed is a small
public integer that anyone can know before the schedule it produces takes
effect.
This is the one item on the page that is neither substitution nor omission. It is a specified requirement, met by an implementation detail that does not meet it, with a comment asserting otherwise. It is exactly the failure the NOM above describes: behavior that becomes protocol by shipping, in a place where nobody wrote the requirement down.
Stake and incentives the protocol depends on
- Voting weight is stake, not node count, which is the sybil defense: spawning nodes buys no consensus power.
- Stake can be delegated to pillars; staking, delegating, and unlocking are processed at epoch boundaries, and consensus nodes face an unstaking waiting period.
- Pillars are rewarded for competitive epoch PoW; sentinels consume transaction fees to fund PoW links and may charge for ledger queries.
- Fees double as denial-of-service defense: flooding sentinels costs the attacker resources that flow into the network.
ALPHANETWhere the second coin came from
The stake-weighting requirement shipped intact: delegated ZNN sets
producer frequency (vm/constants/consensus.go:19), and pillars are paid
on momentums produced against momentums expected.
The fee model did not, and this is where Alphanet’s one genuine invention sits. The paper assumes ordinary transaction fees: sentinels consume them to fund PoW links, may charge for queries, and the fees double as denial-of-service defense. It also specifies “a gas like system” for zApps. Those are two fee roles for an asset the paper never names or separates from the staking coin.
Alphanet made the second asset native. QSR is minted at genesis alongside ZNN, and carries the roles the paper split between fees and gas: fusion into plasma, staking for yield, and burn-to-register for pillars and sentinels. Nothing in the whitepaper calls for a second coin.
So of the two features usually named as Alphanet’s original contributions, the ordering is the reverse of the usual telling. Plasma is inherited engineering. The dual-coin economy is the invention.
Bin three
Left to implementation
The paper marks each of these as an example, a parameter, or deferred work. They are where implementation policy lives, and no implementation’s choice here becomes protocol by shipping first.
- Epoch duration. One minute appears only as an example. The requirement is that adjustable difficulty keeps epochs within stable time bounds; the target itself is a parameter. OPEN
- The difficulty algorithm. A self-balancing scheme switching between ASIC-friendly and ASIC-resistant hashing is described as under investigation, with detailed specification deferred. OPEN
- Penalties for byzantine pillars. Slashing-style punishment is stated as under consideration, not specified. OPEN
- PoW pooling. Pillars may outsource epoch PoW to pools. This is a market arrangement the protocol permits, not a protocol component. OPEN
- Broadcast strategy. Full pillar-to-pillar broadcast is the baseline; round-based gossip with lower message complexity is flagged as future research. OPEN
- zApps. The unikernel application layer is explicitly out of scope, deferred to a yellow paper. Nothing any implementation does with contracts or applications today is specified behavior. OPEN
- Query fees. Sentinels can charge for state queries; pricing and structure are unspecified. OPEN
ALPHANETThe open bin was filled from outside the paper
Most of these are moot: without epochs there is no epoch duration or epoch difficulty to set, and without PoW links there are no query fees to price. Byzantine penalties remain unanswered — no slashing exists.
zApps are the interesting case. The paper deferred an application layer to
a yellow paper. Alphanet shipped one anyway, in a different shape and
without a specification: eleven embedded contracts written directly in Go
(vm/embedded/implementation/), covering pillars, sentinels, plasma,
tokens, staking, swap, sporks, HTLC, an on-chain treasury, a liquidity
program, and a cross-chain bridge with a guardian set.
There is no virtual machine. The package named vm/ is a dispatcher over
a static map from address to Go method (vm/embedded/embedded.go) — no
bytecode, no interpreter, no gas loop, no deployment path. Users cannot
write contracts. One vestige survives: a three-tier plasma price list
commented as “used to query plasma used by op code,” for op codes that
were never built.
The whole of this surface — the bridge in particular, at 56 KB with its own guardian and administrator model — is larger than anything the 2020 paper contemplates. Alphanet is not a cautious subset of the whitepaper. It is a wider system that reused the vocabulary.
ZENOHow the Zeno spec spends its own open bin
zApps are the open item the Zeno spec answers. The application layer arrives not as unikernels but as WASM execution domains — off consensus, deterministic, settled through an embedded contract — the yellow-paper slot filled with a different shape than the paper sketched. Its own open bin is kept with the discipline this article argues for: pre-mainnet parameters (withdrawal delay, bond amounts, caps) are listed rather than implied; Phase 2 work (fraud proofs, slashing, DA enforcement, multi-executor sets) and Phase 3 work (validity proofs) are enumerated as explicitly out of scope; and unresolved designs are marked OPEN DESIGN and gated — the minted-asset reconciliation item must be resolved before any asset bridge can register. Reserved values are not conventions waiting to harden: the core rejects them until a release activates them, so nothing becomes protocol by shipping first.
Not in any paper
Who may change the rules
The whitepaper has no governance section. It describes a protocol whose parameters are set by difficulty algorithms and whose participants are disciplined by stake, and it never contemplates an operator. The shipped network has one, and this is the part of the gap least visible from the paper, because the paper gives no clause to compare against.
ALPHANETOne key, and a comment about the contract that would replace it
The active contract set is chosen at runtime by spork
(vm/embedded/embedded.go), and a node that sees an unrecognised active
spork halts rather than diverging. Sporks are authorised by a single
address (common/types/address.go:38-43), carrying this comment:
The community spork address is used as a temporary spork address until an embedded governance contract is taken into use.
No such contract exists in the repository. Protocol upgrades are
unilateral. The bridge and liquidity administrator is likewise a hardcoded
address (vm/constants/embedded.go:96).
Two constants also still carry their testing annotations in production:
StakeTimeUnitSec is marked // Testnet value, and FuseExpiration is
marked // for testnet, 10 hours (vm/constants/embedded.go:59,67).
None of this is hidden, and the comment shows it was understood as temporary when written. It is recorded here because it is protocol-level authority that no specification grants, constrains, or schedules the removal of — which is the condition the NOM above exists to prevent.
Summary
The measurement
| Specified mechanism | Verdict | What the network does | Evidence |
|---|---|---|---|
| Block-lattice transaction ledger | SHIPPED | Per-account chains, asymmetric send/receive, each block naming the momentum it acknowledges. | chain/nom/account_block.go:82 |
| Meta-DAG consensus ledger | ABSENT | The momentum chain is linear: one previous hash, one height, strictly increasing timestamps. | chain/nom/momentum.go:32 |
| Leaderless virtual voting | SUBSTITUTED | A deterministic 10-second slot schedule over 30 pillars. Exactly one may produce per slot. | consensus/consensus.go:73 |
| Supermajority ζ = 2N/3 + 1 | ABSENT | No quorum concept. Fork choice is longest-chain with a 30-momentum rollback cap. | protocol/chain_bridge.go:153 |
| Shared coin rounds | ABSENT | Nothing to break: without epoch voting there is no stall to resolve. | no occurrence in repository |
| PoW links across sentinel hops | SUBSTITUTED | Plasma. The same work, on the sender’s own block, with the relay chain removed. | pow/pow.go:14 |
| Link weight as double-spend tiebreak | SHIPPED | Account-chain forks resolve on greatest total plasma, then smallest hash. | chain/interface.go:52 |
| Sentinels relay and protect | PLACEHOLDER | Collateral and rewards only. Sentinel identity is never read outside its own contract. | vm/embedded/implementation/sentinel.go |
| Sentry nodes | ABSENT | The role is never defined. | no occurrence in repository |
| zApps on unikernels | ABSENT | Eleven hardcoded Go contracts. No bytecode, no interpreter, no deployment path. | vm/embedded/embedded.go |
| Stake-weighted consensus power | SHIPPED | Delegated ZNN sets producer frequency; spawning nodes buys nothing. | vm/constants/consensus.go:19 |
Reading note
Where the spec needs a ruling
The whitepaper mixes normative and illustrative language without marking which is which. The three-hop minimum appears once as a named constant. The one-minute epoch is introduced with “for example.” The ordering rules are given as “such as.” A conformance-grade specification has to rule on each of these.
This summary makes the calls as follows: the hop minimum and the ordering rule set are requirements, because the theorems lean on them; epoch length is a parameter, because the paper says so directly. Anyone extracting a formal spec from the paper should expect to defend rulings like these clause by clause.
That note was written before the measurement, and the measurement changes what it is for. The rulings above are no longer preventative. The implementation has already answered most of these questions by shipping, and some of its answers — the ordering rule, the election seed, the authority to change the rules — are now the de facto protocol, unwritten.
ZENOThe ruling problem, solved by convention
The Zeno spec adopts exactly the discipline this summary finds missing in the whitepaper. Every clause is marked: RFC 2119 keywords separate binding requirements from prose, Informative text is labeled and carries no force, Deferred items are recorded so they are not foreclosed by accident. Where the NOM says consensus-critical requirements should be machine-checkable, the spec ships normative machine-readable artifacts — state-tree test vectors, a gas table, conformance suites — that bind exact bytes and costs. Version handling is “unknown == reject.” Nobody defends rulings clause by clause after the fact; the clauses arrive pre-ruled.
Read together, the paper and the network describe two different systems that share a vocabulary. The block-lattice, stake-weighted power, and the double-spend tiebreak came through intact. Virtual voting, the meta-DAG, PoW links, sentries and unikernels did not arrive, and the guarantees that rested on them are not the guarantees the network now offers. Plasma carries the paper’s admission mechanism forward under a new name; the second coin is the network’s own idea. Sentinels hold a slot for work that was reassigned.
None of that is settled by this page. Where an implementation and a paper disagree, the question of which one is wrong is a decision somebody has to make, and writing the specification is how it gets made rather than defaulted. That is the whole of the NOM’s argument, and six years of drift is the argument’s best evidence.
Sources · Network of Momentum, leaderless BFT dual ledger architecture,
DRAFT v0.1, 31 March 2020, The Zenon Team — for every clause in the three
bins. go-zenon at v0.0.8-alphanet, commit 667a69d, read 15-Aug-26 — for
every conformance verdict. This page supersedes
The Specification Behind the Whitepaper,
which reads the paper alone.