FISCO BCOS——SmartDev-Contract——Traceability商品溯源合约案例分析
Traceability商品溯源合约案例分析
- 一、合约场景分析
- 二、基础合约介绍
- 1. 产品基础合约
- 2.产品封装合约
- 3.功能说明
- 4.接口说明
- 5.使用说明
- (1)Goods合约使用说明
- (2)Traceability合约使用说明
- 一、业务工厂合约介绍
- 1.功能说明
- 2.接口说明
- 3.使用说明
一、合约场景分析
产品溯源是将当前先进的物联网技术、自动控制技术、自动识别技术、互联网技术结合利用,通过专业的机器设备对单件产品赋予唯一的一维码或者二维码作为防伪身份证,实现“一物一码”,然后可对产品的生产、仓储、分销、物流运输、市场稽查、销售终端等各个环节采集数据并追踪,构成产品的生产、仓储、销售、流通和服务的一个全生命周期管理
源码贡献者:
github:dalaocu
源码分析者:
github:Blockchain_Key
源码链接:
https://github.com/WeBankBlockchain/SmartDev-Contract/tree/master/contracts/business_template/traceability
二、基础合约介绍
1. 产品基础合约
Goods.sol
:
pragma solidity ^0.4.25;
pragma experimental ABIEncoderV2;contract Goods{struct TraceData{address addr; //Operator addressint16 status; //goods statusuint timestamp; //Operator timestring remark; //Digested Data}uint64 _goodsId; int16 _status; //current statusTraceData[] _traceData;event newStatus( address addr, int16 status, uint timestamp, string remark);constructor(uint64 goodsId) public{_goodsId = goodsId;_traceData.push(TraceData({addr:tx.origin, status:0, timestamp:now, remark:"create"}));emit newStatus(tx.origin, 0, now, "create");}function changeStatus(int16 goodsStatus, string memory remark) public {_status = goodsStatus;_traceData.push(TraceData({addr:tx.origin, status:goodsStatus, timestamp:now, remark:remark}));emit newStatus(tx.origin, goodsStatus, now, remark);}function getStatus()public view returns(int16){return _status;}function getTraceInfo()public view returns(TraceData[] memory _data){return _traceData;}
}
2.产品封装合约
Traceability.sol
:
pragma solidity ^0.4.25;import "./Goods.sol";contract Traceability{struct GoodsData{Goods traceGoods;bool valid;}bytes32 _category;mapping(uint64=>GoodsData) private _goods;constructor(bytes32 goodsTp) public {_category = goodsTp;}event newGoodsEvent(uint64 goodsId);function createGoods(uint64 goodsId) public returns(Goods){require(!_goods[goodsId].valid, "is really exists");_goods[goodsId].valid = true;Goods traceGoods = new Goods(goodsId);emit newGoodsEvent(goodsId);_goods[goodsId].traceGoods = traceGoods;return traceGoods;}function changeGoodsStatus(uint64 goodsId, int16 goodsStatus, string memory remark) public{require(_goods[goodsId].valid, "not exists");_goods[goodsId].traceGoods.changeStatus(goodsStatus, remark);}function getStatus(uint64 goodsId)public view returns(int16){require(_goods[goodsId].valid, "not exists");return _goods[goodsId].traceGoods.getStatus();}function getGoods(uint64 goodsId)public view returns(Goods){require(_goods[goodsId].valid, "not exists");return _goods[goodsId].traceGoods;}
}
3.功能说明
本合约支持产品操作。包含产品的创建,获取,以及状态跟踪:
4.接口说明
提供了两个合约:Goods基合约,Traceability应用合约。
Goods合约:
- 部署创建合约:传入参数goodsId,类型uint64
getStatus()public view returns(int16)
: 获取当前产品的状态changeStatus(int16 goodsStatus, string memory remark)
: 改变当前状态。goodsStatus是改变状态的值,remark是作为当前状态的标记getTraceInfo()public view returns(TraceData[] memory _data)
:获取整个流程的状态以及详细信息(产品,状态,时间戳,状态标记)
5.使用说明
(1)Goods合约使用说明
- 部署创建合约
- 获取当前产品的状态
- 改变当前产品状态。
- 获取当前产品整个流程信息
(2)Traceability合约使用说明
- Traceability作为封装Goods的基合约,进一步抽象合约
- 由于没有对外bytes32数据接口,不支持单独使用
一、业务工厂合约介绍
TraceabilityFactory
:
pragma solidity ^0.4.25;import "./Traceability.sol";contract TraceabilityFactory{struct GoodsTrace{Traceability trace;bool valid;}mapping(bytes32=>GoodsTrace) private _goodsCategory;event newTraceEvent(bytes32 goodsGroup);//Create traceability commodity categoryfunction createTraceability(bytes32 goodsGroup)public returns(Traceability) {require(!_goodsCategory[goodsGroup].valid,"The trademark already exists" );Traceability category = new Traceability(goodsGroup);_goodsCategory[goodsGroup].valid = true;_goodsCategory[goodsGroup].trace = category;emit newTraceEvent(goodsGroup);return category;}function getTraceability(bytes32 goodsGroup)private view returns(Traceability) {require(_goodsCategory[goodsGroup].valid,"The trademark has not exists" );return _goodsCategory[goodsGroup].trace;}//Create traceability products function createTraceGoods(bytes32 goodsGroup, uint64 goodsId)public returns(Goods) {Traceability category = getTraceability(goodsGroup);return category.createGoods(goodsId);}//Change product statusfunction changeTraceGoods(bytes32 goodsGroup, uint64 goodsId, int16 goodsStatus, string memory remark)public{Traceability category = getTraceability(goodsGroup);category.changeGoodsStatus(goodsId, goodsStatus, remark);}//Query the current status of goodsfunction getStatus(bytes32 goodsGroup, uint64 goodsId)public view returns(int16){Traceability category = getTraceability(goodsGroup);return category.getStatus(goodsId);}//The whole process of querying goodsfunction getTraceInfo(bytes32 goodsGroup, uint64 goodsId)public view returns(Goods){Traceability category = getTraceability(goodsGroup);return category.getGoods(goodsId);}function getGoodsGroup(string memory name) public pure returns (bytes32) {return keccak256(abi.encode(name));}
}
1.功能说明
本合约支持产品操作。包含产品类hash的创建,产品溯源创建,产品示例的创建,改变状态追踪,获取当前状态,获取溯源产品地址
2.接口说明
TraceabilityFactory合约:
function getGoodsGroup(string memory name) public pure returns (bytes32)
:根据产品名创建产品组hash值,返回bytes32类型的goodsGroupcreateTraceability(bytes32 goodsGroup)public returns(Traceability)
:根据所属产品组的goodsGroup,创建并初始化溯源合约,返回Traceability合约createTraceGoods(bytes32 goodsGroup, uint64 goodsId)public returns(Goods)
:根据所属产品组的goodsGroup,以及当前产品ID,创建并初始化本产品,返回产品地址getStatus(bytes32 goodsGroup, uint64 goodsId)public view returns(int16)
:根据所属产品组的goodsGroup,以及当前产品ID,获取当前产品的状态getTraceInfo(bytes32 goodsGroup, uint64 goodsId)public view returns(Goods)
:根据所属产品组的goodsGroup,以及当前产品ID,获取当前产品的地址changeTraceGoods(bytes32 goodsGroup, uint64 goodsId, int16 goodsStatus, string memory remark)
:根据所属产品组的goodsGroup,以及当前产品ID,更改产品的状态,和当前标志getStatus(bytes32 goodsGroup, uint64 goodsId)public view returns(int16)
:再次查看当前状态
3.使用说明
产品类hash的创建
产品溯源创建
产品示例的创建
获取当前状态
改变状态追踪
查看改变后的状态
获取溯源产品地址
拿到产品地址,返回Goods合约,查看溯源全流程
FISCO BCOS——SmartDev-Contract——Traceability商品溯源合约案例分析相关推荐
- FISCO BCOS——SmartDev-Contract——MarriageEvidence结婚证书合约案例分析
MarriageEvidence结婚证书合约案例分析 一.合约场景分析 二丶基础合约介绍 1. 角色合约 (1)功能说明 (2)接口说明 (3)使用说明 2. 存证合约 (1)功能说明 (2)接口说明 ...
- FISCO BCOS Transaction execution error交易事务合约执行失败原因
error|2022-06-21 19:31:31.351916|[g:1][EXECUTIVE][TxExeError]Transaction execution error,Transaction ...
- API的常识与对接,商品详情数据案例分析
原则上API接口设计一般出现在开发的详细设计中,但是随着诸多公司建立开放平台,产品经理也逐渐需要能理解API接口,尤其是做平台性的产品,还要学会定义接口.本文就关于产品经理在设计接口中需要定义什么.需 ...
- Fisco-Bcos智能合约开发案例----商品溯源
商品溯源合约概念 合约设计 合约间的关系 1个商品种类---->n个商品,同时还可以创建多个商品种类(工厂合约的作用) 编写商品合约 pragma solidity^0.8.7;contract ...
- fisco bcos用caliper0.2.0进行压力测试的安装配置
一.前期环境 1. 硬件 需要外网权限 2. 操作系统 版本要求:Ubuntu >= 16.04, CentOS >= 7, MacOS >= 10.14 3. 基础软件 pytho ...
- FISCO BCOS
一.wsl(windows子系统)安装步骤 wsl(windows子系统)简要介绍和安装步骤_Once_day的博客-CSDN博客_wsl 1.自动安装命令 管理员身份打开CMD,输入wsl --in ...
- spring boot 实现fisco bcos最基础案例
spring boot 实现fisco bcos最基础案例 一.基于国密搭建的4个节点联盟链 1.1 依赖文件 1.2 config.toml配置文件 1.3 用工具编译Helloworld.sol生 ...
- FISCO BCOS 2.0发布:新增群组架构克服吞吐瓶颈
今日,FISCO BCOS开源社区正式对外发布FISCO BCOS的2.0版,该版本在可扩展性.性能.易用性.隐私隔离等方面均取得突破性进展,其新增的群组架构方案,可以让企业间像拉微信群一样快速组链, ...
- Fabric、FISCO BCOS、以太坊对比
Fabric.FISCO BCOS.以太坊对比 一.以太坊 1.1 什么是工作量证明(POW) 1.2 这是如何运作的? 1.3 工作量证明的问题 1.4 股权证明 二.Fabric 2.1 产生背景 ...
最新文章
- android 单选框 icon,Android中的普通对话框、单选对话框、多选对话框、带Icon的对话框、以及自定义Adapter和自定义View对话框详解...
- 内核启动流程分析(四)源码浅析
- python:将json数据写入到excel
- 无限遍历,Python实现在多维嵌套字典、列表、元组的JSON中获取数据
- 蚂蚁集团万级规模 k8s 集群 etcd 高可用建设之路
- Java验证(javafx)
- LeetCode MySQL 1435. 制作会话柱状图
- Windows XP远程桌面控制图文教程
- rhel6+apache2.4+mysql5.7+php5.6部署LAMP架构
- JAVA项目实战开发电商项目案例(一)java技术演进与更新
- Cadence PSpice 仿真4:共射极运放静态工作点仿真图文教程
- Oracle 多行显示在一行详解(listagg)
- 鸿蒙系统屏幕录制,全屏幕录制可以隐藏选项窗口么
- JavaScript完整版国家-省-市地区,级联效果(带效果图哦)
- python全角数字_python 半角全角的相互转换
- 差之毫厘谬之千里!带你认识CPU后缀含义
- 24核48线虚拟化服务器,24核48线程的威力:戴尔PowerEdge R910服务器评测
- 自己写的小型静态服务器
- Springboot: Tomcat很好我选Undertow
- 基于Python的去雾人脸识别算法