# 基于区块链的可信软件供应链系统 **Repository Path**: ShakeJ/trustedsoftware ## Basic Information - **Project Name**: 基于区块链的可信软件供应链系统 - **Description**: 基于区块链的可信软件供应链系统,使用到Python/Flask+Vue3+SQLite+Ganache技术搭建平台用于软件的版本更新和组件更新。 功能包含对组件以及版本是否有毒Poison以及毒Poison种类的判断等,达到良好的追溯性以及不可篡改性 - **Primary Language**: Python - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 1 - **Created**: 2024-06-02 - **Last Updated**: 2025-04-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: Python, Vue, Flask, Sqlite, Ganache ## README ## 基于区块链的可信软件供应链系统 ### 一、使用框架服务 flask + sqlite3 + vue3+Ganache区块链平台 ### 二、IPFS文件服务器 分布式存储方案,用来真实存放文件,返回文件CID ### 三、链和智能合约: hash存储到链上,版本号,上传时间,上传的账号信息,上游的CID。 通过上游CID递归查找整个链上所有的上游信息有没有毒性(标志位和毒库更新),关联的文件cid(上游cid) #### 区块链接口函数: ``` getinfo(string CID):传入CID,找到链上最新一条该CID的记录,返回这里的所有信息sourceManage(json格式) searchPoison(string CID):传入CID,通过该CID的sourceManage["upperstreamDependency"]的CID项向前查找所有链上有的CID的"poison"字段,若该字段不为null且当前sourceManage的"upperstreamDependency"与"poison"字段没有记录,那么记录并添加记录 upload(string CID, string name,string[] upperstreamDependency, string time, string version, string user)上传一个新的项信息(poison项默认为null,upperstreamDependency为一组CID,通过该CID搜索链上的poison信息),若CID与链上重合则不上传返回false,否则成功上链返回true update(string CID, string poison)找到该CID最新的记录,修改其poison项,如果原本为null,则修改为poison,否则添加`;{poison}`到该项的字符串末尾 ``` ### 四、前端: 1. 登录,注册;仅允许用户注册,管理员权限较高,用已知账号; 2. 获取用户相关项目,展示基础信息和是否被投毒等,可以关键词文本搜索; 3. 用户创建新项目,指定版本号、一级上游、上传文件; 4. 用户下载页面,关键词文本搜索,详情按钮动态更新项目的依赖上游的毒性和是否被投毒等,下载按钮天机判断是否可以被下载逻辑; 5. 管理员进行毒库的更新,输入项目文件CID和对应找到的毒即可; ### 五、后端 #### 1. 数据库: + 用户表:(admin表同,暂省略) + 用户ID + 用户名 + 密码 + IPFS: + 主键:文件返回的CID + 项目码(用户ID+文件名) + 文件名 + 用户ID + 用户名 + 上游溯源CIDS + 版本号(1.0开始,仅用CID区分) + 时间戳 + 毒性判断 + 毒库 + poison表(admin操作) + CID + poison #### 2. 返回json数据给前端和区块链进行交互 + 可以返回,同时创建提交时候有存储的json文件,用于备份保存(文件名也含有部分基础信息) #### 3. 接口调用以及跨域转发 + 接口函数等,详情功能请参见`SSSM后端文档` ### 六、项目运行说明 #### 运行环境 1. 安装Ganache客户端运行 + pip install ganache + ganache_url = "http://127.0.0.1:8545" + web3 = Web3(Web3.HTTPProvider(ganache_url)) 2. 配置IPFS环境并主机运行 + 项目中:pip install IPFS-Toolkit + 安装kubo_v0.28.0_windows-amd64 客户端 + 将安装路径放入环境变量path中 + 主机cmd终端输入:ipfs daemon 启动 3. 前端VUE启动 + 指令:`npm run dev` + 默认地址及端口:127.0.0.1:8081 4. 后端Python运行app.py文件启动 + python app.py + SQLite导入/sql目录的表,进行运行创建即可 + 默认地址:127.0.0.1:5000 5. 注意跨域即可 #### 测试账号 1. 管理员 + 账号:admin,密码:123456 2. 用户(仅供测试) + 账号:222,密码:222 ### 七、项目功能: #### 区块链上链信息样例: ```` { "CID": "QmQA75fPBMD7CJ12bzxACdZUMkuSvqughD4trS3dk1BCSj", "name": "新建文本文档.txt", "up_CIDS": "QmZR7QpQRrMStxP1aatamEXh8ruUUVfxaJg7E6YrRV72nY", "upperstreamDependency": [ { "CID": "QmZR7QpQRrMStxP1aatamEXh8ruUUVfxaJg7E6YrRV72nY", "poison": "" } ], "poison": "", "time": "2024-06-10T04:57:14", "version": "1.3", "user": "222" } ```` 后续更新操作会将up_CIDS、upperstreamDependency、poison三者进行`协同更新`: 受到上游CIDS的毒性约束以及版本依赖 #### 后端实现功能: 1. 新建项目/组件、更新项目/组件版本时的详细信息上链,项目文件上传至IPFS,不可篡改 2. 组件上游信息清晰透明,漏洞信息官方与审计人员实时报告、实时上链,风险下游实时更新,快速响应 3. 用户下载项目时进行风险校验、篡改校验,减少恶意分发风险 ### 八、前后端交互模块 #### 1. owner创建项目 + 此时默认没有毒 None,初始标识为 0, 确保CID不重复, 需要注意项目码 + 版本需要手动创建,文件标识,标识更新上链 + 返回一级上游upCIDS + 可以查看全部登录用户(自身)的项目组件以及有关信息,进行分页效果 + 输入项目名称,查看个人参与的项目详情 #### 2. contributor参与修改项目: + 首先需要输入项目码参与项目,指定版本号,上游CIDS,上传文件(一般都是同名文件的修改) + 异步更新关联的项目,通过项目码进行测试 + 项目中存在毒,初始标识为1,同时记录存在的毒 + 更新当前文件CID上链,同时上游upCIDS也同样更新毒性上链 #### 3. admin审计者搜索文件名, 查看部署文件情况(得到CID等信息) + admin进行毒上传: 需要输入CID, 标识位(默认0,现在改为1),毒名称(这里的毒名称上传指的是附加,不会替代原有的毒) + admin上传提交, 此时后续上传的版本只要查询到上游CIDS中有毒,则会自带附加的毒poison + 只有admin可以进行毒库的更新 #### 4. download下载 1. 用户点击详情页,展开查看具体信息的时候的同时更新毒库,重新将此CID进行上链; 2. 自定义分页查询下载 3. 用户下载的时候,点操作详情,我们根据当前文件的CID去查它的upCIDS,upCIDS中的元素是否在毒表中,如果存在的话,那么数据库修改为有毒标志位poisonExist,并且把毒写入poison中; 4. 用户直接从浏览器下载即可 5. 文件下载逻辑: + 用户点击下载进行处理,获取唯一CID从数据库指定路径进行下载: + 这里的下载逻辑是这样的,从前端获取了对应的CID的值,根据这个CID去IPFS中数据库根据sqlite查找出对应的userid和版本号version和文件名filename, + 注意这里的filename是包含有格式(比如.txt)需要提取出来,然后拼接存储路径的文件名为“filename_userid_version.txt”。到文件夹路径相对路径,uploads文件夹中去寻找。找到后读取文件,浏览器下载 6. 下载到本地,格式不变 ### 九、测试效果图 + 忽略注册登录界面,进入主要功能模块: #### 1. 用户项目组件上传和查询主页: ![img.png](picture/img.png) #### 2. 用户项目查询(绑定登录用户): ![img_1.png](picture/img_1.png) #### 3. 原项目创建or版本更新,默认登录用户,成功后会刷新页面以及上链: ![img.png](picture/img_2.png) #### 4. 组件下载主页面: ![img.png](picture/img_7.png) #### 5. 自定义全量查询,与用户解耦: ![img_1.png](picture/img_8.png) #### 6. 项目详情展示,同时将查询区块上链: ![img_2.png](picture/img_9.png) ##### 为了识别可能存在的毒导致区块信息更新: ![img.png](picture/img_14.png) #### 7. 下载使用,通过文件毒性判断是否允许下载: ##### 无毒文件允许下载: ![img_3.png](picture/img_3.png) ##### 有毒文件禁止下载: ![img.png](picture/img_13.png) #### 8. 项目更新,和当前用户解耦,自定义更新以及一级溯源对象: ![img_4.png](picture/img_4.png) ![img_5.png](picture/img_5.png) #### 9. 管理员更新毒库,CID和poison一一对应,下一次用户需要下载以及查询时候,可以看见所选项目的实时毒元素是否存在以及毒库更新: ![img_6.png](picture/img_6.png) #### 10. 命令行查看区块上传信息: ![img.png](picture/img_10.png) #### 11. 区块链全部区块可视化界面: ![img_1.png](picture/img_11.png) #### 12. 具体区块,可以看到区块ID和哈希值: ![img_2.png](picture/img_12.png)