5. 安全、测试与可观测性
把钱包登录、资产金额、权限暂停、测试矩阵、监控指标和对账视图合并为质量保障章节。
8. 安全最佳实践
8.1 钱包登录
必须满足:
- nonce 由服务端生成,设置短 TTL。
- nonce 按钱包地址存储,登录成功后一次性消费。
- 签名消息必须包含域名、chain id、nonce、过期时间和用途。
- 签名公钥必须能推导出提交的钱包地址。
- 后台钱包登录不能弱于会员钱包登录。
8.2 资产和金额
必须满足:
- 支付资产由链上或配置化注册表管理。
- decimals 从资产 metadata 读取,并限制边界。
- 业务价格精度和支付资产精度有明确换算。
- 小额订单换算不能变成 0。
- 大额订单和多件商品必须做溢出测试。
- 前端展示金额、后端校验金额、合约扣款金额必须可对账。
8.3 权限和暂停
必须满足:
- 超级管理员、多签或治理地址初始化明确。
- 用户、商户、运营、财务、结算、POC 管理权限分离。
- 敏感参数更新有延迟生效或多签。
- 高风险模块支持 pause。
- pause 不应破坏用户提现、退款或必要恢复路径,除非是明确的紧急冻结。
8.4 日志和密钥
禁止记录:
- 完整 Authorization header。
- 钱包 API key。
- signedTx 完整原文。
- nonce 原文。
- 私钥、管理员密钥或生产 DSN。
9. 测试矩阵
9.1 合约测试
必须覆盖:
- 正常创建、支付、确认、结算、贡献成熟和贡献发放。
- 金额为 0、换算为 0、溢出、decimals 边界。
- 库存不足、重复业务项、限购和时间窗口。
- 退款申请、拒绝、通过、重复处理。
- 权益锁定、释放、回退。
- 贡献重复发放、pause、custody 余额不足。
- 权限不足、错误 signer、错误资产。
- 事件字段和 view 返回值。
9.2 后端测试
必须覆盖:
- 钱包登录 nonce 过期、重复使用、地址不匹配。
- signedTx 反序列化失败。
- sender 不匹配。
- chain id 错误。
- 合约地址、module、function 错误。
- 参数数量和泛型参数错误。
- 参数语义篡改。
- tx hash 重复提交和 pending 恢复。
- 链上成功但本地异步任务写入失败。
- 链上失败但本地状态已 pending。
9.3 消费者测试
必须覆盖:
- 重复事件。
- 已处理业务对象。
- 链上事件缺失。
- 链上事件字段解析失败。
- 本地事务失败。
handle_status=1崩溃后 lease 回收。- 搜索增量同步和兜底同步。
- POC ContributionEvent 与 DApp 贡献发放事件对账。
9.4 端到端测试
每次重要发版至少跑通:
- Web3 登录。
- 业务对象创建。
- 支付或资产锁定。
- 确认完成。
- 退款或异常处理。
- 结算。
- 成熟贡献生成。
- POC 贡献发放。
- POC staged power 写入。
- POC committed power 展示。
10. 可观测性和对账
必须观测:
| 指标 | 目的 |
|---|---|
| RPC 请求失败率 | 判断链节点或上游服务状态 |
| 交易提交失败率 | 发现钱包、后端、合约或参数问题 |
| tx pending 数量和时间 | 发现未确认或待恢复交易 |
| event_bus 积压 | 发现消费者滞后 |
| 链上事件解析失败数 | 发现 ABI 或事件字段变更 |
| 读模型落后时间 | 衡量用户看到状态的延迟 |
| POC ContributionEvent 数量 | 衡量 DApp 贡献发放 |
| POC 价格快照失败数 | 发现 Coinfair 价格输入问题 |
| POC Writer 写回失败数 | 发现 PowerStore 写回问题 |
| 搜索同步失败数 | 发现查询投影不一致 |
对账视图必须支持:
wallet address
-> local member
-> business object id
-> tx hash
-> chain event
-> read model state
-> mature contribution
-> ContributionEvent
-> POC period
-> staged power
-> committed power