HyperLedgerFabcar学习笔记(写第一个基于hyperledger的应用)翻译自:http://hyperledger-fabric.rea...写第一个为应用,我们需要执行以下三个步骤。首先,设置一个开发环境来了解我们的应用程序将使用的智能合约的一些简单参数。开发一个可以更新和查询分类帐的应用程序。设置开发环境。首先,确保已经安装了必要的织物图像等。如果没有安装,请参考(https://hyperledger-fabric.re...)下载fabric-samples并安装必要的运行工具。(参考地址:https://hyperledger-fabric.re...)如果以上步骤不想看英文,可以参考(Howtobuildthefirsthyperledgernetwork)https://segmentfault。com/a/11...如果按照建立超级账本网络的教程运行,可能会启动一个网络,影响下一步流程,需要关闭。./byfn.sh-mdown进入fabric-sample/fabcar目录:thisisanappcdfabric-samples/fabcar&&ls显示关于汽车(car)交易的结果enrollAdmin.jsinvoke.jspackage.jsonquery.jsregisterUser.jsstartFabric.sh杀掉所有当前正在运行的docker镜像服务dockerrm-f$(dockerps-aq)清除所有缓存网络dockernetworkprune如果你运行过本教程,还需要执行以下操作来删除chaincode镜像,如果是第一次运行,不会出现dockerrmidev-peer0.org1.example.com-fabcar-1.0-5c906e402ed29f20260ae42283216aa75549c571e2e380f3615826365d8269ba安装客户端并登陆网络。首先确保fabric-ca-client和fabric-client准备就绪,这两个模块就是Node.js访问Hyperledger网络的SDKnpminstallfabric-clientnpminstallfabric-ca-client。这时候在fabcar目录下会显示node_module目录和一个package.json文件。如果这部分不明白,可以学习node.js相关知识。通过命令创建超级账本网络。/startFabric.sh#运行golang写的chaincode说明:该脚本会创建一个超级账本网络,包括ca-serverpeerorder等节点,并安装实例化chaincode。./startFabric.shnode#运行node.js写的chaincodeApp如何使用网络创建Admin用户首先,应用的admin用户要向ca-server发送证书注册请求,接受一个注册证书(eCert),我们将跟进一个新用户将使用此管理员进行注册和身份验证。命令如下:如果nodeenrollAdmin.js命令执行成功,会创建一个hfc-key-store目录,存放admin的身份和一对公私钥。创建普通用户创建普通用户user1,用于查询和更新账本。admin用户身份用于创建user1用户。执行以下命令:noderegisterUser.jsqueryledgerinformation执行query命令查询当前汽车信息nodequery.js会显示所有CAR信息CAR0-CAR9[{"Key":"CAR0","Record":{"colour":"blue","make":"Toyota","model":"Prius","owner":"Tomoko"}},{"Key":"CAR1","Record":{"colour":"red"","make":"Ford","model":"Mustang","owner":"Brad"}},{"Key":"CAR2","Record":{"colour":"green","make":"Hyundai","model":"Tucson","owner":"JinSoo"}},{"Key":"CAR3","Record":{"colour":"yellow","make":"Volkswagen","model":"Passat","owner":"Max"}},{"Key":"CAR4","Record":{"colour":"black","make":"Tesla","model":"S","owner":"Adriana"}},{"Key":"CAR5","Record":{"colour":"purple","make":"Peugeot","model":"205","owner":"Michel"}},{"Key":"CAR6","Record":{"colour":"white","make":"Chery","model":"S22L","owner":"Aarav"}},{"Key":"CAR7","Record":{"colour":"violet","make":"菲亚特","model":"Punto","owner":"Pari"}},{"Key":"CAR8","Record":{"colour":"indigo","make":"Tata",“model”:“Nano”,“owner”:“Valeria”}},{“Key”:“CAR9”,“Record”:{“colour”:“brown”,“make":"Holden","model":"Barina","owner":"Shotaro"}}]我们可以尝试修改query.js并再次运行脚本constrequest={//targets:---让this默认分配给通道的peerchaincodeId:'fabcar',fcn:'queryCar',//这里修改为查询单个CAR信息args:['CAR5']//通过修改参数查询指定CAR信息};显示结果Store路径如下:/Users/ly/go/src/github.com/hyperledger/fabric-samples/fabcar/hfc-key-storeSuccessfullyloadeduser1frompersistenceQueryhascompleted,checkingresultsResponseis{"colour":"purple","make":"Peugeot","model":"205","owner":"Michel"}我们通过检查fabric-sample/chaincode/fabcar查看智能合约代码,我们的应用调用函数智能合约支持,通过rpc支持的功能如下:initLedger用于创建和初始化10个CAR信息initLedger,queryCar,queryAllCars,createCar,changeCarOwnerAPP执行流程图更新账本信息更新账本信息类似于query在APP端,即通过智能合约提供的接口更新数据。目前提供的功能包括创建CAR和修改CAR的owner属性。我们可以通过修改invoke.js代码来调用不同的接口。varrequest={//targets:让默认给分配给客户端的peer'],chainId:'mychannel',txId:tx_id};执行结果:lydeiMac:fabcarly$nodeinvoke.js存储路径:/Users/ly/go/src/github.com/hyperledger/fabric-samples/fabcar/hfc-key-storeSuccessfullyloadeduser1frompersistenceAssigningtransaction_id:a5b684603b1f2a0296851409cecb143c3109220014182721165ef8fe5c326b2eTransactionproposalwasgoodSuccessfullysentProposalandreceivedProposalResponse:Status-200,message-"OK"Thetransactionhasbeencommittedonpeerlocalhost:7053SendtransactionpromiseandeventlistenerpromisehavecompletedSuccessfullysenttransaction成功提交到账本的更改创建后查询所有CAR信息,可以看到添加了CAR12信息[{"Key":"CAR0","Record":{"colour":"blue","make":"Toyota","model":"Prius","owner":"Tomoko"}},{"Key":"CAR1","Record":{"colour":"red","make":"Ford","model":"Mustang","owner":"Brad"}},{"Key":"CAR12","Record":{"colour":"Black","make":"Honda","model":"Accord","owner":"Tom"}},{"Key":"CAR2","Record":{"colour":"green","make":"Hyundai","model":"Tucson","owner":"JinSoo"}},{"Key":"CAR3","Record":{"colour":"yellow","make":"Volkswagen","model":"Passat","owner":"Max"}},{"Key":"CAR4","Record":{"colour":"black","make":"Tesla","model":"S","owner":"Adriana"}},{"Key":"CAR5","Record":{"colour":"purple","make":"Peugeot","model":"205","owner":"Michel"}},{"Key":"CAR6","Record":{"colour":"white","make":"Chery","model":"S22L","owner":"Aarav"}},{"Key":"CAR7","Record":{"colour":"violet","make":"Fiat","model":"Punto","owner":"Pari"}},{"Key":"CAR8","Record":{"colour":"indigo","make":"Tata","model":"Nano","owner":"Valeria"}},{"Key":"CAR9","Record":{"colour":"brown","make":"Holden","model":"Barina","owner":"Shotaro"}}]合约执行流程如图:-首先提交交易通过客户端-通过背书节点校验客户端校验后得到背书节点的响应——客户端将背书节点的响应结果提交给订单排序节点——排序节点创建区块后,广播给所有peer节点更新账本
