Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

茶叶溯源项目 #60

Merged
merged 10 commits into from
Feb 23, 2022
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
pragma solidity >=0.4.22 <0.7.0;

import "./Roles.sol";

contract Device
{

using Roles for Roles.Role;

event DeviceAdded(address indexed account);
event DeviceRemoved(address indexed account);

Roles.Role private _devices;

constructor (address device) public
{
_addDevice(device);

}

modifier onlyDevice()
{

require(isDevice(msg.sender), "DeviceRole: caller does not have the device role");
_;
}

function isDevice(address account) public view returns (bool)
{
return _devices.has(account);
}

function addDevice(address account) public onlyDevice
{
_addDevice(account);
}

function renounceDevice() public
{
_removeDevice(msg.sender);
}

function _addDevice(address account) internal
{
_devices.add(account);
emit DeviceAdded(account);
}

function _removeDevice(address account) internal
{
_devices.remove(account);
emit DeviceRemoved(account);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
pragma solidity >=0.4.22 <0.7.0;
pragma experimental ABIEncoderV2;

contract DeviceInfoItem
{
uint[] _timestamp;
/*保存硬件设备上传数据时的时间戳*/
uint8[] _temp;
/*保存茶叶种植或仓储中各个阶段的温度信息*/
uint8[] _humi;
/*保存茶叶种植或仓储过程各个阶段湿度信息*/
uint16[] _lux;
/*保存茶叶种植或仓储过程各个阶段光照度信息*/
uint16[] _pa;
/*保存茶叶种植或仓储过程各个阶段大气压信息*/
uint8[] _alt;
/*保存茶叶种植或仓储过程各个阶段海拔信息*/


address _deviceAddress;
/*保存茶叶流转过程的硬件地址信息(和用户一一对应)*/

uint _createTimestamp;
/*保存设备创建时间*/
string _deviceName;
/*保存设备名称*/
uint8 _status;
/*保存硬件设备所负责的阶段*/
address _owner;

constructor (string deviceName,uint8 status ,address deviceAddress) public
{
_createTimestamp = now;
_deviceName = deviceName;
_deviceAddress = deviceAddress;
_status = status;
_owner = msg.sender;
}

function addDeviceInfo( uint8 temp, uint8 humi, uint16 lux, uint16 pa, uint8 alt,uint8 status) public returns(bool)
{
require(_status == status , "status error");
require(_owner == msg.sender, "only trace contract can invoke");
_timestamp.push(now);
_temp.push(temp);
_humi.push(humi);
_lux.push(lux);
_pa.push(pa);
_alt.push(alt);
return true;
}


function getDeviceInfo() public constant returns(uint,string,uint8,address)
{
return(_createTimestamp, _deviceName,_status,_deviceAddress);
}

function getDeviceTraceInfo() public constant returns(uint[] ,uint8[],uint8[],uint16[],uint16[], uint8[])
{
return(_timestamp, _temp,_humi,_lux,_pa,_alt);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
pragma solidity >=0.4.22 <0.7.0;

import "./Roles.sol";

contract Planter //种植环节
{
using Roles for Roles.Role;

event PlanterAdded(address indexed account);
event PlanterRemoved(address indexed account);

Roles.Role private _planters;

constructor (address planter) public
{
_addPlanter(planter);
}

modifier onlyPlanter()
{
require(isPlanter(msg.sender), "PlanterRole: caller does not have the Planter role");
_;
}

function isPlanter(address account) public view returns (bool)
{
return _planters.has(account);
}

function addPlanter(address account) public onlyPlanter
{
_addPlanter(account);
}

function renouncePlanter() public
{
_removePlanter(msg.sender);
}

function _addPlanter(address account) internal
{
_planters.add(account);
emit PlanterAdded(account);
}

function _removePlanter(address account) internal
{
_planters.remove(account);
emit PlanterRemoved(account);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
pragma solidity >=0.4.22 <0.7.0;

import "./Roles.sol";

contract Processor //加工环节
{
using Roles for Roles.Role;

event ProcessorAdded(address indexed account);
event ProcessorRemoved(address indexed account);

Roles.Role private _processors;

constructor (address Processor ) public
{
_addProcessor(Processor);
}

modifier onlyProcessor()
{
require(isProcessor(msg.sender), "ProcessorRole: caller does not have the Processor role");
_;
}

function isProcessor(address account) public view returns (bool)
{
return _processors.has(account);
}

function addProcessor(address account) public onlyProcessor
{
_addProcessor(account);
}

function renounceProcessor() public
{
_removeProcessor(msg.sender);
}

function _addProcessor(address account) internal
{
_processors.add(account);
emit ProcessorAdded(account);
}

function _removeProcessor(address account) internal
{
_processors.remove(account);
emit ProcessorRemoved(account);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
pragma solidity >=0.4.22 <0.7.0;

import "./Roles.sol";

contract Retailer //零售信息
{
using Roles for Roles.Role;

event RetailerAdded(address indexed account);
event RetailerRemoved(address indexed account);

Roles.Role private _retailers;

constructor (address retailer) internal
{
_addRetailer(retailer);
}

modifier onlyRetailer()
{
require(isRetailer(msg.sender), "RetailerRole: caller does not have the Retailer role");
_;
}

function isRetailer(address account) public view returns (bool)
{
return _retailers.has(account);
}

function addRetailer(address account) public onlyRetailer
{
_addRetailer(account);
}

function renounceRetailer() public
{
_removeRetailer(msg.sender);
}

function _addRetailer(address account) internal
{
_retailers.add(account);
emit RetailerAdded(account);
}

function _removeRetailer(address account) internal
{
_retailers.remove(account);
emit RetailerRemoved(account);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
pragma solidity >=0.4.22 <0.7.0;

library Roles
{
struct Role
{
mapping (address => bool) bearer;
}

function add(Role storage role, address account) internal
{
require(!has(role, account), "Roles: account already has role");
role.bearer[account] = true;
}

function remove(Role storage role, address account) internal
{
require(has(role, account), "Roles: account does not have role");
role.bearer[account] = false;
}

function has(Role storage role, address account) internal view returns (bool)
{
require(account != address(0), "Roles: account is the zero address");
return role.bearer[account];
}

}

Loading