solidity智能合约实例开发(2)(解释+注释)——食品溯源

这篇具有很好参考价值的文章主要介绍了solidity智能合约实例开发(2)(解释+注释)——食品溯源。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

项目总要求

创建三个角色生产者,分销商,零售商,并分别通过三个角色对产品的生产,分销,零售上链,并且能够分别查出上链的全信息。包括每次交易的时间戳,每次交易的交易名称,每次交易的交易地址,每次交易的食品质量,食品的名称,当前交易的名称,当前交易的地址,当前交易的食品质量,当前交易的状态等等

运行环境:remix(0.8.13版本)

Roles.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

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

    //判断地址是否存在
    function has(Role storage role,address amount) internal  view returns (bool){
        require(amount != address(0));//判断地址不为空
        return role.bearer[amount];//返回一个布尔值
    }

    //添加角色
    function add(Role storage role,address amount) internal {
        require(!has(role, amount));
        role.bearer[amount] = true;
    }
    /**这个函数用于向特定角色添加成员。它接受一个 Role 结构体和一个地址作为参数。在函数内部,
    它首先调用 has 函数检查地址是否已经具有该角色,
    如果没有,则将地址添加到映射中,并将其值设置为 true,表示该地址拥有该角色。
    */

    //删除角色
    function remove(Role storage role,address amount) internal {
        require(has(role, amount));
        role.bearer[amount] = false;
    }

    /**
    这个函数用于从特定角色中移除成员。它接受一个 Role 结构体和一个地址作为参数。
    在函数内部,它首先调用 has 函数检查地址是否具有该角色,
    如果是,则将地址从映射中移除,并将其值设置为 false,表示该地址不再拥有该角色。
    */
}

Producer.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

import "./Roles.sol";


contract Producer{
    using Roles for Roles.Role;
    Roles.Role private _produce;



    event  producerAdded(address amount);
    event producerRemoved(address amount);

    constructor(address produce) public {
        _addProducer(produce);

    }

    function _addProducer(address amount) internal {
        _produce.add(amount);
        emit producerAdded(amount);
    }

    function _removeProducer(address amount) internal {
        _produce.remove(amount);
        emit producerRemoved(amount);
    }

    function isProducer(address amount ) public view returns (bool){
        return  _produce.has(amount);
    }

    modifier onlyProducer(){
        require(isProducer(msg.sender),"you are not deployer");
        _;
    }

    function addProducer(address amount) public onlyProducer{
        _addProducer(amount);
    }

    /**
    这个函数用于将调用者从生产商角色中移除。
    任何人都可以调用此函数来将自己从生产商角色中移除。它调用了 _removeProducer 函数来执行实际的移除操作。
    */
    function removeProducer() public  {
        _removeProducer(msg.sender);

    }
}

Distributor.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

import "./Roles.sol";

contract Distributor{
    using Roles for Roles.Role;
    Roles.Role private  _distributor;


    event distributorAdded(address amount);
    event distributorRemoved(address amount);

    constructor(address distributor){
        _addDistributor(distributor);
 
    }

    function _addDistributor(address amount) internal {
        _distributor.add(amount);
        emit  distributorAdded(amount);
    }

    function _removeDistributor(address amount) internal {
        _distributor.remove(amount);
        emit  distributorRemoved(amount);
    }

    function isDistributor(address amount) public view  returns (bool){
        return _distributor.has(amount);
    } 

    modifier onlyDistributor(){
        require(isDistributor(msg.sender),"you are not deployer");
        _;
    }

    function addDistributor(address amount) public  onlyDistributor{
        _addDistributor(amount);
    }

    function removeDistributor() public {
        _removeDistributor(msg.sender);
    } 
}

Retailer.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

import "./Roles.sol";

contract Retailer{
    using Roles for Roles.Role;
    Roles.Role private  _retailer;


    event retailerAdded(address amount);
    event retailerRemoved(address amount);

    constructor(address Retailer) {
        _addRetalier(Retailer);
 
    }
    function _addRetalier(address amount) internal {
        _retailer.add(amount);
        emit  retailerAdded(amount);
    }

    function _removeRetailer(address amount) internal {
        _retailer.remove(amount);
        emit  retailerRemoved(amount);
    }

    function isRetailer(address amount) public view  returns (bool){
        return _retailer.has(amount);
    }

    modifier onlyRetailer() {
        require(isRetailer(msg.sender),"you are not deployer");
        _;
    }

    function addRetailer(address amount) public  {
        _addRetalier(amount);
    }

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

FoodInfoItem.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

contract FoodInfoItem{
    uint256[] _timestamp;  //时间戳
    string[]  _traceName;  //交易名称
    address[] _traceAddress;  //交易地址
    uint8[] _traceQuality;  //交易食品名称
    string _name;  //食品名称
    string _currentName;  //当前交易名称
    address _currentAddress;  //当前交易地址
    uint8 _currentQuality;  //当前交易质量 0 优质 1  合格  2 不合格
    uint8 _status;  //当前交易状态 0 生产 1 分销 2 销售
    address owner;


    constructor(string memory name, string memory traceName, address traceAddress,uint8 quality) public {
        _timestamp.push(block.timestamp);
        _traceName.push(traceName);
        _traceAddress.push(traceAddress);
        _traceQuality.push(quality);
        _name = name;
        _currentName = traceName;
        _currentAddress = traceAddress;
        _currentQuality = quality;
        _status = 0;
        owner = msg.sender;
    } 

    function addFoodByDistributor(string memory traceName, address traceAddress,uint8 quality) public  returns(bool) {
        require(_status == 0 ,"this is not status 0");
        _timestamp.push(block.timestamp);
        _traceName.push(traceName);
        _traceAddress.push(traceAddress);
        _traceQuality.push(quality);
        _currentName = traceName;
        _currentAddress = traceAddress;
        _currentQuality = quality;
        _status = 1;
        return true;
    }

    function addFoodByRetailer(string memory traceName, address traceAddress,uint8 quality) public  returns(bool){
        require(_status == 1 ,"this is not status 0");
        _timestamp.push(block.timestamp);
        _traceName.push(traceName);
        _traceAddress.push(traceAddress);
        _traceQuality.push(quality);
        _currentName = traceName;
        _currentAddress = traceAddress;
        _currentQuality = quality;
        _status = 2;
        return true;
    }

    //返回食品的信息
    function getFoodInfo() public  view returns (uint256,string memory,string memory,uint8,address,uint8){
        return (block.timestamp,_name,_currentName,_currentQuality,_currentAddress,_status);
    }

    //返回新增食品的信息农场
    function getFoodInfoNew() public view returns (uint256,string memory,string memory,address,uint8){
        return (block.timestamp,_name,_traceName[0],_traceAddress[0],_traceQuality[0]);
    }

    //返回通过分销商的信息
    function getFoodInfoByDistributor() public view returns (uint256,string memory,string memory,string memory,address,uint8){
        return (block.timestamp,_name,_traceName[0],_traceName[1],_traceAddress[1], _traceQuality[1]);
    }

    //返回通过零售商的信息
    function getFoodInfoByRetailer() public view returns (uint256,string memory, string memory,string memory,string memory, address,uint8){
        return (_timestamp[0],_name,_traceName[0],_traceName[1],_traceName[2],_traceAddress[2],_traceQuality[2]);
    }

    function getFoodInfoByRoles() public view  returns (uint256,address[] memory,uint8[] memory){
        return (_timestamp[0],_traceAddress,_traceQuality);
    }

    function getFoodInfoByAll() public view returns (string memory,uint256,string memory,uint8,uint256,string memory,uint8,uint256,string memory,uint8){
        return (_name,_timestamp[0],_traceName[0],_traceQuality[0],_timestamp[1],_traceName[1],_traceQuality[1],_timestamp[2],_traceName[2],_traceQuality[2]);
    }
}

Trace.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

import "./Roles.sol";
import "./Producer.sol";
import "./Distributor.sol";
import "./Retailer.sol";
import "./FoodInfoItem.sol";

contract Trace is Producer,Distributor,Retailer{
    mapping (uint256 => address) foods;
    uint256[] foodlist;
    address public  owner;
    
    constructor(address producer,address distributor,address retailer) public Producer(producer) Distributor(distributor) Retailer(retailer){
        owner = msg.sender;
    }

    function newFood(uint256 traceNumber,string memory name,string memory traceName, uint8 quality) public onlyProducer returns (FoodInfoItem){
        require(foods[traceNumber]==address(0),"address is not exist");
        FoodInfoItem food = new FoodInfoItem(name,traceName,msg.sender,quality);
        foods[traceNumber] = address(food);
        foodlist.push(traceNumber);
        return food;
    }

    function addFoodByDistributor(uint256 traceNumber,string memory traceName,uint8 quality) public onlyDistributor returns (bool){
        require(foods[traceNumber] != address(0),"address is 0");
        return FoodInfoItem(foods[traceNumber]).addFoodByDistributor(traceName,msg.sender, quality);
    }

    function addFoodByRetailer(uint256 traceNumber, string memory traceName, uint8 quality) public  onlyRetailer returns (bool){
        require(foods[traceNumber] != address(0),"address is 0");
        return FoodInfoItem(foods[traceNumber]).addFoodByRetailer(traceName, msg.sender, quality);
    }

    //当前食品溯源
    function getFoodInfo(uint256 traceNumber) public view returns (uint256,string memory,string memory,uint8,address,uint8){
        return FoodInfoItem(foods[traceNumber]).getFoodInfo();
    }

    //农场溯源
    function getFoodInfoByNew(uint256 traceNumber) public view returns (uint256,string memory,string memory,address,uint8) {
        return FoodInfoItem(foods[traceNumber]).getFoodInfoNew();
    }

    //分销商溯源
    function getFoodInfoByDistributor(uint256 traceNumber) public view returns (uint256,string memory,string memory,string memory,address,uint8) {
        return FoodInfoItem(foods[traceNumber]).getFoodInfoByDistributor();
    }

    //零售商溯源
    function getFoodInfoRetailer(uint256 traceNumber) public view returns (uint256,string memory, string memory,string memory,string memory, address,uint8) {
        return FoodInfoItem(foods[traceNumber]).getFoodInfoByRetailer();
    }

    //三个阶段溯源
    function getFoodInfoByRoles(uint256 traceNumber) public view returns (uint256,address[] memory,uint8[] memory){
        return FoodInfoItem(foods[traceNumber]).getFoodInfoByRoles();
    }

    //消费者整体溯源
    function getFoodInfoByAll(uint256 traceNumber) public view returns (string memory,uint256,string memory,uint8,uint256,string memory,uint8,uint256,string memory,uint8) {
        return FoodInfoItem(foods[traceNumber]).getFoodInfoByAll();
    }

    //获取所有商品
    function getAllFood() public view returns (uint256[] memory){
        require(msg.sender == owner,"you are not deployer");
        return foodlist;
    }

}

编译部署最终结果

智能合约 溯源,智能合约solidity,智能合约,区块链

 智能合约 溯源,智能合约solidity,智能合约,区块链

有不懂的可以直接评论区留言,必回文章来源地址https://www.toymoban.com/news/detail-739081.html

到了这里,关于solidity智能合约实例开发(2)(解释+注释)——食品溯源的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • solidity开发智能合约

    起源于以太坊(Ethereum),设计的目的是能在以太坊虚拟机(EVM)上运行。Solidity 是一门面向合约的、为实现智能合约而创建的高级编程语言。所以先从智能合约开始。 参考文档 Solidity文档:区块链技术-智能合约Solidity编程语言 solidity官方文档: https://solidity-cn.readthedocs.io/

    2023年04月08日
    浏览(83)
  • Fisco-Bcos智能合约开发案例----商品溯源

    1个商品种类----》n个商品,同时还可以创建多个商品种类(工厂合约的作用) 1.部署工厂合约 2.创建商品种类 3. 创建对应的商品 4.查询商品种类 5. 查询商品状态 0–生产者,1—运输者,2—超市售卖者,3—消费者 6. 查询商品溯源信息 7.改变商品状态 8.查询商品溯源

    2024年02月11日
    浏览(47)
  • 区块链2——Solidity智能合约开发

    区块链 索引目录 智能合约是一种以代码形式编写的自动执行合约,它们运行在区块链上。这些合约定义了在特定条件下发生的事件以及相应的行为。 1.1 智能合约结构 版本声明(Version Declaration): 智能合约通常以声明版本开始,指定合约应该使用的Solidity编译器版本。例如

    2024年02月05日
    浏览(69)
  • Solidity智能合约开发 — 3.2-合约的fallback和函数重载

    每个智能合约有且仅有一个未命名的函数,称为fallback函数,没有参数且没有返回值,可见性必须是 external,且可以是 virtual的(即可以被重载),也可以有修改器 modifier。 fallback执行条件: 如果在一个合约的调用中,没有其他函数与给定的函数标识符匹配时(或没有提供调用

    2024年02月09日
    浏览(62)
  • 以太坊智能合约开发:Solidity 语言快速入门

    在本文中,我们从一个简单的智能合约样例出发,通过对智能合约源文件结构的剖析与介绍,使大家对Solidity语言有一个初步的认识。最后,我们将该智能合约样例在 Remix 合约编译器中编译、部署,观察其执行结果。 在开始之前,我们先对Solidity有个初步的了解,即Solidity是

    2023年04月09日
    浏览(51)
  • 11. Fabric2.2 区块链农产品溯源系统 - 智能合约开发-1

    智能合约与业务逻辑关联度高,承载大量业务逻辑,本小节教大家搭建智能合约开发环境GoLand,并编写合约打包脚本。 作者在windows电脑安装ubuntu18.04版本虚拟机(vmware),Linux环境也有Goland版本,可用性丝毫不差,所有的区块链开发在Linux环境进行。 官方可以下载,要么评估

    2023年04月20日
    浏览(81)
  • 以太坊智能合约开发:Solidity语言中的映射

    本文我们介绍Solidity语言中的映射,包括映射的基本定义、语法、映射的变量声明和基本读写操作。并且通过两个智能合约例子演示了映射的定义与基本操作。 Solidity中关于映射的一些定义: 映射以键-值对(key = value)的形式存储数据; 键可以是任何内置数据类型,包括字节

    2024年02月05日
    浏览(56)
  • Solidity-在vscode上开发智能合约、本地环境部署

     随后我们需要到该插件的设置中进行相关配置说明  点击进入得到如下界面 这里填写solcjs文件的路径位置,注意包含文件本身的名称 关于solcjs文件需要 nodejs 作为前置 nodejs可以在官网直接进行下载 ,安装很简单直接next到底便可 Node.js (nodejs.org) 安装完成后在cmd小黑窗中使用

    2024年02月06日
    浏览(66)
  • 基于以太坊的智能合约开发Solidity(基础篇)

    参考教程:基于以太坊的智能合约开发教程【Solidity】_哔哩哔哩_bilibili (1)程序编译完成后,需要在虚拟机上运行,将合约部署好后便可执行刚刚编写的函数。(注意, 合约一旦部署,就会永久存在于区块链上,且不可篡改 ,不过可以销毁) (2)执行完成后,可以得到以

    2024年02月04日
    浏览(58)
  • 以太坊智能合约开发:Solidity 语言中的数据类型

    本文我们介绍Solidity语言的数据类型,重点是值类型,包括布尔类型、整型、地址类型、字节类型、字符串类型和枚举类型。并且通过两个智能合约例子,用于演示这些数据类型的声明与使用方法。 访问 Github 仓库 获取更多资料。 Solidity中关于数据类型的定义如下: Solidity是

    2024年02月02日
    浏览(69)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包