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 address
int16 status; //goods status
uint timestamp; //Operator time
string remark; //Digested Data
}
uint64 _goodsId;
int16 _status; //current status
TraceData[] _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 category
function 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 status
function 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 goods
function getStatus(bytes32 goodsGroup, uint64 goodsId)public view returns(int16){
Traceability category = getTraceability(goodsGroup);
return category.getStatus(goodsId);
}
//The whole process of querying goods
function 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的創建


- 產品溯源創建

- 產品示例的創建

- 獲取當前狀態


- 獲取溯源產品地址


- 改變狀態追蹤

- 查看改變后的狀態


轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/394003.html
標籤:區塊鏈
