# DataReource Share **Repository Path**: hua-kaifeng/data-reource-share ## Basic Information - **Project Name**: DataReource Share - **Description**: 基于区块链技术的数据资源共享平台的设计与实现 - **Primary Language**: 其他 - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 6 - **Forks**: 4 - **Created**: 2022-03-12 - **Last Updated**: 2025-04-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: Solidity, 区块链, 数据共享, js脚本 ## README # DataReource Share #### 介绍 基于区块链技术的数据资源共享平台的设计与实现 区块链资源共享平台说明书 引言 1. 产品背景与意义 随着时代的进步, 共享正逐步进入我们的社会,共享单车、共享雨伞、共享充电宝、共享汽车等一系列共享经济模式横空出世,给我们的生活带来了巨大的便利。作为一种分布式共享账本,区块链技术似乎天生就和共享密不可分,业界人士也不断宣称这种技术能给共享带来革命性的进步。那么,区块链式共享与互联网式共享究竟有何不同呢? 在互联网模式下,数据读取、写入、编辑和删除一般都伴随着身份认证操作,只有特定的人才能对数据进行修改,而在区块链模式下,尤其是公有链体系下,任何人都可以参与对数据的读写,并且以分布式账本的方式构建一个去信任的系统,参与读写的各个组织或个体可以互不信任,但能对系统存储数据的最终状态达成共识。简单地说,区块链式共享和互联网式共享的本质区别在于区块链共享的不仅仅是数据,而是数据的控制权。在现有互联网体系下,只要掌握了网站平台的运营权,就能完全地控制平台上的数据。在区块链体系下,数据不被任何权威方掌握,其权限是由规则来进行控制的,这些规则规定了什么样的信息是有效的,同时还规定了参与者应当如何对其进行反馈。这些规则通常是预先定义的,而且是参与者共同维护的,所有区块链的参与者必须遵守规则。在互联网环境内,虽然也存在着一些规则,但是由于规则完全是由权力方来维护的,难以避免会出现暗箱操作等行为。而在区块链体系内,规则是由所有参与者共同维护的,各参与方都会根据规则来独立的验证数据。区块链以权限分享的形式,让每个参与者同时作为数据提供方、验证方和使用方,共同维护区块链数据的安全和有效性。 本产品旨在提高资源共享的安全存储性、健壮性与增强共享资源的可信性,隐私性,使得共享数据资源中心化程度大幅降低,不再受到第三方监管,避免数据泄露等一系列因数据共享中心机构的错误可能造成的问题。 2. 国内外发展现状 随着区块链技术越来越多地出现在人们的视野,其去中心化的特性颠覆性地解决了许多“信任”问题,为多企业、多单位共同参与项目提供了一致性的保障,为数据安全、数据增值、成果认定提供了平台支撑。大数据时代的到来更加使得传统关系型数据库显得力不从心,虽然NoSQL技术在一定程度上满足了大数据时代的数据共享需求,但面对数据量的急剧增加以及数据敏感度的日益提升,数据的一致性、可用性以及安全性等方面仍限制了NoSQL的发展。 Sun J J等人提出了一种基于区块链的共享服务的概念模型,用于促进数据共享。然而,研究仅仅侧重于概念和模型,没有提出实际解决方案 。Yue X等人提出一个基于区块链的数据共享模型,在不破坏隐私的前提下,帮助用户安全和轻松地掌握并且分享自己的数据。他们提出一种基于目的的访问模型,实现了用户持有并掌握自己的数据控制权。虽然他们提到了安全多方计算的潜在前景,却没有提出具体的实现方案。Zik ratov I等人提出了一个基于区块链的云上数据共享框架,该框架充分解决了在云环境中存储的敏感数据相关访问控制问题,但普适性还稍有欠缺。Muzammal M等人将区块链和数据库结合,提出一种去中心化、分布式和可审计的数据系统。该方案是第一个基于区块链的防篡改的数据库,提供了对分布式数据的高效检索。 一、产品概述 本产品拟利用区块链的去中心化、数据不可篡改,数据隐私保密,全程留痕等特性,实现链上的数据资源共享平台,解决目前中心化资源管理平台存在的隐私泄露,数据权属不明,数据资源在权利第三方监管机构下流通的易被篡改删除和抓取等问题。 本产品对于数据资源在链上的表示采用区块结构,通过时间戳、数字签名对资源进行唯一标识,将标识后的资源再进行上链分享,在链上有完整的交易体系,不必担心数据会中途丢失或被恶意抓取和篡改。对于交易双方之间,构建了可信的共享通道,利用区块链的节点标识来唯一确定买卖双方,采用智能合约开发了一套请求与服务的交易系统,每当交易产生,发送到合约地址的请求会被迅速执行,并产出新的区块保存在链上,这样就规避了交易信息会被篡改的风险。当合约收到请求,会对请求方做出响应进行身份验证,为真的访问者成功得到链上的数据,并可以利用数据所有者提供的解密公钥进行数据解密。去除第三方介入,保证其去中心化交易。 1. 产品用途 本项目是基于区块链构建的资源共享平台,提供给用户进行链上分享数据资源,不受第三方机构监管,数据权属仅为用户本身,可以连接到全世界任意节点的环境。 2. 产品项目方案 * 智能合约实现自动化数据共享 通过对上链数据进行编号、状态、类型、详情等属性的标识,来实现给用户导航到具体数据。通过用户地址与数据仓库的映射实现每个数据都权属于唯一的数据拥有者。通过时间戳、区块号等区块链独有的特性实现数据资源不可篡改,一旦上链会被永久公开透明地存储在区块链上。通过买方用户账户地址向合约发送查询请求,进行身份验证再操作具体数据来实现资源安全可靠的交易。通过合约对于买卖双方账户余额的监控实现交易额度不会出现差错。 * IPFS实现精准数据查询 通过IPFS星际文件系统来访问用户存储在区块链上的数据资源,利用其单一的bittorrent群集、分布式、从内容产生地址、支持高吞吐、不存在单独故障点等优质特性作为区块链上资源的存储源,使得本项目在性能方面更快更安全。通过前端界面读取IPFS数据展示产品详情,给用户通过资源详情。 * 平台部署于以太坊区块链 通过以太坊官方提供的geth客户端,进行ganache测试通过后,将本项目部署于以太坊官方的ropsten链上,保证了本平台的永久可用性。通过truffle项目作为构建工具,利用webpack管理包进行去中心化应用DApp的前后端开发,执行方便,可利用自动化部署脚本直接将项目作为新的区块打包上链,本DApp拟设计托管于免费的infura区块链服务器,可通过https://ropsten.infura.io/API_kEY 永久访问。 * 资源交易过程的设计 基于以太坊区块链的资源实现交易,用户A通过在平台选择产品,查询详情信息,确认交易后,会由当前浏览器连接到wbe3对象的currentProvider,即用户A的以太坊账户发起请求执行合约代码的交易消息,若同一时间请求地址多,合约收到后会并发执行,确保不会产生未交易消息,出现unconfirm状态。合约代码执行无误后,会将用户A请求的资源权属地址返回给当前web3,即用户A账户地址,若资源缺失或已被其他用户交易,合约会在确保判断无误后自动将用户A提交的请求ETH值返还到用户A账户,不会有资金安全问题出现。若交易成功,用户A成功拿到资源的IPFS哈希值,可以自由拿取,提供的ETH值也会打入到资源权属者账户,没有第三方机构介入,安全可靠,数据隐私也得到绝对保证。 3. 目标用户 物联网领域、数据共享领域研究的学生老师和工作者,从事区块链开发或研究的开发者和高校的学生老师 4. 系统架构 ![输入图片说明](image1.png) 5. 功能特性 * 便捷透明交易 * 数据安全、权属唯一 * 性能优秀、支持并发 * 平台开放接口易扩展 * 上链数据永久存储 * 区块节点遍布全世界 * 去中心化、无第三方垄断 * 开放、共享 二、产品部署 1.区块链环境部署 本项目运行在以太坊ropsten链上,使用geth客户端完成区块链环境搭建 使用npm install geth —save-dev来安装以太坊的geth客户端 使用npm install ganache-cli 安装testrpc测试节点 推荐配置参数: 项目 参数 CPU Intel i5/AMD ryzen 5及以上 内存 8GB以上 磁盘 30GB以上\[用于以fast方式同步ropsten\] 网络 4*千兆网口 geth版本控制在1.8.0-stable及以上,版本过高或低于1.8.0会导致ropsten链同步失败,无法读取ropsten链的节点数据.  geth 参数命令: geth —datadir \[同步ropsten的目录\] —ropsten —rpc —rpcport 8545 —rpccorsdomain “*”—rpcapi db,admin,personal,miner,net,web3,eth --datadir: 指定区块链要同步的目录,将ropsten链中的数据同步到指定目录 --rpc: 指定本地区块链节点运行在rpc默认端口 --rpcport:指定运行的本地端口,默认是8545端口,可以自行修改 --rpccorsdomain:指定跨域访问请求的权限,*代表允许所有类型的跨域访问,默认是不允许,在ftp/http/https等协议连接到该区块链,则必须允许corsdomain配置 --rpcapi:指定公开给开发平台或前端的接口,默认只公开eth,web3,db和net 2.node服务器部署 \[1\] 下载并配置node环境,下载完成后将node\_global加入到path变量中,便于进行全局使用;node版本控制在10以上,npm版本控制在6.0以上,推荐配置:node\_v16.13.2, npm_v8.1.2 \[2\] 在sharePlatform目录下执行: npm install —save-dev,将truffle,webpack安装到node开发环境; \[3\] 在design/webpack/app目录中:npm install --save-dev,将一些依赖包安装到开发环境; \[4\] 对design目录中的truffle-config.js进行配置,改为自己的本地区块链环境(可以使用已同步的ropsten或者ganache,启一个本地私链); \[5\] 对app目录下的webpack-config.js进行配置,将devServer属性修改成自己的开发环境,devServer也可以使用默认 3.ipfs系统部署 推荐使用go-ipfs0.8.0,windows端下载后解压缩,在ipfs、go-ipfs/运行command: \[1\] ipfs.exe init做ipfs本地节点的构建 \[2\] ipfs.exe config edit ,对ipfs的配置文件进行修改,增加cors属性,允许跨域访问,一些端口也可以自行配置 \[3\] ipfs.exe init会得到: ipfs cat ipfs/哈希/readme,运行上述的ipfs cat ipfs/哈希/readme, 看到客户端界面,即安装成功 \[4\] ipfs.exe daemon打开本地ipfs节点,成功开启会提示daemon is ready,默认在本地localhost:5001/webui可以看到ipfs的本地客户端ui,可以上传文件以及下载文件,在项目中会用到该ipfs的本地ui来获取资源哈希从而拿到卖方在区块链上共享的资源 4.mongodb/expressJS/nodeMon部署 \[1\] 在app中的package.json中额外写入: "devDependencies": {   ...   ...   "ethereumjs-util": "5.1.2",   "mongoose": "4.11.7" } 保存后,在app目录运行: npm install \[2\] 在design目录下的package.json中写入: "devDependencies": {   ...   ...   "express": "4.15.4",   "nodemon": "^1.11.0" } 保存后,在design目录运行: npm install即可 \[3\] 在app目录中,运行 $ node_modules/.bin/nodemon server.js,启动nodemon服务 以上就是部署本项目的全部工作,部署完毕后就可以访问localhost:8080/,进入DataResource SharePlatform,进行平台使用,无需注册,只需要开启本地metamask钱包,拥有以太坊账户,即可使用自己的ropsten链中的ETH来进行数据资源的交易。 三、产品使用 1. 开启本地区块链节点 在geth安装目录运行:geth  --ropsten --datadir .\\dataRemix\ --rpc --rpcport 8545 --rpcapi db,admin,net,web3,eth,personal,miner --rpccorsdomain "*" —dev console 会得到以下界面,表示本地以太坊节点已开启,已连接到以太坊ropsten网络 ![输入图片说明](image2.png) 在geth控制端中使用personal.newAccount()生成一个以太坊账户,获取到账户哈希值,可用来测试转账或添加到metamask钱包中,作为您的账户;在交易之前需要解锁账户,使用personal.unlockAccount(账户哈希),输入密码解锁即可 在metamask中按照提示添加用户即可,添加成功会有如下界面: ![输入图片说明](image3.png) 2. 启动IPFS服务 在go-ipfs目录下使用:ipfs config show,查看当前ipfs跨域配置,出现如下界面即代表允许访问: ![输入图片说明](image4.png) 若API中的“HTTPHeaders”字段中没有上图的属性值,需要自行配置: ****①**** ****ipfs config  —json API.HTTPHeaders.********Access-Control-Allow-********Metho********ds**** ****=>**** ****"\[\\"PUT\\",\\"GET\\",\\"POST\\",\\"OPTIONS\\"\]"**** ****② ipfs config**** ****--json API.HTTPHeaders.Access-Control-Allow-Origin "\[\\"*\\"\]"**** ****③ ipfs config**** ****--json API.HTTPHeaders.Access-Control-Allow-Credentials "\[\\"true\\"\]"**** ****④ ipfs config**** ****--json API.HTTPHeaders.Access-Control-Allow-Headers "\[\\"Authorization\\"\]"**** ****⑤ ipfs config**** ****--json API.HTTPHeaders.Access-Control-Allow-Expose-Headers "\[\\"Location\\"\]"**** 同样的,在该目录下执行ipfs init,进行本地ipfs节点构建,init成功出现如下界面: ![输入图片说明](image5.png) 开启本地IPFS服务,运行ipfs daemon即可【可以使用ipfs config edit对ipfs监听的端口【一般只需修改gateway server】进行配置,因为8080会容易引起端口冲突,建议修改为下图中的9001,使用该端口作为默认pid的服务较少】 ipfs 本地服务开启成功后,默认打开localhost:5001/webui,会看到如下ui界面,可以利用从平台得到的资源哈希值cid访问全球所有节点存放在ipfs上的数据资源: ![输入图片说明](image6.png) 3.启动truffle部署,将项目部署在本地节点区块链,出现如下即代表合约部署成功 truffle migrate ![输入图片说明](image7.png) 4.利用自动化脚本从远程填充资源链接到本地区块链,返回多个区块信息即代表填充成功 truffle exec seed.js 5.在app目录下运行npm run dev,开启webpack服务。开启成功在localhost:8080可访问到本项目前端【演示图片】: 点击资源可查看详情以及价格: 点击list-item按钮,可以将本地资源上传到区块链,并得到ipfs哈希值,供交易: ![输入图片说明](image.png) 点击上传后,metamask会开启支付窗口,将本账户到合约账户的资源上传交易将交易花费gas展示在屏幕上 出现如下界面,在metamask中查看活动,是否有新的确认交易,产生了代表资源上传成功: ![输入图片说明](image8.png) 在本地geth端输入刚才的交易哈希,查看是否存在: from: 本地的账户地址 to:合约地址 input:就是刚刚的资源经过区块链加密后生成的哈希数据 出现以下信息代表交易成功别的用户即可在本平台访问到刚提交的资源 6.进行资源购买,输入价格后,会发起交易,交易无论成功与否,都会进入到区块中: ![输入图片说明](image9.png) 7.资源交易后,会获取到ipfs的哈希,到ipfs获取具体数据即可: 第四行就是我们的资源在ipfs上的地址,拿到ipfs去获取即可: 如果是文字资源的话,可以在ipfs直接获取,利用ipfs cat 哈希值,例如: ipfs cat QmZJuCNfjktqyqZgx85QSsgY8MsPLjKRKL5EqxXD9g2V99 平台的部署使用就是以上流程,项目地址已经放到个人git仓库: https://gitee.com/hua-kaifeng/data-reource-share.git