1. 程式人生 > 其它 >RPC框架之Thrift簡單使用

RPC框架之Thrift簡單使用

以太坊·食品溯源案例

內容摘要

這一部關於區塊鏈開發及運維的電子書。

為什麼會寫區塊鏈電子書?因為2018年是區塊鏈年。

這本電子書是否會出版(紙質圖書)? 不會,因為網際網路技術更迭太快,紙質書籍的內容無法實時更新,一本書動輒百元,很快就成為垃圾,你會發現目前市面的上區塊鏈書籍至少是一年前寫的,內容已經過時,很多例子無法正確執行。所以我不會出版,電子書的內容會追逐技術發展,及時跟進軟體版本的升級,做到內容最新,至少是主流。

這本電子書與其他區塊鏈書籍有什麼不同?市面上大部分割槽塊鏈書籍都是用2/3去講區塊鏈原理,只要不到 1/3 的乾貨,乾貨不夠理論來湊,通篇將理論或是大談特談區塊鏈行業,這些內容更多是頭腦風暴,展望區塊鏈,均無法落地實施。本書與那些書籍完全不同,不講理論和原理,面向應用落地,注重例子,均是乾貨。

電子書更新頻率?每天都會有新內容加入,更新頻率最遲不會超過一週,更新內容請關注 https://github.com/netkiller/netkiller.github.io/commits/master

本文采用碎片化寫作,原文會不定期更新,請儘量閱讀原文。

http://www.netkiller.cn/blockchain/index.html

您的打賞是我的寫作動力:http://www.netkiller.cn/blockchain/donations.html

-----------------------------------

食品溯源案例

背景

需求是通過區塊鏈跟蹤產品,實現產品產地,生產,流通等環節溯源。

需求歸納,需要實現下面幾點:

產品具備通用的屬性,例如名稱,價格,重量,顏色,體積等等

生產銷售鏈條跟蹤

涉及環節,農產品的供應鏈是一個非常複雜的過程,涉及多方,農業局、衛生局、藥監局、工商局、環保局等多個部門交織其中。

合約設計

我們設計一個簡單的合約

pragma solidity ^0.4.20;contract Trace {

    enum State { Origin, Factory, QA, Shipping, Received, Pending }
    
    string name;
    uint price;
    uint weight;
    bool lock = false;    //合約鎖
    bool close = false;    //合約狀態
    uint number = 1;
    uint attr_number = 1;
    
    mapping (address  => string) guestbook; //客戶留言本    

    struct Attribute {
        address owner;    // 供應商
        string name;        // 屬性的名字
        string date;        // 生產日期
        string desc;        // 描述資訊
        
    }
    mapping (uint  => Attribute) attribute;

    struct Logistics {
        address owner;    // 中轉站
        string date;    // 轉運日期
        State status;   // 狀態
        string message; // 留言資訊
    }
    mapping (uint  => Logistics) stations;
    
    function Trace(string _name, uint _price, uint _weight) public {
        name = _name;
        price = _price;
        weight = _weight;
    }
    // 名稱
    function getName() public view returns(string){
        return name;
    }
    // 價格
    function getPrice() public view returns(uint){
        return price;
    }
    // 重量
    function getWeight() public view returns(uint){
        return weight;
    }
    
     // 增加商品屬性
    function putAttribute(address _owner,string _name, string _date, string _desc ) public{
        if(lock == false){
                Attribute memory item = Attribute(_owner, _name,_date,_desc);
                attribute[attr_number] = item;
                attr_number = attr_number + 1;
        }
    }

    // 獲得屬性
    function getAttribute(uint _attr_number) public view returns(address, string, string, string) {
        require(_attr_number < attr_number);
        Attribute memory item = attribute[_attr_number];
        
        return (item.owner, item.name, item.date, item.desc);
    }
    
    // 增加物流中轉資訊
    function putLogistics(address _owner,string _date, State _status, string _message ) public{
        if(close == false){
            Logistics memory node = Logistics(_owner,_date,_status,_message);
            stations[number] = node;
            number = number + 1;
            lock = true;
        }
        if (_status == State.Received) {
            close = true;
        }
    }

    // 獲得中轉資訊
    function getLogistics(uint _number) public view returns(address, string, State, string) {
        require(_number < number);

        Logistics memory node = stations[_number];
        
        return (node.owner, node.date, node.status, node.message);
    }
    
    // 或者轉中站數量
    function getLogisticsCount() public view returns(uint){
        return number;
    }
    
    // 客戶留言
        function addGuestbook(address _owner, string message) public{
        guestbook[_owner] = message;
    }}

怎樣使用這個合約呢?

合約部署,需要輸入三個引數,分別是名稱,價格和裝量

Trace(string _name, uint _price, uint _weight)     

應用場景一

呼叫合約案例一,這是沒有經過深加工的原產品案例。例如 Trace("山羊肉", 25, 50)

var contract;Trace.deployed().then(function(instance){contract=instance;});contract.getName();contract.putAttribute("0x627306090abab3a6e1400e9345bc60c78a8bef57","顏色", "", "黑色")contract.putAttribute("0x627306090abab3a6e1400e9345bc60c78a8bef57","產地", "", "內蒙古")contract.putAttribute("0x627306090abab3a6e1400e9345bc60c78a8bef57","出生", "2017-01-12", "XXX牧場")contract.putAttribute("0x627306090abab3a6e1400e9345bc60c78a8bef57","宰殺", "2018-02-12", "XXX宰殺")contract.putLogistics("0x627306090abab3a6e1400e9345bc60c78a8bef57","2018-02-20",0,"XXX牧場");contract.putLogistics("0x627306090abab3a6e1400e9345bc60c78a8bef57","2018-02-20",1,"XXX屠宰公司");contract.putLogistics("0xc5fdf4076b8f3a5357c5e395ab970b5b54098fef","2018-02-22",2,"XXX檢驗檢疫");contract.putLogistics("0xf17f52151ebef6c7334fad080c5704d77216b732","2018-02-21",3,"XXX一級經銷商");contract.putLogistics("0x821aea9a577a9b44299b9c15c88cf3087f3b5544","2018-02-23",3,"XXX二級經銷商");contract.putLogistics("0x821aea9a577a9b44299b9c15c88cf3087f3b5544","2018-02-24",3,"XXX批發中心");contract.putLogistics("0x821aea9a577a9b44299b9c15c88cf3087f3b5544","2018-02-25",3,"XXX超市");contract.putLogistics("0x0d1d4e623d10f9fba5db95830f7d3839406c6af2","2018-02-26",4,"使用者包裹收到");contract.getNode(); // 獲得物流經過的轉運站數量        應用場景二

呼叫合約案例二,經過深加工的原產品案例。

例如 Trace("犛牛肉乾", 80, 500)

var contract;Trace.deployed().then(function(instance){contract=instance;});contract.getName();contract.putAttribute("0x627306090abab3a6e1400e9345bc60c78a8bef57","調和油", "2016-10-10", "銀龍魚牌")contract.putAttribute("0x627306090abab3a6e1400e9345bc60c78a8bef57","辣椒粉", "2016-10-30", "西藏XXX公司生產")contract.putAttribute("0x627306090abab3a6e1400e9345bc60c78a8bef57","生抽", "2016-01-12", "XXX生抽,XXX生產")contract.putAttribute("0x627306090abab3a6e1400e9345bc60c78a8bef57","山梨酸鉀", "2017-02-12", "XXX生產")contract.putAttribute("0x627306090abab3a6e1400e9345bc60c78a8bef57","防腐劑", "2017-02-12", "XXX生產")contract.putAttribute("0x627306090abab3a6e1400e9345bc60c78a8bef57","犛牛肉", "2017-02-12", "XXX牧場")contract.putLogistics("0x627306090abab3a6e1400e9345bc60c78a8bef57","2018-02-20",0,"XXX牧場");contract.putLogistics("0x627306090abab3a6e1400e9345bc60c78a8bef57","2018-02-20",1,"XXX公司生產");contract.putLogistics("0xc5fdf4076b8f3a5357c5e395ab970b5b54098fef","2018-02-22",2,"XXX通過QA、QC");contract.putLogistics("0xf17f52151ebef6c7334fad080c5704d77216b732","2018-02-21",3,"XXX一級經銷商");contract.putLogistics("0x821aea9a577a9b44299b9c15c88cf3087f3b5544","2018-02-23",3,"XXX二級經銷商");contract.putLogistics("0x821aea9a577a9b44299b9c15c88cf3087f3b5544","2018-02-24",3,"XXX批發中心");contract.putLogistics("0x821aea9a577a9b44299b9c15c88cf3087f3b5544","2018-02-25",3,"XXX超市");contract.putLogistics("0x0d1d4e623d10f9fba5db95830f7d3839406c6af2","2018-02-26",4,"使用者包裹收到");contract.getNode(); // 獲得物流經過的轉運站數量        

使用者留言

contract.addGuestbook("0x0d1d423e623d10f9d10f9d10f9d10f9d10f9fba5","東西好吃,下次還買,給好評");

以上僅僅是作者的想法,這是一個學習和熟悉只能合約開發的例子,真實場景不太可行,因為以太坊無法處理高TPS的場景。