forgesworn/nsec-tree-cli
GitHub: forgesworn/nsec-tree-cli
一个离线优先的命令行工具,让用户从单个根密钥派生和管理无限个层级化的 Nostr 身份,并支持密码学所有权证明与 Shamir 恢复。
Stars: 0 | Forks: 0
# nsec-tree-cli
**Nostr:** [`npub1mgvlrnf5hm9yf0n5mf9nqmvarhvxkc6remu5ec3vf8r0txqkuk7su0e7q2`](https://njump.me/npub1mgvlrnf5hm9yf0n5mf9nqmvarhvxkc6remu5ec3vf8r0txqkuk7su0e7q2)
```
npx nsec-tree-cli root create
```
一个根密钥。无限的 Nostr 身份。完全离线。
`nsec-tree-cli` 是一个用于**层级化 Nostr 身份管理**的命令行工具,基于 [`nsec-tree`](https://www.npmjs.com/package/nsec-tree) 库构建。它允许你从单个根密钥派生出任意数量的独立密钥对——就像锁匠用一把主钥匙打孔出无数把独一无二的钥匙一样。每个派生的身份都有自己的 npub 和 nsec,彼此之间完全不可关联,但当你选择证明时,它们都可以追溯到你的根身份。整个工具完全离线工作。你的根密钥永远不会接触到网络。
## 实际运行效果
**创建根身份** — 生成一个 BIP-39 助记词并将其保存为本地配置文件。写下这个助记词;它是你的恢复途径。
```
$ nsec-tree root create --name main
root type mnemonic-backed
recoverable yes
master npub npub1wk7lycqxj5x05thzl59fszlhcmpxe4ya045662skh8elk8zy6rzs6r7hle
profile main
mnemonic misery robust expire sand reflect stove life
hold patch electric vessel rebuild
Store this mnemonic offline. It cannot be recovered.
Try next:
nsec-tree derive path personal
nsec-tree export nsec personal
```
**派生特定用途的身份** — 通过斜杠分隔的路径创建一棵树。在这里,`personal` 是一个类别,而 `forum-burner` 是一个叶子身份。
```
$ nsec-tree derive path personal/forum-burner --mnemonic "abandon ... about"
root
└─ personal@0 npub1nleq...n47ps
└─ forum-burner@0 npub1fakn...kym592 (leaf)
```
**导出私钥** — 当你需要将派生的身份加载到 Nostr 客户端时使用。
```
$ nsec-tree export nsec personal/forum-burner --mnemonic "abandon ... about"
path personal@0/forum-burner@0
nsec nsec1gpd5p2chjuqc9jr72hk6sj662x85v23rzv283wr99cuc0n2068sscuu5wu
This is a private key. Store it securely.
```
**证明两个身份共享同一个根** — 一种密码学证明,证明你的 forum-burner 与你的主身份属于同一个根,而无需泄露派生路径或根密钥本身。
```
$ nsec-tree prove private personal/forum-burner --mnemonic "abandon ... about"
proof type private
master pubkey 3eb14b...8d656
child pubkey 4f6d38...f61f26
attestation nsec-tree:own|3eb14b...8d656|4f6d38...f61f26
signature e3086d...56be4
This proof shows shared root ownership
without revealing how the child was derived.
```
**验证证明** — 任何人都可以检查它。直接将 JSON 证明通过管道传入即可。
```
$ nsec-tree prove private personal/forum-burner --json | nsec-tree verify proof --stdin
✓ Proof is valid
proof type private
master pubkey 3eb14b...8d656
child pubkey 4f6d38...f61f26
```
## 为什么需要层级化身份?
大多数 Nostr 用户只有一个密钥。一个 npub,一个 nsec,在任何地方都只有一个身份。这在行不通之前看似没问题——你可能想要为某个论坛使用一个一次性身份,为一个项目使用一个单独的身份,或者使用一个无法被关联回你主账号的化名。
你可以生成独立的密钥,但这样你就会失去它们之间的联系线索。如果其中一个身份被泄露,或者你需要证明它们是相关的,你就会陷入困境。
层级化派生解决了这个问题。一个根身份可以生成一棵身份树。每个分支在密码学上都是独立的——不同的密钥,没有可见的关联。但正因为它们都派生自同一个根,你可以根据需要选择性地证明所有权。可以把它想象成带有可选逃生舱的隔离式身份。
## 为什么要证明所有权?
默认情况下,`nsec-tree` 中的所有内容都是私密且完全隔离的。但有时你*想要*在无需泄露你整个身份树的情况下,向一个无需信任的网络注入不可否认的真相。关联证明能够支持强大的工作流:
- **建立信任:** 要发布一个新的 bot 或项目?生成一个证明,将你高声誉的主账号与新的 npub 关联起来,让人们知道它是你官方拥有的。
- **安全密钥轮换:** 如果你的手机被黑客入侵且日常使用的密钥被泄露,你可以从离线的根身份派生一个新密钥并发布一个证明。你的关注者将确切知道该迁移到哪里。
- **自愿去匿名化:** 以完全匿名的方式运营一个举报人或化名账号,然后在日后你想获取认可时,通过密码学证明那就是你。
- **企业层级结构:** 一个主公司根身份委托给 `@marketing` 和 `@support`,在员工不持有主密钥的情况下证明官方从属关系。
## 完全离线
`nsec-tree` 不会发起任何网络调用。没有 DNS 查询,没有 TLS 握手,没有中继连接,没有遥测。每一项操作——根身份创建、派生、导出、证明、Shamir 拆分——都完全在你的机器上运行。
这意味着它可以在物理隔离的硬件上运行。这意味着你的根助记词永远不会离开运行该命令的设备。这也意味着你可以确切地验证该工具的功能,因为没有任何需要信任的服务器端组件。
## 你可以做什么?
| 命令组 | 功能 |
|---------------|-------------|
| `root` | 创建、恢复或导入根身份(助记词或现有的 nsec) |
| `derive` | 在你身份树的任意路径派生子身份 |
| `export` | 为派生的密钥提取 npub、nsec 或完整的身份包 |
| `prove` | 生成将子身份与其根关联起来的密码学证明 |
| `verify` | 在不需要根密钥的情况下验证证明 |
| `shamir` | 将你的助记词拆分为多个份额;并从达到阈值的份额中恢复 |
| `profile` | 在本地保存并在命名的根配置文件之间切换 |
| `inspect` | 检查路径和根元数据,而无需派生密钥 |
| `explain` | 五个关于该工具背后概念的内置迷你教程 |
每个命令都支持 `--json`(用于脚本编写)、`--quiet`(用于流水线操作)和 `--no-hints`(用于禁止“下一步尝试”的建议)。设置 `NSEC_TREE_NO_HINTS=1` 可永久禁用提示。
## 安装
免安装试用:
```
npx nsec-tree-cli root create
```
全局安装以便永久保留它:
```
npm install -g nsec-tree-cli
```
需要 Node.js 22 或更高版本。
## 从 CLI 本身学习
`explain` 命令包含五个主题,会在你使用过程中逐步讲解相关概念:
```
nsec-tree explain model # What is nsec-tree? The mental model.
nsec-tree explain proofs # How ownership proofs work.
nsec-tree explain recovery # Mnemonics, Shamir, and backup strategies.
nsec-tree explain paths # How derivation paths and indices work.
nsec-tree explain offline # Why offline-first matters for key management.
```
无需离开终端即可理解你在做什么。
## 用于脚本的 JSON 输出
每个命令都支持 `--json` 以输出机器可读的内容:
```
$ nsec-tree root create --json
{
"rootType": "mnemonic-backed",
"recoverable": true,
"masterNpub": "npub139ps...vexeg",
"mnemonic": "educate bitter aspect nerve step three knife clutch lake auction accident decide"
}
```
将派生操作通过管道传递给证明生成,将证明输入到验证中,拆分助记词并恢复它们——所有这些都可以编写成脚本。
## 文档
- [CLI-SPEC.md](./CLI-SPEC.md) — 命令语法和设计原则
- [JSON-SCHEMAS.md](./JSON-SCHEMAS.md) — 所有命令的稳定 JSON 输出 schema
- [ARCHITECTURE.md](./ARCHITECTURE.md) — CLI 与库之间的关注点分离
- [MISSION.md](./MISSION.md) — 该项目存在的原因
## 构建基于
- [`nsec-tree`](https://www.npmjs.com/package/nsec-tree) — 派生和证明库
- [`@forgesworn/shamir-words`](https://www.npmjs.com/package/@forgesworn/shamir-words) — 支持人类可读的 BIP-39 单词编码的 Shamir 秘密共享
## 支持
有关问题和功能请求,请参阅 [GitHub Issues](https://github.com/forgesworn/nsec-tree-cli/issues)。
## ForgeSworn 工具包的一部分
[ForgeSworn](https://forgesworn.dev) 为 Nostr 构建开源的密码学身份、支付和协同工具。
| 库 | 功能 |
|---------|-------------|
| [nsec-tree](https://github.com/forgesworn/nsec-tree) | 确定性子身份派生 |
| [ring-sig](https://github.com/forgesworn/ring-sig) | secp256k1 上的 SAG/LSAG 环签名 |
| [range-proof](https://github.com/forgesworn/range-proof) | Pedersen 承诺范围证明 |
| [canary-kit](https://github.com/forgesworn/canary-kit) | 抗胁迫的口语验证 |
| [spoken-token](https://github.com/forgesworn/spoken-token) | 人类可发音的验证 token |
| [toll-booth](https://github.com/forgesworn/toll-booth) | L402 支付中间件 |
| [geohash-kit](https://github.com/forgesworn/geohash-kit) | 带有多边形覆盖的 Geohash 工具包 |
| [nostr-attestations](https://github.com/forgesworn/nostr-attestations) | NIP-VA 可验证认证 |
| [dominion](https://github.com/forgesworn/dominion) | 基于 epoch 的加密访问控制 |
| [nostr-veil](https://github.com/forgesworn/nostr-veil) | 隐私保护的信任网络 |
## 许可证
MIT
针对层级化 Nostr 身份的 NIP 提案正在开发中。
标签:BIP-39, MITM代理, Nostr, Shamir碎片恢复, 暗色界面, 离线优先, 自定义脚本, 身份生成