官方文档:https://hyperledger-fabric.readthedocs.io/en/release-1.1/write_first_app.html
作者:ethanlu(ethanlu@mail.ustc.edu.cn)
创建于:2018/7/18
最后修改:2018/8/2
部署之前,因为用过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-v8.9.4-linux-x64.tar.gz,安装版本为node8.9.4。(其他版本会报错)
wget https://nodejs.org/download/release/v8.9.4/node-v8.9.4-linux-x64.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/
这一步不要root权限执行
npm install
如果拉取镜像失败,提示缺少fabcar@1.0.0等。
下载链接中文件:https://download.csdn.net/download/qq_36357926/10112314
完成下载后放入fabcar\node_modules\grpc\src\node\extension_binary\node-v48-linux-x64\目录下即可。
6、现在调用startFabric.sh
来启动网络。
这一步需要sudo执行
./startFabric.sh
启动peer节点、Ordering节点、证书颁发机构以及CLI容器
initLedger
功能来向通道账本写入10个不同的汽车若成功之后出现下图:
7、实现enrollAdmin.js 的功能,会在fabcar目录下生成一个存放key的文件夹:hfc-key-store
此时需要切换git branch到release-1.0版本,否贼以下文件均不存在
生成管理员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 的,在这里,关键字是从CAR0
到CAR9
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
),并获得与该车相对应的制造厂商、型号、颜色和所有者。
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
成功则出现:
2、# don't rewrite paths for Windows Git Bash users
export MSYS_NO_PATHCONV=1
加一个sudo即可