《石油智链》

前言:这是第一次接触的关于区块链的项目,当时只是负责一小部分的任务,其他部分还是由学长学姐构建出来了的,后面这个项目交手给我后,我就对这个项目进行优化,部分整改,以及功能模块的扩展。

项目背景:

石油供应链:指从原油的开采、炼化、运输、存储、配送、直到销售到用户手中的整个供应流程。
传统石油供应链痛点:
1.各大企业间互相信任度低——传统的石油供应链,是一个多方参与的复杂结构,必然存在大量的交互和协作,互相信任成为一个难题。
2.传统业务方在获取数据后需要反复核对,容易出错且耗时耗力,效率很低。
3.整个供应链上的各参与主体难以准确了解石油流通的具体情况,导致某一批次交易,无法完全呈现给涉及该交易的各个主体
针对于这些痛点,所以当时自研的这个项目——基于区块链石油供应链管理平台。

 项目设计:

本作品系统架构分为了业务层、服务层、逻辑层、网络层以及存储层。业务层面向于用户;服务层为该系统技术基础,前端使用VUE框架来设计,后端使用Spring Boot框架以及结合Fabric-Java-SDK来设计;逻辑层为智能合约,后端通过Fabric-Java-SDK来调用智能合约,从而实现相应的业务逻辑;网络层负责数据的接收发送,以及区块链网络部署;存储层将数据保存在区块链中作为存证,并备份在MySql数据库中。架构图如图1所示。

图1 系统架构图


        本作品将系统分为三大功能模块:辅助模块、油品操作模块以及信息查询模块。辅助功能中登录和注册为涉及四种角色提供系统使用权限;该作品以油品操作模块为主要业务功能,实现对于油品申请、审核、运输、接收等功能;查询模块为用户提供数据展示功能。功能模块图如图2所示。

图2 系统模块说明图



        将传统的web项目与区块链技术相结合,使用的是区块链开源项目(Hyperledger Fabric)来构建区块链的网络,实现数据存取与运用,进一步体现区块链中数据不可篡改、数据更加透明、去中心化等特点。图3是该系统的算力节点网络拓扑图,图4是网络部署实图。

图3 网络拓扑图

 

图4 网络部署实图

 

备注:由于设备的限制,所以只能部署最简单的网络,而且是SOLO模式,后续会考虑把网络改成kafak模式

技术实现:

我就前后端的技术进行简单介绍,主要讲解以该项目为背景的智能合约开发。
前端
       前端主要使用的是VUE框架(听我前端开发的同学说,VUE的项目维护起来没有React项目方便),同时使用了Element-UI框架进行页面的样式优化,同时VUE中的路由功能让该项目更具“动态化”。
后端
       后端主要使用Spring Boot框架,其次使用Spring Security来进行用户身份核验;Redis的简单使用,进行数据的缓存;Mybatis技术,将该项目与数据库相连,进行信息的存取。后端使用的Fabric-Java-SDK,使得我们可以更方便地对区块链进行操作,也使区块链技术与web技术更好地结合。
区块链
我们使用的是Hyperledger Fabric开源项目,以GO为主要语言编写智能合约。
1.导入相应的包,可以结合Goland编译器进行代码编写。


2.在导入包以后,一般会编写一些宏定义,以及业务所涉及的结构体。然后是我们的初始化函数(必须)


3.Invoke函数,主要调用我们自己编写的智能合约中的业务逻辑方法。


在后面合约中具体逻辑的实现我就不一一阐述了,我将我对于合约中运用的一些方法和注意事项进行归纳总结:
一.   在fabric账本中存数据是以key-value 的形式来存的,通过JSON(是一种发送和接收结构化信息的标准化表示法),进行一些操作其中json.marshal(),一般是将一个结构体里的内容变成byte类型。
二.合约中一些语句的作用:
1.    SimpleChaincode的结构体定义是为了实现shim.Chaincode这个接口
2.    重要的是:必须包含三个函数:Init , query , invoke 
Init函数是用于任何的初始化
Query函数是为了查询在区块链上的信息
Invoke函数是对区块链上的信息的修改,删除,或者是更新
3.    shim.ChaincodeStubInterface 是 一个接口,可以提供一些fabric本身提供的一些方法。
4.    shim.Success和shim.Error是将正确的或者错误的信息返回给调用的Chaincode的客户端
5.    stub.PutState()该函数是用于将数据上传到fabric中去,它需要一个key值和一个byte类型的值,返回一个error.一般会用在对数据的初始化或者修改上
6.    Stub.GetState()该函数是利用key值将数据从fabric中取出,返回一个byte类型的值和error.一般用于查询时会用到。
7.    stub.GetFunctionAndParameters()该函数时在Invoke中将args数组中的一个关键字提取出来,剩下的继续为一个数组,通过该关键字来执行相应的函数。
8.    使用富查询(GetQueryResult()):
需要注意:传入的参数是一个string
格式为:queryString := fmt.Sprintf("{\"selector\":{\"user_point\":\"%d\"}}", UserPoint)
注: ①.selector是必须要有的
        ②.user_point是根据结构体中对应json的格式
        ③.{\"user_point\":\"%d\"}这部分的格式要跟json中格式一致,%d上有没有引号要注意观察

项目展示:

展示该项目的一些操作页面。

登录界面
首页
填写表单页面
审核页面
订单溯源界面

项目总结:

目前该系统还没有正式上线使用,不论后期是否投入真正的业务场景下使用,对于联盟区块链在供应链方面应用,都有一定的参考价值。同时自己会继续完善该项目的功能,同时增强该系统的安全性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值