zeekayandHanzo Dev bcf93b97db bridgevm: one acceptance predicate for a block MPC signature
batchVerifyBlockSignatures had two answers to "is this signature valid", chosen
by accel.Available():

  - the CPU loop verified against blockHash[:] (accel_verify.go:69) while the GPU
    layout verified against sha256(blockHash[:]) (accel_verify.go:96,107). Same
    signature set, two different signed messages, so a node with an accelerator
    and a node without reached opposite verdicts on the same block —
    bridgevm/block.go:219 turns validSignatures into accept or reject, so this is
    an accept/reject split decided by host hardware.

  - a signature shorter than 64 bytes, or a public key that would not marshal,
    was silently zero-filled (`if len >= sigSize`, `if mErr != nil { continue }`)
    while the entry kept its row in the result vector, and validCount was taken
    straight from the kernel's output for that row. The CPU path rejects those
    entries outright via deserializeSignature. Correctness of the count therefore
    rested on an out-of-tree kernel refusing degenerate input, and one
    spuriously-true row is enough to admit a block.

The predicate is now verifyBlockSig, and the CPU loop is its only evaluator.
packBlockSigBatch lays out the accelerator's rows over the same message bytes and
returns an error for any row it cannot represent exactly, which sends the batch to
that one authority instead of guessing.

Tests: TestBatchSignsTheBlockHashItself, TestBatchRefusesRowsItCannotRepresent,
TestVerifyBlockSigIsTheOneAuthority, TestBatchVerifyCountsNoSignatureWithoutConfig.

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-29 16:48:10 -07:00
2026-07-26 10:02:10 -07:00
2026-07-26 10:02:10 -07:00

chains

Lux Chains

Independent VM plugin binaries for the Lux Network.

Each directory builds to a standalone binary that the Lux node loads as a plugin via --plugin-dir.

Build

make            # build all VMs
make evm        # build one VM
make test       # test all

Install

lpm install evm
lpm install dexvm

Or copy binaries to ~/.lux/plugins/<vmid>.

VMs

One row per directory in this repo. make derives its target list from the directory listing, so a VM that has no directory here has no binary — the table below and ls can never disagree.

Live means the VM has a chain registered on Lux mainnet 96369 (platform.getBlockchains).

VM Chain Live on 96369 Purpose
evm C-Chain ✅ EVM smart contracts
dexvm D-Chain ✅ Decentralized exchange
aivm A-Chain ✅ AI/ML inference
bridgevm B-Chain ✅ Cross-chain bridge — also owns all cross-chain messaging / relay / teleport (LP-6000); there is no separate teleportvm
graphvm G-Chain ✅ GraphQL data layer
keyvm K-Chain ✅ Key management
quantumvm Q-Chain ✅ Post-quantum consensus signing (Pulsar)
zkvm Z-Chain ✅ Groth16 over BLS12-381 (rolls N × ML-DSA-65 sigs into 192-byte proof)
identityvm I-Chain ❌ built, not deployed Decentralized identity
oraclevm O-Chain ❌ built, not deployed Oracle/off-chain data
relayvm R-Chain ❌ built, not deployed Cross-chain relay
mpcvm M-Chain ❌ built, not deployed MPC ceremonies (CGGMP21, FROST, Pulsar-general) — bridge custody for external wallets (LP-7100)
schain S-Chain ❌ built, not deployed S3-style object storage (on-chain metadata / off-chain blob). Declares its own VMID = ids.ID{'s','c','h','a','i','n'} in schain/factory.go and is not in the canonical luxfi/constants VM-ID registry

P-Chain (platformvm) and X-Chain (xvm) are in-process core VMs registered by luxfi/node, not plugins built here. Together with the eight ✅ rows above they are the ten chains live on 96369.

Not in this repo

Name Status
teleportvm / T-Chain Removed. LP-134 dissolves T-Chain with zero remainder: threshold signing → M-Chain, FHE → F-Chain, cross-chain messaging/teleport → B-Chain (bridgevm). LP-5013 and LP-7330 are deprecated by LP-134; see LP-7050 for the migration map. No teleportvm VM ID exists in luxfi/constants.
servicenodevm Never existed. The service-node registry was never built under this name; the S-Chain directory here is schain/ and is object storage, not a registry.
fhevm / F-Chain Unbuilt. luxfi/constants reserves FHEVMID = {'f','h','e','v','m'} and luxfi/node/node/vms.go lists it in OptionalVMs as a plugin named fhevm, so luxd will scan --plugin-dir for it — but there is no fhevm/ directory in this repo and no plugin binary anywhere, so that scan always comes up empty. The FHE runtime library lives at mpcvm/fhe/; it is a package inside mpcvm, not a standalone chain. F-Chain is a spec (LP-8200, LP-167) with no shipping VM.
S
Description
Independent VM plugin binaries for the Lux Network
Readme BSD-3-Clause
21 MiB
Languages
Go 98.2%
C 1.7%
Shell 0.1%