kilax9276/collateral-settlement-gateway
GitHub: kilax9276/collateral-settlement-gateway
一个 Web3 抵押品结算网关参考实现,通过链上金库托管资产、链下签名意图驱动业务逻辑,解决混合架构下快速执行与可审计结算的矛盾。
Stars: 0 | Forks: 0
# 抵押品结算网关
**链上抵押品。链下速度。可审计的结算。**
抵押品结算网关 (Collateral Settlement Gateway) 是一个专业的 Web3 参考实现,适用于需要在链上持有用户抵押品,同时在链下执行快速业务逻辑的应用程序。它将 Solidity 金库、EIP-712 钱包签名意图、应用授权结算、受保护的提取、结算审计报告、对账以及操作员控制台整合为一个连贯的开发者项目。
该代码库包含一个交易参考应用程序,用于在金融工作流中演示此模式。网关本身的范围更广:它可以支持预测市场、抵押游戏、奖励引擎、交易竞赛、风险模拟、衍生品实验,以及其他需要可验证结算层的链下应用程序。
## 项目存在的意义
许多 Web3 产品都面临相同的架构冲突:
- 区块链提供托管、结算透明度和可验证事件;
- 应用逻辑通常需要比公链最终确定交易更快的响应速度;
- 用户仍然需要证明存款、取款和最终余额不是任意的后端数字。
抵押品结算网关通过分离职责来解决这一差距:
| 层级 | 职责 |
| ---------------- | -------------------------------------------------------------------------------------------- |
| 智能合约 | 抵押品托管、保险流动性、受保护的提取、最终结算事件 |
| 网关后端 | 签名意图验证、应用授权、链下业务工作流、结算提交、审计报告 |
| 外部应用 | 产品特定的逻辑,例如奖励、预测、游戏结果或交易计算 |
| 操作员控制台 | 对健康状态、指标、对账、结算和系统活动的可视化 |
结果是一个可重用的模式:**具有链上抵押品锚定和可审计性的快速链下执行**。
## 适用场景
本代码库适用于创始人、后端工程师、Web3 团队和技术评估人员,他们希望了解如何构建混合链上/链下金融基础设施。
潜在用例:
- **交易竞赛** — 用户存入抵押品,在链下交易模拟市场,并在链上结算结果。
- **预测市场** — 用户签署链下参与意图,应用解析结果,网关结算奖励。
- **抵押游戏** — 游戏逻辑在链下运行,而用户存款和支出仍然锚定到金库。
- **奖励系统** — 外部应用提交与签名用户操作相关联的奖励结算。
- **衍生品实验** — 头寸和风险可以在链下快速计算,同时保持结算可审计。
- **内部风险模拟** — 团队可以对结算工作流进行建模,而无需从头构建托管堆栈。
## 核心能力
- 用于存款、保险流动性、结算和受保护提取的 Solidity `CollateralVault`。
- 具有 USDC 类似 6 位小数的本地/测试 `MockUSDC` token。
- 用于钱包授权链下操作的通用 EIP-712 `SignedIntent` 模型。
- 通过 `X-App-Id` 和 `X-App-Secret` 进行应用授权。
- 通过 bearer token 进行管理员/操作员授权。
- 包含 `settlementId`、`reasonHash`、`referenceIds` 和关联的 `signedIntentIds` 的通用结算 API。
- 连接签名意图、链下引用和链上事件的结算审计报告。
- 用户签名的提取请求加上操作员批准。
- 用于金库事件的区块链索引器。
- 后端状态与智能合约状态之间的对账。
- 带有 Swagger/OpenAPI 文档的 Fastify API。
- 支持 SQLite 的本地持久化,带有用于测试的内存模式。
- WebSocket 事件流。
- 静态操作员控制台。
- 独立的外部客户端集成示例。
- 带有签名订单、头寸跟踪、P&L、费用和链上结算的交易参考应用程序。
## 架构
```
flowchart LR
Wallet[User wallet] -->|deposit / withdraw tx| Vault[CollateralVault]
Wallet -->|EIP-712 SignedIntent| API[Gateway API]
ExternalApp[External app] -->|X-App-Id + X-App-Secret| API
Operator[Operator/Admin] -->|Bearer token| API
subgraph Chain[On-chain layer]
Token[MockUSDC local/test token]
Vault
Events[Vault events]
Token --> Vault
Vault --> Events
end
subgraph Gateway[Core gateway]
API --> Registry[App Registry]
API --> Intent[SignedIntent Service]
API --> Settlement[Settlement Service]
API --> Withdrawal[Withdrawal Service]
API --> Ledger[SQLite / In-memory Ledger]
API --> Admin[Admin + Metrics]
API --> WS[WebSocket Events]
Indexer[Blockchain Indexer] --> Ledger
Reconciliation[Reconciliation Service] --> Ledger
Events --> Indexer
Settlement -->|settle delta| Vault
Withdrawal -->|request / approve| Vault
end
subgraph Examples[Reference apps]
Trading[Trading Example]
ExternalClient[Standalone External Client]
Trading --> Settlement
ExternalClient --> API
end
subgraph UI[Operator UI]
Console[Operator Console]
Console --> API
end
```
后端布局:
```
backend/src/
core/
auth/ # Signed intents, app registry, admin auth
blockchain/ # Vault event indexing
collateral/ # collateral-facing routes and contract metadata
settlement/ # generic settlement service and audit reports
withdrawals/ # signed withdrawal request and approval flow
reconciliation/ # on-chain/off-chain state comparison
storage/ # memory and SQLite repositories
websocket/ # realtime event hub
money/ # centralized money conversion helpers
risk/ # reusable risk checks
examples/
trading/ # trading reference application
demo/ # local walkthrough helpers
admin/ # metrics, recent records, system health
```
## 网关流程
1. **存入抵押品** — 用户将测试抵押品存入 `CollateralVault`。
2. **索引事件** — 后端索引器观察金库事件并更新网关账本。
3. **签署意图** — 用户通过 EIP-712 `SignedIntent` 授权链下操作。
4. **运行应用逻辑** — 外部应用或参考模块执行快速的链下业务逻辑。
5. **提交结算** — 应用发送带有相关签名意图的授权结算请求。
6. **应用链上增量** — 网关将最终余额增量提交给金库。
7. **生成审计报告** — 结算可以通过 `settlementId`、`reasonHash`、引用、签名意图和交易哈希进行追踪。
8. **请求提取** — 用户签署提取意图;操作员在风险检查后批准它。
9. **对账** — 管理员端点比较后端账本状态和金库状态。
## 交易参考应用程序
交易模块在具体的金融工作流中演示了网关模式:
- 用户存入抵押品;
- 用户签署交易订单意图;
- 后端在链下执行市价订单;
- 计算 P&L 和费用;
- 提交带有相关意图 ID 的 `TRADING_PNL` 结算;
- 金库在链上应用结果;
- 结算报告连接交易、签名意图和交易数据。
交易模块有意被限定为一个参考应用程序。它不是一个完整的交易所、订单簿、清算引擎或永续期货平台。
## 仓库结构
```
contracts/ Solidity contracts
backend/src/core/ Gateway core modules
backend/src/examples/trading/ Trading reference app
backend/src/admin/ Operator/admin endpoints
backend/src/demo/ Local walkthrough helpers
dashboard/ Static Operator Console
examples/external-client/ Standalone integration example
scripts/ Deployment, demo, reset, report scripts
test/ Contract, backend, and end-to-end tests
docs/ Architecture, operations, deployment, security, use cases
.github/ CI workflow and contribution templates
```
## 要求
- Node.js 22+
- npm 10+
- Linux/macOS shell 或 WSL
- 本地端口:
- `8545` 用于 Hardhat JSON-RPC
- `3000` 用于后端/API/控制台
## 快速开始
```
npm ci
cp .env.example .env
```
终端 1:
```
npm run chain
```
终端 2:
```
npm run deploy:local
npm run dev
```
有用的 URL:
```
Health: http://localhost:3000/health
Swagger UI: http://localhost:3000/docs
OpenAPI JSON: http://localhost:3000/openapi.json
Dashboard: http://localhost:3000/dashboard
```
运行完整的本地流程:
```
npm run demo:e2e
```
运行独立的外部应用集成示例:
```
npm run example:external-client
```
## 常用命令
```
npm run format:check
npm run lint
npm run build
npm run test:contracts
npm run test:backend
npm run test:e2e
npm test
npm audit --audit-level=critical --omit=dev
```
重置本地状态:
```
npm run local:reset
```
从 CLI 生成结算报告:
```
npm run settlement:report --
```
## 环境配置
从 `.env.example` 开始:
```
PORT=3000
HOST=0.0.0.0
RPC_URL=http://127.0.0.1:8545
CHAIN_ID=31337
CONTRACTS_FILE=backend/src/generated/contracts.json
GATEWAY_ADMIN_TOKEN=change-me-admin-token
REGISTERED_APPS=trading-example:change-me-trading-secret,fantasy-trading-app:change-me-external-secret
STORAGE_DRIVER=sqlite
SQLITE_PATH=backend/data/app.db
ENABLE_DEMO_ROUTES=false
```
重要说明:
- `backend/src/generated/contracts.json` 由部署脚本生成,不应提交。
- `backend/src/generated/contracts.example.json` 是一个安全的占位符。
- `MockUSDC` 仅用于本地/测试 token。
- 默认密钥仅供本地开发使用;在任何共享环境中替换它们。
## API 认证
管理员/操作员端点需要:
```
Authorization: Bearer
```
外部应用结算需要管理员身份验证或应用凭据:
```
X-App-Id: fantasy-trading-app
X-App-Secret: change-me-external-secret
```
对于应用授权的结算:
- `appId` 必须与 header 匹配;
- `settlementType` 必须对该应用允许;
- `signedIntentIds` 是必需的;
- 每个关联的意图都必须经过验证、未过期、未被消耗、由同一用户拥有,并在同一应用下注册。
## API 示例
管理员指标:
```
curl -H "Authorization: Bearer change-me-admin-token" \
http://localhost:3000/admin/gateway-metrics
```
结算报告:
```
curl http://localhost:3000/settlements//report
```
应用授权结算体:
```
{
"userAddress": "0x0000000000000000000000000000000000000001",
"appId": "fantasy-trading-app",
"settlementType": "EXTERNAL_APP_REWARD",
"amountDelta": "+25",
"reasonHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"referenceIds": ["round-001"],
"signedIntentIds": ["intent_abc123"],
"metadata": {
"source": "external-client-example"
}
}
```
用户签名的提取请求:
```
{
"userAddress": "0x0000000000000000000000000000000000000001",
"amount": 1000,
"signedIntentId": "intent_withdrawal_123"
}
```
## 操作员控制台
控制台访问地址:
```
http://localhost:3000/dashboard
```
选项卡:
- **网关概览** — 系统健康状况、链、金库、索引器、抵押品、保险、负债和运营指标。
- **结算审计** — 通过 `settlementId` 查找、关联意图、原因哈希、交易数据。
- **对账** — 比较后端账本和金库状态。
- **交易示例** — 参考交易工作流和当前示例状态。
- **演示演练** — 仅限本地的引导流程;除非 `ENABLE_DEMO_ROUTES=true`,否则禁用。
## 部署概述
对于本地开发,使用 Hardhat + Fastify:
```
npm run chain
npm run deploy:local
npm run dev
```
对于服务器部署,使用部署指南:
- [部署指南](docs/deployment.md)
- [操作指南](docs/operations.md)
- [安全模型](docs/security-model.md)
生产样式的高层级步骤:
1. 准备一台 Linux 主机;
2. 安装 Node.js 22+ 和 npm;
3. 配置受管理的 RPC endpoint;
4. 通过环境变量或密钥管理器配置密钥;
5. 部署或指向合约;
6. 在带有 TLS 的反向代理后运行后端;
7. 在 systemd 或进程监控程序下运行进程;
8. 禁用演示路由;
9. 设置真实的管理员 token 和应用凭据;
10. 监控索引器延迟、对账状态、结算失败和金库流动性。
## 测试网部署
支持的脚本:
```
npm run deploy:sepolia
npm run deploy:arbitrum-sepolia
npm run verify:sepolia
npm run verify:arbitrum-sepolia
```
测试网部署是一个开发者工作流。它并不能使系统适合真实资金。
## 质量检查
预计该项目可以通过:
```
npm ci
npm run format:check
npm run lint
npm run build
npm test
npm run test:e2e
npm audit --audit-level=critical --omit=dev
```
`.github/workflows/ci.yml` 下包含了一个 GitHub Actions 工作流。
## 安全模型
当前模型是明确的:
- 用户持有钱包并签署链下意图;
- 抵押品保存在金库合约中;
- 外部应用在提交结算前需经过身份验证;
- 管理员/操作员端点需要 bearer 授权;
- 结算由操作员提交,并可通过报告进行审计;
- 提取需要用户签名的意图以及操作员批准;
- 对账可检测后端/链上的不匹配。
该系统是**可审计的,而非无信任的**。操作员仍然受信任以提交正确的结算。在没有智能合约审计、后端安全审查、更强的密钥管理、稳健的监控和正式的操作程序的情况下,请勿使用真实资金。
参见 [SECURITY.md](SECURITY.md) 和 [docs/security-model.md](docs/security-model.md)。
## 已知限制
- 受信任的操作员结算模型。
- 无去中心化争议解决。
- 无智能合约审计。
- 无后端安全审计。
- 基于环境变量的应用注册表;生产环境应使用带有哈希密钥和轮换的受管注册表。
- SQLite 持久化用于本地/参考用途。
- 为了开发者清晰起见,存储中保留了一些可读的十进制字段;原生的 token 合约调用使用 microUSDC 单位。
- 无生产级 oracle 策略。
- 无清算引擎。
- 无完整订单簿。
- 无高可用性部署。
- 演示路由是本地演练辅助工具,在受控环境之外必须保持禁用。
## 路线图
参见 [ROADMAP.md](ROADMAP.md)。未来的关键方向:
- 端到端定点整数存储;
- Postgres 迁移和操作备份;
- 数据库管理的应用注册表,支持密钥轮换;
- 针对管理员/操作员访问的 RBAC;
- 多重签名或治理的操作员签名者;
- 结算批处理和审查窗口;
- 带有新鲜度/置信度约束的 oracle 策略;
- 索引器重组处理和确认深度;
- 监控和报警;
- 智能合约审计和后端安全审查。
## 项目定位
**简短版本**
抵押品结算网关是可重用的 Web3 基础设施,适用于需要快速链下逻辑,同时保持抵押品托管和最终结算锚定在链上的应用。
**技术版本**
该系统结合了 Solidity 金库、EIP-712 签名意图、应用身份验证结算、经过审计的 reason hash、操作员批准工作流、对账以及交易参考应用程序,以演示混合金融产品如何将速度与最终确定性分离开来。
## 许可证
MIT。参见 [LICENSE](LICENSE)。
标签:EIP-712, MITM代理, Solidity, Web3, 区块链后端, 智能合约, 结算系统, 自动化攻击, 金融基础设施