Files
Hanzo DevandGitHub 2bffadc1b1 beluga: wire L3 to run zooai/node (replace luxd stopgap) (#5)
* beluga: wire L3 to run zooai/node (replace luxd stopgap)

Make the Beluga L3 (chainId 420420) a real thinking-chain instead of an
inert luxd subnet stub. The zoo-chain validators tracked beluga under
ghcr.io/luxfi/node (luxd) — a bare subnet runtime with no Zoo EVM and no
AI precompiles, so beluga could never instantiate (blockchainID empty).

Switch the zoo-chain ZooNetwork image to ghcr.io/zooai/node (zood), which
self-installs the Zoo EVM (AI/FHE/PQ/ZK precompiles, incl. the 0x0303
deterministic in-consensus inference precompile and the 0x0304 aivmbridge
that settles Tier-2 Proof-of-Thought to the Lux A-Chain), Zoo DEX and Zoo
FHE VM plugins at startup.

- base/network.yaml + zoo-{devnet,testnet,mainnet}/network-patch.yaml:
  image ghcr.io/luxfi/node -> ghcr.io/zooai/node.
- zoo-{devnet,testnet,mainnet}/statefulset-patch.yaml: command ./luxd ->
  zood (zood wraps luxfi/node, identical config.BuildFlagSet, so all flags
  apply verbatim). Beluga's blockchainID is appended to --track-chains
  once the CreateChainTx mints it on the Zoo primary network.
- base/beluga.yaml: enrich the ZooChain CR with vmId (Zoo EVM
  2n2njofjYvece8gZWCNnc1mqkcqfW6kbrhPRZPVzwxrSQrQ4gE) and
  genesisConfigMap (beluga-genesis), per the operator ZooChainSpec.
- base/kustomization.yaml: configMapGenerator beluga-genesis from
  k8s/base/beluga/{genesis.json,config.json} (stable name, no hash).
- k8s/base/beluga/: deployed copy of the canonical genesis+config
  (evmChainId 420420, BLG gas, precompile-upgrade activations at ts 0).

Image tags are floating `latest` only on devnet; testnet/mainnet pin the
immutable CI semver. The live rollout (restarts the L2 validators) is a
gated prod step performed after the ghcr.io/zooai/node image is verified.

* beluga: pin zood image to immutable sha-371ea17-amd64-node

ghcr.io/zooai/node built CGO-free (hermetic vendored build, digest
sha256:12e8244d…) and published. Pin the operator ZooChain CR image off the
floating 'latest' to the immutable build SHA per prod policy.

* beluga: pin devnet+testnet zood image to sha-371ea17-amd64-node (consistency)

* beluga(devnet): image is operator-derived from the ZooNetwork CR, not the patch

Per 'one and only one way, operator-derived': the zood image comes solely from
k8s/base/network.yaml (the ZooNetwork CR); the operator renders it. The patch
asserts only the luxd CLI flags the operator wrongly passes as ZOO_* env.

* beluga: pin zood image to clean semver 0.2.0 (not the sha hash)

Proper semver for all image pins — ghcr.io/zooai/node:0.2.0 (digest 12e8244d,
same build), not sha-371ea17-amd64-node. The ZooNetwork CR is the single source;
the operator renders it onto the StatefulSet.
2026-06-24 13:44:27 -07:00

62 lines
2.7 KiB
YAML

# Beluga L3 -- AI app-chain on Zoo Network.
# Runs on the existing Zoo validators via a ZooChain tracking CR (no new nodes):
# the zoo-operator (crate zoo-operator, ghcr.io/zooai/operator) only stamps
# status (phase/chainId/blockchainId) for ZooChain — the chain is actually
# tracked by the validators' TRACK_CHAINS env. So the CR carries just the
# fields in zoo-operator's ZooChainSpec (src/crd.rs): chainId (required, u64),
# and optional blockchainId / vmId / genesisConfigMap / networkRef.
#
# The L3's EVM/precompile/genesis parameters (AI/FHE/PQ/ZK precompiles, BLG
# gas token, gas limits) are properties of the chain's genesis.json + VM build,
# not of this k8s tracking CR — they are not consumed by the operator and were
# dropped here so the CR deserializes cleanly (the old rich schema had no
# `chainId`, which broke the operator's ZooChain list-watch → InitialListFailed).
apiVersion: zoo.network/v1alpha1
kind: ZooChain
metadata:
name: beluga
labels:
app: beluga
app.kubernetes.io/name: beluga
app.kubernetes.io/part-of: zoo
zoo.network/type: l3
spec:
# EVM chainID for the Beluga L3 (also pinned in blg-token.yaml).
chainId: 420420
# Parent validator cluster (ZooNetwork) that tracks this chain. zoo-chain
# runs zooai/node (zood) — the Zoo EVM it self-installs carries the AI/FHE/
# PQ/ZK precompiles, incl. the deterministic in-consensus inference
# precompile at 0x0300…0003 (the "0x0303" thinking precompile, Tier-1) and
# the aivmbridge at 0x0300…0004 that settles Tier-2 Proof-of-Thought to the
# Lux A-Chain (AIVM). Without zooai/node this CR is just a luxd subnet stub.
networkRef: zoo-chain
# Zoo EVM VM ID — the VM the validators instantiate this chain under. This is
# the plugin zood self-installs (vm.EVMID in zooai/node), distinct from the
# built-in C-Chain EVM. luxd alone cannot serve this chain.
vmId: 2n2njofjYvece8gZWCNnc1mqkcqfW6kbrhPRZPVzwxrSQrQ4gE
# Genesis (evmChainId 420420, BLG gas, AI/FHE/PQ/ZK precompile-upgrade
# activations at blockTimestamp 0) — generated by configMapGenerator from
# k8s/base/beluga/genesis.json (see base/kustomization.yaml).
genesisConfigMap: beluga-genesis
# blockchainId is stamped by the operator once the CreateChainTx that mints
# the Beluga blockchain on the Zoo primary network lands and its ID is added
# to the validators' TRACK_CHAINS. Empty until then (chain registered, not
# yet instantiated).
---
apiVersion: v1
kind: Service
metadata:
name: beluga-rpc
labels:
app: beluga
app.kubernetes.io/name: beluga-rpc
app.kubernetes.io/part-of: zoo
spec:
type: ClusterIP
selector:
app: zoo-chain
ports:
- port: 9650
targetPort: 9650
name: http