The decomplection proper: separate what the threshold primitive IS from where
it is APPLIED (LP-134 / LP-7050). service.go carves three orthogonal service
interfaces directly from the methods the single overloaded *VM already
implements:
- ThresholdService — pure primitives (DKG/keygen/refresh/reshare, key lookup).
The substrate M and F both consume.
- MPCService (embeds ThresholdService) — threshold signing + bridge-custody
attestation. M-Chain's surface (LP-7100).
- FHEService (embeds ThresholdService) — confidential compute over encrypted
state. F-Chain's surface (LP-8200); FHE-execution methods are added as the
physical fhevm package is carved out.
*VM is asserted to satisfy all three at compile time (the compatibility
bridge). This changes NO behavior and NO genesis — the full test suite stays
green — but it establishes the exact interface boundary the physical VM split
(github.com/luxfi/chains/{mpcvm,fhevm} each backed only by the substrate it
needs) will implement, so the split cannot silently reach across surfaces.
service_test.go locks the embedding relationship (MPC/FHE ⊃ Threshold) so a
future split can't drop the substrate dependency.
Co-authored-by: Hanzo Dev <[email protected]>
ThresholdVM
ThresholdVM is a Go library, not a chain.
Per LP-134 (Lux Chain Topology) and LP-7050 (Supersession Map), T-Chain is fully removed with zero remainder. Its concerns decompose onto existing chains, each of which consumes this library substrate:
- M-Chain (
mpcvm, LP-7100) — bridge custody for external wallets, threshold signing ceremonies (CGGMP21 / FROST / Pulsar-general). Owns all threshold signing. - F-Chain (
fhevm, LP-8200) — TFHE keygen, encrypted EVM, threshold decrypt, confidential compute. Owns all encrypted computation.
chains/thresholdvm/ is the shared library these two chains import in
process — it is not itself a chain and has no genesis, no validators, no
block production. There is no teleportvm and no "T-Chain": teleport
IS bridgevm (B-Chain, LP-6000). Any live identifier still naming "T-Chain",
"ThresholdVM-as-a-chain", or "teleportvm" is stale.
+--------------------------------+
| ThresholdVM |
| (ceremony state machine, |
| share envelope, lane API, |
| subject binding) |
+----------------+---------------+
|
+-------------------+-------------------+
| |
+--------v--------+ +--------v--------+
| M-Chain | | F-Chain |
| (MPC: CGGMP21, | | (FHE: TFHE, |
| FROST, | | bootstrap-key |
| Corona-gen) | --bootstrap key--> | gen, encrypted |
| | | EVM) |
+-----------------+ +-----------------+
ceremony_root: ceremony_root:
mchain_ceremony_root fchain_fhe_root
block time ~500ms block time ~2s
sign-oriented compute-oriented
What this directory contains
| Path | Role |
|---|---|
types/ |
Ceremony, Participant, Share, Proof — pure data types, no chain logic |
protocol/ |
Protocol-specific verifier interfaces (impl ships with the chain that uses it) |
cert/ |
QuasarCertLane integration: lane registration + certificate-subject binding |
runtime/ |
MChainAdapter and FChainAdapter interfaces the two chains implement |
docs/ |
Architecture + per-chain integration notes |
What this directory is not
- Not a Lux VM. There is no
factory.goexposed tochains.Manager. - Not a chain ID. M-Chain and F-Chain are the chains; they have their own validator sets, ceremony roots, and block cadence.
- Not a registry of secrets, keys, or signed material. State lives on M-Chain or F-Chain, never here.
Why split
LP-134 deprecates LP-5013 ("T-Chain MPC Custody"). T-Chain previously mixed MPC ceremonies and FHE compute under one validator set, one ceremony root, one block cadence. Sign-oriented (sub-second, latency critical) and compute-oriented (multi-second, throughput critical) workloads have incompatible scaling profiles. Splitting them lets each scale on its own validator set.
The substrate stays one piece because the ceremony state machine is
identical across both: registered participants → round 1 commitments →
round 2 shares → finalized cert. Only the per-protocol payload
(carried by (offset, len) indirection in the share envelope) differs.
Permissionless participation
Both M-Chain and F-Chain inherit P-Chain's permissionless validator model. Anyone with stake on P-Chain can delegate to the M-Chain or F-Chain validator subset (or both). No allowlist. No central authority. Bitcoin-like decentralization carries through — the threshold scheme itself enforces honest-majority safety, the chain enforces liveness.
Cross-chain handoff
When M-Chain finishes a ceremony whose output feeds F-Chain (e.g., a TFHE bootstrap key generated by FROST DKG on M-Chain), the output crosses via a CertLane artifact:
- M-Chain finalizes ceremony, emits cert with lane
MChainFROSTandmchain_ceremony_rootupdated. - F-Chain consumes the artifact via its
FChainBootstraplane, binds it intofchain_fhe_root. - Quasar 3.0's
certificate_subjectbinds both roots in the same round, making cross-chain replay structurally impossible.
The handoff envelope is defined in cert/lane.go; the typed adapter
in runtime/.
Migration from T-Chain
LP-5013 is deprecated. The legacy chain at chains/thresholdvm/ (this
directory's vm.go, block.go, factory.go, fhe/, cmd/) hosts
the migration shims that route legacy TChain* cert lanes to the
appropriate MChain* / FChain* verifiers during the one-epoch grace
window. After the grace window closes, the shims are removed and only
the substrate (this README's directory tree) remains.
Activation
ThresholdVM substrate activates with Quasar 3.0 on 2025-12-25, alongside the M-Chain and F-Chain genesis events. Versions before that date target the legacy T-Chain layout.
References
| LP | Topic |
|---|---|
| LP-019 | Threshold MPC for Bridge Signing (M-Chain protocols) |
| LP-013 | FHE on GPU (F-Chain compute) |
| LP-076 | Universal Threshold Cryptography Framework |
| LP-134 | Lux Chain Topology — defines the M/F split |
| LP-132 | QuasarGPU Execution Adapter — lane verifiers run here |
| LP-020 | Quasar Consensus 3.0 — certificate_subject binding |
License
Copyright (C) 2019-2025 Lux Industries Inc. MIT licensed.