DeFi / NFT 后端架构模式¶
30 秒版(开场)¶
Web3 后端 = 链上结算 + 链下体验:索引器、报价 API、元数据、风控。DeFi 重 Oracle/滑点/MEV;NFT 重 元数据/IPFS/版税。Go 常做 聚合 API、任务队列、对账。生产关键词:链上链下一致性、价格延迟、合规 KYT。
3 分钟版(精讲深度)¶
- 是什么:用户通过前端签 tx;后端提供数据、缓存、业务规则,不替代链上清算。
- 为什么:架构师/Web3 后端面问「swap 报价怎么来」「NFT 图片存哪」。
- 怎么做:读路径走可回溯索引 + 指定 block 的 RPC;写路径由用户签名或受控平台钱包。报价与风控可组合多源数据,但链上结算最终以合约实际读取的 oracle/pool 状态为准。
10 分钟版(原理 + 图示)¶
flowchart TB
FE[Web/App] -->|sign tx| Wallet[钱包]
FE --> API[Go API 层]
API --> Idx[索引器 DB]
API --> RPC[节点 RPC]
API --> IPFS[IPFS / OSS 元数据]
API --> Oracle[价格 Oracle 缓存]
Wallet --> Chain[链上协议 DEX/NFT]
Chain --> Idx
DeFi 后端组件
| 组件 | 职责 |
|---|---|
| 报价服务 | 读 pool reserve / aggregator API |
| 交易构建 | 组装 router calldata,用户签 |
| 风控 | 滑点上限、黑名单、KYT |
| 对账 | 链上 swap event vs 订单 |
NFT 后端组件
| 组件 | 职责 |
|---|---|
| Metadata API | tokenURI 解析 JSON |
| 媒体 | IPFS CID + CDN 缓存 |
| 版税 | EIP-2981 仅表达 royalty 信息,是否执行取决于市场/协议 |
| 铸造队列 | 平台代 mint + Gas 管理 |
Oracle 注意
- Chainlink 等链上 feed 必须绑定明确的网络、feed 地址、资产对和版本,并校验
answer、decimals、updatedAt及业务允许的范围。staleness 阈值要依据该 feed 公布的 heartbeat/deviation 与业务风险制定,不存在所有 feed 通用的秒数 - 在使用受支持 L2 的 feed 时,还要检查对应 sequencer uptime feed,并在 sequencer 恢复后执行 grace period;链下缓存不能把过期或停机期间的值重新包装成“新价格”
- 报价 API 还应带 quote block、expiry、slippage assumptions,并在发送前重新模拟
跨链桥(简述)
- 信任模型:官方桥 / 轻客户端 / 多签 — 说明 额外信任假设
- 后端记录 bridge tx 状态机,非即时 finality
生产场景¶
- DEX 聚合器:Go 调 1inch/0x API + 自建 pool 模拟
- Launchpad:白名单 Merkle proof 链下生成,用户 mint tx 上链
- GameFi:链下游戏态 + 周期性链上结算
排查与工具¶
- DeBank/Etherscan 对账
- Slither/Mythril 合约审计(后端懂结论即可)
- 合规:TRM/Chainalysis 地址风险 API
架构取舍¶
| 全链上游戏 | 链下状态 |
|---|---|
| 透明 | 体验好 |
| 贵 | 需信任运营方 |
与 S-SOL-07 安全、S-SOL-05 多租户 在 SaaS 钱包场景交叉。
深挖问答¶
- MEV 是什么? → 排序提取价值;后端可提示 slippage、私有 RPC。
- NFT 元数据中心化? → IPFS 仍可能 gateway 挂;hash 上链锚定。
- 和 CeFi 交易所区别? → 托管 vs 非托管;本模块偏链上数据服务。
- L2 架构? → 序列器、L1 结算、不同 finality;索引器需区分 chainId。
反模式与事故¶
- 后端替用户 unlimited approve
- Oracle 单源无 staleness 检查 → 错误清算
- 把 IPFS/CDN 当成天然不可变 → CID 内容寻址,但 tokenURI/baseURI、网关和合约本身仍可能升级;展示端要记录解析来源与版本
代码示例¶
报价 API 可返回 {chainId, to, data, value, quoteBlock, expiresAt, gasEstimate} 供钱包复核和签名;前端仍应校验目标地址、chain、模拟结果和最小输出,gas estimate 不是上限保证。