以太坊·食品溯源案例

本文节选自电子书《Netkiller Blockchain 手札》

Netkiller Blockchain 手札

本文作者最近在找工作,有意向致电 13113668890

Mr. Neo Chan, 陈景峯(BG7NYT)

中国广东省深圳市龙华新区民治街道溪山美地 518131

+86 13113668890 <netkiller@msn.com>

文档始创于2018-02-10

版权 © 2018 Netkiller(Neo Chan). All rights reserved.

版权声明

转载请与作者联系,转载时请务必标明文章原始出处和作者信息及本声明。

http://www.netkiller.cn

http://netkiller.github.io

http://netkiller.sourceforge.net

微信订阅号 netkiller-ebook (微信扫描二维码)

QQ:13721218 请注明“读者”

QQ群:128659835 请注明“读者”

内容摘要

这一部关于区块链开发及运维的电子书。

为什么会写区块链电子书?因为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的场景。

以太坊·食品溯源案例相关推荐

  1. 短暂相逢却回味无穷,全球最具影响力的以太坊技术会议视频,你保存了吗!...

    关注我们,了解更多精彩内容 自2008年中本聪发表的那篇仅短短9页的比特币白皮书后,毁誉参半的比特币对当今互联网及物联网的世界格局产生了重大的影响,其后延伸出来的区块链技术成为了全球最时髦的名词. 相 ...

  2. 【区块链技术工坊36期】基于“GS1+区块链”的药品疫苗溯源案例解析

    1,活动基本信息 1)题目: [区块链技术工坊36期]基于"GS1+区块链"的药品疫苗溯源案例解析 2)议题: 疫苗安全问题已是迫切需要解决的民生问题,国家食药监总局暂停执行药监码 ...

  3. 以太坊ERC20代币合约案例

    一.ERC20代币合约与web3调用 ERC20代币合约在小白看来觉得很高大上,但其实就是一个代币的定义标准,方便其他dapp统一调用各种代币的方法.如图: 二.ERC20合约标准 [官方链接] co ...

  4. 基于以太坊的58同城 | DApp开发与应用案例

    基于以太坊的58同城 | DApp开发与应用案例 今天,Origin开发团队很高兴地宣布在以太坊Rinkeby测试网络上推出Origin Protocol Demo DApp ! 在这个DApp中,你 ...

  5. 【重磅推荐】基于truffle-contract库实现的以太坊solidity合约调用案例(注:web3.js切勿和truffle-contract库同时使用,否则报错,无法修复!)

    1.一个基于truffle-contract库实现的以太坊solidity智能合约调用案例! 2. 注意:truffle-contract库和web3.js使用nodej或import同时导入转码的时 ...

  6. 以太坊钱包私钥爆破产业链和攻击案例

    一:产业链频道:小飞机搜索"BRUTE_FORCE_CRYPTO_WALLET" 2.github项目(有成熟的工具) GitHub - Houzich/CUDA-GPU-Brut ...

  7. JAVA使用web3j开发以太坊实战案例

    JAVA使用web3j开发以太坊实战案例 必读 1.前言 2.基础(必看) 3.web3j引入 4.创建账户(离线创建) 5.geth节点搭建.基本使用及一般问题 6.常量类 后面内容都要用到(必备! ...

  8. 基于以太坊开发的类似58同城的DApp开发与应用案例

    今天,Origin开发团队很高兴地宣布在以太坊Rinkeby测试网络上推出Origin Protocol Demo DApp ! 在这个DApp中,你可以在不同垂直行业的solidarity econ ...

  9. 以太坊投票智能合约案例

    这个例子相对复杂一些,用到了以太坊编程语言Solidity的很多特性.例子实现了一个投票智能合约.电子投票系统的一个主要问题是如何分配合理的权限给正确的人,并且要防止篡改.这个例子不能解决所有问题,但 ...

最新文章

  1. 华为任正非:5G只是将来支撑人工智能存在的工具
  2. *LeetCode--Add Two Numbers
  3. 数学建模学习笔记——数学规划
  4. 《英雄联盟:双城之战》全球首映 沉浸式观影打造追剧新潮流
  5. [HAOI2016]找相同字符
  6. HTML中常见问题汇总贴
  7. oracle registers,【案例】Oracle RAC强制删除node节点过程的详细笔记
  8. 重温.NET Remoting(一)
  9. 螺纹的规定,http://www.doc88.com/p-30089302852.html
  10. 什么是利亚诺夫指数?Lyapunove指数 李雅普诺夫指数
  11. imagej得到灰度图数据_【原创】imagej使用达人指南,分享给大家!
  12. SageMath浅尝
  13. Ubuntu查看显卡型号
  14. HDU 4475 Downward paths (推公式)
  15. 改进的判定条件覆盖讲解和真值表书写
  16. python关于函数作用的描述_Python函数的概念和使用
  17. Azure Queues and Service Bus Queues - Compared and Contrasted
  18. Cesium源码解读系列(一):GeoJsonDataSource如何处理geojson格式的数据
  19. 由LG 的G2手机浅析国产旗舰机的方向
  20. 惊!brat安装后进行标注-实战,并且通过一行代码自动标注为BIO格式,便于模型训练-and 错误解决

热门文章

  1. 021_bi_li_bi_li_zhu_shou
  2. 面试:一分钟自我介绍
  3. 深度学习中的过拟合问题
  4. 微信小程序组件的传参
  5. Delphi 远程连接Mysql
  6. 25,verilog之generate生成块
  7. 亚马逊、速卖通、lazada、阿里国际等跨境卖家如何通过自养号测评提高产品review,销量和权重
  8. 中望CAD 2022怎么样?测评来了!
  9. 2022-2028全球与中国数码喷墨打印机市场现状及未来发展趋势
  10. 服务器内存低压性能,服务器内存低压和标压的区别