基于 Spring Boot + Hyperledger Fabric 的数字版权交易与链上存证系统 项建议标题基于 Spring Boot Hyperledger Fabric 的数字版权交易与链上存证系统标签Spring Boot, Vue3, Hyperledger Fabric, 区块链存证, 数字版权, 毕业设计类型原创分类后端 / 区块链源码https://gitee.com/song-ri/digital-copyright-trading正文本文介绍一个完整的数字版权交易与存证溯源系统Spring Boot Vue3 搭建业务平台Hyperledger Fabric 实现审核通过后的链上锚定支持公开验真与版权溯源。完整源码已开源至 Gitee。前言数字作品图片、文档、设计稿等具有易复制、易篡改、权属难举证的特点。传统交易平台往往只记录「谁买了什么」缺少可验证的内容存证链条。本项目的设计思路是链下保存原文件 链上锚定内容指纹哈希既不把大文件塞进区块链成本高、隐私差又能通过密码学哈希实现「事后可验真、难篡改」的存证能力。整套系统覆盖登记 → 审核 → 上链 → 挂牌 → 交易 → 验真全流程。开源地址https://gitee.com/song-ri/digital-copyright-trading一、技术栈层次技术选型前端Vue 3、Vite、Pinia、Vue Router后端Spring Boot 3、Spring Security、JWT数据库MySQL 8区块链Hyperledger Fabric Go 链码通信REST API、WebSocket消息通知二、系统架构整体采用「Web 业务层 异步锚定 联盟链」的分层架构┌─────────────────────────────────────────────┐ │ Vue3 前端 │ │ 登记作品 / 市场挂牌 / 公开验真 / 管理后台 │ └──────────────────┬──────────────────────────┘ │ REST API JWT ┌──────────────────▼──────────────────────────┐ │ Spring Boot 业务层 │ │ 作品 · 挂牌 · 订单 · 审核 · 投诉 · 分润 │ └──────────────────┬──────────────────────────┘ │ WorkApprovedEvent异步 ┌──────────────────▼──────────────────────────┐ │ BlockchainAnchorService │ │ mock 模式本地演示/ fabric 模式真实上链│ └──────────────────┬──────────────────────────┘ │ Fabric Gateway (gRPC TLS) ┌──────────────────▼──────────────────────────┐ │ Hyperledger Fabric │ │ 通道 mychannel · 链码 copyright_attestation │ └──────────────────┬──────────────────────────┘ │ ┌──────────────────▼──────────────────────────┐ │ MySQL │ │ users / copyright_works / marketplace_listings / trade_orders │ └─────────────────────────────────────────────┘三层保护机制层级机制作用内容指纹上传后生成sha256:...把数字文件绑定为唯一可比对的标识平台审核管理员 PENDING → APPROVED/REJECTED人工把关登记内容是否合规链上存证审核通过后调用Anchor(workId, hash)证明某时刻平台认定的指纹已被记录事后可验真重要链上不存图片/文档原文件只存SHA256(指纹字符串)的 64 位十六进制哈希。三、核心业务流程3.1 作品登记自动生成内容指纹用户登录后上传源文件或展示图后端自动计算 SHA-256 指纹// CopyrightWorkService — 指纹计算简化if(file!null){rawFpsha256:sha256Hex(file.getBytes());}elseif(!gallery.isEmpty()){rawFpsha256:sha256Hex(gallery.get(0).getBytes());}work.setContentFingerprint(normalize(rawFp));// 例sha256:e18d6060...work.setAuditStatus(AuditStatus.PENDING);// 待审核尚未上链若库内已有相同指纹系统返回 HTTP 409 并列出重复作品用户确认后可继续登记。3.2 管理员审核通过后触发异步上链审核通过时在事务内更新状态并发布 Spring 事件事务提交后异步监听器执行链上锚定// 审核通过work.setAuditStatus(AuditStatus.APPROVED);workRepository.save(work);eventPublisher.publishEvent(newWorkApprovedEvent(workId));// 异步监听器 Async TransactionalEventListener(AFTER_COMMIT)blockchainAnchorService.anchorApprovedWork(event.getWorkId());这样设计的好处审核事务与上链解耦Fabric 网络异常不会回滚审核结果失败信息写入blockchain_anchor_error字段支持手动重试。3.3 Java 侧Fabric Gateway 提交交易后端通过 Fabric Gateway SDK 连接 Peer调用链码Anchor函数Contractcontractnetwork.getContract(chaincodeName);Proposalproposalcontract.newProposal(Anchor).addArguments(String.valueOf(workId),contentHashHex).build();Transactiontxnproposal.endorse();// 背书txn.submit();// 提交至 Ordererreturntxn.getTransactionId();// 写入 blockchain_tx_hash其中contentHashHex SHA256(指纹字符串)64 位小写十六进制。3.4 Go 链码copyright_attestation链码非常精简只有两个函数// Anchor — 写入世界状态 WORK_workId → 64位hexfunc(s*SmartContract)Anchor(ctx contractapi.TransactionContextInterface,workIdstring,contentHashHexstring)error{key:WORK_strings.TrimSpace(workId)returnctx.GetStub().PutState(key,[]byte(strings.ToLower(contentHashHex)))}// GetAnchor — 只读查询不修改账本func(s*SmartContract)GetAnchor(ctx contractapi.TransactionContextInterface,workIdstring)(string,error){b,err:ctx.GetStub().GetState(WORK_workId)ifbnil{return,nil}returnstring(b),nil}3.5 挂牌交易购买后版权主体转移审核通过的作品可挂牌出售。买家下单后挂牌状态ACTIVE → SOLD作品owner变更为买家生成TradeOrder状态 COMPLETED异步记录分润RoyaltyService3.6 公开验真三方交叉比对验真页面/verify支持三种输入方式按作品 ID 查询粘贴指纹字符串上传文件重新计算指纹验真通过需同时满足verified 作品 audit_status APPROVED AND 库中有 blockchain_tx_hash AND 链上 GetAnchor(workId) SHA256(库内指纹) AND若提交文件/指纹与库内记录一致验真通过说明文件内容与平台登记、链上存证一致但不等于自动证明「登记人即著作权人」论文/答辩中需如实说明边界。四、核心逻辑伪代码以下伪代码与源码一一对应便于理解各模块状态迁移规则。4.1 登录接口ApiAuthControllerSESSION_STATE Unauthenticated / Authenticated ACCOUNT_STATE Disabled / Enabled function 用户登录(username, password): if 参数非法: return HTTP 400 try: auth AuthenticationManager.authenticate(...) catch: return HTTP 401 if 账号 Disabled: return HTTP 403 accessToken JwtService.createToken(user) return { accessToken, user } function 请求鉴权(request): token Header Authorization: Bearer ... if token 有效 AND 账号 Enabled: SESSION_STATE Authenticated else: 对受保护接口返回 HTTP 4014.2 购买交易TradeServiceLISTING_STATE ACTIVE / SOLD / CANCELLED WORK_AUDIT_STATE PENDING / APPROVED / REJECTED function 购买交易(buyer, listingId): listing 查询挂牌(listingId) if listing.status ! ACTIVE: 抛出异常 if work.auditStatus ! APPROVED: 抛出异常 if buyer seller: 抛出异常「不能购买自己的作品」 listing.status SOLD work.owner buyer order 新建 TradeOrder(statusCOMPLETED) RoyaltyService.calculateAndRecordRoyalty(order) return order4.3 前端登录提交LoginView.vuefunction 登录提交(): try: await AuthStore.login(username, password) Router.push(redirect 或 /catalog) catch e: if e.status 403: 清空 localStorage Token 展示友好错误信息 function AuthStore.login(username, password): response POST /api/auth/login localStorage.setItem(TOKEN_KEY, response.accessToken)4.4 管理员审核AdminWorkReviewServiceAUDIT_STATE PENDING / APPROVED / REJECTED ANCHOR_STATE NotAnchored / Anchored / AnchorFailed function 管理员审核通过(admin, workId): work.auditStatus APPROVED 保存(work) 发布 WorkApprovedEvent(workId) function 管理员审核驳回(admin, workId, remark): work.auditStatus REJECTED 取消该作品全部 ACTIVE 挂牌 // 不发布上链事件 function 监听审核通过(event): result BlockchainAnchorService.anchorApprovedWork(workId) if result.success: ANCHOR_STATE Anchored else: ANCHOR_STATE AnchorFailed4.5 内容指纹登记CopyrightWorkServicefunction 登记作品(owner, file, images, manualFingerprint): rawFp computeRawFingerprint(...) // 文件 / 图集 / 手动三选一 fingerprint normalize(sha256: hex) if 库内重复 AND 用户未确认: return HTTP 409 work 新建 CopyrightWork(auditStatusPENDING, fingerprint) 保存(work) // 此时有指纹、待审核尚未上链4.6 异步链上锚定BlockchainAnchorServicefunction 锚定已审核作品(workId): if work.blockchainTxHash 非空: return Ok() // 幂等 if work.contentFingerprint 为空: return Fail() hashHex SHA256(fingerprint字符串) if BLOCKCHAIN_MODE fabric: txId FabricGatewayClient.anchor(workId, hashHex) else: txId mockAnchor(workId, fingerprint) persistAnchor(workId, txId)4.7 Fabric 网关FabricGatewayClientfunction anchor(workId, contentHashHex): gw 获取Gateway() // 懒加载 TLS User1 身份 contract network.getContract(copyright_attestation) proposal contract.newProposal(Anchor) .addArguments(str(workId), contentHashHex) txn proposal.endorse() txn.submit() return txn.getTransactionId() function getAnchor(workId): return contract.evaluateTransaction(GetAnchor, str(workId))4.8 公开验真与溯源BlockchainVerificationServicefunction buildReport(work, submittedFingerprint, file): expectedChainHash SHA256(work.contentFingerprint) chainHash FabricGatewayClient.getAnchor(work.id) chainMatchesDb (expectedChainHash chainHash) verified 已审核 AND 已锚定 AND chainMatchesDb AND 文件一致 function 溯源聚合(workId): timeline [REGISTER, AUDIT_APPROVE, BLOCKCHAIN_ANCHOR, LISTING, ...] 按时间排序返回 TraceReport五、数据库设计四张核心业务表及其关系users ── copyright_works (owner_id) copyright_works ── marketplace_listings (work_id) marketplace_listings ── trade_orders (listing_id) users ── trade_orders (buyer_id)copyright_works表关键字段字段说明content_fingerprint内容指纹如sha256:e18d6060...audit_statusPENDING / APPROVED / REJECTEDblockchain_tx_hashFabric 交易 IDblockchain_network如fabric-mychannel:copyright_attestationblockchain_anchored_at上链时间blockchain_anchor_error上链失败原因可重试完整建表 SQL 见仓库src/main/resources/db/mysql-init.sql。六、Fabric 部署与双模式切换项目支持两种区块链模式通过环境变量BLOCKCHAIN_MODE切换模式说明适用场景mock本地模拟交易 ID无需 Fabric开发调试、演示答辩fabric真实连接 VM 上的 Fabric Peer生产/真实上链Fabric 模式配置示例application.ymlapp:blockchain:enabled:truemode:fabricfabric:grpc-target:192.168.x.x:7051tls-enabled:truetls-root-cert-file:C:/fabric-crypto/org1/ca.crtclient-cert-file:C:/fabric-crypto/org1/user1-cert.pemclient-key-file:C:/fabric-crypto/org1/user1-key.pemmsp-id:Org1MSPchannel-name:mychannelchaincode-name:copyright_attestation部署步骤VM 侧启动 Fabric test-network创建通道mychannellifecycle 部署链码copyright_attestation导出 Org1 User1 证书到本机启动 Spring Boot管理员审核通过一个作品即可触发上链详细脚本见仓库fabric/deploy/README.md。七、本地快速启动# 1. 初始化数据库mysql-uroot-psrc/main/resources/db/mysql-init.sql# 2. 无 Fabric 时用 mock 模式setBLOCKCHAIN_MODEmock# 3. 启动后端mvn spring-boot:run# 4. 启动前端cdfrontendnpminstallnpmrun dev地址说明http://localhost:5173前端http://localhost:8080后端 APIadmin / admin123默认管理员首次启动自动创建完整演示流程注册/登录 → 登记作品上传文件管理员审核通过 → 自动上链或 mock 模拟「我的作品」→ 去挂牌 → 设价其他用户购买 → 版权转移导航栏「验真」→ 输入作品 ID 或上传文件验证八、项目亮点链下指纹 链上哈希原文件不上链兼顾隐私与成本审核驱动上链避免无效数据写入账本异步事件架构审核与上链解耦失败可重试三方验真库内指纹、链上哈希、上传文件交叉比对指纹撞库预警重复登记治理与风险提示真实 Fabric 对接非纯 Mock含 VM 部署脚本与 Gateway 客户端九、研究边界系统能做到内容防篡改举证验真通过 文件与登记、链上一致登记—审核—存证—交易的平台闭环版权交易后的权利人变更记录系统不能单独做到自动识别抄袭、冒领、跨平台侵权链上或平台单方面裁决著作权归属同一文件被多人登记时的法律效力排序十、目录结构digital-copyright-trading/ ├── frontend/ # Vue3 前端 │ └── src/views/VerifyView.vue # 公开验真页 ├── src/main/java/ # Spring Boot 后端 │ ├── fabric/ # FabricGatewayClient │ └── service/ # 锚定、验真、溯源服务 ├── fabric/ │ ├── chaincode/copyright_attestation/ # Go 链码 │ └── deploy/ # VM/Windows 部署脚本 └── src/main/resources/db/ # MySQL 初始化脚本总结本项目将 Web 版权交易平台与 Hyperledger Fabric 联盟链结合通过「内容指纹 审核驱动异步锚定 公开验真」构建了一套可落地的数字版权保护闭环。适合作为区块链应用、数字版权管理方向的毕业设计或实战学习参考。完整源码https://gitee.com/song-ri/digital-copyright-trading如果本文对你有帮助欢迎点赞 收藏部署或二次开发中遇到问题欢迎在评论区交流。