Seashail

架构

系统架构概述,展示代理进程/守护进程设计以及从 MCP 宿主到链层的组件流程。

Seashail 使用代理-守护进程架构,允许多个智能体进程共享单一密钥存储和策略状态。这种设计在支持并发智能体访问的同时,确保了一致的安全边界。

系统概述

Seashail 将 MCP stdio 接口(代理)与核心状态管理(守护进程)分离。这允许多个智能体(Claude Desktop、Cursor 等)同时连接,而不会产生密钥存储冲突或重复提示密码短语。

┌─────────────────┐
│   MCP 宿主      │  (智能体:Claude Desktop、Cursor 等)
│  (stdio 客户端) │
└────────┬────────┘
         │ stdio(换行符分隔的 JSON 上的 JSON-RPC)

┌─────────────────┐
│  seashail mcp   │  轻量级 stdio 代理
│    (代理)     │  - 注入网络覆盖参数
└────────┬────────┘  - 守护进程未运行时自动启动
         │ Unix 套接字 / 命名管道 / TCP 回环

┌─────────────────┐
│ seashail daemon │  单例进程
│                 │  - 持有独占密钥存储锁
│                 │  - 管理密码短语会话
└────────┬────────┘  - 协调所有 MCP 客户端


┌─────────────────┐
│  MCP 服务器     │  工具调度 + 交互确认
│  (在守护进程中)│  - 策略评估
└────────┬────────┘  - 密钥解密 + 签名
         │           - 交易广播

┌─────────────────┐
│  策略引擎       │  拦截每个写操作
│                 │  - 分级审批(自动/确认/拦截)
└────────┬────────┘  - 美元上限、滑点、白名单


┌─────────────────┐
│   链层          │  链特定适配器
│  (EVM/Solana/   │  - RPC 通信
│   Bitcoin)      │  - 交易构建
└─────────────────┘  - 广播

架构层次

MCP 宿主

MCP 宿主是通过 stdio 与 Seashail 通信的智能体或编辑器(Claude Desktop、Cursor、Windsurf、VSCode)。智能体发送 JSON-RPC 工具调用并接收工具响应。

关键特性:

  • 通过 stdin/stdout 上的换行符分隔 JSON 进行通信
  • 在初始化时接收工具描述和模式
  • 永远不会看到原始私钥或密码短语(通过 MCP 交互确认处理)
  • 可以运行多个实例连接到同一守护进程

代理(seashail mcp)

代理是由智能体启动的轻量级 stdio 进程。它将 stdio 转换为守护进程的套接字协议,并注入会话特定参数。

职责:

  • 接受来自 MCP 宿主的 stdio JSON-RPC
  • 如果指定了 --network,将其覆盖注入工具调用
  • 如果守护进程尚未运行,自动启动它
  • 通过 Unix 套接字(或 Windows 上的命名管道)将工具调用转发给守护进程
  • 将守护进程响应转发回 stdio

与守护进程分离的原因:

  • 每个智能体都需要自己的 stdio 进程(与智能体生命周期绑定)
  • 网络覆盖是会话特定的(不同智能体可以使用不同网络)
  • 轻量级进程,无状态或锁

守护进程(seashail daemon)

守护进程是持有所有状态并协调所有 MCP 客户端的单例进程。每个用户只运行一个守护进程。

职责:

  • 持有独占文件系统锁(data_dir/seashail-daemon.lock)以防止脑裂
  • 管理密钥存储(加密私钥、沙米尔密钥分片)
  • 缓存密码短语会话(基于 TTL,跨客户端共享)
  • 协调来自多个代理的并发工具调用
  • 无客户端连接时空闲退出(可选)

单例的原因:

  • 单一密钥存储锁防止并发写入导致损坏
  • 密码短语会话在智能体间共享(解锁一次,处处使用)
  • 策略状态一致性(所有智能体相同的限额、白名单、开关)

MCP 服务器

MCP 服务器在守护进程内运行,实现模型上下文协议。它将工具调用分派给处理程序并管理交互确认提示。

职责:

  • 工具注册和模式生成
  • 工具调用分派(解析参数、验证、路由到处理程序)
  • 密码短语和确认的交互确认
  • 工具响应序列化

关键工具:

  • 钱包工具(创建、导入、列表、充值信息)
  • 网络工具(余额、价格、交易历史)
  • 写入工具(发送、兑换、跨链桥接、DeFi、NFT)
  • 策略工具(获取/设置策略字段)

策略引擎

策略引擎在签名前评估每个写操作(发送、兑换、跨链桥接、DeFi、NFT)。它应用分级审批规则并执行美元上限、滑点限制和白名单。

审批级别:

  • 自动批准 — 静默执行(低风险,在限额内)
  • 用户确认 — MCP 交互确认提示(超过自动批准阈值)
  • 硬性阻止 — 拒绝(超过硬性上限或违反策略)

策略控制:

  • 每笔交易和每日美元上限
  • 滑点限制(兑换、跨链桥接、DeFi)
  • 杠杆限制(永续合约)
  • 白名单(地址、合约、代币)
  • 操作开关(启用/禁用整个类别)
  • 内部转账豁免

有关所有策略字段,请参阅策略工具参考;有关使用示例,请参阅策略与审批指南

链层

链层是构建和广播交易的链特定适配器。每个链族(EVM、Solana、Bitcoin)都有自己的适配器。

职责:

  • RPC 通信(余额查询、交易模拟、广播)
  • 交易构建(从工具参数构建未签名交易)
  • 燃料/手续费估算
  • 链特定签名(EVM 的 EIP-1559、Solana 的版本化交易)
  • 交易市场适配器(NFT 的 Blur、Magic Eden、OpenSea、Tensor)

支持的链:

  • EVM: Ethereum、Base、Optimism、Arbitrum、Polygon(主网 + 测试网)
  • Solana: 主网 + Devnet
  • Bitcoin: 主网 + 测试网(BIP-84 原生 SegWit)

为什么使用代理 + 守护进程?

代理进程/守护进程分离解决了三个问题:

1. 多智能体共享状态

没有守护进程,每个智能体都需要自己的密钥存储副本。这会产生同步问题:

  • 在 Claude Desktop 中创建的钱包不会出现在 Cursor 中
  • 在 Cursor 中输入的密码短语不会解锁 Windsurf
  • 在一个智能体中的策略更改不会应用于其他智能体

守护进程提供了单一的事实来源。

2. 并发访问安全

多个进程写入同一密钥存储文件可能导致损坏。守护进程持有独占文件系统锁,确保一次只有一个进程修改密钥存储状态。

3. 密码短语会话缓存

没有会话缓存,每个需要密钥访问的工具调用都会提示输入密码短语。守护进程以 TTL 缓存解密密钥(默认 15 分钟),因此解锁一次即可处处使用。

数据流

请求路径

智能体输入消息
  → 智能体调用工具(stdio JSON-RPC)
  → 代理接收工具调用
  → 代理注入网络覆盖(如果设置了 --network 标志)
  → 代理通过套接字转发给守护进程
  → 守护进程接收工具调用
  → MCP 服务器验证参数
  → 策略引擎评估(对于写操作)
  → 如果需要密码短语:MCP 交互确认提示
  → 如果需要用户确认:MCP 交互确认提示
  → 链适配器构建交易
  → 密钥存储签名交易
  → 链适配器广播交易
  → MCP 服务器返回响应
  → 守护进程通过代理发送响应
  → 代理通过 stdio 发送响应给智能体
  → 智能体接收工具结果

响应路径

响应通过相同的层次反向流回:

链广播结果
  → 链适配器打包响应
  → MCP 服务器序列化
  → 守护进程发送给代理
  → 代理发送给智能体
  → 智能体显示给用户

交叉参考

目录