国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

solidity智能合約實例開發(fā)(2)(解釋+注釋)——食品溯源

這篇具有很好參考價值的文章主要介紹了solidity智能合約實例開發(fā)(2)(解釋+注釋)——食品溯源。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

項目總要求

創(chuàng)建三個角色生產(chǎn)者,分銷商,零售商,并分別通過三個角色對產(chǎn)品的生產(chǎn),分銷,零售上鏈,并且能夠分別查出上鏈的全信息。包括每次交易的時間戳,每次交易的交易名稱,每次交易的交易地址,每次交易的食品質(zhì)量,食品的名稱,當前交易的名稱,當前交易的地址,當前交易的食品質(zhì)量,當前交易的狀態(tài)等等

運行環(huán)境: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;
    }
    /**這個函數(shù)用于向特定角色添加成員。它接受一個 Role 結構體和一個地址作為參數(shù)。在函數(shù)內(nèi)部,
    它首先調(diào)用 has 函數(shù)檢查地址是否已經(jīng)具有該角色,
    如果沒有,則將地址添加到映射中,并將其值設置為 true,表示該地址擁有該角色。
    */

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

    /**
    這個函數(shù)用于從特定角色中移除成員。它接受一個 Role 結構體和一個地址作為參數(shù)。
    在函數(shù)內(nèi)部,它首先調(diào)用 has 函數(shù)檢查地址是否具有該角色,
    如果是,則將地址從映射中移除,并將其值設置為 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);
    }

    /**
    這個函數(shù)用于將調(diào)用者從生產(chǎn)商角色中移除。
    任何人都可以調(diào)用此函數(shù)來將自己從生產(chǎn)商角色中移除。它調(diào)用了 _removeProducer 函數(shù)來執(zhí)行實際的移除操作。
    */
    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;  //當前交易質(zhì)量 0 優(yōu)質(zhì) 1  合格  2 不合格
    uint8 _status;  //當前交易狀態(tài) 0 生產(chǎn) 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);
    }

    //返回新增食品的信息農(nóng)場
    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();
    }

    //農(nóng)場溯源
    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,智能合約,區(qū)塊鏈

?智能合約 溯源,智能合約solidity,智能合約,區(qū)塊鏈

有不懂的可以直接評論區(qū)留言,必回文章來源地址http://www.zghlxwxcb.cn/news/detail-739081.html

到了這里,關于solidity智能合約實例開發(fā)(2)(解釋+注釋)——食品溯源的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • solidity開發(fā)智能合約

    solidity開發(fā)智能合約

    起源于以太坊(Ethereum),設計的目的是能在以太坊虛擬機(EVM)上運行。Solidity 是一門面向合約的、為實現(xiàn)智能合約而創(chuàng)建的高級編程語言。所以先從智能合約開始。 參考文檔 Solidity文檔:區(qū)塊鏈技術-智能合約Solidity編程語言 solidity官方文檔: https://solidity-cn.readthedocs.io/

    2023年04月08日
    瀏覽(25)
  • Fisco-Bcos智能合約開發(fā)案例----商品溯源

    Fisco-Bcos智能合約開發(fā)案例----商品溯源

    1個商品種類----》n個商品,同時還可以創(chuàng)建多個商品種類(工廠合約的作用) 1.部署工廠合約 2.創(chuàng)建商品種類 3. 創(chuàng)建對應的商品 4.查詢商品種類 5. 查詢商品狀態(tài) 0–生產(chǎn)者,1—運輸者,2—超市售賣者,3—消費者 6. 查詢商品溯源信息 7.改變商品狀態(tài) 8.查詢商品溯源

    2024年02月11日
    瀏覽(64)
  • 區(qū)塊鏈2——Solidity智能合約開發(fā)

    區(qū)塊鏈 索引目錄 智能合約是一種以代碼形式編寫的自動執(zhí)行合約,它們運行在區(qū)塊鏈上。這些合約定義了在特定條件下發(fā)生的事件以及相應的行為。 1.1 智能合約結構 版本聲明(Version Declaration): 智能合約通常以聲明版本開始,指定合約應該使用的Solidity編譯器版本。例如

    2024年02月05日
    瀏覽(29)
  • Solidity智能合約開發(fā) — 3.2-合約的fallback和函數(shù)重載

    每個智能合約有且僅有一個未命名的函數(shù),稱為fallback函數(shù),沒有參數(shù)且沒有返回值,可見性必須是 external,且可以是 virtual的(即可以被重載),也可以有修改器 modifier。 fallback執(zhí)行條件: 如果在一個合約的調(diào)用中,沒有其他函數(shù)與給定的函數(shù)標識符匹配時(或沒有提供調(diào)用

    2024年02月09日
    瀏覽(18)
  • 以太坊智能合約開發(fā):Solidity 語言快速入門

    以太坊智能合約開發(fā):Solidity 語言快速入門

    在本文中,我們從一個簡單的智能合約樣例出發(fā),通過對智能合約源文件結構的剖析與介紹,使大家對Solidity語言有一個初步的認識。最后,我們將該智能合約樣例在 Remix 合約編譯器中編譯、部署,觀察其執(zhí)行結果。 在開始之前,我們先對Solidity有個初步的了解,即Solidity是

    2023年04月09日
    瀏覽(32)
  • 11. Fabric2.2 區(qū)塊鏈農(nóng)產(chǎn)品溯源系統(tǒng) - 智能合約開發(fā)-1

    智能合約與業(yè)務邏輯關聯(lián)度高,承載大量業(yè)務邏輯,本小節(jié)教大家搭建智能合約開發(fā)環(huán)境GoLand,并編寫合約打包腳本。 作者在windows電腦安裝ubuntu18.04版本虛擬機(vmware),Linux環(huán)境也有Goland版本,可用性絲毫不差,所有的區(qū)塊鏈開發(fā)在Linux環(huán)境進行。 官方可以下載,要么評估

    2023年04月20日
    瀏覽(18)
  • 以太坊智能合約開發(fā):Solidity語言中的映射

    以太坊智能合約開發(fā):Solidity語言中的映射

    本文我們介紹Solidity語言中的映射,包括映射的基本定義、語法、映射的變量聲明和基本讀寫操作。并且通過兩個智能合約例子演示了映射的定義與基本操作。 Solidity中關于映射的一些定義: 映射以鍵-值對(key = value)的形式存儲數(shù)據(jù); 鍵可以是任何內(nèi)置數(shù)據(jù)類型,包括字節(jié)

    2024年02月05日
    瀏覽(32)
  • 基于以太坊的智能合約開發(fā)Solidity(基礎篇)

    基于以太坊的智能合約開發(fā)Solidity(基礎篇)

    參考教程:基于以太坊的智能合約開發(fā)教程【Solidity】_嗶哩嗶哩_bilibili (1)程序編譯完成后,需要在虛擬機上運行,將合約部署好后便可執(zhí)行剛剛編寫的函數(shù)。(注意, 合約一旦部署,就會永久存在于區(qū)塊鏈上,且不可篡改 ,不過可以銷毀) (2)執(zhí)行完成后,可以得到以

    2024年02月04日
    瀏覽(28)
  • Solidity-在vscode上開發(fā)智能合約、本地環(huán)境部署

    Solidity-在vscode上開發(fā)智能合約、本地環(huán)境部署

    ?隨后我們需要到該插件的設置中進行相關配置說明 ?點擊進入得到如下界面 這里填寫solcjs文件的路徑位置,注意包含文件本身的名稱 關于solcjs文件需要 nodejs 作為前置 nodejs可以在官網(wǎng)直接進行下載 ,安裝很簡單直接next到底便可 Node.js (nodejs.org) 安裝完成后在cmd小黑窗中使用

    2024年02月06日
    瀏覽(41)
  • 以太坊智能合約開發(fā):Solidity語言中的構造函數(shù)

    以太坊智能合約開發(fā):Solidity語言中的構造函數(shù)

    Solidity語言中關于構造函數(shù)的定義: 構造函數(shù)是使用 constructor 聲明的一個可選函數(shù); 構造函數(shù)只在合約部署時調(diào)用一次,并用于初始化合約的狀態(tài)變量; 如果沒有顯式定義的構造函數(shù),則由編譯器創(chuàng)建默認構造函數(shù)。 構造函數(shù)聲明語法如下: 其中: ** constructor :

    2024年02月01日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包