前言
本文记录数据共享演示系统的开发全过程,包括环境搭建、BUG解决、开发思路等……
区块链网络
环境搭建
前置准备环境安装参考:传送门,本地开发环境如下:
- git v2.34.1
- curl v7.81.0
- docker v20.10.21
- docker-compose v1.29.2
- go v1.20
- jq v1.6
- fabric v2.2 fabric-ca v1.4.7
运行测试网络
按照Fabric教程启动测试网络,验证环境搭建是否成功,参考:传送门
改造测试网络
将network.sh
文件复制到数据共享演示系统项目目录下,从头阅读network.sh
文件,将提及的相关文件复制到项目目录下,
生成加密材料时,将组织从两个修改为四个
cryptogen
./organizations/cryptogen
中新建crypto-config-org3.yaml
、和crypto-config-org4.yaml
配置文件- 在
network.sh
中的createOrgs()
函数中添加生成org3
、org4
加密材料的代码
ca
- 在
/organizations/fabric-ca/org1/fabric-ca-server-config.yaml
、/organizations/fabric-ca/org2/fabric-ca-server-config.yaml
和/organizations/fabric-ca/orderOrg/fabric-ca-server-config.yaml
中的affiliations
节添加org3、org4
的所属部门信息, docker/docker-compose-ca.yaml
中添加ca_org3
和ca_org4
配置项/organizations/fabric-ca/
中新建org3、org4
文件夹及其中的fabric-ca-server-config.yaml
配置文件- 修改
organizations/fabric-ca/registerEnroll.sh
中端口号,添加createOrg3()、createOrg4()
- 在
network.sh
中的createOrgs()
函数中调用registerEnroll.sh
的createOrg3()、createOrg4()
函数 - 修改
./organizations/ccp-generate.sh
中端口号,添加Org3、Org4
- 在
修改network.sh
中createConsortium()
的Two->Four
- 修改
./configtx/configtx.yaml
,Organizations:
中添加Org3、Org4
,Profiles:
中添加Org3、Org4
并且Two->Four
修改./docker/docker-compose-test-net.yaml
:volumes
中添加org34
、services
中修改org12
的端口号并添加org34
、cli
中添加org34
(默认用的levelDB
)修改./docker/docker-compose-couch.yaml
:添加org34
修改scripts/createChannel.sh
,createChannelTx()
中Two->Four
(config.yaml
中的profiles
),最后joinChannel()、setAnchorPeer()
调用加34
- 修改
scripts/envVar.sh
:添加org4
- 修改
scripts/createChannel.sh
:修改端口号,添加org4
修改scripts/deployCC.sh
:最后调用函数处添加org34
修改network.sh
中networkDown()
:添加关闭org4
容器,删除org34
生成的文件和证书
启动测试网络
使用cryptogen
- 启动节点容器:此命令创建一个由四个
peer
节点和一个orderer
节点组成的 Fabric 网络,运行此命令时没有创建任何channel
|
|
- 创建通道:在
Org1、Org2、Org3
和Org4
之间创建一个默认名称为mychannel
的通道,并将它们的peer
节点加入该通道,最后为每个组织设置了锚节点
|
|
- 安装链码:
deployCC
子命令将在peer0.org1.example.com
和peer0.org2.example.com
上安装asset-transfer (basic)
链码。 然后在使用通道标志(或mychannel
如果未指定通道)的通道上部署指定的通道的链码
|
|
- 初始化链码:
|
|
- 查询账本:
|
|
- 调用链码改变账本上的资产所有者:
|
|
- 切换组织和节点查询账本:
|
|
- 关闭网络:该命令将停止并删除节点和链码容器,删除组织加密材料,并从
Docker Registry
移除链码镜像。 该命令还删除之前运行的通道项目和docker
卷
|
|
使用 Fabric CA
|
|
拷贝Fabric-trace
项目的blockchain-explorer
,替换本项目的organizations
文件夹,修改配置文件,启动explorer
|
|
手动部署Fabcar链码
复制fabric-samples/chaincode
目录到Fabric-Data-Sharing
- 安装链码依赖项(Go):
|
|
- 打包链代码:
|
|
- 在节点上安装链码包:
|
|
- 为组织批准链码
|
|
- 提交链码到通道
|
|
- 调用链码
|
|
- 升级链码
|
|
启动应用程序与区块链交互
复制fabric-samples/fabcar
到Fabric-Data-Sharing
目录下
启动网络:
|
|
启动应用程序(Go):
|
|
关闭网络:
|
|
在 Fabric 中使用私有数据
创建集合定义的 JSON 文件:确定私有数据的访问权限
使用链码 API 读写私有数据:读取和写入带有集合定义的私有数据需要使用 GetPrivateData()
和 PutPrivateData()
接口
- 启动网络:
|
|
- 安装并定义一个带集合的链码:
|
|
- 存储私有数据:Org1 的成员已经被授权使用弹珠私有数据示例中的所有私有数据进行交易,切换回 Org1 节点并提交添加一个弹珠的请求。私有数据 price 将会和私有数据 name, owner, color, size 分开存储。因此,
initMarble
方法会调用PutPrivateData()
接口两次来存储私有数据。另外注意,传递私有数据时使用--transient
参数。作为瞬态的输入不会被记录到交易中,以此来保证数据的隐私性。瞬态数据会以二进制的方式被传输,所以在 CLI 中使用时,必须使用 base64 编码
|
|
- 授权节点查询私有数据:集合定义定义允许 Org1 和 Org2 的所有成员在他们的私有数据库中保存
name, color, size, owner
私有数据,但是只有 Org1 的成员才可以在他们的私有数据库中保存price
私有数据。作为一个已授权的 Org1 的节点,我们可以查询两个私有数据集。Org2 的节点的私有数据库中不存在price
数据。当你尝试查询这个数据时,将只能看到私有数据的公共 hash。
|
|
- 清除私有数据:数据在过了一定数量的区块后进行 “清除”,仅仅把数据的哈希作为交易不可篡改的证据保存下来。(知道这个功能就行,时间关系此处不实操)
- 使用私有数据索引:可以通过打包链码目录中的索引
META-INF/statedb/couchdb/collections/<collection_name>/indexes
目录,将索引也用于私有数据数据集。在生产环境中部署链码时,建议在链码目录中定义所有索引,这样当链码在通道中的节点上安装和初始化的时候就可以自动作为一个单元自动部署。当使用--collections-config
标识私有数据集的 JSON 文件路径时,通道上链码初始化的时候相关的索引会自动被部署。 - 关闭网络:
|
|
使用CouchDB索引完成富查询
- 启动网络:
|
|
- 安装、批准、提交和初始化链码:
|
|
- 查询CouchDB状态数据库
|
|
上面的第一个富查询json格式化后:
|
|
webdav
使用nginx搭建webdav文件服务器(BUG)
- 安装
nginx
:注意必须安装nginx-full
, 默认的nginx
里面并不包含webdav
模块
|
|
- 创建发布目录:
|
|
- 配置
|
|
内容如下:
|
|
- 测试配置文件
|
|
- 创建用户登录验证信息(用户名-密码)
|
|
- 重启nginx服务
|
|
- 查看nginx状态
|
|
使用apache搭建webdav文件服务器(不适用)
- 安装
apache2
|
|
- 启动关联到的模块
|
|
- 关联文件
|
|
- 重启服务
|
|
- 创建共享目录
|
|
- 创建用户
|
|
- 配置文件
|
|
在VirtualHost
节点中加入配置信息:(注意:先在 DocumentRoot /var/www/sync/ 前加#, 避免重复)
|
|
- 重启服务并登录
|
|
Bug1:Apache2无法启动,报错 for apache2.service failed because the control process exited with error code.
原因:端口占用
解决:杀掉占用了端口的进程
|
|
gin+webdav+vue
数据存储服务:各个参与方都运行一个gin实现的webdav服务器,并将共享目录的文件摘要上传到区块链中记录(智能合约),结合前端技术,实现在数据存储服务页面上设置共享目录,上传下载等操作
- 上传目前是直接将共享文件放入共享目录,没有写前端上传API
数据共享系统:使用gin编写一个数据共享系统服务器,展示区块链中记录的文件摘要。当用户请求文件时,该数据共享系统请求参与方的数据存储服务,并将请求记录存入区块链
数据存储服务与数据共享系统的区别与联系:
- 数据存储服务后台是各个参与方自己管理的一个数据库;数据共享系统展示所有参与方的数据,通过请求响应获取各个参与方的数据
- 数据共享系统包含数据存储服务;数据存储服务是数据共享系统的一部分
开发步骤:
- 阅读并大概理解ginwebdav源码
- 编写智能合约
数据存储服务实操:
- 启动网络:链码路径
../chaincode/fabcar/go/
、使用CA
、couchdb
、初始化链码
|
|
- 启动应用程序(Go):复制
fabcar
应用程序的代码、证书密钥和配置文件到win下,修改代码和配置文件使之适配新路径,实现在宿主机通过API,连接虚拟机中的区块链网络,调用其智能合约(此路不通,因为区块链网络节点是在本地启动,节点地址都设置为localhost:port,若要在宿主机访问,需要修改为宿主机ip+port)
|
|
- 关闭网络:
|
|
进度表
2023.7.6-2023.7.9
- 搭建环境并运行测试网络
- 改造测试网络使之适配项目(四个组织一个通道、使用Fabric-CA、使用couchDB)
2023.7.10
- 网络浏览器拉取镜像失败(已解决,网络原因)
- (BUG)资产转移链码调用失败,显示成功,但是查询后没有改变,在原测试网络再试下能否转移成功(已解决,背书的Peer节点不够,原示例只有
org12
的peer
节点背书,未过半数peer
节点)
2023.7.11
- 网络浏览器启动失败(初步查明原因:签名证书不匹配)
- 排查原因步骤
- 用
fabric-sample
试一下能否成功启动(可以启动成功) - 查看容器日志发现无法连接
peer
节点且pg
数据库查询失败 - 检查配置的证书文件路径及名称
- 检查配置文件格式
- 检查数据卷残留(发现有残留,但官方推荐的
docker-compose down -v
按道理会清除Postgres data and user wallet
数据卷,查看控制台输出发现是由于fabric-test
网络在启动中,所以无法关闭,导致报错结束命令执行,怀疑是该原因造成后续删除数据卷的步骤未执行)
- 用
- 排查原因步骤
2023.7.12
- 手动部署
fabcar
链码(Go
)、修改链码、升级链码 - 看教程的编写你的第一个应用,实操用应用程序调用
fabcar
链码,而不是用cli
调用
2023.7.13
- 逐行看
fabcar
应用程序的Go
代码如何实现 - 学习私有数据的概念,在 Fabric 中实操使用私有数据的例程
2023.7.14
- 逐行看使用私有数据的
marbles
例程的链码
2023.7.15
- 看如何使用CouchDB
- 了解下
marbles
例程的链码下索引的概念(couchDB的特性)
2023.7.16
- 在 Fabric 中实操使用CouchDB的例程(有BUG,无法在节点安装链码)
2023.7.18
- 看链码开发者教程
- Ubuntu使用nginx搭建webdav文件服务器(BUG,80只显示欢迎页,改到8081后可以输入用户名密码,但验证失败,显示404)
2023.7.22
- Ubuntu使用nginx搭建webdav文件服务器(尝试解决BUG失败)
2023.7.23
- 使用APACHE建webdav文件服务器
2023.7.29
- 看gin+webdav源码
- 成功启动webdav服务器
2023.7.30
- 尝试在win系统中开发数据存储服务(失败原因:无法连接区块链网络)
- 在ubuntu中安装goland,配置环境
- 解决ubuntu系统问题:apparmor权限规则问题导致经常黑屏,通过修改apparmor的权限规则文件解决;修改后无黑屏现象,但无法启动通过snap的软件商店安装的goland,故从官网下载goland安装包重新安装
2023.7.31
- 在ubuntu中启动webdav服务器
- 编译错误:缺少io/fs包;解决:升级go版本到1.17
- 成功在dataStorage连接区块链网络调用智能合约
2023.8.1
- 虚拟机中安装的ubuntu系统频繁出现内核错误,无法解决,故重装系统Ubuntu22.04.2
- 在新系统中重新配置项目环境,成功启动区块链网络、webdav服务器、调用智能合约
2023.8.4
- 仿照fabcar编写智能合约定义数据结构体,实现简单增删改查,使用fabric-sdk-go完成调用
2023.8.5
- 在数据储存服务中提取文件摘要,并调用API上传文件相关信息到区块链,同时也通过API从区块链中查询出文件信息(键查询)
- 使用例程学习CouchDB,建立索引,使用富查询完成例程中的资产的查询
2023.8.6
- 在链码中添加索引文件(dataHash、dataName),智能合约中完成QueryInfoByHash函数,在客户端应用程序中完成QueryByHash函数,通过gin框架成功调用该接口,使用APIPOST成功通过QueryByHash的测试
2023.8.7
- 完成QueryAllInfos、QueryInfoById、QueryInfoByHash、QueryInfoByName、ChangeInfoByName接口测试
- 包括智能合约返回值的修改
- 完善uploadSingleFile接口的内部细节:
- 查询在区块链中查询是否存在哈希值一样的文件,若存在,则说明是同一文件,不再上传,直接返回提示信息
- 查询在区块链中查询是否存在文件名一样的文件,上面通过了哈希值校验,说明文件名相同,但内容不同,则覆盖原文件,更新dataVersion(先从区块链中获取version,再更新),区块链中会保存原文件的记录,但内容已被覆盖(BUG:提取DataId时遇到问题)
2023.8.8
- 解决uploadSingleFile接口中无法提取到DataId的BUG
- 优化代码,抽象出连接区块链的connectToBlockchain函数,减少代码冗余
2023.8.9
- 复习javascript基础
- 复习Vue2基础
- 阅读Vue3官方文档-开始,并动手实践,跟着教程成功使用 Vite + Vue 3 创建了一个项目
2023.8.10-2023.8.17
- 学习
vue3
+typescript
+vue-router
+pinia
+element-plus
+axios
在项目中如何配置和使用
2023.8.18
- 修改Ubuntu的DNS,解决网速慢问题,修改Ubuntu的Dock位置、字体大小
- 在
Ubuntu
中搭建数据共享演示系统的前端开发环境,完成axios
二次封装 - 优化项目目录,删除无用文件,重新构建项目启动路径
- 将项目的启动和关闭过程记录在
README.md
中 - 创建
update_json_path
脚本文件,实现自动化根据当前区块链网络生成的秘钥修改区块链浏览器配置文件
2023.8.19
- 修改中间件:链接区块链网络时事先生成管理员和用户的身份并存储在
wallet/
中 - 解决了在GO中使用
GO MOD
模式导入本地自定义包/函数的问题 - 将生成身份填充钱包和连接区块链的代码封装到工具包中
2023.8.20
- 替换Fabric生成的身份文件中的
\n
- 完成后端登录接口开发,后端使用前端发送身份和私钥,与钱包中的身份文件中的私钥做对比,若一致则登录成功;否则登陆失败
2023.8.21
- 完善登录接口
- 编写生成token的函数,利用token实现用户登录状态的保持
- 编写请求拦截器,通过GIN的中间件实现,完成token的验证以及用户信息的解析提取
- 抽象出http的请求处理函数
- Fabric生成的身份文件中
\n
不能删除,不然会报错秘钥错误,但用户登录时使用的秘钥含有\n
又不太美观,后期可以考虑用BASE64优化 - 修改上传文件时的上传者为TOKEN中保存的identity
- 若header中未携带token则提示登录
- 待优化:避免重复登陆,该用户存在TOKEN且未过期的话,返回该TOKEN
2023.8.24
- 学习vue项目中的layout模块开发
2023.8.25
- 学习vue项目中的登录获取用户信息、退出登录、路由鉴权和真实接口替代mock接口
2023.8.26
- 继续学习vue项目中的真实接口替代mock接口、接口ts数据类型定义
- 完成数据共享系统的的真实接口替代mock接口、接口ts数据类型定义
- 修改后端登录接口获取请求体中RAW数据(JSON),原来是获取表单数据,表单类型适合上传文件
2023.8.27
- 首页使用了粒子效果(安装
particles
、vue3 tsparticles
),并将登录框水平垂直居中,输入框加入提示文字 - 主题颜色:蓝色、紫色;删除模板的滚动条
scss
代码 - 添加主题切换按钮,借助element-plus的暗色模式,删除原来模板的顶部和主题颜色
- 修改折叠后边框宽度使logo和icon水平居中,隐藏logo旁标题
- 使用后端的登录接口,新开发后端获取用户信息的接口
- 完成前端的退出登录和路由鉴权
- 设置用户头像为el组件提供的icon,修改tabbar右侧按钮大小为默认
- 学习模板中的主体内容开发
2023.8.28
- 学习模板中的主体内容开发
- 分析项目的文件管理模块,理清思路
2023.8.29-9.2
-
智能合约
- 文件结构体中新建一个字段说明文件的查看范围(公开/指定一个组织)
- 新建索引文件
indexDataAuthority
- 编写函数
QueryAllInfoByOwnerPrefix
,通过字段dataOwner
的前缀组织名查询文件信息 - 编写函数
QueryFilesByDataAuthority
,通过字段dataAuthority
的值(public/Org*
)查询文件信息
-
后端开发接口
/query/myorg
获取token
中的identity
的Org为发布者的所有文件,使用couchdb的模糊查询(正则匹配)/query/public
获取文件范围为公开public
的所有文件/query/spec
获取token
中的identity
的Org
为指定接收者的所有文件- 上传文件接口:接收文件返回URL、Hash、Name、Size、Type
- 上传文件表单接口:接收URL、Hash、Name、Size、Type、文件描述、授权范围
-
前端文件管理分为两个个子页面
- 展示所有公开分享的文件
- 展示本组织为特定接收方的文件
-
点击【分享】按钮分享文件
- 填写相关信息
- 文件描述:单选框+补充说明
- 分享范围:单选框
- 上传文件
- 字段校验:除了补充说明均为必填项
- 填写相关信息
-
本组织分享的文件:显示【查看】(【修改】按钮暂时不开发)
- 点击【查看】:浏览器能加载的直接打开,加载不了会下载
- 点击【修改】:获取文件信息,重新上传(暂时不开发)
- 关键词搜索文件描述字段:模糊查询
- 智能合约层面编写查询函数:正则查询
dataDeScription
,并且dataAuthority
为public
- 编写相应的前后端调用方法
- 前端输入框为空时,【查询】按钮不可用
- 【重置】按钮:清除关键字,重新获取表格数据
- 智能合约层面编写查询函数:正则查询
-
非本组织分享的文件:显示【请求查看】按钮,点击发送查看请求,记录入区块链,该文件信息在公开页不显示,在我的请求中显示。请求授权过程:发送授权请求=>同意授权=>查看数据
-
具体操作:
- 新加一个菜单项【请求授权】:两个子页面显示【我的请求】、【我的授权】
- 智能合约:
- 创建
ReqAuthInfo
结构体:记录信息类型、请求授权记录ID、请求者、请求的文件ID、请求时间、是否同意、操作者、操作时间 - 创建
QueryReqAuthResult
结构体:接收区块链查询结果 CreateReqAuthInfo
:创建请求授权记录QueryReqAuthInfoByReqUser
:根据请求者查询所有的请求授权记录QueryReqAuthInfoByOperator
:根据响应者查询所有的请求授权记录QueryReqAuthInfoByReqAuthId
:根据请求授权记录ID查询请求授权记录- !!!BUG创建
KEY
:作为区块链中所有记录的ID
:由于智能合约安装在多个节点中,所以不能用全局变量,其他节点无法同步变量更新;(解决)改为在后端计数递增然后传递给合约 QueryReqAuthInfoByReqUserAndReqDataId
:根据请求者和请求的文件ID查询请求授权信息ChangeReqAuthInfoIsAuth
:根据Key
和reqAuthId
修改请求授权记录的IsAuth
字段- 修改
QueryAllInfos
为QueryAllFileInfos
:由于返回字段的结构不一致,故此处改为返回所有文件信息
- 创建
- 后端:
- 中间件:创建对应智能合约的创建记录函数和查询函数
- 请求处理
- 新建全局变量
REQAUTHID
:作为每条请求授权记录信息的ReqAuthId
- 创建结构体
ReqAuthInfo
:定义创建请求授权记录 - 创建对应中间件的创建记录函数和查询函数
- 修改
QueryAllInfosToAllHandler
为QueryInfosToPublicByAuthorizedHandler
:返回所有公开的且请求授权记录中的该文件使未被授权给该用户的- 先查询到所有授权范围为公开的文件信息
- 再查询到所有该登录用户的请求授权记录信息
- 再用所有授权范围为公开的文件信息的
dataId
字段与所有请求授权记录信息中的reqDataId
字段的值做比对,哪个文件信息比对成功,说明哪个文件信息被该登录用户请求过,所以从所有授权范围为公开的文件信息中去除比对成功的该条文件信息,所有文件信息全部比对过后,返回所有授权范围为公开且没有被该登录用户请求过文件信息
- 新建
QueryFileInfoByReqUserHandler
:根据请求者查询请求过的所有文件信息的接口用于【我的请求】页展示 - 新建
QueryReqAuthInfoByReqUserAndDataIdHandler
:根据请求者和请求的文件ID查询请求授权信息 - 新建
QueryFileInfoWithRequestAuthInfoByOperatorHandler
:根据登陆用户查询需要授权和授权过的所有请求授权信息和对应的文件信息的接口 - 修改
QueryAllInfosToSpecHandler
:查询特定接收方的所有文件信息且过滤掉已经被请求过的文件的接口 - 修改
QueryAllInfos
为QueryAllFileInfos
:返回所有文件信息
- 新建全局变量
- 前端:
- 点击【请求】后该文件信息从【公开文件】页移至【我的请求】页
- 不能重复请求同一文件:点击【请求授权】后在【公开文件】页直接不显示
- 在【公开文件】页提示文件已移动至【我的请求】页
- 【我的请求】页展示登录用户所有请求过的文件,未授权的显示【待授权】按钮(禁用),授权了的显示【查看】按钮、(暂时没做:被拒绝的显示【请求被拒绝】按钮)
v-if
和v-show
的判断函数中异步的promise
对象总是返回true
- 【我的授权】页展示登录用户所有的作为操作者的请求授权信息及其对应的文件信息,展示【请求者】和【请求时间】,操作栏显示【查看】和【授权】
- 点击【授权】后,修改该条请求授权信息中的
isAuth
字段,然后将按钮变为【已授权】,不可再次点击
- 点击【授权】后,修改该条请求授权信息中的
- 点击【请求】后该文件信息从【公开文件】页移至【我的请求】页
-
本组织为特定接收方的文件:显示【查看】按钮,点击也要通过请求授权
-
在登陆页校验:管理员直接跳转到区块链浏览器,用户首页显示数据统计
- 历史/今日被请求的文件排行榜
- 历史/今日被请求的组织排行榜
- 历史/今日发布文件的组织排行榜
- 历史发布总文件数(顶部居中)
- 每天发布文件数的趋势折线图(中间一横排)
- 实时发布文件的流水图(向下自动划)(右下角)
- 参考数据大屏、Fabric-trace、hyperledger explorer
- 调研Fabric关于HISTORY的API
-
演示时开两个浏览器代表不同用户
2023.9.17
添加文件访问记录上链功能
- 智能合约
- 创建
FileAccessInfo
结构体:信息类型、文件访问记录ID、文件ID、文件名、访问者、访问时间 - 创建
QueryFileAccessResult
结构体:接收区块链查询结果 CreateFileAccessInfo
:创建文件访问记录QueryAllFileAccessInfos
:查询所有的文件访问记录QueryFileAccessInfoByAccessId
:通过AccessId
查询文件访问记录
- 创建
- 后端
- 中间件:创建对应智能合约的创建记录函数和查询函数
- 请求处理:
CreateFileAccessInfo
:创建文件访问记录- 将
httpHandlers.go
移至gowebdav
:避免import cycle
- 修改
webdav
客户端的Defaulthandle
:将文件访问记录上链
- 前端
- 配置
webdav
服务器的代理 requestWebdav
:进行axios
二次封装,使用请求与响应拦截器src/api/webdav/index.ts
:请求webdav
服务器的相关API- 修改文件管理和请求授权四个子页面的【查看】按钮回调函数:
- 发送文件访问记录给服务器,服务器将该记录上链,弹窗提示用户文件访问记录上链
- 显示文件内容
- 配置
TODO
- 开发前端文件上传:通过网络将文件上传到后端服务器指定的共享目录,后端会提取数据摘要上传到区块链网络
- 主页数据展示、学习菜单权限分析与实现和路由的拆分在12完成后开始,边学边做,结合自己项目
- 前端登录,后续请求用请求头携带TOKEN
- 在前端通过请求响应获取Fabric的MSP,实现不同组织的不同用户登录的访问控制
- 修改文件信息要看登录用户的权限:所属组织、是否管理员、是否上传者;本组织管理员可修改本组织所有文件,上传者可修改自己上传的文件
- 结合前端技术(Vue+ElementUI),实现在数据存储服务页面上设置共享目录,上传下载等操作
- 前端表单生成可以试试form-create(没采用该方案,本项目直接使用
element-ui
组件) - 上传文件实际上传的是文件的数据摘要,不是把文件本身传到区块链网络,每个组织都运行一个数据存储服务,该组织下的用户上传文件是上传到该组织的服务器上
- 在登陆页校验:区块链管理员直接跳转到区块链浏览器,监管机构显示数据统计
时间 | 内容 |
---|---|
2023.6.10-2023.7.5 | 需求分析、总体设计、技术选型 |
2023.7.6-2023.7.9 | 1. 搭建环境并运行测试网络;2. 改造测试网络使之适配项目(四个组织一个通道、使用Fabric-CA、使用couchDB) |
2023.7.10 | 1. 网络浏览器拉取镜像失败(已解决,网络原因);2. (BUG)资产转移链码调用失败,显示成功,但是查询后没有改变,在原测试网络再试下能否转移成功(已解决,背书的Peer节点不够,原示例只有org12 的peer 节点背书,未过半数peer 节点) |
2023.7.11 | 网络浏览器启动失败(初步查明原因:签名证书不匹配)排查原因步骤:1)用fabric-sample 试一下能否成功启动(可以启动成功);2) 查看容器日志发现无法连接peer 节点且pg 数据库查询失败;3)检查配置的证书文件路径及名称;4)检查配置文件格式;5)检查数据卷残留(发现有残留,但官方推荐的docker-compose down -v 按道理会清除 Postgres data and user wallet 数据卷,查看控制台输出发现是由于fabric-test 网络在启动中,所以无法关闭,导致报错结束命令执行,怀疑是该原因造成后续删除数据卷的步骤未执行) |
2023.7.12 | 1. 手动部署fabcar 链码(Go )、修改链码、升级链码;2. 看教程的编写你的第一个应用,实操用应用程序调用fabcar 链码,而不是用cli 调用 |
2023.7.13 | 1. 逐行看fabcar 应用程序的Go 代码如何实现;2. 学习私有数据的概念,在 Fabric 中实操使用私有数据的例程 |
2023.7.14 | 逐行看使用私有数据的marbles 例程的链码 |
2023.7.15 | 看如何使用CouchDB |
2023.7.16 | 在 Fabric 中实操使用CouchDB的例程(有BUG,无法在节点安装链码) |
2023.7.18-2023.9.2 | 完成系统原型开发:前后端和区块链网络 |
2023.9.17 | 添加文件访问记录上链功能 |