安全三层防线
AI 越聪明,越需要更严的护栏。从「能不能启动」到「交易前检查」再到「交易中风控」,AI Crypto Wallet 用三道防线层层把关,让每一次资金操作都经过至少三重校验。
01三道防线整体架构
任何交易请求(无论来自用户还是 AI)都必须依次穿越三道防线,任一环节拒绝即终止:
三道防线职责分离:TradeAuthManager 管「该不该启动」,SafetyGate 管「这笔交易安不安全」,RiskManager 管「这笔交易盈不盈利」。即使 AI 被诱导,也无法绕过任一环节。
02第 1 道防线:TradeAuthManager
TradeAuthManager 控制 AI 交易功能本身能否启动。不满足条件时,AI 无法开启自动交易,从源头避免「小额账户被高频交易磨损」。
启动条件(满足任一即可)
| 条件 | 阈值 | 说明 |
|---|---|---|
| 主流币资产 | ≥ $200 | BNB/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 是所有写入操作(交易 / 转账 / 授权)的前置安全检查,共五步,任一失败即拒绝:
熔断规则表
| 触发条件 | 熔断时长 | 说明 |
|---|---|---|
| 连续亏损 3 笔 | 30 分钟 | 保护用户不再连续亏损 |
| 日错误率 > 50% | 60 分钟 | 策略可能失效,需要冷静期 |
| 手动触发 | 用户指定 | 用户可随时手动熔断 |
所有写入工具拒绝执行,但保护性平仓除外(止损触发)。AI 仍可正常分析市场,只是不能交易。
白名单机制与豁免
默认所有代币为黑名单,AI 买入前必须通过白名单检查。检查目标是传入真实的 toToken 合约地址(非固定字符串)。
- 豁免规则:原生币(
NATIVE/DEX_ROUTER/null)豁免白名单检查,无需用户确认。 - 确认弹窗选项:① 加入白名单并继续(永久加入)② 仅本次允许 ③ 拒绝(取消交易)。
- 超时处理:60 秒无操作自动拒绝。
- 存储位置:
SharedPreferences的safety_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 笔 | 防止过度交易 |
止损止盈监控
持仓数据结构示例:
{
"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 等敏感信息。