搭建账本Fabric-sample fabcar(三)

 本文参照官方文档测试fabcar基本功能

官方文档:https://hyperledger-fabric.readthedocs.io/en/release-1.1/write_first_app.html

作者:ethanlu([email protected])

创建于:2018/7/18

最后修改:2018/8/2

1、用例搭建:

部署之前,因为用过e2e和first-network,所以需要清空一下docker,,执行下面三步:

1# docker rm -f $(docker ps -aq)

 # Press 'y' when prompted by the command

2# docker network prune
3# docker rmi dev-peer0.org1.example.com-fabcar-1.0-5c906e402ed29f20260ae42283216aa75549c571e2e380f3615826365d8269ba

 最后检查下:

docker ps -a

若无镜像,则显示docker ps目录为空

 方可开始下列步骤

1、安装npm和node:

下载地址:https://nodejs.org/download/release/v8.9.4/,安装版本为node-v6.9.5-linux.tar.gz。下载后解压:

tar -zxf node-v8.9.4-linux-x64.tar.gz

 移动到通用的软件安装目录/opt/

sudo mv node-v8.9.4-linux-x64 /opt

 安装npm和node:

ln -s /opt/node-v8.9.4-linux-x64/bin/node /usr/local/bin/node
ln -s /opt/node-v8.9.4-linux-x64/bin/npm /usr/local/bin/npm

 查看版本号:node为8.94则不会报错,其他版本会报错,错误在问题解决处

node -v
npm -v

3、选择clone fabric-samples的工作目录,运行clone命令,并进入fabcar子目录

git clone https://github.com/hyperledger/fabric-samples.git
cd fabric-samples/fabcar

basic-network:实现的是搭建基本的网络(创建channel,peer0等等)。都已经封装写好,start.sh脚本文件就可以实现,我们这里也不需要运行该脚本。

chaincode:该文件夹下的fabcar中的fabcar.go是这个例子中的智能合约。实现了初始化账本,创建汽车,查询汽车,改变汽车的所属者等等。

fabcar:该文件夹下有enrollAdmin.js  registerUser.js query.js  invoke.js startFabric.sh  package.json 

分别实现注册管理,查询等,需求包,启动部署脚本。       

4、这个子目录 - fabcar - 包含运行示例程序的脚本以及程序代码。在该目录运行ls命令,您应该会看到以下内容:

5、在我们查看该应用程序的工作原理之前,我们需要安装SDK模块才能让程序运行。在fabcar目录中,运行下面的命令:

npm config set registry http://registry.npm.taobao.org/
npm install

 如果拉取镜像失败,提示缺少[email protected]等。

下载链接中文件:https://download.csdn.net/download/qq_36357926/10112314

完成下载后放入fabcar\node_modules\grpc\src\node\extension_binary\node-v48-linux-x64\目录下即可。

6、现在调用startFabric.sh来启动网络。

./startFabric.sh
  • 启动peer节点、Ordering节点、证书颁发机构以及CLI容器

  • 创建一个通道,并将peer加入该通道
  • 将智能合约(即链码)安装到peer节点的文件系统上,并在通道上实例化该链码;实例化会启动链码容器
  • 调用initLedger功能来向通道账本写入10个不同的汽车

若成功之后出现下图:

7、实现enrollAdmin.js 的功能,会在fabcar目录下生成一个存放key的文件夹:hfc-key-store

生成管理员Admin账户

node enrollAdmin.js 

若成功会出现以下:

 8、实现registerUser.js,生成用户账户

node registerUser.js

若成功则出现以下界面: 

8、现在我们可以运行JavaScript程序。首先,运行query.js 程序,返回账本上所有汽车列表。应用程序中预先加载了一个queryAllCars函数,用于查询所有车辆,因此我们可以简单地运行程序:

node query.js

返回应如下:

 这里有10辆车,一辆属于Adriana的黑色Tesla Model S、一辆属于Brad的红色Ford Mustang、一辆属于Pari的紫罗兰色Fiat Punto等等。账本是基于Key/Value 的,在这里,关键字是从CAR0CAR9

9、现在让我们来看看代码内容。使用编辑器(例如atom或visual studio)打开query.js程序。

应用程序的初始部分定义了变量,如链码,通道名称和网络端点:

var options = {
    wallet_path : path.join(__dirname, './network/creds'),
    user_id: 'PeerAdmin',
    channel_id: 'mychannel',
    chaincode_id: 'fabcar',
    network_url: 'grpc://localhost:7051',

构建查询的代码块:

// queryCar - requires 1 argument, ex: args: ['CAR4'],
// queryAllCars - requires no arguments , ex: args: [''],
const request = {
    chaincodeId: options.chaincode_id,
    txId: transaction_id,
    fcn: 'queryAllCars',
    args: ['']

我们将chaincode_id变量赋值为fabcar- 这让我们定位到这个特定的链码 - 然后调用该链码中定义的queryAllCars函数。

10、现在我们返回query.js程序并编辑请求构造函数以查询特定的车辆。为达此目的,我们将函数queryAllCars更改为queryCar并将特定的“Key” 传递给args参数。在这里,我们使用CAR4。 所以我们编辑后的query.js程序现在应该包含以下内容:

const request = {
    chaincodeId: options.chaincode_id,
    txId: transaction_id,
    fcn: 'queryCar',
    args: ['CAR4']

11、保存程序并返回fabcar目录。现在再次运行程序:

node query.js

运行成功则出现以下结果:

{"colour":"black","make":"Tesla","model":"S","owner":"Adriana"}

这样,我们就从查询所有车变成了只查询一辆车:Adriana的黑色Tesla Model S。使用queryCar函数,我们可以查询任意关键字(例如CAR0),并获得与该车相对应的制造厂商、型号、颜色和所有者。

2、账本分析:

1、查询账本:

查询是指如何从账本中读取数据。您可以查询单个或者多个键的值,如果账本是以类似于JSON这样的数据存储格式写入的,则可以执行更复杂的搜索(如查找包含某些关键字的所有资产)。

2、查询账本

下图演示本应用程序如何在链码中调用不同功能:

 我们可以看到我们用过的queryAllCars函数,还有一个叫做createCar,这个函数可以让我们更新账本,并最终在链上增加一个新区块。但首先,让我们做另外一个查询。

遇到问题:

1async_createOrUpdateChannel(request,have_envelope) 


解决方案,1、将npm换成8.9.4 链接:https://nodejs.org/download/release/v8.9.4/

        2、执行以下代码,此时会提示node和npm文件已经存在,根据文件位置rm -rf删掉即可。

ln -s /opt/node-v8.9.4-linux-x64/bin/node /usr/local/bin/node
ln -s /opt/node-v8.9.4-linux-x64/bin/npm /usr/local/bin/npm

3、执行以下代码,会出现

node enrollAdmin.js

4、执行以下代码:

npm rebuild

5、重新执行:

node enrollAdmin.js

成功则出现:

 

猜你喜欢

转载自blog.csdn.net/weixin_34960892/article/details/81116646