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.
 
 
 
pvysmz68u 2adf5d5408
new version
1 month ago
app new version 1 month ago
contracts new version 1 month ago
services new version 1 month ago
README.md new version 1 month ago
package.json new version 1 month ago
start-dev.js new version 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. 仲裁系统

去中心化社区治理机制:

仲裁类型

  • 目标名称修改:修改目标的名称
  • 目标标签修改:修改目标的标签
  • 其他话题:社区治理相关提案

仲裁流程

  1. 创建提案用户创建仲裁提案需要权重≥100
  2. 投票期7天投票期用户根据权重投票
  3. 投票截止:统计赞成/反对票数
  4. 执行提案:通过后自动或手动执行
  5. 取消提案:提案创建者可取消未执行的提案

投票机制

  • 基于用户权重分数投票
  • 最小投票权重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)会自动尝试启动链下服务,如果未配置会提示但前端仍可正常运行。

如果需要配置链下服务:

  1. services 目录下创建 .env 文件
  2. 配置以下内容:
RPC_URL=http://127.0.0.1:8545
PRIVATE_KEY=你的管理员私钥0x开头64个字符
CONTRACT_ADDRESS=0x...  # CampusRatingV2合约地址
MAIN_CONTRACT_ADDRESS=0x...  # CampusRating主合约地址
UPDATE_INTERVAL=3600  # 更新间隔(秒)

获取管理员私钥:

  1. 打开 Ganache
  2. 选择一个账户(通常是第一个账户,即部署合约的账户)
  3. 点击账户右侧的钥匙图标,复制私钥
  4. 确保该账户在 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 - 部署并配置V2
  • scripts/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 - 提案数据解析

代码质量

模块化设计

  • 职责单一:每个模块只负责一个功能
  • 低耦合:模块间依赖最小化
  • 高内聚:相关功能集中管理
  • 易于测试和维护

类型安全

  • 完整的类型定义和类型守卫
  • 类型安全的数据解析

错误处理

  • 统一错误处理机制
  • 用户友好的错误提示
  • 区分用户拒绝和系统错误

⚠️ 注意事项

本地开发

  1. Ganache 运行:确保 Ganache 正在运行,并且网络配置正确
  2. 钱包连接:首次使用需要连接 MetaMask 或其他 Web3 钱包
  3. 合约地址:部署后记得更新 app/src/contracts/config.ts 中的合约地址

数据持久化

  • 所有评分和评价数据存储在区块链上,确保永久保存
  • 部分 UI 状态使用 localStorage 持久化,提升用户体验

链下服务

  • 链下服务需要管理员权限才能调用合约
  • 建议使用进程管理器(如 PM2在生产环境运行
  • 建议添加日志和监控

安全建议

  • 生产环境部署前进行安全审计
  • 考虑实施代理合约模式UUPS支持升级
  • 考虑集成时间锁机制TimelockController
  • 考虑使用多签钱包管理合约

📊 项目状态

功能完整性98%

  • 核心评分功能
  • 用户权重系统
  • 仲裁机制
  • 管理员功能
  • 链下服务框架

代码质量95%

  • 模块化设计
  • 类型安全
  • 错误处理
  • 代码复用

安全性90%

  • 基础安全机制
  • 速率限制
  • ⚠️ 代理合约(方案已制定)
  • ⚠️ 时间锁(方案已制定)

📝 许可证

本项目仅供学习和演示使用。

🤝 贡献

欢迎提交 Issue 和 Pull Request


快速开始: 运行 npm run dev 即可同时启动前端和链下服务。