超级账本发现之旅二:开始第一个程序

本文将通过超级账本 Fabric 网络展示如何使用区块链网络。最通用的一个层面, 就是区块链网络上的应用 会允许用户来查询账本(ledger),获取账本中包含的特定的记录, 或者更新这个账本, 例如对这个账本增加记录信息。

    在这个例子中, 通过使用Node.js SDK 来和区块链交互, 其中包含下面三个步骤:

  1. 启动一个测试用的超级账本Fabric 区块链网络。 我们需要在区块链网络中有一些基本的组件, 以便能完成查询和更新账本的操作。 这些组件包括:

    (1)一个peer 节点

    (2)一个证书验证节点——这是整个网络的支柱和基础

    (3)一个CLI 容器,用来执行一些带有权限的命令



  2. 学习例子中的智能合约以及参数。 例子中的智能合约包含一些函数, 以不同的方式来和账本进行交互。 例如, 我们可以全局的读取数据, 也可以查询更加细粒度层面的数据。

  3. 开发这个应用, 使得这个应用能够执行查询和更新操作。 会通过提供两个示例应用, 一个用来查询账本, 另一个用来更新账本。 应用程序会通过SDK API来和区块链网络进行交互, 并最终调用这些函数。



在读完本篇之后, 你会对应用程序如何借助Fabric SDK(本例中使用Node.js SDK), 通过编程的方式联合只能合约, 来和区块链网络中的账本进行交互。


下面, 开始超级账本之旅吧。


启动区块链网络


超级账本发现之旅二:开始第一个程序_第1张图片


登陆系统之后, 打开命令行, 输入:

cd fabric-samples/fabcar
ls

fabcar 目录如下:

超级账本发现之旅二:开始第一个程序_第2张图片

这是整个fabric-samples的目录结构, 需要了解这个目录结构, 是因为fabcar会执行其他目录中的命令:

超级账本发现之旅二:开始第一个程序_第3张图片


现在,通过执行 startFabric.sh 这个脚本来启动区块链网络

./startFabric.sh

注意, 在这个脚本中,会执行一系列的操作, 主要有:


  • 启动一个peer 节点, ordering 节点,证书验证节点, 以及 CLI 容器

  • 创建一个channel, 并把peer 节点加入到channel中

  • 安装智能合约 (也就是 chaincode) 到 peer的文件系统中, 并初始化channel上的 chaincode; 

  • 调用initLedger 函数, 把10辆不同的汽车数据填充到这个channel的账本中。


下面开始逐行分析这个脚本。
#!/bin/bash
# Exit on first error, set命令作用主要是显示系统中已经存在的shell变量,以及设置shell变量的新变量值。使用set更改shell特性时,符号"+"和"-"的作用分别是打开和关闭指定的模式。-e表示,若指令传回值不等于0,则立即退出shell。

set -e
# 设置时间
starttime=$(date +%s)

#准备证书目录
if [ ! -d ~/.hfc-key-store/ ]; then
mkdir ~/.hfc-key-store/
fi
#这是把证书信息复制到对应目录,这一步是建立CA的关键
cp $PWD/creds/* ~/.hfc-key-store/
# 进入basic-network目录, 开启区块链网络, 创建渠道,并把节点加入进去
./start.sh


先来看看这个start.sh里面都做了哪些工作。


set -ev
#先停掉之前启动的网络
docker-compose -f docker-compose.yml down
#在这一行里,传入ca、orderer、peer0 以及一个couchdb存储的容器, 启动网络
docker-compose -f docker-compose.yml up -d ca.example.com orderer.example.com peer0.org1.example.com couchdb

通过Docker,启动了区块链的网络, 目前网络的拓扑结构大致如下:

超级账本发现之旅二:开始第一个程序_第4张图片


下一步, 就是要通过CLI 来安装和启动chaincode

#启动cli 容器
docker-compose -f ./docker-compose.yml up -d cli
#创建channel, 指定在peer0上创建mychannel 渠道,并传入目标的orderer节点
docker exec -e "CORE_PEER_LOCALMSPID=Org1MSP" -e "CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/msp/users/[email protected]/msp" peer0.org1.example.com peer channel create -o orderer.example.com:7050 -c mychannel -f /etc/hyperledger/configtx/channel.tx

超级账本发现之旅二:开始第一个程序_第5张图片

#将peer0加入mychannel
docker exec -e "CORE_PEER_LOCALMSPID=Org1MSP" -e "CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/msp/users/[email protected]/msp" peer0.org1.example.com peer channel join -b mychannel.block

超级账本发现之旅二:开始第一个程序_第6张图片

现在区块链网络搭建完成, 返回之前的命令行:

#通过Cli , 安装智能合约
docker exec -e "CORE_PEER_LOCALMSPID=Org1MSP" -e "CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/[email protected]/msp" cli peer chaincode install -n fabcar -v 1.0 -p github.com/fabcar


#通过cli, 初始化智能合约
docker exec -e "CORE_PEER_LOCALMSPID=Org1MSP" -e "CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/[email protected]/msp" cli peer chaincode instantiate -o orderer.example.com:7050 -C mychannel -n fabcar -v 1.0 -c '
{"Args":[""]}' -P "OR ('Org1MSP.member','Org2MSP.member')"


#通过Cli, 执行一次invoke 调用, 在区块链网络中添加10辆汽车信息
docker exec -e "CORE_PEER_LOCALMSPID=Org1MSP" -e "CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/[email protected]/msp" cli peer chaincode invoke -o orderer.example.com:7050 -C mychannel -n fabcar -c '

执行完invoke操作之后的命令行输出:

超级账本发现之旅二:开始第一个程序_第7张图片


从命令行中可以看出, 10辆汽车信息已经存放到区块链中了。


区块链应用分析


首先,在命令行中输入:

#docker ps

可以看到目前有多少个docker 实例:

超级账本发现之旅二:开始第一个程序_第8张图片


对于这些docker image 的具体信息以及用法, 后续的文章会给以分析。


应用分析


应用和Fabric 网络交互示意图:

超级账本发现之旅二:开始第一个程序_第9张图片


如前所述,  这个例子中包含一个活跃的chaincode 容器, 以及一个预装了10辆汽车信息的账本。另外, 这个例子里面还有一个样例 Javascript 代码:

    -query.js

可以用来查询账本中的汽车信息。

    在进一步查看应用如何工作之前,首先需要安装一个SDK node 模块, 以便让我们的样例应用可以工作。 在fabcar 目录, 输入如下命令:

    

#sudo npm install


安装成功之后, 在命令行里面输入:


#sudo node query.js


在控制台就会输出这十辆车的信息:

超级账本发现之旅二:开始第一个程序_第10张图片


看, 第一辆车,CAR0, 是Toyota 的Prius, owner 是Tomoko, 如果看到这一行, 说明已经可以执行查询了哦~!

    今天先分析到这里,至于这个查询是如何执行的, chaincode 存放在什么位置, 下一期推送吧!


0?wx_fmt=jpeg

0?wx_fmt=jpeg


你可能感兴趣的:(超级账本发现之旅二:开始第一个程序)