Cosigner 架构
各组件运行在哪里、彼此如何通信,以及会话如何协调。

组件
Cosigner 运行时
一个 Go 二进制文件,以 ghcr.io/fystack/cosigner 发布,支持 linux/amd64 和 linux/arm64。它只加入会话,不负责协调会话。
- MPC 引擎:Fystack 的 tss-lib 分支,与 MPCium 相同。ECDSA 在 secp256k1 上使用 GG18。EdDSA 使用 tss-lib 的门限 Ed25519。
- 身份密钥:Ed25519,在配对时创建。用于认证 cosigner 并签名其消息。
- 密钥存储:以 AES-256-GCM 加密的记录,存储在 SQLite(默认)、Badger 或 DynamoDB 中。
- Gateway 中继:一条出站 gRPC 流。每 5 秒发送一次在线状态。
- 审批客户端:在每个会话开始前调用你的审批回调。
- 审计日志:经过签名、哈希链式连接的 JSONL。
你的服务
- cosigner-cli:负责安装、校验、配对、启动和备份运行时。
- 审批回调:你的 HTTPS 服务器。返回
approve或reject。 - 存储密钥来源:密码(
manual配置)或 AWS KMS(unattended配置)。
Fystack 服务
- Apex:签发配对 token、注册 cosigner 密钥、处理吊销并提交 MPC 请求。
- Gateway:接收 cosigner 流,检查身份和吊销状态,并将流量桥接到 NATS。在所有副本中,每个 cosigner 只有一条活动流。
- Orchestrator:运行会话状态机并签名每条控制消息。从不接触密钥分片。
- MPCium:Fystack 的 MPC 节点。请参阅 MPCium。
通道
| 发送方 → 接收方 | 传输方式 | 认证 | 承载内容 |
|---|---|---|---|
| Cosigner → Apex | HTTPS | 一次性配对 token | 身份注册 |
| Cosigner ↔ Gateway | gRPC 流,TLS | EdDSA JWT,有效期 60 秒 | 全部会话流量 |
| Gateway ↔ Orchestrator ↔ MPCium | NATS | 每条消息使用 Ed25519 | Fystack 内部协调 |
| 参与方 ↔ 参与方 | 中继转发 | X25519 + ChaCha20-Poly1305 | MPC 轮次,端到端加密 |
| Cosigner → Callback | HTTPS | 双向 RS256 JWT | 批准或拒绝 |
流信封
每一帧都携带经过认证的 workspace_id、cosigner_id 和 participant_id。Gateway 会丢弃与流身份不匹配的帧。
| 类型 | 方向 | 主题 |
|---|---|---|
CONTROL |
Orchestrator → cosigner | mpc.v1.peer.<participant_id>.control |
SESSION_EVENT |
Cosigner → orchestrator | mpc.v1.session.<session_id>.event |
P2P |
参与方 ↔ 参与方 | mpc.v1.peer.<to>.session.<session_id>.p2p |
PRESENCE |
Cosigner → orchestrator | mpc.v1.peer.<participant_id>.presence |
信任边界
- Gateway:中继密文。可以丢弃或延迟流量,但无法读取或伪造 MPC 消息。
- Orchestrator:使用 cosigner 在配对时固定的密钥签名每条控制消息。未签名或签名错误的消息会被丢弃。
- Apex:无法跳过你的回调。每个会话都会先经过你的回调。
- 你的 cosigner:无法单独签名。签名委员会在密钥生成时即已固定。
详情请参阅安全模型。
会话
每次密钥生成、签名或重新分享都是一个 orchestrator 会话,TTL 为 120 秒。

- 准入:Orchestrator 校验 Apex 签名、检查委员会,并确认每个参与方都在线。每个钱包和协议同一时间只能有一个会话。
- waiting:参与方收到已签名的
session_start,执行本地检查(cosigner 会调用你的回调),然后回复peer_joined、peer_ready。 - key_exchange:参与方交换已签名的 X25519 密钥。配置了审批方的钱包还需要在此阶段获得其签名的批准。
- active_mpc:Orchestrator 发送
mpc_begin。参与方直接运行 tss-lib 轮次。 - completed:所有参与方报告相同的结果哈希。Orchestrator 签名并发布结果。
当参与方出错、断开连接或结果不一致时,会话会失败;超过 120 秒则会过期。无论哪种情况,orchestrator 都会广播一条已签名的 session_abort。
委员会
门限 t 表示需要 t + 1 个签名方(tss-lib 语义)。由 MPCium 节点和 cosigner 组成的委员会在密钥生成时即已固定。之后的每个会话都必须使用相同的参与方密钥、身份密钥和审批方角色。
连接
- 每个 cosigner 身份只有一条活动流。使用相同身份的第二个实例会被拒绝。
- 每个会话都绑定到其启动时处于活动状态的流。如果该流断开,会话将以
PARTICIPANT_DISCONNECTED失败。 - 已被吊销的 cosigner 会收到
PermissionDenied并停止运行。