sachncs/find

GitHub: sachncs/find

一个高性能 Rust 实现的 secp256k1 私钥发现系统,采用区间分割与 Montgomery 批量求逆算法,面向密码学研究与教育场景。

Stars: 1 | Forks: 0

Secp256k1 Find Tool

High-performance secp256k1 private-key discovery using range-splitting and Montgomery batch inversion.

Rust License CI crates.io Stars

**find** 是一个高性能的 Rust 系统,用于 secp256k1 私钥发现, 它采用了多变种区间分割算法。它搜索标量 `j` 和偏移量 `V`,使得 `x(j·G) = x(P - V·G)`,从而得出候选密钥 `d = V ± j (mod n)`。 ## 功能 - **512 变种搜索引擎** — 使用 2 的幂和累积求和进行区间分割;512 变种集合在每个进程内只分配一次(无每次会话的内存分配)。 - **两种输入模式** — `--pubkey ` 用于传统的变种键控 X 坐标扫描;`--address ` + `--from X --to Y` 用于在用户指定范围内进行针对 hash40 的发现。参见 [ADR-0011](docs/adr/0011-address-discovery.md)。 - **运行时大小的批处理数组** — 根据 `Config::batch_size` (1..=256) 调整大小的 `Vec` / `Vec` / `Vec`。参见 [ADR-0009](docs/adr/0009-runtime-batch-size.md)。 - **批量归一化** — 在归一化阶段使用 Montgomery 同时求逆实现约 15–20 倍的提速。 - **并行扫描** — 通过 `rayon` 实现支持提前退出的工作窃取数据级并行。 - **无锁跨批次协调** — `OnceLock` 替换了之前的 `Mutex + AtomicBool` 对(参见 [优化决策 0007](docs/optimization-decisions/0007-oncelock-early-exit.md))。 - **二进制缓存** — 为受 I/O 限制的缓存扫描提供可选的预计算(在 NVMe 上约 100 倍提速)。在地址模式下自动禁用。 - **原子检查点** — 采用先写后重命名的方式实现具有完整性锚点的崩溃安全状态持久化。 - **结构化可观测性** — 使用 `tracing` 实现非阻塞滚动文件日志。 - **全面测试** — 包含基于属性的测试、集成测试、编排器测试、审计测试、KAT 和差分测试套件。 - **差分测试** — 针对 `libsecp256k1`(参考 C 语言实现)进行跨实现验证。 - **模糊测试** — 针对公共 API(`parse_pubkey`, `parse_pubkey_roundtrip`, `hex_to_scalar`, `scalar_mul_g`, `generate_variants`, `match_x`)设置了六个 cargo-fuzz 目标。 - **严格的 Lint 配置** — 精选的 `pedantic + nursery` clippy 集合,带有已记录的允许列表,并由 `-D warnings` 严格控制。 - **合并必需的 `cargo miri`** — 每个 PR 都会在 `ubuntu-latest` 上运行 `cargo +nightly miri test --workspace --all-features`。 ## 安装 ### 从 crates.io 安装 ``` cargo install find ``` ### 从源码安装 ``` git clone https://github.com/sachncs/find.git cd find cargo build --release ``` ### 环境要求 - Rust **1.81** 或更高版本(MSRV 在提交 16 中被提升,以使用稳定的 `core::error::Error` trait) - 支持的平台:Linux, macOS, Windows (x86_64 和 aarch64) ## 快速入门 ### CLI ``` # 针对 public key 的基础搜索 find --pubkey 0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 # 在搜索过程中生成 binary cache(每十亿 scalars 约 32 GB) find --pubkey 0279be66... --cache-points # 调整 batch size 和 variant count(高级;commits 7a/7b 在运行时同时遵循两者) find --pubkey 0279be... --batch-size 64 --variants 256 # 自定义数据和日志目录 find --pubkey 0279be66... --output-dir --log-dir # Address-keyed discovery:在 [from, to] 范围内搜索 a 背后的 scalar # mainnet P2PKH/P2SH address。`--from` / `--to` 接受十进制或 # 带 `0x` 前缀的 hex。参见 docs/cli.md 和 ADR-0011。 find --address 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa --from 1 --to 100000000 ``` 如需详细引导,请参阅 [docs/getting-started.md](docs/getting-started.md)。 ### Rust API(库) ``` use find::config::Config; use find::ecc; use find::orchestrator; let pubkey = "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798"; let config = Config::new(pubkey, "data", false) .try_with_batch_size(32)? // 1..=256; returns FindError::InvalidConfig on out-of-range .try_with_variant_count(512)?; // 1..=512 let match_ = orchestrator::run(&config)?; if let Some(m) = match_ { println!("MATCH DISCOVERED via {} at j={}", m.label, m.j); println!("Candidates (d = V ± j): {:?}", m.candidates_hex()); } # Ok::<(), find::error::FindError>(()) ``` 高级入口点为 `find::orchestrator::run(&Config) -> Result, FindError>`。来自 [`SearchMatch`] 的 `[Scalar; 2]` 候选数组可以直接进行检查 (`m.candidates`),或通过 `candidates_hex()` 访问器转换为十六进制以供显示。 ## 配置 ### 环境变量 | 设置 | 环境变量 | 默认值 | 描述 | |---------|--------------|---------|-------------| | 日志过滤器 | `RUST_LOG` | `info` | 日志级别过滤器(例如 `debug`, `trace`) | | 回溯 | `RUST_BACKTRACE` | `0` | 设置为 `1` 以在 panic 时生成回溯信息 | ### 编译时常量和运行时默认值 | 符号 | 值 | 来源 | 用途 | |--------|-------|--------|---------| | `TRILLION` | `1_000_000_000_000` | `src/orchestrator.rs` | 审计边界日志的步长 | | `DEFAULT_CACHE_CHUNK_SIZE` | `1_000_000_000` | `src/orchestrator.rs` | 每个缓存块的标量数量 | | `BatchSize::DEFAULT.get()` | `32` | `src/config.rs` | 默认批次大小 | | `BatchSize::MAX` | `256` | `src/config.rs` | 最大合法批次大小 | | `MAX_VARIANT_COUNT` | `512` | `src/config.rs` | 最大合法变种数量 | | `MAX_SEARCH` | `u64::MAX` | `src/orchestrator.rs` | 扫描上限 | `DEFAULT_BATCH_SIZE` 常量作为公共默认值保留,用于基准测试 / 文档使用;运行时的控制值是类型为 `BatchSize` 的 `Config::batch_size`(提交 7a)。 ### CLI 标志 | 标志 | 类型 | 默认值 | 范围 | 效果 | |------|------|---------|-------|--------| | `--batch-size` | `u32` | `32` | `1..=256` | 每次 Montgomery 批量归一化的点数;在运行时生效(提交 7b) | | `--variants` | `u32` | `512` | `1..=512` | 2 的幂 + 累积求和变种 | | `--cache-points` | `bool` | `false` | — | 将 X 坐标持久化到磁盘,用于受 I/O 限制的重复运行 | 超出范围的 `--batch-size` 或 `--variants` 值将被报告为 `FindError::InvalidConfig`,并导致二进制程序以非零状态退出(无 panic)。 有关完整的配置参考,请参见 [docs/configuration.md](docs/configuration.md),包括驱动 `cargo clippy --all-targets --all-features -- -D warnings` 的精选 `[lints]` 配置。 ## 性能 热点循环主要由以下部分主导: - 每个大小为 `batch_size` 的批次执行一次引导标量乘法(在默认的 `batch_size = 32` 下约 256 次域乘法)。 - `batch_size - 1` 次混合 `+G` 加法(每次约 12 次域乘法)。 - 对 `batch_size` 点批次进行 Montgomery 同时求逆。 - 在驻留于 16 KiB L1 缓存的 key 数组中进行二分搜索 `match_x`。 `find::ecc::scalar_mul_g` 使用 k256 的 `MulByGenerator::mul_by_generator` 并启用了 `precomputed-tables` 特性。一个 33 项的 Radix16 查找 表(约 30 KB 静态内存,延迟构建)将引导标量乘法的成本 大约减少了一半。在 M3 Pro 上测得 (opt-level=3, lto=fat, criterion 100 采样): | 基准测试 | 启用预计算表前 | 启用预计算表后 | 提速 | |---|---|---|---| | `plus_g_chain/chain_32_plus_g` | 33.78 µs | 18.93 µs | 1.78× | | `plus_g_chain/naive_32_independent_scalar_muls` | 919.88 µs | 455.89 µs | 2.02× | | `end_to_end_small_scalar_12345` (1000万 标量) | ~5.27 ms | 1.949 ms | 2.70× | 在进行预计算表更改之前,引导占每个批次 周期的约 80%;现在 chain + Montgomery 归一化 + match 总共占据了 主导地位。将 `batch_size` 增加到 64 以上收益递减。 批次大小的选择需要在每个批次的分配成本(热点路径 数组在堆上分配并在运行时确定大小)之间进行权衡 —— 参见 [ADR-0009](docs/adr/0009-runtime-batch-size.md)。 `generate_variants` 的每次会话冷启动成本在正常路径上 实际上是免费的:512 项变种元数据(label、scalar、decimal 偏移量)在每个进程中通过 `OnceLock>` 进行驻留。 只有特定于目标的 `compute_variant_x_bytes` 仍然是 每次会话的工作。参见 [优化决策 0002](docs/optimization-decisions/0002-variant-labels-once-lock.md) 以及新的 `optimization-decisions/0007-oncelock-early-exit.md` 了解相关决策。 对于持续的工作负载,在 NVMe 硬件上,缓存扫描路径比受限于 CPU 的路径快约 100 倍(完整指南请参见 [docs/performance.md](docs/performance.md))。 复现已发布的周期计数: ``` cargo bench --bench bench # criterion microbenchmarks cargo bench --bench bench -- --baseline current -- --threshold 5 # 5% regression gate scripts/build-pgo.sh # profile-guided optimized build scripts/run-benchmarks.sh # benchmark wrapper ``` ## 研究可复现性 代码库附带五个独立的验证层: - **KAT 测试** (`tests/kat.rs`):13 个已知答案测试,针对 SEC1 §2.7.1 向量和 `k256` 参考输出,以及来自提交 4 的 `to_hex_x` ↔ `x_bytes` 往返回归测试 (`kat_to_hex_x_matches_x_bytes_hex` + `prop_to_hex_x_equals_x_bytes_hex`)。 - **差分测试** (`tests/differential.rs`):针对 12 个边界标量(1, 2, 3, 7, 100, 1k, 1M, 1.2G, 2^32, 2^63, u64::MAX, …),将 `k256` 与参考 C 语言实现 `libsecp256k1` 进行交叉检查。 - **审计测试** (`tests/audit.rs`):针对已知标量 `1234567890` 进行端到端流水线测试(解析 → 变种 → 扫描 → 恢复),以及对 `[2, 10_000]` 进行 20 个用例的属性测试。 - **集成测试** (`tests/integration.rs`):随机发现 + 新的 `prop_batch_size_runtime` 属性测试,该测试执行 `--batch-size in 1..=256` 并验证生成的匹配项在不同批次选择下是不变的。 - **单元测试**(位于 `src/` 中):`search`、`ecc`、`config` 和 `error` 中的每个公共函数都有单元测试(上次统计时有 71 个库测试)。 使用 `cargo test --all-targets --all-features` 运行全部五项测试。完整的本地预提交关卡(镜像 CI)为: ``` cargo fmt --all -- --check cargo clippy --all-targets --all-features -- -D warnings cargo test --all-targets --all-features cargo test --doc RUSTDOCFLAGS="-D warnings" cargo doc --no-deps --all-features cargo +nightly miri test --workspace --all-features # required for merges touching unsafe ``` ## 迁移 (0.1.6 → 0.2.0) 下一个版本 (`v0.2.0`) 发布了在 评审驱动审查期间引入的破坏性变更: | API | 之前 (0.1.6) | 之后 (0.2.0) | |---|---|---| | `Config::batch_size` 字段 | `pub batch_size: u32` | `pub batch_size: BatchSize` (提交 7a) | | `Config::{with_batch_size, with_variant_count}` 构建器 | `fn(self, u32) -> Self` (会 panic) | `#[deprecated]`;被返回 `Result` 的 `try_with_*` 构建器替换 | | `--batch-size` 运行时生效 | 被忽略;固定在 `MAX_BATCH = 32` | 通过堆分配的运行时大小批次生效(提交 7b) | | `Config::validate` | 仅浅层检查 | 重命名为 `Config::validate_fields`;保留了 `Config::validate_pubkey()` 深度验证(提交 3 + 重命名阶段) | | `find::search::SearchMatch::candidates` | `pub candidates: [String; 2]` | `pub candidates: [Scalar; 2]`(提交 12,破坏性) | | `SearchMatch::candidates_as_scalars` | `pub fn(&self) -> Result<[Scalar; 2]>` | `pub fn(&self) -> [Scalar; 2]`(无需解析) | | `SearchMatch::candidates_hex()` | (不存在) | 新增:返回 `[String; 2]` | | `find::search::generate_variants` | `-> Vec` | `-> &'static [OffsetVariant]`(提交 7c,破坏性) | | `find::search::VariantIndex::new` | `fn(variants: Vec) -> Self` | `fn(variants: &'static [OffsetVariant], x_bytes: &[[u8; 32]]) -> Self` | `find::search::OffsetVariant` | 携带 `x_bytes: [u8; 32]` | 不再携带 `x_bytes`;`offset` 字段重命名为 `offset_decimal`(使用新的 `compute_variant_x_bytes` 辅助函数) | | `SearchMatch::small_scalar` | `pub small_scalar: u64` | 重命名为 `SearchMatch::j: u64` | | `find::search::perform_chunked_sweep` | — | 重命名为 `find::search::sweep_parallel` | | `find::search::precompute_chunk` | — | 重命名为 `find::search::sweep_and_cache` | | `find::persistence::perform_cached_sweep` | — | 重命名为 `find::persistence::sweep_cached` | | `find::persistence::FileCacheWriter` | `pub struct FileCacheWriter` | 重命名为 `find::persistence::BinaryCacheWriter` | | `find::persistence::save_variants_to_json` | — | 重命名为 `find::persistence::write_variants_json` | | `find::telemetry::install_rayon_panic_handler` | — | 重命名为 `find::telemetry::install_worker_panic_handler` | | `find::search::BATCH_SIZE` 常量 | `pub const BATCH_SIZE: u64 = 32` | **已移除**(使用 `find::config::DEFAULT_BATCH_SIZE`) | | `find::config::MIN_J` 常量 | `pub const MIN_J: u64 = 1` | 重命名为 `find::config::MIN_SEARCH_SCALAR` | | `find::config::SweepRange` | 可用 | **已移除**(提交 8) | | `find::search::MAX_BATCH` 常量 | `pub const MAX_BATCH: usize = 32` | **已移除**(提交 7b) | | Doctest `Box` | 存在于 6 处以上位置 | 替换为 `Box`(提交 16,MSRV 1.81) | | MSRV | 1.70 | **1.81**(提交 16) | | `k256-bmi2` crate | 存在 `bmi2-adx` 特性,`mul_bmi2_adx` 占位符 | 移除了 BMI2/ADX 代码路径;该 crate 仅限可移植,带有工作正常的 schoolbook `mul` + 对称 `square`。零 `unsafe`。未接入 `find` 的热点路径;用作正确性预言机。(ADR-0010) | 完整的评审驱动审查增加了(未破坏 API):`BatchSize` newtype + `try_with_*` 构建器、运行时批次大小调整、`OnceLock` 协调、驻留的静态变种元数据、严格的 `cargo clippy -D warnings`(带有精选的 pedantic + nursery 集合),以及合并必需的 `cargo miri` 作业。 ## 文档 所有项目文档均位于 [`docs/`](docs/README.md) 下。重点内容: - [docs/overview.md](docs/overview.md) — 项目目标、范围、支持的平台 - [docs/architecture.md](docs/architecture.md) — 系统架构、数据流、并发、同步原语 - [docs/algorithms.md](docs/algorithms.md) — 数学基础和伪代码 - [docs/cli.md](docs/cli.md) — 完整的 CLI 参考 - [docs/configuration.md](docs/configuration.md) — 环境变量和常量 - [docs/modules.md](docs/modules.md) — `find` crate 的逐模块参考 - [docs/observability.md](docs/observability.md) — 日志记录、tracing、审计边界 - [docs/performance.md](docs/performance.md) — 性能特征和调优 - [docs/testing.md](docs/testing.md) — 测试策略和方法论 - [docs/security.md](docs/security.md) — 安全模型 - [docs/glossary.md](docs/glossary.md) — 术语、缩写、定义 - [docs/adr/](docs/adr/README.md) — 架构决策记录 (0001–0009) - [docs/optimization-decisions/](docs/optimization-decisions/README.md) — 单项优化理由 (0001–0007) ## 项目结构 ``` find/ ├── src/ │ ├── lib.rs # Crate root; #![warn(missing_docs)] + #![warn(rustdoc::broken_intra_doc_links)] │ ├── main.rs # CLI binary entry point │ ├── config.rs # Config, BatchSize newtype, validation, MAX_BATCH_SIZE / MAX_VARIANT_COUNT │ ├── ecc.rs # SEC1 parsing, point arithmetic, hex conversion, to_hex_x │ ├── error.rs # FindError (8 variants) + Result alias │ ├── search.rs # Pure domain logic: VariantIndex, generate_variants, sweep_parallel, │ │ # sweep_and_cache, compute_variant_x_bytes, CacheWriter trait, Progress │ ├── persistence.rs # Checkpoint save/load, BinaryCacheWriter, sweep_cached, │ │ # write_variants_json (the only libc::fsync unsafe lives here) │ ├── orchestrator.rs # run(&Config) entry point + checkpoint/lifecycle loop │ └── telemetry.rs # tracing-subscriber + Rayon panic handler ├── tests/ │ ├── audit.rs # End-to-end key recovery + 20-case proptest │ ├── differential.rs # Cross-check vs libsecp256k1 (12 boundary scalars) │ ├── integration.rs # Randomized discovery, prop_batch_size_runtime, │ │ # prop_search_finds_any_scalar_in_range, edge cases │ ├── kat.rs # 13 known-answer tests + to_hex_x round-trip │ └── orchestrator.rs # Session flow + checkpoint-resume + corruption rejection ├── benches/ │ └── bench.rs # Criterion micro-benchmarks (9 cases including x_bytes, │ # batch_normalization, +G chain, end-to-end) ├── fuzz/ │ └── fuzz_targets/ # cargo-fuzz targets (6): │ ├── parse_pubkey.rs │ ├── parse_pubkey_roundtrip.rs │ ├── hex_to_scalar.rs │ ├── scalar_mul_g.rs │ ├── generate_variants.rs │ └── match_x.rs ├── k256-bmi2/ # Workspace member: portable 5×52 limb schoolbook + │ # symmetric square. Correctness oracle for k256 │ # arithmetic; not wired into find's hot path. │ # See ADR-0010. ├── docs/ # Architecture, algorithms, ADRs, optimization decisions ├── Cargo.toml # Package metadata, deps, [lints], profiles └── README.md ``` ## 开发 ``` cargo build --release cargo test cargo bench cargo clippy --all-targets --all-features -- -D warnings cargo fmt --all -- --check cargo +nightly miri test --workspace --all-features # required if you touched unsafe ``` 该项目还附带了一个 `Makefile`: | 命令 | 描述 | |---------|-------------| | `make build` | 编译生产环境二进制文件 (opt-level=3, lto=fat) | | `make test` | 运行详尽的测试套件 | | `make bench` | 使用 Criterion 运行微基准测试 | | `make lint` | 运行 fmt + clippy + doc 检查 | | `make doc` | 生成并打开 API 文档 | | `make coverage` | 生成 HTML 覆盖率报告 (`cargo tarpaulin`) | | `make deny` | 运行 `cargo-deny` 进行许可证/依赖项审计 | | `make all-checks` | 运行完整的验证套件 (`scripts/check-all.sh`) | **本地预提交关卡**(镜像 CI)在 [CONTRIBUTING.md](CONTRIBUTING.md) 中有详细记录;对于任何添加或修改 `unsafe` 代码的 PR,`cargo +nightly miri test --workspace --all-features` 步骤是必需的,并且 `cargo bench --bench bench -- --baseline current -- --threshold 5` 关卡确保没有任何热点路径的更改会导致超过 5% 的性能倒退。 ## 测试 ``` cargo test --all-targets --all-features cargo test --doc RUSTDOCFLAGS="-D warnings" cargo doc --no-deps --all-features cargo +nightly miri test --workspace --all-features # ~10–30 min on first run ``` ## 构建 ``` cargo build --release ``` 发布配置 (`Cargo.toml`): ``` [profile.release] opt-level = 3 lto = "fat" codegen-units = 1 panic = 'abort' strip = true overflow-checks = true ``` ## 发布 版本遵循[语义化版本控制](https://semver.org/)。该 crate 目前处于 `0.1.6`;下一个版本 (`0.2.0`) 是发布上述 [迁移](#migration-016--020) 中记录的破坏性 API 变更的 SemVer 次版本号更新。版本通过 [CHANGELOG.md](CHANGELOG.md) 中的 `version:X.Y.Z` 提交进行标记,并通过 CI 工作流 (`release.yml`) 发布到 crates.io。 ## 技术栈 | 类别 | 技术 | |----------|------------| | 语言 | Rust (2021 edition, **MSRV 1.81**) | | 密码学 | k256 0.13 (`arithmetic`, `serde`, `bits`, `pkcs8`) — 纯 Rust,经过审计 | | 域算术参考 | k256-bmi2 0.1.0(workspace 成员;可移植的 5×52 limb schoolbook + 对称 square;仅作正确性预言机 —— 未接入 `find` 热点路径。参见 [ADR-0010](docs/adr/0010-k256-bmi2-portable-scope.md).) | | 并行计算 | rayon 1.8 (工作窃取);使用 `find_map_any` 实现提前退出 | | CLI | clap 4.4 (derive) | | 错误处理 | `thiserror` 2 (库), `anyhow` 1 (二进制) | | 序列化 | serde 1 + serde_json 1 (检查点 + points.json 导出) | | 可观测性 | `tracing` 0.1 + `tracing-subscriber` 0.3 (`env-filter`) + `tracing-appender` 0.2 | | 热点路径编码 | hex 0.4, `k256::elliptic_curve::bigint::U256` (无 BigUint) | | 地址发现 (hash40 路径) | `sha2` 0.10, `ripemd` 0.1 (纯 Rust,经过审计) | | 十六进制 + 大整数(仅测试辅助) | `num-bigint` 0.5 (dev-dep) | | POSIX(仅限 Unix) | `libc` 0.2 (唯一经过审查的 `unsafe`:位于 `src/persistence.rs` 的 `libc::fsync`) | | 测试 | `proptest` 1.11, `criterion` 0.8, `tempfile` 3, `rand` 0.10, `rand_chacha` 0.10, `num-traits` 0.2 | | CI/CD | GitHub Actions (Ubuntu + macOS + Windows); `ubuntu-latest` 上的 `cargo miri` 为合并必需 | ## 最新交付(评审驱动的完善,提交 1–16) 以下项目已在 `master` 分支的提交 1–16 中交付,并分别在其对应的提交和 ADR 中进行了详细说明: - **移除了 `u256_to_decimal` 中的 `unsafe`**(提交 1)— `src/search.rs` 中仅存的 `unsafe` 已消失。 - **收紧了 `libc::fsync` 的 SAFETY 注释**(提交 2)— 三段式的独立理由说明。 - **`Config::validate_pubkey`** + **`FindError::InvalidConfig`**(提交 3)— 在会话开始时实现深度的 SEC1 快速失败。 - **`to_hex_x` ↔ `x_bytes` 往返回归测试**(提交 4)。 - **`to_hex_x` 直接使用 `AffineCoordinates::x()`**(提交 5)— 去掉了 SEC1 框架的往返转换。 - **`OnceLock` 替换了 `Mutex + AtomicBool`**(提交 6)— 参见 [optimization-decisions/0007](docs/optimization-decisions/0007-oncelock-early-exit.md)。 - **`BatchSize` newtype + `try_with_*` 构建器**(提交 7a)— 运行时大小批次的基础。 - **堆分配的热点路径批处理数组**(提交 7b)— `--batch-size` 最终在运行时生效;参见 [ADR-0009](docs/adr/0009-runtime-batch-size.md)。 - **`generate_variants -> &'static [OffsetVariant]`**(提交 7c)— 驻留的元数据;每次会话执行 `compute_variant_x_bytes`。 - **`SweepRange` 已移除**(提交 8)— 清除了无用的 newtype。 - **合并必需的 `cargo miri` 作业**(提交 9)— `.github/workflows/ci.yml::miri`。 - **精选的 `[lints]` 部分**(提交 10)— 带有文档化允许列表的 pedantic + nursery。 - **`SearchMatch.candidates: [Scalar; 2]`**(提交 12)— 破坏性变更;新增 `candidates_hex()` 访问器。 - **缓存扫描中的 `copy_from_slice`**(提交 13)— 去掉了 `try_into + expect`。 - **ADR-0009、优化决策 0007、CHANGELOG 汇总、文档刷新**(提交 14)。 - **MSRV 1.70 → 1.81**(提交 16)— 启用稳定的 `core::error::Error`。 ## 路线图 - Profile-guided optimization (PGO) CI 集成 - WebAssembly 目标 (WASI),用于基于浏览器的研究工具 (`wasm32-unknown-unknown`) - 对 `+G` 链正确性和匹配不变量的形式化验证 - 扩展的 KAT/差分覆盖(更大的 `TEST_SCALARS` 集合) - `secp256r1` / `secp384r1` (RustCrypto `elliptic-curves`) — 完整列表请参见 [docs/roadmap.md](docs/roadmap.md) ## 安全 向 **sachncs@gmail.com** 报告漏洞 — 参见 [SECURITY.md](SECURITY.md)。 有关安全模型,请参见 [docs/security.md](docs/security.md)。 ## 许可证 [MIT](LICENSE-MIT) © 2026 Sachin **免责声明:** 此工具仅用于教育和研究目的。完整的法律条款请参见 [DISCLAIMER.md](DISCLAIMER.md)。
标签:Rust, secp256k1, 可视化界面, 密码学, 手动系统调用, 椭圆曲线, 私钥破解, 网络流量审计, 通知系统, 高性能计算