冰冻
FROSTR 的 SDK 阈值签名 - 使用 Nostr接力分配密钥保管
什么是FROSTER吗?
弗罗斯特 (Frost Over Nostr)是一种阈值加密协议,它能够使用以Nostr中继为通信层来进行分布式密钥保管. 它执行灵活圆-优化的Schnorr阈值(FROST)签名计划.
问题: 传统密钥管理产生单一的失败点. 如果一个私人钥匙被损坏、丢失或被一个没有的当事方所持有,则失去获得资金或签字的能力.
解决办法: 阈值签名将一键分割为多股,分布于不同方. M-of-N股东必须合作制作签名. 没有一方拥有完整的钥匙,即使在签署期间。 由此产生的签名是标准的BIP-340 Schnor签名——与由单一签名人制作的签名不可区分.
为什么是诺斯特? 诺斯特提供了一个分散的中继网络,已经为消息传递进行了战斗测试. FROSTER利用这一现有的基础设施进行对等通信,端到端加密确保中继操作员永远看不到消息内容.
特征
- 阈值签名: M-o-of-N 签字时没有一方持有完整的密钥
- ECDH 密钥交换:合作获取共同机密
- 端到端加密: 所有对等通讯都加密到 Chacha20-Poly1305
- 鼻孔传输: 使用现有的中继基础设施进行分散通信
- BIP-340 可兼容: 制作可用于比特币和诺斯特尔的标准Schnor签名
- 类型脚本第一: 启用严格模式的完整类型安全
安装
npm install @frostr/bifrost
快速示例
import { BifrostNode } from '@frostr/bifrost'
import { generate_dealer_package } from '@frostr/bifrost/lib'
// Generate a 2-of-3 threshold group
const { group, shares } = generate_dealer_package(2, 3)
// Create and connect a node
const node = new BifrostNode(group, shares[0], ['wss://relay.example.com'])
await node.connect()
// Exchange nonces with a peer
await node.req.ping(shares[1].pubkey)
// Request a threshold signature
const result = await node.req.sign('Hello FROSTR!')
if (!result.ok) throw new Error('signing failed!')
console.log('Signature:', result.data)
见 指南 用于完整的例子.
API 概览
| 方法 | 说明 |
|---|---|
node.req.sign(message) | 请求阈值签名 |
node.req.sign_batch(messages) | 请求多个阈值签名 |
node.req.ecdh(pubkey) | ECDH 协作关键交换 |
node.req.ecdh_batch(pubkeys) | 批量 ECDH 键交换多个密钥 |
node.req.ping(peer) | 平平对等和交换非对等 |
node.req.echo(message) | 测试中继连接 |
node.req.onboard(pubkey) | 装入有组证书的新端点 |
见 API 参考 用于完整文档.
活动
BifrostNode 为生命周期和操作发射输入的事件 :
生命周期事件
| 活动 | 有效载荷 | 说明 |
|---|---|---|
ready | BifrostNode | 节点连接并准备运行 |
closed | BifrostNode | 节点断开 |
message | RpcMessageData | 收到原始消息( 用于调试) |
bounced | [reason, msg] | 信件被拒绝( 未经授权或无效) |
签名事件
| 活动 | 有效载荷 | 说明 |
|---|---|---|
/sign/sender/req | SignSessionPackage | 向同行发送签名请求 |
/sign/sender/res | PartialSigPackage[] | 从同行收到的部分签名 |
/sign/sender/sig | [SignatureEntry[], msgs] | 最后签名合计 |
/sign/sender/rej | [reason, session] | 签名请求阶段失败 |
/sign/sender/err | [reason, msgs] | 签名聚合失败 |
/sign/handler/req | msg | 端点收到的签名请求 |
/sign/handler/res | msg | 向请求者发送部分签名 |
/sign/handler/rej | [reason, msg] | 签名请求被拒绝 |
ECDH 活动
| 活动 | 有效载荷 | 说明 |
|---|---|---|
/ecdh/sender/res | msgs | 从同行收到的ECDH份额 |
/ecdh/sender/ret | [ecdh_pk, secret] | 共享秘密来源 |
/ecdh/sender/rej | [reason, pkg] | ECDH 请求阶段失败 |
/ecdh/sender/err | [reason, msgs] | ECDH 生成失败 |
/ecdh/handler/req | msg | 同行提出的ECDH请求 |
/ecdh/handler/res | msg | ECDH 共享发送给请求者 |
/ecdh/handler/rej | [reason, msg] | 驳回欧洲人权法院的请求 |
文档
| 文档 | 说明 |
|---|---|
| 指南 | 从代码示例和交互式演示开始 |
| API 参考 | 完整的 API 文档 |
| 担保模式 | 威胁模式、保障和部署指导 |
| 技术文件 | 建筑、协议和密码 |
发展
npm install # Install dependencies
npm test # Run test suite
npm run build # Build for production
交互式演示
见正在采取行动的议定书:
npm run demo:keygen # Generate test credentials
npm run demo # Launch 4-pane tmux demo (auto-cleanup on close)
见 指南 需要完整的指示.
捐款
欢迎捐款! 请:
- 在开始工作前打开一个讨论重大变革的问题
- 叉开存储器并创建一个特性分支
- 新功能的写入测试
- 确保所有测试合格(
npm test(中文(简体) ) - 提交带有清晰描述的拉动请求
警卫
见 警卫 用于:
- 威胁模式和安全保障
- FROSTTR 所保护的(和它没有的)
- 安全部署清单
- 报告安全弱点
许可证
麻省理工学院执照 - 看 自由主义 详细情况.