blockchain-cert-demo Logo
blockchain-cert-demo已通过

区块链证书系统项目文档 项目概述区块链证书系统是一个基于Monad测试网的去中心化数字证书发行与验证平台。该项目利用区块链技术的不可篡改性和透明性,确保学历和证书的真实性和可信度。 核心特性- 去中心化证书管理:使用NFT技术将证书数字化并存储在区块链上- 内容完整性验证:通过哈希算法验证证书内容未被篡改- 安全防护机制:地址锁定保护防止暴力破解攻击- 血缘追溯功能:完整的证书生命周期记录和审计追踪- 现代化用户界面:响应式设计,支持桌面端和移动端访问 技术架构 前端技术栈- 框架:React 18 + Vite- 状态管理:React Hooks- 区块链交互:Ethers.js- 样式:CSS-in-JS + 响应式设计- 部署:Vercel 后端技术栈- 智能合约开发:Solidity 0.8.20- 开发框架:Hardhat- 测试网络:Monad Testnet (Chain ID: 10143)- 部署工具:Hardhat Script 核心合约 1. LearningCredential.sol主要功能- ERC721 NFT证书铸造- 证书元数据存储- 证书撤销机制- 证书历史记录追踪- 管理员权限控制2. SecureContentValidator.sol 安全验证功能- 内容哈希验证- 地址锁定保护- 验证日志记录- 失败次数追踪部署指南环境要求- Node.js >= 16- npm 或 yarn- MetaMask 浏览器扩展(测试使用)后端部署 1. 安装依赖cd backendnpm install2. 编译合约npx hardhat compile3. 部署到Monad Testnet部署LearningCredential合约npx hardhat run scripts/deployToMonadTestnet.js --network monadTestnet 部署SecureContentValidator合约npx hardhat run scripts/deploySecureValidator.js --network monadTestnet 前端部署 1. 安装依赖cd frontendnpm install 2. 开发环境npm run dev3. 生产构建npm run build 4. 部署到Vercelnpm install -g vercelvercel --prod环境变量配置在Vercel项目中配置以下环境变量:VITE_CONTRACT_ADDRESS=0x6c2acEdEF5BE55f89CfBeFA6d438A6750e17B108VITE_SECURE_VALIDATOR_ADDRESS=0x51Ff6c11163e7da9Bc939808bd27a136b518F2FcVITE_RPC_URL=https://testnet-rpc.monad.xyz/VITE_CHAIN_ID=10143VITE_EXPLORER_URL=https://testnet.monadexplorer.com/ 功能详解 1. 证书颁发用户可以连接钱包后填写证书信息,系统会将证书铸造为NFT并上链。操作流程:1. 连接钱包2. 填写学员姓名、课程名称、颁发机构、日期3. 点击"生成证书并上链"4. 确认MetaMask交易5. 查看铸造成功的证书信息 2. 证书验证通过交易哈希验证证书的真实性和有效性。操作流程:1. 获取证书交易哈希2. 在验证区域输入哈希3. 点击"验证证书"4. 查看验证结果和证书详细信息 3. 安全内容验证基于哈希算法验证证书内容的完整性,防止内容篡改。操作流程:1. 输入证书Token ID2. 点击"验证证书内容完整性"3. 查看验证结果4. 连续3次失败将触发地址锁定机制 4. 血缘追溯记录证书的完整生命周期,包括颁发、撤销等操作。操作流程:1. 输入证书Token ID2. 点击"查询血缘历史"3. 查看完整的证书历史记录时间线 安全机制 地址锁定保护为防止暴力破解攻击,系统实现了地址锁定机制:- 触发条件:同一地址连续3次验证失败- 锁定时长:1小时- 锁定期间:拒绝该地址的所有验证请求- 自动解锁:锁定时间到达后自动解锁 内容完整性验证使用keccak256哈希算法确保证书内容未被篡改:- 哈希生成:对证书内容生成唯一哈希值- 验证机制:重新计算哈希并与存储值对比- 篡改检测:任何内容修改都会导致验证失败 权限控制精细化的权限管理系统确保操作安全:- 合约所有者:最高权限,可添加/移除管理员- 管理员:可撤销证书- 普通用户:只读验证权限 API接口合约接口LearningCredential.sol// 铸造证书function safeMint(address to, string memory _metadata) public onlyOwner// 获取证书元数据function getMetadata(uint256 tokenId) public view returns (string memory)// 撤销证书function revokeCertificate(uint256 tokenId) public onlyAdministrator// 检查证书状态function certificateStatus(uint256 tokenId) public view returns (string memory)// 获取历史记录function getHistoryCount(uint256 tokenId) public view returns (uint256)function getHistoryEntry(uint256 tokenId, uint256 index) public view returns (CertificateEvent memory)// 管理员功能function addAdministrator(address admin) public onlyOwnerfunction removeAdministrator(address admin) public onlyOwnerfunction isAdministrator(address admin) public view returns (bool) SecureContentValidator.sol// 验证内容function verifyContent(string memory content, bytes32 expectedHash, uint256 tokenId) public// 检查地址锁定状态function isAddressLocked(address user) public view returns (bool)// 获取失败次数function getFailedAttempts(address user) public view returns (uint256)// 获取解锁时间function getUnlockTime(address user) public view returns (uint256) 部署网络配置 Monad Testnet- 网络名称:Monad Testnet- RPC URL:`https://testnet-rpc.monad.xyz/`- 链ID:10143 (0x279f)- 货币符号:MONA- 区块浏览器:`https://testnet.monadexplorer.com/` MetaMask配置1. 网络名称:`Monad Testnet`2. RPC URL:`https://testnet-rpc.monad.xyz/`3. 链ID:`10143`4. 货币符号:`MONA`5. 区块浏览器URL:`https://testnet.monadexplorer.com/` 测试指南 功能测试 证书颁发测试1. 连接钱包2. 填写证书信息3. 点击"生成证书并上链"4. 确认交易成功5. 检查证书信息正确性 证书验证测试1. 获取证书交易哈希2. 输入哈希进行验证3. 确认验证结果正确4. 检查证书详细信息 安全验证测试1. 输入正确Token ID和内容2. 验证内容完整性(应成功)3. 输入错误内容进行验证(应失败)4. 重复失败验证3次5. 确认地址被锁定 血缘追溯测试1. 输入证书Token ID2. 查询血缘历史3. 确认历史记录完整准确4. 检查时间线显示正确 安全测试 地址锁定测试1. 使用测试地址连接2. 故意进行3次失败验证3. 确认地址被锁定1小时4. 等待解锁后再次测试 权限测试1. 使用普通用户地址连接2. 尝试撤销证书(应失败)3. 使用管理员地址连接4. 尝试撤销证书(应成功) 常见问题解答 Q1: 为什么验证证书时显示"证书不存在"?可能原因:1. Token ID输入错误2. 证书尚未铸造成功3. 合约地址配置错误解决方案:1. 确认Token ID正确2. 检查交易是否成功3. 验证合约地址配置 Q2: 为什么地址被锁定后无法验证?说明:这是安全机制的一部分,连续3次失败验证会锁定地址1小时。解决方案:1. 等待锁定时间结束(1小时)2. 使用不同地址进行验证3. 联系管理员协助解锁 Q3: 为什么MetaMask总是提示切换网络?可能原因:1. MetaMask未添加Monad Testnet网络2. 网络配置不正确解决方案:1. 在MetaMask中添加Monad Testnet网络2. 确认网络配置与文档一致 Q4: 为什么前端无法连接到区块链?可能原因:1. RPC URL配置错误2. 网络连接问题3. 合约地址错误解决方案:1. 检查环境变量配置2. 验证网络连接3. 确认合约地址正确项目结构blockchain-cert-demo/├── backend/│ ├── contracts/│ │ ├── LearningCredential.sol # 主要证书合约│ │ └── SecureContentValidator.sol # 安全验证合约│ ├── scripts/│ │ ├── deployToMonadTestnet.js # 部署脚本│ │ └── deploySecureValidator.js # 安全验证器部署│ ├── hardhat.config.js # Hardhat配置│ └── package.json # 后端依赖├── frontend/│ ├── src/│ │ ├── components/│ │ │ └── CertificatePage.jsx # 主要页面组件│ │ ├── contracts/│ │ │ ├── LearningCredential.json # 合约ABI和地址│ │ │ └── SecureContentValidator.json # 安全验证器ABI│ │ ├── App.jsx # 应用入口│ │ └── main.jsx # 主文件│ ├── public/│ │ └── demo.html # 演示页面│ ├── package.json # 前端依赖│ └── vite.config.js # Vite配置└── README.md # 项目说明贡献指南开发流程1. Fork项目到个人仓库2. 创建功能分支3. 进行开发和测试4. 提交Pull Request5. 等待代码审查代码规范- 遵循Solidity编码规范- 使用ESLint和Prettier保持前端代码一致性- 编写单元测试和集成测试- 添加必要的注释和文档 测试策略- 单元测试:针对智能合约功能- 集成测试:前后端交互测试- 端到端测试:用户操作流程测试

项目截图

截图 1
截图 2
截图 3
截图 4

创建者:lora

创建时间:2025年9月20日

活动详情
Monad Blitz @ 成都

Monad Blitz @ 成都

查看活动详情

活动
calendar2025年9月20日

团队成员

Zzoe
Llucy
Llora
队长

团队名称: LOK