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.
**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标签:Rust, secp256k1, 可视化界面, 密码学, 手动系统调用, 椭圆曲线, 私钥破解, 网络流量审计, 通知系统, 高性能计算