Files
mpcvm/CMakeLists.txt
zeekay b5b20c1d90 mpcvm: ringtail → corona rename (Ringtail enum + ceremony kind)
Per the canonical-name rename of the lattice-based threshold signature
primitive from Ringtail to Corona. Coordinated with lux-private/gpu-
kernels and luxcpp/gpu so the byte-equal cross-tree ABI stays in lockstep.

Renamed:
  * RingtailDkg / RingtailSign (ceremony-kind enum values 4u/5u)
      → CoronaDkg / CoronaSign
  * SchemeRingtail = 2u → SchemeCorona = 2u  (value preserved)
  * kRingtailDkgRounds / kRingtailSignRounds → kCoronaDkgRounds / kCoronaSignRounds
  * mpcvm_ringtail.{cu,metal,wgsl}        → mpcvm_corona.{cu,metal,wgsl}
                                            (filename refs in CMakeLists)
  * "Ringtail" / "Ringtail R-LWE" comments → "Corona"

Updated:
  * include/lux/mpcvm/mpcvm_gpu_layout.hpp — enum + scheme + rounds + comments
  * src/mpcvm_cpu_reference.cpp           — kind dispatch table
  * src/mpcvm_gpu_engine.mm               — comment
  * test/mpcvm_benchmark.cpp              — fixture enum refs
  * test/mpcvm_layout_test.cpp            — fixture enum refs
  * CMakeLists.txt                        — Metal/CUDA/WGSL kernel filenames

No numeric on-wire constants changed — pure naming rename:
  * RingtailDkg = 4u stays 4u (now spelled CoronaDkg)
  * RingtailSign = 5u stays 5u (now spelled CoronaSign)
  * SchemeRingtail = 2u stays 2u (now spelled SchemeCorona)

The deterministic share envelope (24-byte hash digest at ceremony-finalize
time, mpcvm_state_root composition) is byte-identical post-rename — only
the C++ identifier strings change.

Refs: corona v0.7.6 wire codec ; luxfi/threshold v1.9.4 mldsa-tee +
slhdsa-tee + rlwe-tee TEE-only extensions ; magnetar GPU-port v1.3
(SLH-DSA hash-tree kernels — separate work landing alongside this rename).
2026-06-03 12:45:51 -07:00

280 lines
11 KiB
CMake

# Copyright (C) 2026, Lux Partners Limited. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
#
# MPCVM (M-Chain) GPU substrate.
# v0.60: FROST + CGGMP21 + Corona threshold ceremonies, GPU-native
# across CUDA + Metal + WGSL with byte-for-byte cross-backend
# determinism against a CPU reference oracle.
cmake_minimum_required(VERSION 3.20)
project(lux-mpcvm
VERSION 0.62
DESCRIPTION "GPU-native M-Chain (MPC) ceremony substrate"
LANGUAGES CXX
)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
option(LUX_MPCVM_BUILD_TESTS "Build MPCVM tests" ON)
option(LUX_MPCVM_ENABLE_METAL "Build Metal backend (Apple)" ${APPLE})
option(LUX_MPCVM_ENABLE_CUDA "Build CUDA backend" OFF)
# Auto-detect wgpu-native (Homebrew prefix on macOS, plain pkg-config elsewhere).
set(_LUX_MPCVM_WGPU_DEFAULT OFF)
find_path(LUX_MPCVM_WGPU_INCLUDE_DIR NAMES webgpu.h
PATHS
/opt/homebrew/opt/wgpu-native/include
/usr/local/opt/wgpu-native/include
/usr/local/include
/usr/include
)
find_library(LUX_MPCVM_WGPU_LIBRARY NAMES wgpu_native
PATHS
/opt/homebrew/opt/wgpu-native/lib
/usr/local/opt/wgpu-native/lib
/usr/local/lib
/usr/lib
)
if(LUX_MPCVM_WGPU_INCLUDE_DIR AND LUX_MPCVM_WGPU_LIBRARY)
set(_LUX_MPCVM_WGPU_DEFAULT ON)
endif()
option(LUX_MPCVM_ENABLE_WGPU "Build WebGPU/wgpu-native backend" ${_LUX_MPCVM_WGPU_DEFAULT})
# Kernel source dirs — canonical homes are one-per-backend
# (luxcpp/metal/src/shaders/mpcvm, luxcpp/cuda/kernels/mpcvm,
# luxcpp/webgpu/kernels/wgsl/mpcvm). Override via -D<VAR>=<dir>.
if(NOT LUX_MPCVM_KERNEL_DIR_METAL)
set(LUX_MPCVM_KERNEL_DIR_METAL
"${CMAKE_CURRENT_SOURCE_DIR}/../metal/src/shaders/mpcvm")
endif()
if(NOT LUX_MPCVM_KERNEL_DIR_CUDA)
set(LUX_MPCVM_KERNEL_DIR_CUDA
"${CMAKE_CURRENT_SOURCE_DIR}/../cuda/kernels/mpcvm")
endif()
if(NOT LUX_MPCVM_KERNEL_DIR_WGSL)
set(LUX_MPCVM_KERNEL_DIR_WGSL
"${CMAKE_CURRENT_SOURCE_DIR}/../webgpu/kernels/wgsl/mpcvm")
endif()
# ---- core library (host code: layout + CPU reference) --------------------
add_library(lux_mpcvm_core STATIC
src/mpcvm_cpu_reference.cpp
)
target_include_directories(lux_mpcvm_core PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
target_compile_features(lux_mpcvm_core PUBLIC cxx_std_20)
set_target_properties(lux_mpcvm_core PROPERTIES
OUTPUT_NAME "lux_mpcvm_core"
POSITION_INDEPENDENT_CODE ON
)
# ---- Metal driver (Apple) -------------------------------------------------
if(LUX_MPCVM_ENABLE_METAL AND APPLE)
add_library(lux_mpcvm_metal STATIC
src/mpcvm_gpu_engine.mm
)
target_include_directories(lux_mpcvm_metal PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
)
target_compile_features(lux_mpcvm_metal PUBLIC cxx_std_20)
target_link_libraries(lux_mpcvm_metal PUBLIC lux_mpcvm_core
"-framework Metal" "-framework Foundation")
set_target_properties(lux_mpcvm_metal PROPERTIES
OUTPUT_NAME "lux_mpcvm_metal"
POSITION_INDEPENDENT_CODE ON
)
foreach(src
mpcvm_kernels_common.h.metal
mpcvm_ceremony.metal
mpcvm_frost.metal
mpcvm_cggmp21.metal
mpcvm_corona.metal
mpcvm_transition.metal)
configure_file(
${LUX_MPCVM_KERNEL_DIR_METAL}/${src}
${CMAKE_CURRENT_BINARY_DIR}/src/${src}
COPYONLY)
endforeach()
set(MPCVM_METAL_COMBINED ${CMAKE_CURRENT_BINARY_DIR}/src/mpcvm_combined.metal)
add_custom_command(
OUTPUT ${MPCVM_METAL_COMBINED}
COMMAND bash -c "cat ${LUX_MPCVM_KERNEL_DIR_METAL}/mpcvm_kernels_common.h.metal > ${MPCVM_METAL_COMBINED} && for f in mpcvm_ceremony.metal mpcvm_transition.metal mpcvm_frost.metal mpcvm_cggmp21.metal mpcvm_corona.metal; do grep -v 'mpcvm_kernels_common.h.metal' ${LUX_MPCVM_KERNEL_DIR_METAL}/$f >> ${MPCVM_METAL_COMBINED}; done"
DEPENDS
${LUX_MPCVM_KERNEL_DIR_METAL}/mpcvm_kernels_common.h.metal
${LUX_MPCVM_KERNEL_DIR_METAL}/mpcvm_ceremony.metal
${LUX_MPCVM_KERNEL_DIR_METAL}/mpcvm_transition.metal
${LUX_MPCVM_KERNEL_DIR_METAL}/mpcvm_frost.metal
${LUX_MPCVM_KERNEL_DIR_METAL}/mpcvm_cggmp21.metal
${LUX_MPCVM_KERNEL_DIR_METAL}/mpcvm_corona.metal
VERBATIM)
set(MPCVM_METAL_AIR ${CMAKE_CURRENT_BINARY_DIR}/src/mpcvm_combined.air)
set(MPCVM_METAL_LIB ${CMAKE_CURRENT_BINARY_DIR}/src/mpcvm.metallib)
add_custom_command(
OUTPUT ${MPCVM_METAL_AIR}
COMMAND xcrun -sdk macosx metal -std=metal3.0
-Wno-pragma-once-outside-header
-Wno-unused-const-variable
-c ${MPCVM_METAL_COMBINED} -o ${MPCVM_METAL_AIR}
DEPENDS ${MPCVM_METAL_COMBINED}
VERBATIM)
add_custom_command(
OUTPUT ${MPCVM_METAL_LIB}
COMMAND xcrun -sdk macosx metallib ${MPCVM_METAL_AIR} -o ${MPCVM_METAL_LIB}
DEPENDS ${MPCVM_METAL_AIR}
VERBATIM)
add_custom_target(mpcvm_metallib ALL DEPENDS ${MPCVM_METAL_LIB})
add_dependencies(lux_mpcvm_metal mpcvm_metallib)
endif()
# ---- CUDA driver ---------------------------------------------------------
if(LUX_MPCVM_ENABLE_CUDA)
enable_language(CUDA)
add_library(lux_mpcvm_cuda STATIC
src/mpcvm_gpu_engine_cuda.cpp
${LUX_MPCVM_KERNEL_DIR_CUDA}/mpcvm_ceremony.cu
${LUX_MPCVM_KERNEL_DIR_CUDA}/mpcvm_frost.cu
${LUX_MPCVM_KERNEL_DIR_CUDA}/mpcvm_cggmp21.cu
${LUX_MPCVM_KERNEL_DIR_CUDA}/mpcvm_corona.cu
${LUX_MPCVM_KERNEL_DIR_CUDA}/mpcvm_transition.cu
)
target_include_directories(lux_mpcvm_cuda PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
)
target_compile_definitions(lux_mpcvm_cuda PUBLIC LUX_MPCVM_HAVE_CUDA=1)
set_target_properties(lux_mpcvm_cuda PROPERTIES
CUDA_STANDARD 17
CUDA_SEPARABLE_COMPILATION ON
POSITION_INDEPENDENT_CODE ON
OUTPUT_NAME "lux_mpcvm_cuda"
)
target_link_libraries(lux_mpcvm_cuda PUBLIC lux_mpcvm_core)
endif()
# ---- WebGPU / wgpu-native driver ------------------------------------------
if(LUX_MPCVM_ENABLE_WGPU)
if(NOT LUX_MPCVM_WGPU_INCLUDE_DIR OR NOT LUX_MPCVM_WGPU_LIBRARY)
message(FATAL_ERROR
"LUX_MPCVM_ENABLE_WGPU=ON but wgpu-native not found. "
"Install via `brew install wgpu-native` (macOS) or unset the option.")
endif()
add_library(lux_mpcvm_wgpu STATIC src/mpcvm_gpu_engine_wgpu.cpp)
target_include_directories(lux_mpcvm_wgpu PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<BUILD_INTERFACE:${LUX_MPCVM_WGPU_INCLUDE_DIR}>
)
target_compile_features(lux_mpcvm_wgpu PUBLIC cxx_std_20)
target_compile_definitions(lux_mpcvm_wgpu PUBLIC LUX_MPCVM_ENABLE_WGPU=1)
target_link_libraries(lux_mpcvm_wgpu PUBLIC lux_mpcvm_core ${LUX_MPCVM_WGPU_LIBRARY})
if(APPLE)
# wgpu-native links against Metal/CoreFoundation/QuartzCore on macOS.
target_link_libraries(lux_mpcvm_wgpu PUBLIC
"-framework Metal"
"-framework Foundation"
"-framework QuartzCore"
"-framework CoreFoundation")
endif()
set_target_properties(lux_mpcvm_wgpu PROPERTIES
OUTPUT_NAME "lux_mpcvm_wgpu"
POSITION_INDEPENDENT_CODE ON
)
# Stage WGSL source files next to the built library so the engine can
# locate them at runtime.
foreach(src
mpcvm_kernels_common.wgsl
mpcvm_ceremony.wgsl
mpcvm_transition.wgsl)
configure_file(
${LUX_MPCVM_KERNEL_DIR_WGSL}/${src}
${CMAKE_CURRENT_BINARY_DIR}/src/${src}
COPYONLY)
endforeach()
endif()
# ---- tests ----------------------------------------------------------------
if(LUX_MPCVM_BUILD_TESTS)
enable_testing()
# Layout test — host-only.
add_executable(mpcvm-layout-test test/mpcvm_layout_test.cpp)
target_link_libraries(mpcvm-layout-test PRIVATE lux_mpcvm_core)
target_compile_features(mpcvm-layout-test PRIVATE cxx_std_20)
add_test(NAME mpcvm-layout-test COMMAND mpcvm-layout-test)
# GPU engine test — Apple-only (.mm).
if(LUX_MPCVM_ENABLE_METAL AND APPLE)
add_executable(mpcvm-gpu-engine-test test/mpcvm_gpu_engine_test.mm)
target_link_libraries(mpcvm-gpu-engine-test PRIVATE lux_mpcvm_metal)
target_compile_features(mpcvm-gpu-engine-test PRIVATE cxx_std_20)
add_test(NAME mpcvm-gpu-engine-test COMMAND mpcvm-gpu-engine-test)
endif()
# Cross-backend determinism — links to whichever GPU backends are enabled.
add_executable(mpcvm-determinism-test test/mpcvm_determinism_test.cpp)
target_compile_features(mpcvm-determinism-test PRIVATE cxx_std_20)
if(LUX_MPCVM_ENABLE_METAL AND APPLE)
target_link_libraries(mpcvm-determinism-test PRIVATE lux_mpcvm_metal)
elseif(LUX_MPCVM_ENABLE_CUDA)
target_link_libraries(mpcvm-determinism-test PRIVATE lux_mpcvm_cuda)
else()
target_sources(mpcvm-determinism-test PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/src/mpcvm_engine_stub.cpp)
target_link_libraries(mpcvm-determinism-test PRIVATE lux_mpcvm_core)
endif()
if(LUX_MPCVM_ENABLE_WGPU)
target_link_libraries(mpcvm-determinism-test PRIVATE lux_mpcvm_wgpu)
target_compile_definitions(mpcvm-determinism-test PRIVATE LUX_MPCVM_ENABLE_WGPU=1)
endif()
add_test(NAME mpcvm-determinism-test COMMAND mpcvm-determinism-test)
# ---- benchmark harness -------------------------------------------------
#
# Mirrors the determinism harness link rules but compiles -O3 -DNDEBUG
# so the numbers reflect release behaviour.
add_executable(mpcvm-benchmark test/mpcvm_benchmark.cpp)
target_compile_features(mpcvm-benchmark PRIVATE cxx_std_20)
target_compile_options(mpcvm-benchmark PRIVATE -O3 -DNDEBUG)
if(LUX_MPCVM_ENABLE_METAL AND APPLE)
target_link_libraries(mpcvm-benchmark PRIVATE lux_mpcvm_metal)
elseif(LUX_MPCVM_ENABLE_CUDA)
target_link_libraries(mpcvm-benchmark PRIVATE lux_mpcvm_cuda)
else()
target_sources(mpcvm-benchmark PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/src/mpcvm_engine_stub.cpp)
target_link_libraries(mpcvm-benchmark PRIVATE lux_mpcvm_core)
endif()
if(LUX_MPCVM_ENABLE_WGPU)
target_link_libraries(mpcvm-benchmark PRIVATE lux_mpcvm_wgpu)
target_compile_definitions(mpcvm-benchmark PRIVATE LUX_MPCVM_ENABLE_WGPU=1)
endif()
endif()
message(STATUS "")
message(STATUS "=== Lux MPCVM Configuration ===")
message(STATUS " Version: ${PROJECT_VERSION}")
message(STATUS " Build Tests: ${LUX_MPCVM_BUILD_TESTS}")
message(STATUS " Metal: ${LUX_MPCVM_ENABLE_METAL}")
message(STATUS " CUDA: ${LUX_MPCVM_ENABLE_CUDA}")
message(STATUS " WebGPU: ${LUX_MPCVM_ENABLE_WGPU}")
message(STATUS "")