超级账本发现之旅二:开始第一个程序
2017-08-25 00:00
267 查看
本文将通过超级账本 Fabric 网络展示如何使用区块链网络。最通用的一个层面, 就是区块链网络上的应用 会允许用户来查询账本(ledger),获取账本中包含的特定的记录, 或者更新这个账本, 例如对这个账本增加记录信息。
在这个例子中, 通过使用Node.js SDK 来和区块链交互, 其中包含下面三个步骤:
启动一个测试用的超级账本Fabric 区块链网络。 我们需要在区块链网络中有一些基本的组件, 以便能完成查询和更新账本的操作。 这些组件包括:
(1)一个peer 节点
(2)一个证书验证节点——这是整个网络的支柱和基础
(3)一个CLI 容器,用来执行一些带有权限的命令
学习例子中的智能合约以及参数。 例子中的智能合约包含一些函数, 以不同的方式来和账本进行交互。 例如, 我们可以全局的读取数据, 也可以查询更加细粒度层面的数据。
开发这个应用, 使得这个应用能够执行查询和更新操作。 会通过提供两个示例应用, 一个用来查询账本, 另一个用来更新账本。 应用程序会通过SDK API来和区块链网络进行交互, 并最终调用这些函数。
在读完本篇之后, 你会对应用程序如何借助Fabric SDK(本例中使用Node.js SDK), 通过编程的方式联合只能合约, 来和区块链网络中的账本进行交互。
下面, 开始超级账本之旅吧。
登陆系统之后, 打开命令行, 输入:cd fabric-samples/fabcar
lsfabcar 目录如下:
这是整个fabric-samples的目录结构, 需要了解这个目录结构, 是因为fabcar会执行其他目录中的命令:
现在,通过执行
启动一个peer 节点, ordering 节点,证书验证节点, 以及 CLI 容器
创建一个channel, 并把peer 节点加入到channel中
安装智能合约 (也就是 chaincode) 到 peer的文件系统中, 并初始化channel上的 chaincode;
调用
下面开始逐行分析这个脚本。
#!/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,启动了区块链的网络, 目前网络的拓扑结构大致如下:
下一步, 就是要通过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/Admin@org1.example.com/msp" peer0.org1.example.com peer channel create -o orderer.example.com:7050 -c mychannel -f /etc/hyperledger/configtx/channel.tx
#将peer0加入mychannel
docker exec -e "CORE_PEER_LOCALMSPID=Org1MSP" -e "CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/msp/users/Admin@org1.example.com/msp" peer0.org1.example.com peer channel join -b mychannel.block
现在区块链网络搭建完成, 返回之前的命令行:#通过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/Admin@org1.example.com/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/Admin@org1.example.com/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/Admin@org1.example.com/msp" cli peer chaincode invoke -o orderer.example.com:7050 -C mychannel -n fabcar -c '执行完invoke操作之后的命令行输出:
从命令行中可以看出, 10辆汽车信息已经存放到区块链中了。
区块链应用分析
首先,在命令行中输入:#docker ps可以看到目前有多少个docker 实例:
对于这些docker image 的具体信息以及用法, 后续的文章会给以分析。
应用分析
应用和Fabric 网络交互示意图:
如前所述, 这个例子中包含一个活跃的chaincode 容器, 以及一个预装了10辆汽车信息的账本。另外, 这个例子里面还有一个样例 Javascript 代码:
-query.js
可以用来查询账本中的汽车信息。
在进一步查看应用如何工作之前,首先需要安装一个SDK node 模块, 以便让我们的样例应用可以工作。 在fabcar 目录, 输入如下命令:
#sudo npm install
安装成功之后, 在命令行里面输入:
#sudo node query.js
在控制台就会输出这十辆车的信息:
看, 第一辆车,CAR0, 是Toyota 的Prius, owner 是Tomoko, 如果看到这一行, 说明已经可以执行查询了哦~!
今天先分析到这里,至于这个查询是如何执行的, chaincode 存放在什么位置, 下一期推送吧!
在这个例子中, 通过使用Node.js SDK 来和区块链交互, 其中包含下面三个步骤:
启动一个测试用的超级账本Fabric 区块链网络。 我们需要在区块链网络中有一些基本的组件, 以便能完成查询和更新账本的操作。 这些组件包括:
(1)一个peer 节点
(2)一个证书验证节点——这是整个网络的支柱和基础
(3)一个CLI 容器,用来执行一些带有权限的命令
学习例子中的智能合约以及参数。 例子中的智能合约包含一些函数, 以不同的方式来和账本进行交互。 例如, 我们可以全局的读取数据, 也可以查询更加细粒度层面的数据。
开发这个应用, 使得这个应用能够执行查询和更新操作。 会通过提供两个示例应用, 一个用来查询账本, 另一个用来更新账本。 应用程序会通过SDK API来和区块链网络进行交互, 并最终调用这些函数。
在读完本篇之后, 你会对应用程序如何借助Fabric SDK(本例中使用Node.js SDK), 通过编程的方式联合只能合约, 来和区块链网络中的账本进行交互。
下面, 开始超级账本之旅吧。
启动区块链网络
我们假定您已完成搭建环境的所有任务, 整个超级账本的环境是完全正常的。正常的超级账本环境界面如下:登陆系统之后, 打开命令行, 输入:cd fabric-samples/fabcar
lsfabcar 目录如下:
这是整个fabric-samples的目录结构, 需要了解这个目录结构, 是因为fabcar会执行其他目录中的命令:
现在,通过执行
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,启动了区块链的网络, 目前网络的拓扑结构大致如下:
下一步, 就是要通过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/Admin@org1.example.com/msp" peer0.org1.example.com peer channel create -o orderer.example.com:7050 -c mychannel -f /etc/hyperledger/configtx/channel.tx
#将peer0加入mychannel
docker exec -e "CORE_PEER_LOCALMSPID=Org1MSP" -e "CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/msp/users/Admin@org1.example.com/msp" peer0.org1.example.com peer channel join -b mychannel.block
现在区块链网络搭建完成, 返回之前的命令行:#通过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/Admin@org1.example.com/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/Admin@org1.example.com/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/Admin@org1.example.com/msp" cli peer chaincode invoke -o orderer.example.com:7050 -C mychannel -n fabcar -c '执行完invoke操作之后的命令行输出:
从命令行中可以看出, 10辆汽车信息已经存放到区块链中了。
区块链应用分析
首先,在命令行中输入:#docker ps可以看到目前有多少个docker 实例:
对于这些docker image 的具体信息以及用法, 后续的文章会给以分析。
应用分析
应用和Fabric 网络交互示意图:
如前所述, 这个例子中包含一个活跃的chaincode 容器, 以及一个预装了10辆汽车信息的账本。另外, 这个例子里面还有一个样例 Javascript 代码:
-query.js
可以用来查询账本中的汽车信息。
在进一步查看应用如何工作之前,首先需要安装一个SDK node 模块, 以便让我们的样例应用可以工作。 在fabcar 目录, 输入如下命令:
#sudo npm install
安装成功之后, 在命令行里面输入:
#sudo node query.js
在控制台就会输出这十辆车的信息:
看, 第一辆车,CAR0, 是Toyota 的Prius, owner 是Tomoko, 如果看到这一行, 说明已经可以执行查询了哦~!
今天先分析到这里,至于这个查询是如何执行的, chaincode 存放在什么位置, 下一期推送吧!
相关文章推荐
- 开始写第一个程序。。
- 对一个长度为100000条指令的程序进行集成测试期间记录如下面的数据: (A)7月1日集成测试开始没有发现错误 (B)8月2日总共改正了100个错误,此时MTTF=0.4H (C)9月1日:总共改正3
- 开始iOS第一个程序的学习
- [置顶] 开始吧!Arduino 少年(安装,编译,第一个程序)
- 独立完成的第一个c程序,虽然很简单,但是一个开始
- 2级C语言可能没过,数据结构必须开始,第一个目标手写程序突破100行
- 开始写程序,发现自己很弱智
- 快速开始,第一个量子程序
- s3c2410上搭建QT/Embedded4.8.5开发环境(七)--命令行开始第一个Qt程序
- 为了忘却的纪念----开始从操就业的第一个SHELL程序
- 线程,是不是打破了“程序是顺序执行“的真谛?如一个main函数中,顺序定义了二个线程,并启动,第一个线程还没执行完,第二个线程就开始执行了
- Hadoop学习6--里程碑式的开始之执行第一个程序wordcount
- Apache开始第一个cgi程序
- 汇编语言: 试编制一个程序:从键盘输入一行字符,要求第一个键入的字符必须是空格符,如不 是,则退出程序;如是,则开始接收键入的字符并顺序存放在首地址为buffer的缓冲区中(空 格符不存入),直到接收
- 开始学习python了,第一个程序是一个逆波兰式的表达式分析器
- 开始玩hadoop8--hadoop 2.6.0实战(第一个reduce程序,ubuntu 14.04)倒排索引
- 开始第一个Qt程序
- 第一个C程序从今天开始学习记录
- 新开始,第一个MFC程序
- 【python之旅】第一个python程序,当然得从 Hello World 开始喽