草庐IT

基于hyperleger fabric区块链的校园化妆品交易平台搭建

星川皆无恙 2023-04-03 原文

基于hyperleger fabric区块链的校园化妆品交易平台搭建

一、大数据与区块链解决方案概述
选题背景:
目前不少同学在校园里进行二手交易没有一个大众认可的平台,很多都是私下交易,但会存在很多虚假交易,甚至出现诈骗事件,没有一个让校园同学认可放心的二手化妆品交易平台,基于这个交易问题,我们将校园二手化妆品交易与区块链技术结合来处理交易存在的问题,给校园内学生提供提供一个安全、公开、方便、美观的交易平台,让学生在校园交易的放心,买得放心,用的安心。不但可以交易平台的资产也可以添加我的售卖,自己成为卖家。

采用区块链技术架构的优点:
区块链采用了分布式核算和存储,不存在中心化的硬件或管理机构,因此使得任意节点的权利和义务都是均等的。区块链的系统的一个开放性质的,除了交易各方的私有信息被加密外,区块链的数据对所有人公开的。在区块链中,任何人为的干预都是不起作用的,将对“人”的信任改成了对机器的信任。使得整个系统中的所有节点能够在去信任的环境自由安全的交换数据。在区块链中一旦信息经过验证并添加至区块就会永久的存储起来无法进行修改。
区块链作为当下被推崇的一门技术主要优点为分布式记账、全流程记录、不可篡改性和加密技术。在区块链中都必须遵循同一记账交易规则,基于密码的算法同时每笔交易需要网络内其他用户的批准,核心分布式去中心化。区块链不可篡改和加密安全性采取了单向哈希算法,时间的不可逆性导致任何试图入侵篡改区块链内数据信息的行为都很容易被追溯,提高了对应的安全性。

二、应用场景需求分析

应用场景分析:
基于目前不少同学在校园里进行二手交易没有一个大众认可的平台,很多都是私下交易,但会存在很多虚假交易,甚至出现相关二手化妆品交易诈骗事件,目前没有一个让校园同学认可放心的二手化妆品交易平台,基于这个交易问题,我们将校园二手化妆品交易与区块链技术结合来处理交易存在的问题,给校园内学生提供提供一个安全、公开、方便、美观的交易平台,让学生在校园交易的放心,买得放心,用的安心。不但可以交易平台的资产也可以添加我的售卖,自己成为卖家。

需求分析
在校园内搭建一个基于Fabirc区块链的化妆品二手交易平台,学生以学院为单位(=>Org=>peer节点)加盟该平台;学生使用客户端连接本组织的peer节点参与交易。可以售卖化妆品、也可以购买化妆品;阅读过管理员平台公告后进入登录页面,学生通过学号认证后通过登录,学生在个人中心可以查看所有可交易的化妆品也可以查看自己的交易情况是否已经完成,也可以注册平台个人账号进行商品评论和交流查看个人信息,不但可以交易平台的资产也可以添加我的售卖,自己成为卖家;用户可以根据自己的需求选择不同的化妆品类型比如口红、香水、面部护理等。查看化妆品详情,收藏化妆品、加入购物车完成资产交易,退出的时候直接注销用户清除个人登陆记录保护用户隐私。这样校园内学生交易大大提高了安全性和大众的认可,满足了很多学生的交易需求。

用户需求分析和用户组织结构设计:

三、平台功能设计及功能结构设计图





四、数据存储结构设计与链码开发

1、数据存储结构
交易资产以资产键值对(Key-Value)的方式存储:

  Key:id
       value {
            brand: '化妆品品牌名称',
            type: '化妆品类型',
            price: '$化妆品价格',
            owner: '拥有者',
            describe:'化妆品介绍',
        },


2、链码开发与实现

启动startFabric.sh javascript脚本启动网络并部署链码:

功能一:调用智能合约初始化自定义链码:

peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n fabmakeup --peerAddresses localhost:7051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"function":"initLedger","Args":[]}'

功能二:通过调用智能合约初始化查询特定键值的资产:

peer chaincode query -C mychannel -n fabmakeup -c '{"function":"queryMakeup","Args":["MAKEUP1"]}'

功能三:通过调用智能合约初始化查询特定键值范围的资产:

peer chaincode query -C mychannel -n fabmakeup -c '{"function":"queryMakeupsByRange","Args":["MAKEUP3",""]}'

功能四:通过调用智能合约新增资产:

peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n fabmakeup --peerAddresses localhost:7051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"function":"createMakeup","Args":["MAKEUP14","迪奥","香水","450","Lala","美白保湿"]}'


功能五:通过调用智能合约修改资产属性:

peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n fabmakeup --peerAddresses localhost:7051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"function":"updateMakeup","Args":["MAKEUP1","迪奥","香水","$820","gala","女士香水 魅惑清新淡香氛50ml 清新甜韵"]}'


功能六:通过调用智能合约删除指定资产:

peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n fabmakeup --peerAddresses localhost:7051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"function":"deleteMakeup","Args":["MAKEUP14"]}

功能七:通过调用智能合约实现资产交易:

peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n fabmakeup --peerAddresses localhost:7051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"function":"changeMakeupOwner","Args":["MAKEUP3","Lisksk"]}'

功能八:调用链码实现更新资产信息 :

peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n fabmakeup --peerAddresses localhost:7051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"function":"updateMakeup","Args":["MAKEUP1","迪奥","香水","$820","gala","女士香水 魅惑清新淡香氛50ml 清新甜韵"]}'

功能九:判断资产是否存在:

peer chaincode query -C mychannel -n fabmakeup -c '{"function":"makeupExists","Args":["MAKEUP1"]}'

四、应用程序前端开发

在站长素材-分享综合设计素材的平台 (chinaz.com)找到项目合适的前端网页模板,然后修改数据和更改网页部分样式,最后通过前后端链接实现资产交易。客户端的主要作用是与Fabric区块链交互,实现对区块链的操作。区块链操作分为管理类和链码类的两种,管理类操作包括启停节点和配置网络等;链码类操作主要是链码的生命周期管理,如安装、实例化以及调用链码。最常用的客户端是命令行客户端(CLI),此外是使用Fabric SDK开发的应用客户端。
开发者创建客户端应用和智能合约( chaincode ), Chaincode 被部署到区块链网络的 Peer 节点上面。通过 chaincode 来操作账本,当你调用一个交易 transaction 时,你实际上是在调用 Chaincode 中的一个函数方法,它实现业务逻辑,并对账本进行 get , put , delete 操作。客户端应用提供用户交互界面,并提交交易到区块链网络上。
前端页面以用户体验效果为主,主页化妆品里面有化妆品分类、热销推荐、折扣推荐、化妆品详情、化妆品资讯,也可以进入我的个人主页查看个人订单和交易情况等。尽可能满足用户交易各方面需求,一些折扣和热销推荐也方便用户做出交易决策。用户挑好自己合适喜欢的就可以放进购物车进行资产交易。每个化妆品分类页面又有各种不同的产品热销和折扣供用户挑选,

源主页面及其文件:


修改源码和完善后的主页面和文件:

使用pycharm对前端网页模板源码进行修改:
通过元素对应的源码进行更改删除或添加相关标签,完善页面布局和整体效果。

页面一:主页面及其商品分类和商品推荐:
化妆品分类有:健康护理、皮肤护理、口红、面部护理、香水、自然护理。

对应路由: /index
页面二
显示化妆品所有资产信息

对应路由:

else if(url_path == '/list'){
                query().then(async function(contract){
                const result = await contract.evaluateTransaction('queryAllMakeups');
                const result_json = JSON.parse(result);
                //response.end('Transaction has been evaluated, result is: ' + result.toString());
                const view = path.resolve(__dirname, 'views', 'list.html');
                list1 = template(view, {
                data:result_json
            });
                response.end(list1);
            });


页面三:进行化妆品资产交易

对应路由:

对应路由:

else if(request.url == '/modify'){
            let formData = '';
            //接收post参数
            request.on('data',function(param){
                formData += param;
            });
            //post参数接收完毕
            request.on('end',function(){
                console.log(formData);
                const params = new URLSearchParams(formData);
                query().then(async function(contract){
                    await contract.submitTransaction('updateMakeup', params.get('id'), params.get('brand'), params.get('type'), params.get('price'), params.get('owner'),params.get('describe'));
                    //301代表重定向 
                    response.writeHead(301,{
                        Location: '/list'
                    });
                    response.end();
                });
            });
else if(url_path == '/modify'){
                query().then(async function(contract){
                    const result = await contract.evaluateTransaction('queryMakeup',params.get('id'));
                    const result_json = JSON.parse(result);

页面四:添加交易化妆品资产
用户可以看到自己售卖化妆品的交易订单,也可以继续添加自己售卖的化妆品资产,在平台进行交易。



对应路由:

 if(request.method == 'POST'){
        if(request.url == '/add'){
            let formData = '';
            //接收post参数
            request.on('data',function(param){
                formData += param;
            });
            //post参数接收完毕
            request.on('end',function(){
                console.log(formData);
                const params = new URLSearchParams(formData);
                query().then(async function(contract){
                    await contract.submitTransaction('createMakeup', params.get('id'), params.get('brand'), params.get('type'), params.get('price'), params.get('owner'),params.get('describe'));
                    //301代表重定向 
                    response.writeHead(301,{
                        Location: '/list'
                    });
                    response.end();
                });
            });


页面五:删除交易化妆品资产(选择所需要删除的化妆品资产)

对应路由:

else if(url_path == '/remove'){
                query().then(async function(contract){
                    await contract.submitTransaction('deleteMakeup',params.get('id'));
                    response.writeHead(301,{
                      Location: '/list'
                    });
                    response.end();
                });

六、应用程序服务端开发(注:对于分工内容,需详细描述设计思路和实现细节,非分工内容,只需截图)
1、路由一
Get:通过params参数获取,

  query().then(async function(contract){
            await contract.submitTransaction('createMakeup', params.get('id'), params.get('brand'), params.get('type'), params.get('price'), params.get('owner'),params.get('describe'));
            //301代表重定向 
            response.writeHead(301,{
                Location: '/list'
            });
            response.end();
        });

Post:

  if(request.method == 'POST'){
    if(request.url == '/add'){
            let formData = '';
            //接收post参数
            request.on('data',function(param){
                formData += param;
            });
            //post参数接收完毕
            request.on('end',function(){
                console.log(formData);
                const params = new URLSearchParams(formData);

2、路由二

Get:
else if(url_path == '/modify'){
                query().then(async function(contract){
                    const result = await contract.evaluateTransaction('queryMakeup',params.get('id'));
                    const result_json = JSON.parse(result);

Post:

  let formData = '';
    //接收post参数
    request.on('data',function(param){
        formData += param;
    });
    //post参数接收完毕
    request.on('end',function(){
        console.log(formData);
        const params = new URLSearchParams(formData);
        query().then(async function(contract){
            await contract.submitTransaction('updateMakeup', params.get('id'), params.get('brand'), params.get('type'), params.get('price'), params.get('owner'),params.get('describe'));
            //301代表重定向 
            response.writeHead(301,{
                Location: '/list'
            });
            response.end();
        });
    });

Get:

else if(url_path == '/remove'){
                query().then(async function(contract){
                    await contract.submitTransaction('deleteMakeup',params.get('id'));
                    response.writeHead(301,{
                      Location: '/list'
                    });
                    response.end();
                });

Post:

   let formData = '';
    //接收post参数
    request.on('data',function(param){
        formData += param;
    });
    //post参数接收完毕
    request.on('end',function(){
        console.log(formData);
        const params = new URLSearchParams(formData);
        query().then(async function(contract){
            await contract.submitTransaction('updateMakeup', params.get('id'), params.get('brand'), params.get('type'), params.get('price'), params.get('owner'),params.get('describe'));
            //301代表重定向 
            response.writeHead(301,{
                Location: '/list'
            });
            response.end();
        });
    });

七、应用程序扩展

八、应用程序整体展示

仔细看平台公告后然后进入用户认证:

通过学号进行用户认证:

进入认证成功后登录主页:

通过商品分类选择自己想要的产品:



也可以注册和登录自己的私人账户:


选择合适的化妆品加入购物车进行交易:

也可以查看我的订单和所有可交易的化妆品资产:

关于化妆品品牌排行榜:

查看相关资讯:

也可以在评论区进行交流查看化妆品评价:

有问题和疑问可以向平台进行反馈:

应用平台流程图:

这里大家如果有需要可以私信我要更多关于本项目的文档和源码内容,也有做好项目导出的虚拟机文件(介意有偿勿入)。

OK。这里小马跟大家分享的基于hyperleger fabric的校园化妆品交易平台搭建到此结束了,希望大家可以参考得到一些思路设计新的项目,有机会我也会跟大家分享其它区块链项目和关于长安链的一些知识。

实践是提高自己的最快方法,希望大家多实践多总结,思路理清了后面都好做。祝愿大家一切顺利!

很喜欢村上春树的一句:“尽管眼下十分艰难 可日后这段经历说不定就会开花结果。”这句话送给所有考研的人

花会沿途盛开 以后的路也是。我们终将上岸,阳光万里。

有关基于hyperleger fabric区块链的校园化妆品交易平台搭建的更多相关文章

  1. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  2. 区块链之加解密算法&数字证书 - 2

    目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非

  3. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  4. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  5. ruby-on-rails - (Ruby,Rails) 基于角色的身份验证和用户管理...? - 2

    我正在寻找用于Rails的优质管理插件。似乎大多数现有的插件/gem(例如“restful_authentication”、“acts_as_authenticated”)都围绕着self注册等展开。但是,我正在寻找一种功能齐全的基于管理/管理角色的解决方案——但不是简单地附加到另一个非基于角色的解决方案。如果我找不到,我想我会自己动手......只是不想重新发明轮子。 最佳答案 RyanBates最近做了两个关于授权的railscast(注意身份验证和授权之间的区别;身份验证检查用户是否如她所说的那样,授权检查用户是否有权访问资源

  6. ruby - 在 Rakefile 中动态生成 Rake 测试任务(基于现有的测试文件) - 2

    我正在根据Rakefile中的现有测试文件动态生成测试任务。假设您有各种以模式命名的单元测试文件test_.rb.所以我正在做的是创建一个以“测试”命名空间内的文件名命名的任务。使用下面的代码,我可以用raketest:调用所有测试require'rake/testtask'task:default=>'test:all'namespace:testdodesc"Runalltests"Rake::TestTask.new(:all)do|t|t.test_files=FileList['test_*.rb']endFileList['test_*.rb'].eachdo|task|n

  7. ruby - 如何使用 Ruby 基于字母数字字符串生成颜色? - 2

    我想要像“嘿那里”这样的东西变成,例如,#316583。我希望将任意长度的字符串“归结”为十六进制颜色。我不知道从哪里开始。我在想,每个字符串的MD5散列都是不同的-但如何将该散列转换为十六进制颜色数字? 最佳答案 你可以只取几位前几位:require'digest/md5'color=Digest::MD5.hexdigest('Mytext')[0..5] 关于ruby-如何使用Ruby基于字母数字字符串生成颜色?,我们在StackOverflow上找到一个类似的问题:

  8. 区块链入门教程(6)--WeBASE-Front节点前置服务安装 - 2

    文章目录1.任务背景2.任务目标3.相关知识点4.任务实操4.1安装配置JDK4.2启动FISCOBCOS4.3下载解压WeBASE-Front4.4拷贝sdk证书文件4.5启动节点4.6访问节点4.7检查运行状态5.任务总结1.任务背景FISCOBCOS其实是有控制台管理工具,用来对区块链系统进行各种管理操作。但是对于初学者来说,还是可视化界面更友好,本节就来介绍WeBASE管理平台,这是一款微众银行开源的自研区块链中间件平台,可以降低区块链使用的门槛,大幅提高区块链应用的开发效率。微众银行是腾讯牵头设立的民营银行,在国内民营银行里还是比较出名的。微众银行参与FISCOBCOS生态建设,一定

  9. iNFTnews | 周杰伦18年前未发布的作品Demo,藏在了区块链技术里 - 2

    当音乐碰上区块链技术,会擦出怎样的火花?或许周杰伦已经给了我们答案。8月29日下午,B站独家首发周杰伦限定珍藏Demo独家访谈VCR,周杰伦在VCR里分享了《晴天》《青花瓷》《搁浅》《爱在西元前》四首经典歌曲Demo背后的创作故事,并首次公布18年前未发布的神秘作品《纽约地铁》的Demo。在VCR中,方文山和杰威尔音乐提及到“多亏了区块链技术,现在我们可以将这些Demos,变成独一无二具有收藏价值的艺术品,这些Demos可以在薄盒(国内数藏平台)上听到。”如何将音乐与区块链技术相结合,薄盒方面称:“薄盒作为区块链技术服务方,打破传统对于区块链技术只能作为数字收藏的理解。聚焦于区块链技术赋能,在

  10. 【自动驾驶环境感知项目】——基于Paddle3D的点云障碍物检测 - 2

    文章目录1.自动驾驶实战:基于Paddle3D的点云障碍物检测1.1环境信息1.2准备点云数据1.3安装Paddle3D1.4模型训练1.5模型评估1.6模型导出1.7模型部署效果附录show_lidar_pred_on_image.py1.自动驾驶实战:基于Paddle3D的点云障碍物检测项目地址——自动驾驶实战:基于Paddle3D的点云障碍物检测课程地址——自动驾驶感知系统揭秘1.1环境信息硬件信息CPU:2核AI加速卡:v100总显存:16GB总内存:16GB总硬盘:100GB环境配置Python:3.7.4框架信息框架版本:PaddlePaddle2.4.0(项目默认框架版本为2.3

随机推荐