|
| 1 | +# 02. MiniApp 交易金额语义标准(Raw Amount Standard) |
| 2 | + |
| 3 | +> Last Updated: 2026-02-12 |
| 4 | +> Status: Active(生态升级基线) |
| 5 | +
|
| 6 | +本文定义 MiniApp 与 KeyApp 交互中所有“链上金额字段”的统一语义,避免“展示金额与真实广播金额不一致”的高风险问题。 |
| 7 | + |
| 8 | +--- |
| 9 | + |
| 10 | +## 1. 统一规则(必须遵守) |
| 11 | + |
| 12 | +### 1.1 金额字段一律使用 raw(最小单位整数) |
| 13 | + |
| 14 | +- `amount` 必须是 **十进制整数字符串**(`^\d+$`) |
| 15 | +- 表示链最小单位(如 USDT 8 位精度时,`1000000000` 表示 `10.00000000`) |
| 16 | +- 禁止传入格式化小数字符串(例如 `10.00000000`) |
| 17 | + |
| 18 | +### 1.2 展示与签名/广播职责分离 |
| 19 | + |
| 20 | +- 展示层:根据 `decimals` 把 raw 转为人类可读金额 |
| 21 | +- 交易层:签名与广播始终使用 raw |
| 22 | +- 严禁在显示修复时改动实际广播语义 |
| 23 | + |
| 24 | +### 1.3 适用接口(第一批) |
| 25 | + |
| 26 | +- `bio_sendTransaction.params.amount` |
| 27 | +- `bio_createTransaction.params.amount` |
| 28 | +- `bio_destroyAsset.params.amount` |
| 29 | + |
| 30 | +--- |
| 31 | + |
| 32 | +## 2. 风险背景(为什么必须统一) |
| 33 | + |
| 34 | +当调用方把 raw 当 formatted,或 Host 把 formatted 当 raw,会导致: |
| 35 | + |
| 36 | +- 面板显示金额被放大/缩小(误导用户) |
| 37 | +- 签名/广播金额与用户预期不一致 |
| 38 | +- 后端入库与链上数据出现语义冲突(含重复提交与对账困难) |
| 39 | + |
| 40 | +这是高风险交易语义问题,不是纯 UI 问题。 |
| 41 | + |
| 42 | +--- |
| 43 | + |
| 44 | +## 3. 当前审计结论(KeyApp 内置应用) |
| 45 | + |
| 46 | +### 3.1 已符合或基本符合 |
| 47 | + |
| 48 | +- `xin.dweb.rwahub`:调用 `bio_sendTransaction` 前使用整数运算构造 raw(BigInt 路径) |
| 49 | +- `xin.dweb.biobridge`(forge/redemption 主路径):在有精度上下文时将用户输入转换为 raw 再调用 |
| 50 | + |
| 51 | +### 3.2 需升级 |
| 52 | + |
| 53 | +- `xin.dweb.teleport`:当前 `bio_createTransaction` 调用路径仍可能传格式化小数字符串(示例:补 `.0`) |
| 54 | + |
| 55 | +### 3.3 Host 侧需对齐项 |
| 56 | + |
| 57 | +- `bio_sendTransaction` 已按 raw 语义处理(现状) |
| 58 | +- `bio_destroyAsset` 对话框仍存在 formatted 假设(需要改为 raw 语义) |
| 59 | +- `bio_createTransaction` 当前存在“自动识别 raw/formatted”路径(应收敛为单一 raw 语义) |
| 60 | + |
| 61 | +--- |
| 62 | + |
| 63 | +## 4. 升级计划(执行顺序) |
| 64 | + |
| 65 | +### Phase 0:标准冻结(立即) |
| 66 | + |
| 67 | +- 白皮书明确 raw-only 规则(本文) |
| 68 | +- 对外同步“禁止 formatted amount” |
| 69 | + |
| 70 | +### Phase 1:Host 收敛(优先) |
| 71 | + |
| 72 | +- `bio_destroyAsset` 切换为 raw 解析与展示 |
| 73 | +- `bio_createTransaction` 去除双语义自动判断,统一 raw-only |
| 74 | +- 参数不合规时统一返回 `INVALID_PARAMS` |
| 75 | + |
| 76 | +### Phase 2:内置应用对齐 |
| 77 | + |
| 78 | +- 升级 `xin.dweb.teleport`,确保传入 raw |
| 79 | +- 回归验证 `biobridge`、`rwahub` 多笔交易流程 |
| 80 | + |
| 81 | +### Phase 3:生态外部应用迁移 |
| 82 | + |
| 83 | +- 发布迁移窗口和截止版本 |
| 84 | +- 要求每个应用提交“amount 字段转换点”自检清单 |
| 85 | +- 逐步开启严格校验(不再接收 formatted) |
| 86 | + |
| 87 | +--- |
| 88 | + |
| 89 | +## 5. 测试与验收基线 |
| 90 | + |
| 91 | +### 5.1 最小验收样例 |
| 92 | + |
| 93 | +- 输入 `amount="1000000000"`, `decimals=8`:展示 `10.00000000` |
| 94 | +- 输入 `amount="10.00000000"`:直接 `INVALID_PARAMS`(严格模式) |
| 95 | +- 广播上链金额必须保持 `raw=1000000000` |
| 96 | + |
| 97 | +### 5.2 回归重点 |
| 98 | + |
| 99 | +- 多笔交易队列(FIFO,不互相覆盖) |
| 100 | +- 手势/支付密码步骤下金额不漂移 |
| 101 | +- 广播失败时状态文案与实际阶段一致 |
| 102 | + |
| 103 | +--- |
| 104 | + |
| 105 | +## 6. 迁移沟通模板(摘要) |
| 106 | + |
| 107 | +对生态方统一口径: |
| 108 | + |
| 109 | +1. `amount` 改为 raw 整数字符串 |
| 110 | +2. UI 层自行处理 formatted ↔ raw |
| 111 | +3. 不再依赖 Host 自动兼容 formatted |
| 112 | + |
| 113 | +完整可执行提示词见:`/.chat/2026-02-12-miniapp-amount-raw-upgrade-plan.md` |
| 114 | + |
0 commit comments