You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
1 month ago | |
|---|---|---|
| app | 1 month ago | |
| contracts | 1 month ago | |
| services | 1 month ago | |
| README.md | 1 month ago | |
| package.json | 1 month ago | |
| start-dev.js | 1 month ago | |
README.md
校园评分系统 (Web3)
一个基于 Web3 技术的去中心化校园评分系统,采用企业级架构设计,支持用户权重系统、仲裁机制和管理员功能。
📋 项目简介
这是一个基于区块链技术的校园评分系统,使用智能合约存储评分数据,确保数据的永久性和不可篡改性。系统采用模块化设计,低耦合、高内聚,符合生产级/企业级标准。
核心特性
- ✅ 去中心化存储:所有数据存储在区块链上,永久保存
- ✅ 用户权重系统:基于多维度指标计算用户权重
- ✅ 仲裁机制:去中心化社区治理
- ✅ 速率限制:防止恶意刷量
- ✅ Gas 优化:批量操作和存储优化
- ✅ 类型安全:完整的 TypeScript 类型定义
- ✅ 统一错误处理:用户友好的错误提示
🛠️ 技术栈
前端
- React 18 + TypeScript - 前端框架
- Vite - 构建工具
- wagmi + viem - Web3 交互库
- CSS3 - 现代化 UI 设计
智能合约
- Solidity 0.8.24 - 智能合约语言
- Hardhat - 开发环境
- OpenZeppelin - 安全合约库
- Ganache - 本地区块链
链下服务
- TypeScript - 服务开发
- viem - 区块链交互
- tsx - TypeScript 执行环境
📁 项目结构
campus-rating/
├── contracts/ # 智能合约目录
│ ├── contracts/ # Solidity 合约文件
│ │ ├── CampusRating.sol # 主合约(评分系统)
│ │ ├── CampusRatingV2.sol # V2合约(权重和仲裁)
│ │ ├── CampusToken.sol # ERC20代币合约
│ │ ├── libraries/ # 工具库
│ │ │ ├── SecurityLib.sol # 安全检查
│ │ │ ├── ValidationLib.sol # 输入验证
│ │ │ ├── RateLimiter.sol # 速率限制
│ │ │ └── GasOptimizer.sol # Gas优化
│ │ ├── core/ # 核心逻辑
│ │ │ ├── WeightCalculator.sol # 权重计算
│ │ │ ├── VoteHandler.sol # 投票处理
│ │ │ └── V2ContractCaller.sol # V2合约调用
│ │ └── interfaces/ # 接口定义
│ ├── scripts/ # 部署脚本
│ │ ├── deploy.ts # 基础部署
│ │ ├── deploy-v2.ts # V2合约部署
│ │ ├── deploy-complete.ts # 完整部署流程
│ │ ├── deploy-and-setup-v2.ts # 部署并配置V2
│ │ ├── setup-contracts.ts # 合约配置
│ │ ├── check-admin.ts # 检查管理员
│ │ └── sync-user-weights.ts # 同步用户权重
│ └── typechain-types/ # 类型定义
│
├── app/ # 前端应用目录
│ ├── src/
│ │ ├── components/ # React 组件
│ │ │ ├── admin/ # 管理员组件
│ │ │ ├── arbitration/ # 仲裁组件
│ │ │ ├── profile/ # 用户主页组件
│ │ │ ├── rate/ # 评分组件
│ │ │ └── reviews/ # 评价组件
│ │ ├── hooks/ # 自定义 Hooks
│ │ │ ├── useContractRead.ts
│ │ │ ├── useContractWrite.ts
│ │ │ ├── useErrorHandler.ts
│ │ │ ├── useAdmin.ts
│ │ │ └── useAdminWrite.ts
│ │ ├── types/ # 类型定义
│ │ ├── utils/ # 工具函数
│ │ └── contracts/ # 合约配置
│ └── ...
│
├── services/ # 链下服务目录(可选)
│ ├── ranking-service.ts # 排名分数计算服务
│ ├── rationality-service.ts # 合理性分数计算服务
│ ├── check-admin.js # 检查管理员权限
│ ├── setup-env.js # 环境配置脚本
│ └── shared/ # 共享模块
│ ├── clientFactory.ts # 客户端工厂
│ ├── contractABIs.ts # 合约ABI
│ └── userFetcher.ts # 用户数据获取
│
├── start-dev.js # 开发启动脚本
└── README.md # 项目文档
✨ 功能特性
1. 核心功能
创建评分目标
- 创建新的评分目标(名称、描述、标签、图片)
- 实时检查名称唯一性
- 支持目标编辑(创建者可修改图片和描述)
- 速率限制:每个地址每天最多 10 个
评分功能
- 对目标进行 0.5-5 星评分(0.5 步长)
- 发表文字评价
- 支持多次更新评价(保留历史记录)
- 查看历史评价(支持展开/收起)
- 支持按最新、热度、高评、低评排序
- 速率限制:每个目标每个地址每小时最多 3 条
点赞/点踩
- 对目标和评价进行点赞或点踩
- 链上存储,确保数据永久性
- 防止自己给自己点赞/点踩
- 支持切换投票(从赞切换到踩,反之亦然)
- 速率限制:每个地址每小时最多 50 次
排行榜
- 按标签筛选
- 按评分人数或平均评分排序
- 显示热门标签快速筛选
- 实时显示目标热度
用户主页
- 查看用户创建的评分目标
- 查看用户发布的评价
- 显示用户权重信息
- 支持多种排序方式
2. 用户权重系统
用户权重由多个维度综合计算:
基础指标
- 收到的赞/踩:赞+1分,踩-0.5分
- 创建目标的排名:根据目标在排行榜上的排名计算
- 投票合理性:评估用户投票是否合理
高级指标
- 仲裁贡献:参与仲裁+10分,提案通过+20分,失败-5分
- 异常行为惩罚:每次异常行为-50分
权重计算
- 基础分数:链上实时计算(点赞数 - 点踩数/2)
- 排名分数:链下定期更新(通过
ranking-service.ts) - 合理性分数:链下延迟计算(通过
rationality-service.ts) - 贡献分数:链上实时更新
- 惩罚分数:管理员链上操作
最终权重 = 基础分数 + 排名分数 + 合理性分数 + 贡献分数 - 惩罚分数
3. 仲裁系统
去中心化社区治理机制:
仲裁类型
- 目标名称修改:修改目标的名称
- 目标标签修改:修改目标的标签
- 其他话题:社区治理相关提案
仲裁流程
- 创建提案:用户创建仲裁提案(需要权重≥100)
- 投票期:7天投票期,用户根据权重投票
- 投票截止:统计赞成/反对票数
- 执行提案:通过后自动或手动执行
- 取消提案:提案创建者可取消未执行的提案
投票机制
- 基于用户权重分数投票
- 最小投票权重:100分
- 投票期限:7天
- 结果判定:赞成票权重总和 > 反对票权重总和
4. 管理员功能
管理员控制面板(AdminTab):
管理员管理
- 添加/移除管理员
- 查看当前管理员列表
分数管理
- 更新用户排名分数(单个/批量)
- 更新用户合理性分数(单个/批量)
- 批量操作支持最多 50 个用户
异常行为管理
- 记录用户异常行为(单个/批量)
- 自动降低用户权重分数
用户冻结管理
- 冻结/解冻用户账户
- 冻结用户权重为 0
历史数据同步
- 同步主合约中的历史数据到 V2 合约
- 设置用户创建目标数
- 设置用户收到的点赞/点踩数
5. 安全特性
合约安全
- ✅ ReentrancyGuard:防止重入攻击
- ✅ Pausable:紧急暂停机制
- ✅ Ownable:访问控制
- ✅ 速率限制:防止恶意刷量
- ✅ 输入验证:ValidationLib 和 SecurityLib
- ✅ 库合约:代码复用和模块化
- ✅ 接口化调用:类型安全的跨合约调用
前端安全
- ✅ 错误边界:React ErrorBoundary
- ✅ 统一错误处理:useErrorHandler Hook
- ✅ 输入验证:完整的表单验证
- ✅ 类型安全:完整的类型定义
6. Gas 优化
批量操作
- 批量更新排名分数
- 批量更新合理性分数
- 批量记录异常行为
- 每个用户节省 ~21,000 Gas
存储优化
- 存储打包库(OptimizedStorage.sol)
- Gas 优化工具库(GasOptimizer.sol)
🚀 快速开始
前置要求
- Node.js (v18+)
- npm 或 yarn
- Ganache(本地区块链)
- MetaMask 或其他 Web3 钱包
安装依赖
智能合约
cd contracts
npm install
前端应用
cd app
npm install
链下服务(可选)
cd services
npm install
启动本地区块链
启动 Ganache,确保运行在 http://127.0.0.1:8545
部署智能合约
cd contracts
npx hardhat run scripts/deploy.ts --network localhost
部署完成后,将合约地址更新到 app/src/contracts/config.ts:
export const CONTRACT_ADDRESSES = {
rating: '0x...', // CampusRating 合约地址
v2: '0x...', // CampusRatingV2 合约地址
token: '0x...' // CampusToken 合约地址
}
启动应用
方式1:同时启动前端和链下服务(推荐)
cd campus-rating
npm run dev
这会同时启动:
- ✅ 前端应用(http://127.0.0.1:5173)
- ✅ 排名分数计算服务(如果已配置)
- ✅ 合理性分数计算服务(如果已配置)
注意: 如果未配置链下服务(services/.env 文件),启动脚本会提示但前端仍可正常运行。
方式2:仅启动前端
cd app
npm run dev
访问 http://127.0.0.1:5173 即可使用应用。
链下服务配置(可选)
注意: 链下服务是可选的,用于自动计算和更新用户的排名分数和合理性分数。如果不需要自动更新这些分数,可以跳过此步骤。
默认启动方式(npm run dev)会自动尝试启动链下服务,如果未配置会提示但前端仍可正常运行。
如果需要配置链下服务:
- 在
services目录下创建.env文件 - 配置以下内容:
RPC_URL=http://127.0.0.1:8545
PRIVATE_KEY=你的管理员私钥(0x开头,64个字符)
CONTRACT_ADDRESS=0x... # CampusRatingV2合约地址
MAIN_CONTRACT_ADDRESS=0x... # CampusRating主合约地址
UPDATE_INTERVAL=3600 # 更新间隔(秒)
获取管理员私钥:
- 打开 Ganache
- 选择一个账户(通常是第一个账户,即部署合约的账户)
- 点击账户右侧的钥匙图标,复制私钥
- 确保该账户在 CampusRatingV2 合约中是管理员
单独运行链下服务:
cd services
npm install
npm run dev:all # 同时运行两个服务
详细说明请查看 services/README.md。
🏗️ 开发说明
智能合约开发
合约结构
- 主合约:
CampusRating.sol- 评分系统核心功能 - V2合约:
CampusRatingV2.sol- 权重系统和仲裁功能 - 库合约:
libraries/- 可复用的工具库 - 核心逻辑:
core/- 核心业务逻辑
编译和测试
cd contracts
npx hardhat compile
npx hardhat test
部署脚本
scripts/deploy.ts- 基础部署scripts/deploy-v2.ts- V2合约部署scripts/deploy-complete.ts- 完整部署流程scripts/deploy-and-setup-v2.ts- 部署并配置V2scripts/setup-contracts.ts- 合约配置scripts/check-admin.ts- 检查管理员权限scripts/sync-user-weights.ts- 同步用户权重
前端开发
组件结构
- 页面组件:
components/- 主要页面组件 - 业务组件:按功能分组(admin, arbitration, profile, rate, reviews)
- 工具组件:ErrorBoundary, ErrorDisplay, WalletButton 等
Hooks 封装
useContractRead.ts- 合约读取操作useContractWrite.ts- 合约写入操作useErrorHandler.ts- 统一错误处理useAdmin.ts/useAdminWrite.ts- 管理员操作
类型安全
types/contracts.ts- 完整的类型定义utils/contractData.ts- 类型安全的数据解析utils/proposalParser.ts- 提案数据解析
代码质量
模块化设计
- ✅ 职责单一:每个模块只负责一个功能
- ✅ 低耦合:模块间依赖最小化
- ✅ 高内聚:相关功能集中管理
- ✅ 易于测试和维护
类型安全
- ✅ 完整的类型定义和类型守卫
- ✅ 类型安全的数据解析
错误处理
- ✅ 统一错误处理机制
- ✅ 用户友好的错误提示
- ✅ 区分用户拒绝和系统错误
⚠️ 注意事项
本地开发
- Ganache 运行:确保 Ganache 正在运行,并且网络配置正确
- 钱包连接:首次使用需要连接 MetaMask 或其他 Web3 钱包
- 合约地址:部署后记得更新
app/src/contracts/config.ts中的合约地址
数据持久化
- 所有评分和评价数据存储在区块链上,确保永久保存
- 部分 UI 状态使用 localStorage 持久化,提升用户体验
链下服务
- 链下服务需要管理员权限才能调用合约
- 建议使用进程管理器(如 PM2)在生产环境运行
- 建议添加日志和监控
安全建议
- 生产环境部署前进行安全审计
- 考虑实施代理合约模式(UUPS)支持升级
- 考虑集成时间锁机制(TimelockController)
- 考虑使用多签钱包管理合约
📊 项目状态
功能完整性:98%
- ✅ 核心评分功能
- ✅ 用户权重系统
- ✅ 仲裁机制
- ✅ 管理员功能
- ✅ 链下服务框架
代码质量:95%
- ✅ 模块化设计
- ✅ 类型安全
- ✅ 错误处理
- ✅ 代码复用
安全性:90%
- ✅ 基础安全机制
- ✅ 速率限制
- ⚠️ 代理合约(方案已制定)
- ⚠️ 时间锁(方案已制定)
📝 许可证
本项目仅供学习和演示使用。
🤝 贡献
欢迎提交 Issue 和 Pull Request!
快速开始: 运行 npm run dev 即可同时启动前端和链下服务。