NiobiumInc/niobium-client

GitHub: NiobiumInc/niobium-client

Niobium Client 是一个开源的全同态加密客户端工具链,通过提供统一的中间表示追踪和多前端接入方式,帮助开发者构建并部署 FHE 应用至专用硬件加速器。

Stars: 20 | Forks: 0

# Niobium Client **Niobium Mistic** FHE 加速器的开源客户端技术栈。无论你通过哪种前端接入,路径都是一样的:你的全同态计算会被记录为未优化的 **FHETCH Polynomial IR** 追踪记录 (`.fhetch`),你可以通过内置的本地模拟器进行重放以进行验证,或者提交给 Niobium 编译服务以进行优化并部署到硬件。所有优化逻辑都位于服务器端——这个客户端保持轻量、开源 (Apache 2.0) 且独立运行。 ## 支持矩阵 构建 (`make release`) 和运行客户端所需的外部依赖项: | 依赖项 | 最低版本 | |--------------------------|-----------------| | CMake | 3.16.3 | | GCC | 9.0 | | Clang (GCC 的替代方案) | 10.0 | | GNU make | 3.82 | | bash | 3.0 | | Git | 任意 | | pthreads | 任意 | | yaml-cpp | 0.8.0 | | OpenSSL | 3.0.0 | | BoringSSL / LibreSSL (OpenSSL 的替代方案) | 1.1.1 | | python3 | 3.7 | | certifi (Python 包) | 任意 | python3 和 certifi 是 `fog` CLI 的运行时依赖(而 python3 是 `nbc` DSL 编译器的依赖)——在默认配置下,C++ 构建本身完全不涉及 Python。只有在操作系统/Python 安装未提供可用 CA 存储的情况下(例如 python.org 的 macOS 版本),才严格需要 certifi;在其他情况下,`fog` 会回退到使用系统信任存储。 ## 选择你的入口点 按受众划分,共有四种接入方式: | 你是… | 入口点 | 从这里开始 | |---|---|---| | **AI 编程助手**(或与 AI 结对编程) | **nb DSL + design skill** —— 一套分阶段的 FHE 设计方法论,可为 Claude Code、OpenAI Codex 及其他兼容 agentskills.io 的智能体自动加载,并配有一个紧凑的 DSL,其编译器会生成所有基础架构代码 | [`dsl_fhe/`](dsl_fhe/README.md), [`.claude/skills/`](.claude/skills/fhe-application-design) & [`.agents/skills/`](.agents/skills/fhe-application-design) | | **应用开发者**(使用 OpenFHE C++) | **Instrumented OpenFHE** —— 编写标准的 `EvalMult`/`EvalAdd`/… 代码,用 `niobium::compiler()` 调用将其括起;探针会记录一切 | [Instrumenting an OpenFHE application](#entry-point-2--openfhe-for-application-developers), [`examples/`](examples/) | | **编译器 / 代码生成器作者** | **FHETCH Polynomial IR** —— 通过记录 API(或文本追踪格式)直接发出 IR,并使用会话、重放和传输机制作为你的后端 | [`niobium-fhetch`](https://github.com/NiobiumInc/niobium-fhetch), [`src/fhetch_transport/`](src/fhetch_transport/) | | **FHE 库集成商**(GPU/加速器后端) | **HAZE** —— 一个 CUDA 风格的 C API (`hazeMalloc`/`hazeMemcpy`/`hazeNTT`/…):每次调用都会记录一个多项式级别的 IR 操作,因此针对 CUDA 的 FHE 库只需极少的精力即可完成移植 | [`vendor/niobium-haze`](https://github.com/NiobiumInc/niobium-haze) | 以上四种方式最终都会汇聚到同一个记录器和同一份追踪记录: ``` AI agents End users FHE compilers FHE libraries (Claude Code + (OpenFHE C++ (emit Polynomial (CUDA-shaped code, design skill) applications) IR directly) e.g. FIDESlib) | | | | v | | v +---------------+ | | +---------------+ | nb DSL | | | | HAZE | | dsl_fhe/ |--generates--->| | | libhaze | | (nbc) | OpenFHE C++ | | | hazeAdd, | +---------------+ v | | hazeNTT, ... | +---------------------+ | +---------------+ | Niobium- | | | | instrumented | | | | OpenFHE (probes.h) | | | +---------------------+ | | | openfhe_cprobe_* | fhetch_api.h | one IR op | fires on every | (sr_addp, | per haze | NTT, ADD, MUL, ... | sr_ntt, ...) | call v v v +----------------------------------------------------------------+ | libnbfhetch — FHETCH Polynomial IR recorder | | niobium::compiler() session API: init / start / probe / stop | | cooperative auto-tagging · cache · replay · result | +----------------------------------------------------------------+ | | unoptimized .fhetch trace | + fhetch_replay.json manifest v +---------------+--------------------+ | | v v +-----------------------+ +--------------------------+ | fhetch_sim (local) | | Niobium compilation | | replays the trace, | | service (proprietary) | | reconstructs result | | optimizes and deploys | | ciphertexts — for | | to Mistic hardware | | validation | | | +-----------------------+ +--------------------------+ ``` 有关 FHETCH 指令集、会话 API、追踪格式和模拟器内部原理,请参阅伴随仓库: [`niobium-fhetch`](https://github.com/NiobiumInc/niobium-fhetch)。 ## 入口点 1 —— 适用于 AI 智能体的 DSL + design skill 这种组合的设计使得 AI 编程助手能够在一个会话中完成从*隐私模型*到*经验证的加密流水线*的应用开发: - **design skill**(通过 `make sync-skill` 从 [`niobium-skills`](https://github.com/NiobiumInc/niobium-skills) 目录安装到 [`.claude/skills/fhe-application-design`](.claude/skills/fhe-application-design) 和 [`.agents/skills/fhe-application-design`](.agents/skills/fhe-application-design) 中)可在此仓库中为 Claude Code(从 `.claude/skills/` 加载)、OpenAI Codex 和其他兼容 agentskills.io 的智能体(从 `.agents/skills/` 加载)自动加载。它引导你走过分阶段的方法论——隐私模型、可行性、明文基准、方案选择、电路设计、参数选择、实现、协议规范——其第 7 阶段的“Track A”即针对下方的 DSL。 - **nb DSL** ([`dsl_fhe/`](dsl_fhe/README.md)) 将 `.niob` 源代码编译为链接此客户端的 OpenFHE C++ 代码。信任边界 (`@client`/`@server`,`@encryptors(independent)`) 由编译器强制执行;序列化、密钥生成以及记录/重放插桩均会自动生成;加密属性在类型流中完全是结构化的;每个阶段都会生成一个**明文参考孪生体**(基准);编译时的建议涵盖了切比雪夫多项式次数选择 (`max_error:`)、深度预算以及安全/参数边界(logQ 与环维度,以及固定 N 的裕量)。 ``` cd dsl_fhe make test-compiler # compiler unit tests make examples # build + run all self-contained examples ``` 七个实践示例(`simple`、`fetch-by-similarity`、`password-retrieval`、`set-membership`、`fraud-flag`、`ml-inference-fhe`、`fhe-NetworkMonitor`)与该 skill 的设计参考相配合——其中三个是该 skill 自身设计方案的落地实现。 | 文件 | 用途 | |---|---| | [`dsl_fhe/README.md`](dsl_fhe/README.md) | 概述、构建说明、示例演练 | | [`dsl_fhe/CLAUDE.md`](dsl_fhe/CLAUDE.md) | 设计原理、代码生成内部机制 | | [`dsl_fhe/NB_LANGUAGE.md`](dsl_fhe/NB_LANGUAGE.md) | 语言参考 | | [`dsl_fhe/GRAMMAR.md`](dsl_fhe/GRAMMAR.md) | 形式化 EBNF 语法 | | [`dsl_fhe/HOWTO.md`](dsl_fhe/HOWTO.md) | 逐步演示如何添加新示例 | ## 入口点 2 —— 适用于应用开发者的 OpenFHE 你只需编写标准的 OpenFHE 代码,并添加 `niobium::compiler()` 调用来包裹计算过程。带有插桩的 OpenFHE 分支会在探针级别拦截每一个多项式操作——你**永远**不需要直接调用 FHETCH API。 ### 步骤说明 1. **编译与链接** —— 针对 `libnbfhetch` 和 Niobium 插桩的 OpenFHE 分支构建你的 OpenFHE 应用程序。在计算过程前后添加 `niobium::compiler().init()`,`start()`,`stop()`。无需更改 FHE 算法代码。 2. **执行** —— 每一个 OpenFHE 多项式操作(`NTT`、`INTT`、`ADD`、`SUB`、`MUL`、`MULI`、`ADDI`、`MORPH`、…)都会触发一个 C 探针(`openfhe_cprobe_add`、`openfhe_cprobe_ntt`、…),该探针会在追踪记录中记录一条或多条 FHETCH 指令。 3. **捕获** —— 在调用 `compiler().stop()` 时,追踪记录会被最终确定为 `.fhetch` 文本文件以及 `fhetch_replay.json` 清单(加密上下文、模数链、密钥 ID 范围、输入/输出布局)。 4. **重放(本地)** —— `compiler().replay()` 通过内置的 FHETCH 模拟器执行记录的追踪记录;`compiler().result(cc, name, ct)` 从探针重新还原出 `Ciphertext`,以便应用程序的其余部分(解密、验证)能够继续正常执行。在缓存有效运行的情况下,主机执行的 FHE 操作数量为**零**——并且记录的追踪记录可以使用**重新生成的密钥/输入**进行重放(更改的输入文件会自动刷新)。 5. **提交** —— 将追踪记录(连同序列化的输入和元数据)发送给 Niobium 编译服务,该服务会对其进行降级和优化,以适应 Mistic 加速器。 ### 最小示例 ``` #include "openfhe.h" #include "niobium/compiler.h" using namespace lbcrypto; int main(int argc, char* argv[]) { niobium::compiler().init(argc, argv); niobium::compiler().set_program_info("my_app", "1.0", "CKKS multiply example"); niobium::compiler().set_build_info(__FILE__, __LINE__, __TIMESTAMP__); niobium::Compiler::CacheParameters params; params.push_back({"workload", "ckks_mul"}); niobium::compiler().cache_parameters(params); // Load previously-generated crypto context, keys, and ciphertexts. CryptoContext cc; Serial::DeserializeFromFile("keys/cc.bin", cc, SerType::BINARY); Ciphertext ct_a, ct_b; Serial::DeserializeFromFile("keys/ct_a.bin", ct_a, SerType::BINARY); Serial::DeserializeFromFile("keys/ct_b.bin", ct_b, SerType::BINARY); // ... load mk.bin, rk.bin ... niobium::compiler().capture_crypto_context(cc); niobium::compiler().tag_input("ct_a", ct_a); niobium::compiler().tag_input("ct_b", ct_b); niobium::compiler().tag_keys(cc); if (!niobium::compiler().is_cache_valid()) { // ---- RECORDING ---- // Probes fire automatically during this OpenFHE call. niobium::compiler().start(); auto result = cc->EvalMult(ct_a, ct_b); niobium::compiler().probe("result", result); niobium::compiler().stop(); // .fhetch + fhetch_replay.json are now written to disk. } else { // ---- REPLAY (cache hit: zero FHE ops on the host) ---- niobium::compiler().replay(); } Ciphertext ct_result; niobium::compiler().result(cc, "result", ct_result); Serial::SerializeToFile("keys/ct_result.bin", ct_result, SerType::BINARY); return 0; } ``` 不想手动添加标签?`niobium::compiler().enable_auto_tagging()` 可切换至**协作式自动标记**:插桩的反序列化钩子会捕获加密上下文,对求值密钥进行标记,并在你的代码加载每个输入密文时对其进行标记(这正是 DSL 生成的逻辑)。详见 [`docs/AUTO_FACADE.md`](docs/AUTO_FACADE.md)。 ### 标记输入、密钥和输出(手动模式) - `capture_crypto_context(cc)` —— 使用环维度、模数链和逆链在清单中盖上时间戳;注册 bootstrap 预计算钩子。 - `tag_input(name, ct)` —— 将密文的多项式锚定为具有稳定 FHETCH 地址范围的命名输入,并序列化以供重放。 - `tag_keys(cc)` —— 标记所有求值密钥(eval-mult + eval-automorphism)。 - `probe(name, ct)` —— 标记一个可观察的输出;重放后,`result(cc, name, ct)` 会将其重构出来。 地址布局:输入占据较低的 FHETCH 地址范围(从 1 开始;地址 0 是复制哨兵),接下来是求值密钥,随后是 bootstrap 预计算明文。 ### 手写示例 | 示例 | 功能说明 | |---|---| | `examples/bootstrap/` | 空心记录下的 CKKS bootstrap(大型追踪,完全重放) | | `examples/mult/` | CKKS `EvalMult` —— 客户端/服务端/解密切分,包含重放与重构 | | `examples/simple_ops/` | 由一个测试驱动程序驱动的 13 个操作(ADD、SUB、MUL、NEG、ADDI/SUBI/MULI、复合链、MORPH) | ``` make test-simple-ops-release make test-mult-release make test-bootstrap-release make test-op-release OP=MORPH A=5 B=6 # one specific op ``` ## 入口点 3 —— 适用于编译器编写者的 FHETCH 如果你正在构建 FHE 编译器、转译器或代码生成器,请直接针对 **FHETCH Polynomial IR**,并让这套技术栈作为你的后端: - **记录 API** —— 位于 [`niobium-fhetch`](https://github.com/NiobiumInc/niobium-fhetch) 中的 `fhetch_api.h`:每个 IR 操作对应一次调用(`sr_addp`、`sr_mulp`、`sr_ntt`、`mr_mulp`、…),由 `niobium::compiler()` 会话(init / start / probe / stop / replay / result / cache)封装。 - **追踪格式** —— `.fhetch` 是一种文本格式;你也可以直接输出它。`fhetch_replay.json` 清单包含加密上下文、模数链和 I/O 布局。 - **验证** —— 内置的 `fhetch_sim` 使用确定性的 OpenFHE 原生数学运算重放任何追踪记录;`fhetch_driver` 通过 API 重新驱动追踪记录,作为往返检查。 - **传输** —— [`src/fhetch_transport/`](src/fhetch_transport/) 提供了一个客户端/服务端对及归档格式,用于将追踪记录(连同输入和元数据)交付至编译目标。传入 `--target FOG` 即可在 Niobium 稳定的 FPGA 设备上运行:服务器会将该别名解析为当前绑定的硬件 ID,因此客户端永远不会依赖于内部设备名称。任何其他目标 ID 都将原样转发。 追踪记录的是 FHETCH 操作名称,而不是硬件指令——服务器端编译器会执行底层转换(NTT 拆分、加载/存储插入、寄存器分配)。 ## 入口点 4 —— 适用于 FHE 库集成商的 HAZE [`niobium-haze`](https://github.com/NiobiumInc/niobium-haze)(位于 `vendor/niobium-haze` 目录下)在比 OpenFHE 更低的层级提供了一个 **CUDA 风格的 C API**:`hazeMalloc` / `hazeMemcpy` / `hazeAdd` / `hazeNTT` / … —— 每个公共入口点都是一个单一的多项式级 IR 操作,通过相同的 `libnbfhetch` 核心进行记录。其风格刻意设计为 CUDA 风格,这样一来,基于 CUDA 编写的 GPU FHE 库——例如 [FIDESlib](https://github.com/CKKS-Community/FIDESlib)——只需极少的移植工作即可重新定向到 Niobium 硬件:将 `cuda*` 调用替换为 `haze*` 调用,然后 `hazeFlush()` 会完成追踪记录并调度重放(本地或远程),`azeMemcpy` D2H 会读回重构的结果。 ## 构建 ### 全新构建 ``` make sync # git submodule update --init --recursive make release # configure + build everything (Release) make config && make build # same, Debug (config once, then build) ``` ### 增量构建 ``` make sync make build-release # build OpenFHE + libnbfhetch + examples (Release) make build # same, Debug ``` ### 构建流水线 顶层 `Makefile` 会构建 OpenFHE(位于 `vendor/niobium-fhetch/vendor/openfhe` 下),将其安装在 `vendor/lib/openfhe` 下,然后在同一个目录树中构建 `libnbfhetch` 和示例二进制文件。 ### 前置条件 - C++17 编译器 - CMake 3.16+ - OpenFHE(Niobium 插桩分支,通过 `vendor/niobium-fhetch/vendor/openfhe` 间接获取) - Python 3(DSL 编译器 + 示例测试驱动程序) ### 安装 design skill FHE design skill 是**按需安装**的,并未提交到仓库中。它位于上游目录的 `skills//` 子目录中(子模块无法挂载该目录),因此 `make sync-skill` 会将其复制到 `.claude/skills/fhe-application-design/` 和 `.agents/skills/fhe-application-design/` 中(两者均在 gitignore 忽略列表内)。每个副本都会在一个 `.vendored-from` 文件中记录其来源的上游提交。 随时运行此命令以进行安装或更新——它会重新拉取目录并原地覆盖已安装的副本: ``` make sync-skill # install or update from the default branch scripts/update-fhe-skill.sh # install or update from a specific commit, tag, or branch ``` 目录的最终用户也可以选择使用 skills.sh CLI 进行安装: ``` npx skills add NiobiumInc/niobium-skills --skill fhe-application-design ``` ## Fog 快速入门 **Niobium Fog** 是托管的*任务即服务*重放路径:你无需在本地 `fhetch_sim` 上重放追踪记录,而是通过 TLS 将其提交给 Fog worker(一个 Mistic FPGA,或托管的函数模拟器)。**`fog`** CLI (`scripts/fog`) 会准备任务,等待分配 worker,将 worker 的端点配置到环境中,并针对该端点运行你的 OpenFHE 应用——该应用的 `replay()` 会透明地分发到远程 worker,而不是本地模拟器。 ### 1. 申请账户 Fog 的访问受到限制。请在 **** 申请账户。你将收到一封包含账户邮箱和密码的邮件——`fog login` 会使用它们生成一个长期有效的 API 密钥,并存储在本地 (`~/.fog/credentials`,权限模式 `0600`)。 ### 2. 安装构建先决条件 构建过程需要 C++17 工具链、CMake ≥ 3.16、OpenSSL 头文件(Fog 传输层通过 HTTPS 与 worker 通信)以及 Python 3(`fog` CLI 和示例测试驱动程序)。需要 `git` 来获取子模块。 **macOS** —— 安装 Apple 的命令行工具,接着安装 [Homebrew](https://brew.sh),然后安装 CMake 和 OpenSSL: ``` xcode-select --install # clang, make, git /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" brew install cmake openssl@3 python3 # 在此 shell 中将 CMake 指向 Homebrew 的 OpenSSL(Apple 仅附带 LibreSSL): export OPENSSL_ROOT_DIR="$(brew --prefix openssl@3)" ``` **Ubuntu / Debian**: ``` sudo apt update sudo apt install -y build-essential cmake libssl-dev python3 git ``` ### 3. 构建并安装 CLI ``` make sync # fetch submodules: niobium-fhetch + nested OpenFHE + json + niobium-haze make release # build OpenFHE + libnbfhetch + transport client + examples (Release) make install-cli # install fog + nbcc_fhetch_replay to ~/.local/bin make sync-skill # install the FHE design skill into .claude + .agents ``` 使用 `make sync-fhetch` 替代 `make sync` 可以仅拉取 niobium-fhetch 及其内嵌的 OpenFHE,跳过面向 GPU 的 `niobium-haze` 子模块(默认构建中的任何内容都不需要它)。`make sync-haze` 则单独为面向 GPU 的应用程序拉取 haze。 `make install-cli` 会复制独立的 `fog` 脚本,以及 `fog` 在提交任务时交接给的 `nbcc_fhetch_replay` 传输客户端(由 `make release` 构建)。可以通过 `make install-cli CLI_PREFIX=/usr/local` 安装到其他位置(安装至 `$CLI_PREFIX/bin`)。 确保安装目录在你的 `PATH` 中: ``` # zsh(macOS 默认):~/.zshrc · bash:~/.bashrc(Linux) / ~/.bash_profile(macOS) echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc && exec $SHELL fog --help ``` ### 4. 登录并提交示例任务 ``` fog init # optional: write ~/.fog/config with defaults fog login -u you@example.com # prompts for password; mints + stores an API key cd build/examples ./mult_client mult_keys 7 13 65536 # will create the mult_keys directory, generate keys, and encrypt(ring dimension of 2^16) fog submit ./mult_server mult_keys --target=FOG fog list # watch your jobs ./mult_decrypt mult_keys #decrypt the results ``` `fog submit ./app --target=FOG …` 会准备一个 Fog 任务,阻塞等待直到分配了 worker,然后 `exec` 执行 `./app`,同时设置好 `NBCC_FHETCH_SERVER`/`NBCC_FHETCH_TOKEN`,以便其 `replay()` 在该 worker 上运行。程序名之后的所有内容都会直接传递给你的应用。 `mult_*` 示例是一个分为三步的 客户端 → 服务端 → 解密 的切分过程。客户端生成密钥并加密两个整数,服务端在 Fog worker 上将它们相乘,解密后会显示乘积。`mult_client` 的最后一个参数是环维度(`65536` = 2^16);在它之前的两个整数是操作数。`fog submit` 封装了 `mult_server`,使其 `replay()` 分发到分配的 worker,而不是本地模拟器。 ### `fog` 命令参考 运行 `fog`(或 `fog --help`)查看摘要。所有命令都会读取下文描述的配置和凭证。 | 命令 | 功能说明 | |---|---| | `fog init [-f\|--force]` | 写入带有默认值的 `~/.fog/config`(可根据需要编辑)。`--force` 会覆盖现有文件。 | | `fog login [-u\|--username EMAIL] [-n\|--name NAME]` | 进行身份验证(OAuth2 密码模式)并准备一个**命名的** API 密钥,保存至 `~/.fog/credentials` (`0600`)。如果未提供,则会提示输入邮箱/密码;`-n` 用于为密钥添加标签(默认为 `fog@`)。该操作会添加一个密钥——现有密钥依然有效。它还会将原始令牌打印到标准输出,因此可以使用 `export FOG_API_TOKEN=$(fog login)`。 | | `fog submit ./app --target=T [args…]` | **包装模式** —— 为目标 `T` 准备任务,等待 worker,然后针对它运行你的 OpenFHE 应用 `./app`(额外的参数会传递给应用)。 | | `fog list` | 以表格形式列出你的所有任务(ID、状态、模式、目标、worker、入队时间)以及处理中的数量。 | | `fog get ID [ID…]` | 获取一个或多个任务 ID 的完整 JSON 详细信息。 | | `fog cancel ID [ID…]` | 取消/释放特定任务。 | | `fog cancel --pending` | 取消所有处理中的任务(`queued`/`assigned`/`running`/`reserved`)——释放 worker。 | **`--target` 值** —— `FOG` 在 Niobium 稳定的 FPGA 别名上运行(服务器会将其解析为当前绑定的硬件 ID) `--target` 对于 `submit` 是必需的。 ### 配置 `fog` 会读取两个可选的 INI 文件(使用 `$FOG_HOME` 覆盖该目录,默认为 `~/.fog`)。每个设置的优先级依次为 **环境变量 → 配置文件 → 内置默认值**。 | 文件 | 节 / 键 | 写入者 | |---|---|---| | `~/.fog/config` | `[fog]` `api_url`, `mode`, `wait`, `maxwait` | `fog init`(之后可手动编辑) | | `~/.fog/credentials` | `[fog]` `api_token` | `fog login` (权限模式 `0600`) | **环境变量**(每一个都会覆盖配置文件中的设置): | 变量 | 含义 | 默认值 | |---|---|---| | `FOG_API_URL` | fog-api 的基础 URL | `https://api.niobium.co` | | `FOG_API_TOKEN` | API 令牌(作为 `X-Api-Token` 发送) | 从 `credentials` 读取 | | `FOG_JOB_MODE` | `batch` 或 `persistent` | `batch` | | `FOG_JOB_WAIT` | 每个请求的长轮询秒数 | `20` | | `FOG_JOB_MAXWAIT` | 保持轮询队列的总秒数 | `600` | | `FOG_HOME` | 配置/凭证目录 | `~/.fog` | | `NBCC_FHETCH_REPLAY_BIN` | `fog` 移交给的 `nbcc_fhetch_replay` 客户端的路径 | 查找 `PATH`,然后是 `build/` | | `NBCC_FHETCH_REPLAY` | 设置为 `fog` 以启用驱动程序模式(见上文) | 未设置 | **TLS 说明** —— `fog` 仅使用 Python 标准库。在没有内置 CA 存储的构建版本上(例如某些 python.org 的 macOS 版本),可以通过 `pip install certifi` 为其提供一个用于校验的证书包;否则,它将使用操作系统信任存储,并遵循 `$SSL_CERT_FILE` 的设置。 ## 项目结构 ``` niobium-client/ .claude/skills/ # installed by `make sync-skill` (gitignored) fhe-application-design/ # the FHE design skill (AI agents) .agents/skills/ # same skill, .agents/ convention (Codex / agentskills.io) fhe-application-design/ dsl_fhe/ # nb DSL + cross-compiler (nbc) — entry point 1 xcomp/ # the compiler: lexer, parser, semantic, codegen tools/ # replay-integrity verifier, ... examples/ # simple, fetch-by-similarity, password-retrieval, # set-membership, fraud-flag, ml-inference-fhe, # fhe-NetworkMonitor examples/ # hand-written OpenFHE examples — entry point 2 bootstrap/ # CKKS bootstrap (hollow recording) mult/ # CKKS EvalMult (client / server / decrypt) simple_ops/ # 13 elementary ops, one harness include/niobium/ # public client headers (Utils/ScopedPause.h, ...) src/ auto_facade/ # cooperative auto-tagging (deserialize hooks) fhetch_transport/ # trace transport client/server + archive — entry point 3 docs/ AUTO_FACADE.md # transparent/cooperative record-replay design vendor/ niobium-fhetch/ # submodule: libnbfhetch + fhetch_sim + API headers vendor/openfhe/ # nested submodule: Niobium-instrumented OpenFHE niobium-haze/ # submodule: CUDA-shaped C API — entry point 4 lib/openfhe/ # installed OpenFHE (built by the Makefile) CMakeLists.txt Makefile README.md CLAUDE.md LICENSE (Apache 2.0) ``` ## 架构决策 - **多前端,单一 IR** —— DSL、带插桩的 OpenFHE、直接 FHETCH 输出以及 HAZE 最终都会汇聚到同一个 FHETCH Polynomial IR 和相同的 `niobium::compiler()` 会话机制上。任何记录了有效追踪记录的程序,都可以免费获得模拟器、缓存、使用新输入重放以及编译服务。 - **设计上的瘦客户端** —— 所有优化逻辑都位于服务器端的专有编译器中。客户端只负责记录和传输未优化的指令追踪,从而将开源层面的代码保持在最小限度。 - **基于探针的记录** —— 应用程序代码保持为标准的 OpenFHE;插桩分支中的 C 探针 (`probes.h`) 会在每次多项式操作时触发,FHETCH 库会将它们转换为追踪指令。 - **FHETCH 级别的追踪格式** —— 追踪使用多项式 IR 操作名称(`sr_addp`、`sr_ntt`、`mr_mulp`、…),而不是硬件指令;服务器端编译器会对其进行降级处理(NTT 拆分、加载/存储插入、寄存器分配)。 - **缓存 + 使用新数据重放** —— 追踪记录由 `CacheParameters` 进行缓存。缓存有效运行时,主机上执行的 FHE 操作数量为零:追踪记录会使用当前的输入文件进行重放(更改的输入和密钥会自动刷新),并且记录的追踪记录本身永远不会重新生成(受测试限制,包括时间戳)。 - **用于验证的本地模拟器** —— `fhetch_sim` 使用确定性的 OpenFHE 原生数学运算重放 `.fhetch` 文件,为硬件的计算结果提供参考基准,可通过 `replay()` + `result()` 从用户代码中访问,而无需脱离 OpenFHE 对象模型。 ## 许可证 Apache 2.0 —— 详见 [LICENSE](LICENSE)。 ## 贡献 我们正在积极制定贡献政策和贡献者许可协议(CLA)。在此流程落实之前,我们还无法接受外部贡献。如果你有错误报告、功能请求或问题,请直接[联系我们](https://niobium.co/contact)。 关注此仓库,以便在贡献政策发布时获取通知。
标签:Bash脚本, C++, Python, SOC Prime, 全同态加密, 安全测试工具, 密码学, 开发工具, 手动系统调用, 数据擦除, 无后门, 硬件加速器, 编译器, 逆向工具