Files
chains/mpcvm/factory.go
T
zeekay a93f6e3dec build the VMs without the daemon in their closure
A plugin is its own binary; the daemon that loads it has no business being
linked into it. Twelve VMs reached into github.com/luxfi/node for four things,
and each one now programs against a home that is actually its own:

- fee admission (Policy, FlatPolicy, NoUserTxPolicy, Validate) joins the
  settlement half already in chains/fee. One fee package, and the nodefee alias
  that marked the split is gone.
- the cross-chain artifact types move to chains/artifacts.
- the factory the daemon registers is luxfi/vm/manager.Factory, and the version
  types are luxfi/version. Both are ordinary modules the daemon reads too, so a
  VM imports them directly rather than through anything of ours.

The GPU switch is deleted, not moved. It was a global set during daemon startup
that a separate process could never observe, so every plugin read its default;
FHEOptions.Backend is the switch that was really there.

go list -deps names no luxfi/node for aivm, bridgevm, dexvm, evm, fhevm,
graphvm, identityvm, keyvm, mpcvm, quantumvm, schain or zkvm, and the built
plugin binaries carry no such string. oraclevm and relayvm still do: they are
re-export shims over luxfi/oracle and luxfi/relay, which build their fee
policies upstream. Their tests keep naming the daemon's fee package because
that is the type their value has.
2026-09-03 21:10:40 -07:00

48 lines
2.0 KiB
Go

// Copyright (C) 2019-2025, Lux Industries Inc. All rights reserved.
// See the file LICENSE for licensing terms.
package mpcvm
import (
"github.com/luxfi/constants"
"github.com/luxfi/log"
"github.com/luxfi/vm/manager"
)
var _ manager.Factory = (*Factory)(nil)
// VMID identifies M-Chain: MPC threshold signing and bridge custody of external
// wallets (LP-7100). It is constants.MPCVMID and nothing else.
//
// A vmID is an immutable one-way door: it is baked into the CreateChainTx at
// genesis, it is the plugin binary's filename, and it is what the P-Chain stores
// forever. Every declaration of it must agree, so there is exactly one — this
// alias — and it points at the single source of truth in luxfi/constants.
//
// This VM previously declared a private `thresholdvm` literal here that matched
// no other declaration in the stack. Per LP-7050 the thresholdvm package was
// split into mpcvm (M-Chain) and fhevm (F-Chain); "ThresholdVM" and "mvm" are
// stale names. constants.MPCVMID, node/genesis/builder/registry.go and
// node/node/vms.go all say mpcvm.
var VMID = constants.MPCVMID
// The value is held by TestVMID_Bytes and TestVMID_IsCanonicalAndStable, which
// compare it to the literal bytes and to the CB58 the plugin binary is named
// after.
//
// It used to also carry `var _ = map[bool]struct{}{VMID == ids.ID{...}: {}}`,
// labelled a compile-time assertion. It is not one: a map literal with a
// single non-constant key compiles whatever the key evaluates to — only a
// DUPLICATE constant key is a compile error. So it held for every possible
// value of VMID, including a wrong one, while reading as proof. A check that
// cannot fail is worse than no check, because it stops anyone writing the one
// that can.
// Factory creates M-Chain VM instances.
type Factory struct{}
// New returns a new M-Chain VM. Everything that needs configuration or a
// database is set up in Initialize; a Factory-built VM holds no state.
func (f *Factory) New(log.Logger) (interface{}, error) {
return &VM{}, nil
}