Files
precompile/modelregistry/module.go
T
zooqueenandHanzo Dev c3fc7c57af fix(ai): restore model-registry + cross-chain mining (dropped from main) + e2e tests
The modelregistry precompile (0x0300..02) and the ai cross-chain mining methods
(verifyAndMintWork/verifyAndMintData) were rebased OFF main by the recent deps/branding
rewrites — yet luxfi/evm's registry still imports modelregistry AND the v0.5.38 release tag
contains both, so main had regressed below the release and would break evm on the next cut.
Restored both from their original commits (4329c93, 3d96be3) onto current main.

Adds end-to-end tests: verifyAndMintWork/Data through Run with a REAL ML-DSA signature
(calldata decode -> verify -> reward -> mark-spent), with double-spend + read-only + bad-sig
rejection; plus modelregistry adopt/governance. Full ai + modelregistry suites green (CGO=0).

Co-authored-by: Hanzo Dev <[email protected]>
2026-06-16 23:03:06 -07:00

110 lines
3.6 KiB
Go

// Copyright (C) 2026, Lux Partners Limited. All rights reserved.
// SPDX-License-Identifier: Apache-2.0
//
// Package modelregistry is the on-chain registry of the network's current AI model —
// the "continuously evolving" mechanism for a thinking chain (e.g. Zoo L3 Beluga / BLG).
// Admins (a DAO/multisig, seeded at genesis) ADOPT new model versions by weight-commitment
// hash; the inference precompile (0x0300…0003) reads the approved commitment. The model
// evolves through on-chain governance — versioned, auditable, and immutable once adopted
// (you can't slip in a backdoor without a recorded adopt by an admin).
//
// Precompile address 0x0300…0002 (AI range slot 0x02 = MODEL_REGISTRY).
package modelregistry
import (
"fmt"
"github.com/luxfi/geth/common"
"github.com/luxfi/precompile/contract"
"github.com/luxfi/precompile/modules"
"github.com/luxfi/precompile/precompileconfig"
)
var _ contract.Configurator = (*configurator)(nil)
var _ contract.StatefulPrecompiledContract = (*ModelRegistryContract)(nil)
const ConfigKey = "modelRegistryConfig"
// ContractAddress — AI reserved range 0x0300…0000..00FF; slot 0x02 = MODEL_REGISTRY
// (0x00 AI_MINING, 0x01 NV_TRUST, 0x02 MODEL_REGISTRY, 0x03 AI_INFERENCE).
var ContractAddress = common.HexToAddress("0x0300000000000000000000000000000000000002")
var ModelRegistryPrecompile = &ModelRegistryContract{}
var Module = modules.Module{
ConfigKey: ConfigKey,
Address: ContractAddress,
Contract: ModelRegistryPrecompile,
Configurator: &configurator{},
}
// Method selectors (first 4 bytes).
const (
SelectorAdopt uint32 = 0x01000000 // adopt(bytes32 name, uint256 version, bytes32 weightHash)
SelectorGetApproved uint32 = 0x02000000 // getApproved(bytes32 name) -> (uint256, bytes32)
SelectorIsAdmin uint32 = 0x03000000 // isAdmin(address) -> bool
SelectorSetAdmin uint32 = 0x04000000 // setAdmin(address, bool) -> bool
)
const (
GasAdopt uint64 = 25_000 // two state writes (version + weight)
GasGetApproved uint64 = 5_000 // two state reads
GasIsAdmin uint64 = 3_000
GasSetAdmin uint64 = 10_000
)
type configurator struct{}
func init() {
if err := modules.RegisterModule(Module); err != nil {
panic(err)
}
}
func (*configurator) MakeConfig() precompileconfig.Config { return new(Config) }
// Configure seeds the initial admin (governance) set into state at activation.
func (*configurator) Configure(
_ precompileconfig.ChainConfig,
cfg precompileconfig.Config,
state contract.StateDB,
_ contract.ConfigurationBlockContext,
) error {
c, ok := cfg.(*Config)
if !ok {
return fmt.Errorf("modelregistry: unexpected config type %T", cfg)
}
for _, a := range c.Admins {
setAdminState(state, a, true)
}
return nil
}
// Config is the upgrade config; Admins is the initial governance set (a DAO/multisig).
type Config struct {
Upgrade precompileconfig.Upgrade `json:"upgrade"`
Admins []common.Address `json:"admins,omitempty"`
}
func (c *Config) Key() string { return ConfigKey }
func (c *Config) Timestamp() *uint64 { return c.Upgrade.Timestamp() }
func (c *Config) IsDisabled() bool { return c.Upgrade.Disable }
func (c *Config) Verify(precompileconfig.ChainConfig) error { return nil }
func (c *Config) Equal(cfg precompileconfig.Config) bool {
other, ok := cfg.(*Config)
if !ok {
return false
}
if !c.Upgrade.Equal(&other.Upgrade) || len(c.Admins) != len(other.Admins) {
return false
}
for i := range c.Admins {
if c.Admins[i] != other.Admins[i] {
return false
}
}
return true
}