安全三层防线

AI 越聪明,越需要更严的护栏。从「能不能启动」到「交易前检查」再到「交易中风控」,AI Crypto Wallet 用三道防线层层把关,让每一次资金操作都经过至少三重校验。

SafetyGateRiskManager · TradeAuthManager

01三道防线整体架构

任何交易请求(无论来自用户还是 AI)都必须依次穿越三道防线,任一环节拒绝即终止:

用户 / AI 发起交易请求
第 1 道:TradeAuthManagerAI 启动条件(主流币 ≥ $200 或 R-MAB ≥ 20000)
▼ 通过
第 2 道:SafetyGate交易前安全检查(熔断 / 限额 / 白名单 / 审计)
▼ 通过
第 3 道:RiskManager交易中风控(仓位 / 止损止盈 / 滑点)
▼ 通过
执行交易链上广播
设计哲学

三道防线职责分离:TradeAuthManager 管「该不该启动」,SafetyGate 管「这笔交易安不安全」,RiskManager 管「这笔交易盈不盈利」。即使 AI 被诱导,也无法绕过任一环节。

02第 1 道防线:TradeAuthManager

TradeAuthManager 控制 AI 交易功能本身能否启动。不满足条件时,AI 无法开启自动交易,从源头避免「小额账户被高频交易磨损」。

启动条件(满足任一即可)

条件阈值说明
主流币资产≥ $200BNB/ETH/SOL 等原生币 + 持仓总价值
R-MAB 持有量≥ 20000 个平台代币,代表用户是生态参与者

检查方式

检查在后台线程执行(checkInBackground),避免主线程网络请求阻塞 UI。使用 getAllTokenBalances 批量查询(比单查更稳定),查询失败时用 0 兜底而非直接拒绝,结果缓存后主线程通过 canEnableAITrade() 直接读取。

TradeAuthManager tam = new TradeAuthManager(context);
tam.checkInBackground(context, result -> {
    if (result.allowed) {
        // 启动 AI 交易
    } else {
        Toast.show(result.reason); // 显示原因,提示用户加仓
    }
});

检查结果示例

// 通过
{
  "allowed": true,
  "nativeBalance": 0.003376,
  "nativeValueUsd": 1.91,
  "rmabBalance": 20998.0,
  "reason": null
}

// 拒绝
{
  "allowed": false,
  "nativeBalance": 0.001,
  "nativeValueUsd": 0.57,
  "rmabBalance": 5000.0,
  "reason": "资产不足:主流币 $0.57(需≥$200)且 R-MAB 5000(需≥20000),请加仓后重试"
}

03第 2 道防线:SafetyGate

SafetyGate 是所有写入操作(交易 / 转账 / 授权)的前置安全检查,共五步,任一失败即拒绝:

写入工具调用
Step 1:熔断检查连续亏损 3 笔 → 熔断 30 分钟;日错误率 > 50% → 熔断 60 分钟
▼ 未熔断
Step 2:每日限额检查今日交易金额 > maxDailyLoss → 拒绝
▼ 未超限
Step 3:单笔限额检查交易金额 > maxTradeAmount → 拒绝
▼ 未超限
Step 4:白名单检查白名单命中 → 通过;非白名单 → 弹窗确认(60s 超时拒绝);原生币/DEX_ROUTER 豁免
▼ 通过
Step 5:操作描述审计operation_desc 是否清晰 → 记录审计日志
执行交易onTradeSuccess() 更新统计

熔断规则表

触发条件熔断时长说明
连续亏损 3 笔30 分钟保护用户不再连续亏损
日错误率 > 50%60 分钟策略可能失效,需要冷静期
手动触发用户指定用户可随时手动熔断
熔断期间

所有写入工具拒绝执行,但保护性平仓除外(止损触发)。AI 仍可正常分析市场,只是不能交易。

白名单机制与豁免

默认所有代币为黑名单,AI 买入前必须通过白名单检查。检查目标是传入真实的 toToken 合约地址(非固定字符串)。

  • 豁免规则:原生币(NATIVE / DEX_ROUTER / null)豁免白名单检查,无需用户确认。
  • 确认弹窗选项:① 加入白名单并继续(永久加入)② 仅本次允许 ③ 拒绝(取消交易)。
  • 超时处理:60 秒无操作自动拒绝。
  • 存储位置SharedPreferencessafety_gate_state.xml 文件 contract_whitelist 字段。

安全检查结果统一返回 JSON,便于 AI 与 UI 解析:

// 通过
{ "allowed": true, "reason": null }

// 拒绝
{ "allowed": false, "reason": "安全网关拦截: 已熔断,剩余 15 分钟" }

04第 3 道防线:RiskManager

RiskManager 在交易执行过程中做风控,确保单笔风险和总体暴露都在可控范围。

风控规则表

规则默认值说明
单笔最大仓位总资产的 10%防止重仓单一代币
止损线买入价 -5%自动触发卖出
止盈线买入价 +15%自动触发卖出
滑点保护3%DEX 兑换最大滑点
每日最大交易笔数20 笔防止过度交易

止损止盈监控

持仓记录PositionManager 持久化(SharedPreferences)
PositionMonitor 定时检查
价格 ≤ 止损价自动卖出 → 记录亏损
价格 ≥ 止盈价自动卖出 → 记录盈利
价格在区间内继续持有

持仓数据结构示例:

{
  "token": "ETH", "contract": "0x...", "chain": "BNB",
  "amount": 0.1, "avgCost": 3200.0, "currentPrice": 3210.0,
  "stopLoss": 3040.0, "takeProfit": 3680.0,
  "unrealizedPnl": 1.0, "unrealizedPnlPercent": 0.31,
  "boughtAt": 1721484000000
}

05审计日志与脱敏

审计日志

每次工具调用都会记录到 Logger,格式 [时间] [级别] [模块] 消息

[22:05:01] [ACTION] [AgentSwap] swap_tokens chain=BNB target=0x92cb...->NATIVE desc=卖出R-MAB换BNB
[22:05:02] [INFO] [SafetyGate] 检查通过: 白名单命中, 未熔断, 限额正常
[22:05:03] [SUCCESS] [DexTrader] 交易广播成功: txHash=0xabc...
[22:05:04] [INFO] [SafetyGate] onTradeSuccess: 今日第3笔, 累计$150

敏感信息保护

数据类型处理方式存储位置
私钥不存储,AI 不可见WalletManager 内存中
助记词不存储,AI 不可见仅创建/导入时短暂使用
API Key脱敏(前4后4)agent_memory.json
钱包地址完整存储实时从 WalletManager 获取

06异常处理

类别异常类型处理方式
网络异常ConnectException切换备用节点,重试当前批次
SocketTimeout超时缩短至 3s,快速失败快速回退
Cloudflare 403切换 User-Agent 和 HttpClient
GFW 阻断使用自建代理节点
交易异常交易失败记录错误,通知 SafetyGate 更新错误率
滑点过大拒绝交易,提示调整滑点容忍度
Gas 不足提示用户充值原生币
合约调用失败返回错误信息,AI 可调整策略重试
应用异常onCreate 崩溃try-catch(Throwable) + Toast + crash_log
onResume 冲突延迟 500ms 执行网络请求
空指针所有 View 操作前判空
View 初始化失败try-catch + Toast,不闪退
安全红线(注入系统提示词)

1. 你不需要知道私钥,所有签名由钱包本地完成。2. 所有写入操作必须经过安全网关校验。3. 非白名单代币的买入操作必须获得用户明确确认。4. 熔断期间拒绝一切交易操作。5. 绝不暴露用户的私钥、助记词、API Key 等敏感信息。