HyperLedger Fabcar 学习笔记(基于超级帐本编写第一个应用)

HyperLedger Fabcar 学习笔记(基于超级帐本编写第一个应用)

翻译自:http://hyperledger-fabric.rea...html

编写第一个应用程序

咱们须要实现以下三个步骤node

  1. 首先设置一个开发环境
  2. 学习一些简单的咱们app将会用到的智能合约的参数
  3. 开发一个app可以更新查询一个帐本

设置开发环境

  1. 首先确保必备的fabric image等已经安装成功,若是没有安装,请参考(https://hyperledger-fabric.re...
  2. 下载fabric-samples,而且安装必备的运行工具。(参考地址:https://hyperledger-fabric.re...
  3. 上述步骤若是不想看英文的同窗,能够参考(搭建第一个超级帐本网络的方法)https://segmentfault.com/a/11...
  4. 若是按照创建超级帐本网络的教程运行,可能会启动着一个网络,会对接下来的流程有影响,须要关闭网络。

    ./byfn.sh -m downgit

  5. 进入到fabric-sample/fabcar目录下:这是一个关于car(汽车)交易的appgithub

    cd fabric-samples/fabcar  && ls
    显示结果
    enrollAdmin.js     invoke.js       package.json    query.js        registerUser.js startFabric.sh
  6. 杀死当前运行的全部docker 镜像服务

    docker rm -f $(docker ps -aq)golang

  7. 清除全部缓存网络
    docker network prune
  8. 若是已经运行过此教程,还须要执行以下操做,删除chaincode镜像,若是第一次运行是不会有的
    docker rmi dev-peer0.org1.example.com-fabcar-1.0-5c906e402ed29f20260ae42283216aa75549c571e2e380f3615826365d8269ba

安装客户端并登陆网络

  1. 首先要确保fabric-ca-client和fabric-client是否已经准备好了,这两个module是Node.js访问超级帐本网络的SDKdocker

    npm install fabric-client
    npm install fabric-ca-clientnpm

    • 此时会在fabcar目录下显示node_module目录以及一个package.json的文件。此部分若是不理解能够学习node.js相关知识。
  2. 经过命令建立一个超级帐本网络

    ./startFabric.sh #运行golang编写的chaincodejson

  • 说明:此脚本会建立建立一个超级帐本网络,包括ca-server peer order等节点,安装并实例化了chaincode。
    ./startFabric.sh node#运行node.js编写的chaincode

App如何使用网络

建立Admin用户

  1. 首先应用的admin用户应该向ca-server发送一个证书登记请求,接受一个对于这个user的登记证书(eCert),后续咱们会根据使用这个admin注册和认证一个新的user。命令以下:

    node enrollAdmin.jssegmentfault

    命令执行成功会建立一个hfc-key-store目录,目录中存放admin的身份标示,一对公私密钥。promise

建立普通User用户

  1. 建立一个普通用户user1,这个用户用来查询和更新帐本。admin用户身份用来建立user1用户。执行以下命令:

    node registerUser.js

查询帐本信息

  1. 执行查询命令查询当前汽车信息

    node query.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":"Jin Soo"}},{"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"}}]
  2. 咱们能够尝试修改query.js后再次运行脚本

    const request = {
    //targets : --- letting this default to the peers assigned to the channel
        chaincodeId: 'fabcar',
        fcn: 'queryCar',    //此处修改成查询单个CAR信息
        args: ['CAR5']        //经过修改参数查询指定的CAR信息
    };
    显示结果以下
    Store path:/Users/ly/go/src/github.com/hyperledger/fabric-samples/fabcar/hfc-key-store
    Successfully loaded user1 from persistence
    Query has completed, checking results
    Response is  {"colour":"purple","make":"Peugeot","model":"205","owner":"Michel"}
  3. 咱们经过查看fabric-sample/chaincode/fabcar 查看智能合约代码,咱们的app就是调用了智能合约中支持的函数,经过rpc方式。支持函数以下:initLedger用于建立初始化的10个CAR信息

    initLedger, queryCar, queryAllCars, createCar, and changeCarOwner.
  4. APP执行流程图

更新帐本信息

  1. 更新帐本信息在APP侧和查询类似,就是经过智能合约提供的接口更新数据。当前提供的功能包括建立CAR,以及修改CAR的owner属性。咱们能够经过修改invoke.js代码实现对不一样接口的调用。

    var request = {
            //targets: let default to the peer assigned to the client
            chaincodeId: 'fabcar',
            fcn: 'createCar',
            args: ['CAR12', 'Honda', 'Accord', 'Black', 'Tom'],
            chainId: 'mychannel',
            txId: tx_id
        };
    执行结果:
    lydeiMac:fabcar ly$ node invoke.js 
    Store path:/Users/ly/go/src/github.com/hyperledger/fabric-samples/fabcar/hfc-key-store
    Successfully loaded user1 from persistence
    Assigning transaction_id:  a5b684603b1f2a0296851409cecb143c3109220014182721165ef8fe5c326b2e
    Transaction proposal was good
    Successfully sent Proposal and received ProposalResponse: Status - 200, message - "OK"
    The transaction has been committed on peer localhost:7053
    Send transaction promise and event listener promise have completed
    Successfully sent transaction to the orderer.
    Successfully committed the change to the ledger by the peer
  2. 建立后查询全部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":"Jin Soo"}},{"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"}}]
  3. 合约执行流程如图:

- 先经过客户端提交交易
- 经过背书节点检查后,客户端获得背书节点响应
- 客户端将背书节点响应结果提交给order排序节点
- order节点建立区块后,广播给全部的peer节点更新帐本
相关文章
相关标签/搜索