欢迎访问比特币_区块链-币链视界!

币链视界

区块链防伪溯源应用场景知乎

发布时间:2021-02-23区块链应用评论
区块链防伪溯源应用场景文章节选自《NetkillerBlockchain手札》NetkillerBlockchain手札?食品安全溯源下面的方案,同样适合药品安全溯源背景需求是通过区块链跟踪产品,实现产品产地,生产

区块链防伪溯源应用场景文章节选自《NetkillerBlockchain手札》

NetkillerBlockchain手札?www.netkiller.cn食品安全溯源下面的方案,同样适合药品安全溯源

背景需求是通过区块链跟踪产品,实现产品产地,生产,流通等环节溯源。需求归纳,需要实现下面几点:产品具备通用的属性,例如名称,价格,重量,颜色,体积等等生产销售链条跟踪涉及环节,农产品的供应链是一个非常复杂的过程,涉及多方,农业局、卫生局、药监局、工商局、环保局等多个部门交织其中。参与者角色,我们为每个环节的参与者分配一个以太坊账号,例如每个供应商一个账号,每个代理商一个账号。这样任何一方经手后都会使用自己的账号想合约中添加数据。

安全问题我将安全划分为六层,分别是:

+----------+-----------------------------+实体层物+----------+-----------------------------+用户层人+----------+-----------------------------+网络层网络+----------+-----------------------------+应用层操作系统,应用服务器+----------+-----------------------------+业务逻辑层功能,业务逻辑+----------+-----------------------------+存储层物理存储,硬盘+----------+-----------------------------+并不是实施了区块链技术就安全无忧了,安全分为很多层,区块链只能做到网络层和存储层的安全。区块链无法解决用户层,应用层,逻辑层等安全问题,他只能保证存储在硬盘上的区块不被修改。因为区块链仅仅能解决数据存储层的安全问题,不能保证上链的数据是真实的,上链前绝对不会被篡改;所以仅仅朔源,不考虑防伪是没有意义的,防伪仍然是重中之重。

防伪问题如何做防伪呢,这个领域很多公司已经探索多年,各种高科技应用,武装到牙齿,但仍没有解决假货问题。区块链的出现很可能是一个突破,我们只需将现有成熟的防伪技术与区块链结合即可。现在流行的访问技术太多了,我倾向于采用二维码技术,二维码与互联网紧密相连。

性能问题区块链目前的底层只适合做,低频高价值的业务。区块链的读取性能通常是没有问题的,但是区块链的写入实际上无论你用多少个服务器节点都不能提升,因为写入区块需要做共识算法,这步操作,会在所有节点上进行,同时还需要加密运算,这些操作都是CPU密集型操作。所以写入操作是存在瓶颈的。解决这个问题,我想出了几种方案:

性能解决方案

通过消息队列技术异步写入,将需要写入的区块放入队列,异步完成上链操作。并行写入,我们可以建设多个区块链平台。多个平台同时服务于业务。为了达到去中心化并行写入,我们将在客户端通过算法,匹配服务器。而不是在两个平台前面增加负载均衡。因为这样又回到了中心化系统。

颗粒度问题朔源的颗粒度问题,例如“红酒”的溯源,我们是将单位溯源做到箱呢?还是打,或是瓶呢?我们用“四象限法则”分析

高价值oo低频率--------------+-------------高频率操作频率oo低价值物品价值通过观察上面图,我们可以看到可以有四种情况,低频低价值,低频高价值,高频高价值,高频低价值我认为对于低频高价值和高频高价值的业务,尽量做到最小颗粒度。而对于低频低价值和高频低价值的业务,可以颗粒度更粗。

存储规划如果是高频低价值的业务,那么溯源数据源源将会不断的被添加到区块,以此同时区块的访问率极低。迟早会达到一个临界值。所以你要规划存储,例如溯源数据的过期时间,对于hyperledger可以使用DelState(key)删除历史数据。如果是高频高价值的业务是否要考虑永久保留数据呢?这些问题都是需要考虑的。因为目前我们还不知道区块链的存储临界值。

大数据问题区块链替代不了数据库,它与数据库是互补关系。对于低频的业务,通常传统数据库足以应付。那么对于高频操作的业务呢?暂时可能没有问题,但总有一天会遇到瓶颈。综上所述,溯源项目数据库规划决不能少。同时还要考虑数据仓库和后期数据挖掘。因为用户使用微信或者我们的APP扫描二维码,我们可以获得很多有价值的数据。手上没有Vision使用文本简单的绘制了一幅图

+------------------------+User->QRCode+------------------------+VV+---------------++---------------++---------------+SearchEngine<--MicroserviceMicroservice+---------------++---------------++---------------++----------------------------------+VVVV+----------++------------++-------------+DatabaseBigDataBlockchain+----------++------------++-------------+MySQLHadoopHyperledgerNoSQLHive/HbaseChaincode+----------++------------++-------------+^^+------ETL-----+-----------MessageQueue----------o区块链之外的很多复杂的需求我们需要借助大数据系统和搜索技术。区块链的弱点是无法做复杂的查询,这里我们会用到搜索引擎技术解决,实际上搜索引擎角色是给区块链做索引。上图数据写入时,保存了四份,分别在搜索引擎,关系型数据库,数据仓库和区块的具体怎么实现,有很多方式,这里就不讨论了,否则就跑题了。

BI商业智能数据采集,大数据分析溯源信息的查询是通过用户手机终端实现,有几种途径,微信扫二维码,APP扫二维码,微信小程序等等。扫码的同时还可以收集用户数据,我们可以收集到很多有价值的数据,例如地理位置,手机号码,性别,年龄等等......有了这些数据便可以挖掘出有价值的数据,甚至可以将数据提供给生产企业作参考。传统销售数据只能跟踪到地域,也就是统计出地域销量,没法监控到最后一公里的数据,而我们主要是采集商品最后一公里的数据。我们能做到用户消费后,呼叫中心立即跟进回访,还能在用户快用完商品是向用户推送促销信息,以及客服二次跟进。

大数据能做什么?

用户行为分析,用户的喜好,这些数据能为后面精准推送提供支持。消费与地理分析的关系年龄段与购买力的关系区域产品的存量,例如:用户扫描了一次二维码,可能用户就已经使用了改产品。我们就知道该地区投放的1000件商品被消耗了意见。性别与消费习惯两次间隔消费时间活跃用户和沉睡用户

采集终端溯源数据怎么录入呢?例如我们开发一个设备,二维码扫描枪,内置安卓系统。我们不清楚他们的教育背景以及学习能力,所以设计原则是尽量傻瓜化,降低数据录入难度和学习难度,终端开机后互动教学,走一遍流程即可上手。首先将溯源环节的每个节点通过后台事先写入数据库,接下来通过GIS地理信息系统匹配。UUID->二维码->设备扫描二维码激活->入数据库->异步消息队列->上链>---+^+-------------------追加数据-----------------+终端会帮助用户欲录入信息,用户可以在信息基础上修改或者重写。同时终端支持图片,图像记录上传。对于图片还能实现EXIF数据保存,包括图片描述信息,地理信息等等......

多媒体数据这里我们需要考虑是否需要记录多媒体数据,这里的多媒体指图像,声音,甚至3D扫描数据等等......对于图片、音频与视频,我们可以将它集成到采集终端上,然后异步上传到去中心化的分布式文件系统中。去中心化的分布式文件系统能实现,一张图片一个hash值,通过hash值访问图片,图片被同步到相邻节点实现去中心化,图片被修改hash值随之变化数据便无效。

物流接口使用物流单好通过物流公司提供的借口获得物流数据,然后写入到区块。

如何激励用户防伪技术做了,区块链溯源也做了,那么对于用户来说,他可能懒得去扫你的二维码,怎么办呢?

这里需要激励用户,怎样激励用户,我的方案是送代币。首先代币不仅能够购买物品,还能交易,流通,形成一个小的商业闭环。其次目前代币已经泛滥99%可能是空气币,这里我们需要将代币的价值与物品对价,类似金本位/银本位。怎样操作呢?例如一个代币等于一斤水果,无论代币怎样炒作,最终用户不想玩下去了,就来换水果,也可以是大米,食用油等等...关于怎样使用代币来做积分系统请参考我的另一篇文章《使用代币替代传统积分系统》,你可以在搜索引擎中找到根据业务需要,可以发行布置一套币,例如水果币,流量币,话费币,每种币的功能不同,这些币可以在交易所中撮合交易,例如卖出水果币,换成流量币等等。由于国家的法规问题,代币系统设计原则一定是代币只能用来购买商城中的物品,不能直接兑换成RMB,否则会触碰到国家的红线。但是通过交易所,币币之间兑换我们就控制不了了。另外扫描二维码显示溯源防伪信息的同时我们有很多可以操作空间,可以获取用户地理位置,手机号码等等信息,为后面大数据分析埋点。

用户激励手段

分享激励好评激励用户等级激励代币激励用户排名,PK排行榜成就勋章身份标签,黄马甲:)等等,手段众多,目的是让用户查询溯源信息,手机用户数据,鼓励代币消费等等.......

上链并不是所有数据都上链,哪些数据上链呢?产地(出生、生长)、采购、加工(检疫、屠宰)、库存、运输、销售、配送等等......

以太坊解决方案我们设计一个简单的合约,模拟上面提到的解决方案

pragmasolidity^0.4.20;contractTrace{enumState{Origin,Factory,QA,Shipping,Received,Pending}stringname;uintprice;uintweight;boollock=false;//合约锁boolclose=false;//合约状态uintnumber=1;uintattr_number=1;mapping(address=>string)guestbook;//客户留言本structAttribute{addressowner;//供应商stringname;//属性的名字stringdate;//生产日期stringdesc;//描述信息}mapping(uint=>Attribute)attribute;structLogistics{addressowner;//中转站stringdate;//转运日期Statestatus;//状态stringmessage;//留言信息}mapping(uint=>Logistics)stations;functionTrace(string_name,uint_price,uint_weight)public{name=_name;price=_price;weight=_weight;}//名称functiongetName()publicviewreturns(string){returnname;}//价格functiongetPrice()publicviewreturns(uint){returnprice;}//重量functiongetWeight()publicviewreturns(uint){returnweight;}//增加商品属性functionputAttribute(address_owner,string_name,string_date,string_desc)public{if(lock==false){Attributememoryitem=Attribute(_owner,_name,_date,_desc);attribute[attr_number]=item;attr_number=attr_number+1;}}//获得属性functiongetAttribute(uint_attr_number)publicviewreturns(address,string,string,string){require(_attr_number

Trace(string_name,uint_price,uint_weight)产品属性可以在出厂前设置,一旦出厂进入物流阶段就不允许在更改了。

应用场景一调用合约案例一,这是没有经过深加工的原产品案例。例如Trace("山羊肉",25,50)

varcontract;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)

varcontract;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","东西好吃,下次还买,给好评");

Hyperledger解决方案由于家里在刷墙,服务器收起来了,没有开发环境,只能提供部分参考代码,无法提供合约完整代码,只是给大家一个思路,原理很上面以太坊的合约类似。溯源合约涉及

packagemainimport"fmt"import"encoding/json"const(Origin=iota//0Factory//1QA//2Shipping//3Received//4Pending//5Supermarket//6)typestructElementstruct{Namestring`json:"name"`Companystring`json:"company"`Descriptionstring`json:"description"`}typestructLogisticsstruct{Stationsstring`json:"stations"`//中转站Datestring`json:"date"`//转运日期Statusuint8`json:"status"`//状态Messagestring`json:"message"`//留言信息}typeTracestruct{Namestring`json:"name"`Addressstring`json:"address"`Attributemap[string]string`json:"attribute"`Element[]structElement`json:"element"`Logisticsmap[string]structLogistics`json:"logistics"`}func(trace*Trace)setName(_namestring){trace.Name=_name}func(trace*Trace)getName()string{returntrace.Name}func(trace*Trace)putAttribute(_keystring,_valuestring){trace.Attribute[_key]=_value}func(trace*Trace)putLogistics(_keystring,_valuestructLogistics){trace.Logistics[_key]=_value}funcmain(){trace:=&Trace{Name:"牦牛肉干",Address:"内蒙古呼和浩特",Attribute:map[string]string{},Element:[]structElement{structElement{Name:"塑料袋",Company:"XXX塑料制品有限公司",Description:"外包装"},structElement{Name:"辣椒粉",Company:"XXX调味品有限公司",Description:"采摘年份2016-10-10"},structElement{Name:"调和油",Company:"XXX调味品有限公司",Description:"生产日期2016-10-10"}},Logistics:map[string]structLogistics{}}trace.putAttribute("Color","Red")trace.putAttribute("Size","10")trace.putAttribute("Weight","100kg")trace.putLogistics("1",structLogistics{"呼和浩特","2016-10-15",Origin,"牦牛收购"})trace.putLogistics("2",structLogistics{"呼和浩特","2016-10-18",Factory,"牦牛宰杀"})trace.putLogistics("3",structLogistics{"呼和浩特","2016-10-15",QA,"经过质检"})trace.putLogistics("4",structLogistics{"北京市","2016-10-15",Shipping,"运输中"})trace.putLogistics("5",structLogistics{"杭州市","2016-10-15",Shipping,"XXX冷库"})trace.putLogistics("5",structLogistics{"深圳市","2016-10-15",Supermarket,"XXX超市"})trace.putLogistics("5",structLogistics{"龙华区","2016-10-15",Received,"用户签收"})traceJson,_:=json.Marshal(trace)fmt.Println(string(traceJson))}食品安全朔源

trace:=&Trace{Name:"牦牛肉干",Address:"内蒙古呼和浩特",Attribute:map[string]string{},Element:[]structElement{structElement{Name:"塑料袋",Company:"XXX塑料制品有限公司",Description:"外包装"},structElement{Name:"辣椒粉",Company:"XXX调味品有限公司",Description:"采摘年份2016-10-10"},structElement{Name:"调和油",Company:"XXX调味品有限公司",Description:"生产日期2016-10-10"}},Logistics:map[string]structLogistics{}}trace.putAttribute("Color","Red")trace.putAttribute("Size","10")trace.putAttribute("Weight","100kg")trace.putLogistics("1",structLogistics{"呼和浩特","2016-10-15",Origin,"牦牛收购"})trace.putLogistics("2",structLogistics{"呼和浩特","2016-10-18",Factory,"牦牛宰杀"})trace.putLogistics("3",structLogistics{"呼和浩特","2016-10-15",QA,"经过质检"})trace.putLogistics("4",structLogistics{"北京市","2016-10-15",Shipping,"运输中"})trace.putLogistics("5",structLogistics{"杭州市","2016-10-15",Shipping,"XXX冷库"})trace.putLogistics("5",structLogistics{"深圳市","2016-10-15",Supermarket,"XXX超市"})trace.putLogistics("5",structLogistics{"龙华区","2016-10-15",Received,"用户签收"})水平移植

这个方案可以水平移植到其他领域,例如药品安全溯源

trace:=&Trace{Name:"强身大力丸",Address:"深圳是XXX制药有限公司",Attribute:map[string]string{},Element:[]structElement{structElement{Name:"枸杞",Company:"宁夏XXX农业有限公司",Description:"采摘年份2016-10-10,10g"},structElement{Name:"茯苓",Company:"河南XXX农业有限公司",Description:"采摘年份2016-10-10,20kg"},structElement{Name:"XXX",Company:"XXX有限公司",Description:"生产日期2016-10-10"},structElement{Name:"XXX",Company:"XXX有限公司",Description:"生产日期2016-10-10"},......structElement{Name:"塑料包装",Company:"XXX有限公司",Description:"生产日期2016-10-10"},structElement{Name:"包装盒",Company:"XXX有限公司",Description:"生产日期2016-10-10"}},Logistics:map[string]structLogistics{}}trace.putAttribute("Color","Red")trace.putAttribute("Size","10")......trace.putAttribute("Weight","100kg")trace.putLogistics("1",structLogistics{"呼和浩特","2016-10-15",Origin,"原材料...."})trace.putLogistics("2",structLogistics{"呼和浩特","2016-10-18",Factory,"生产...."})trace.putLogistics("3",structLogistics{"呼和浩特","2016-10-15",QA,"经过质检"})trace.putLogistics("3",structLogistics{"XXX市药品监督局","2016-10-15",QA,"经过质检"})trace.putLogistics("4",structLogistics{"北京市","2016-10-15",Shipping,"运输中"})trace.putLogistics("5",structLogistics{"杭州市","2016-10-15",Shipping,"XXX冷库"})trace.putLogistics("5",structLogistics{"深圳市","2016-10-15",Supermarket,"XXX超市"})trace.putLogistics("5",structLogistics{"龙华区","2016-10-15",Received,"用户签收"})合约落地,还需要做一些调整已适应实际场景。但基本思路是通的。

积分通正(代币)我发现用以太坊思维,将以太坊代币合约搬到hyperledger上,一样可以实现代币的功能,这个代币除了不能上交易所,基本满足我们替代积分系统的需求,下面是我写了这样一个合约,在超级账本上实现类似以太坊的代币转账功能。

packagemainimport("bytes""encoding/json""fmt""strconv""github.com/hyperledger/fabric/core/chaincode/shim"sc"github.com/hyperledger/fabric/protos/peer")//DefinetheSmartContractstructuretypeSmartContractstruct{}typeTokenstruct{Ownerstring`json:"Owner"`TotalSupplyuint`json:"TotalSupply"`TokenNamestring`json:"TokenName"`TokenSymbolstring`json:"TokenSymbol"`BalanceOfmap[string]uint`json:"BalanceOf"`}func(token*Token)initialSupply(){token.BalanceOf[token.Owner]=token.TotalSupply;}func(token*Token)transfer(_fromstring,_tostring,_valueuint){if(token.BalanceOf[_from]>=_value){token.BalanceOf[_from]-=_value;token.BalanceOf[_to]+=_value;}}func(token*Token)balance(_fromstring)uint{returntoken.BalanceOf[_from]}func(token*Token)burn(_valueuint){if(token.BalanceOf[token.Owner]>=_value){token.BalanceOf[token.Owner]-=_value;token.TotalSupply-=_value;}}func(token*Token)burnFrom(_fromstring,_valueuint){if(token.BalanceOf[_from]>=_value){token.BalanceOf[_from]-=_value;token.TotalSupply-=_value;}}func(token*Token)mint(_valueuint){token.BalanceOf[token.Owner]+=_value;token.TotalSupply+=_value;}func(s*SmartContract)Init(stubshim.ChaincodeStubInterface)sc.Response{returnshim.Success(nil)}func(s*SmartContract)initLedger(stubshim.ChaincodeStubInterface)sc.Response{token:=&Token{Owner:"netkiller",TotalSupply:10000,TokenName:"代币通正",TokenSymbol:"COIN",BalanceOf:map[string]uint{}}token.initialSupply()tokenAsBytes,_:=json.Marshal(token)stub.PutState("Token",tokenAsBytes)fmt.Println("Added",tokenAsBytes)returnshim.Success(nil)}func(s*SmartContract)transferToken(stubshim.ChaincodeStubInterface,args[]string)sc.Response{iflen(args)!=3{returnshim.Error("Incorrectnumberofarguments.Expecting2")}tokenAsBytes,_:=stub.GetState(args[0])token:=Token{}json.Unmarshal(tokenAsBytes,&token)token.transfer(args[1],args[2],args[3])tokenAsBytes,_=json.Marshal(token)stub.PutState(args[0],tokenAsBytes)returnshim.Success(nil)}func(s*SmartContract)balanceToken(stubshim.ChaincodeStubInterface,args[]string)sc.Response{iflen(args)!=1{returnshim.Error("Incorrectnumberofarguments.Expecting1")}tokenAsBytes,_:=stub.GetState(args[0])token:=Token{}json.Unmarshal(tokenAsBytes,&token)amount:=token.balance(args[1])returnshim.Success(amount)}func(s*SmartContract)Invoke(stubshim.ChaincodeStubInterface)sc.Response{//RetrievetherequestedSmartContractfunctionandargumentsfunction,args:=stub.GetFunctionAndParameters()//Routetotheappropriatehandlerfunctiontointeractwiththeledgerappropriatelyiffunction=="balanceToken"{returns.balanceToken(stub,args)}elseiffunction=="initLedger"{returns.initLedger(stub)}elseiffunction=="transferToken"{returns.transferToken(stub,args)}returnshim.Error("InvalidSmartContractfunctionname.")}//Themainfunctionisonlyrelevantinunittestmode.Onlyincludedhereforcompleteness.funcmain(){//CreateanewSmartContracterr:=shim.Start(new(SmartContract))iferr!=nil{fmt.Printf("ErrorcreatingnewSmartContract:%s",err)}}合约代码的测试

funcmain(){token:=&Token{Owner:"netkiller",//代币管理者TotalSupply:10000,//代币发行总量TokenName:"积分连",//代币名称TokenSymbol:"NEO",//代币符号NEOBalanceOf:map[string]uint{}}token.initialSupply()//初始化代币fmt.Println(token.balance("netkiller"))//查询余额token.transfer("netkiller","neo",100)//转账,这里账号使用用户ID,没有使用以太坊钱包那样的哈希值,因为哈希值不便于记忆。fmt.Println(token.balance("netkiller"))fmt.Println(token.balance("neo"))}我们可以建立很多套这样的比,例如水果币,蔬菜币,流量币...

开发一个小型交易所难度也不大,让用户在交易所中交易这些币。

netkiller:使用代币替代传统积分系统?zhuanlan.zhihu.comnetkiller:Solidity语言安全·整型溢出?zhuanlan.zhihu.comnetkiller:食品安全溯源区块链解决方案探索?zhuanlan.zhihu.comnetkiller:区块链防伪溯源应用场景?zhuanlan.zhihu.com以上文章节选择《NetkillerBlockchain手札》

微信订阅号netkiller-ebook(微信扫描二维码)QQ:13721218请注明“读者”QQ群:128659835请注明“读者”用户评论丁伟平大大方方0

广告位

热心评论

评论列表