Hyperledger Fabric教程–运行FabCar应用程序
前期准备:安装二进制文件fabric-ca-client、fabric-ca-server(版本1.5.2,https://github.com/hyperledger/fabric-ca/releases/tag/v1.5.2)
下载好后解压到fabric-samples/bin
目录下
一、启动Fabric网络(https://hyperledger-fabric.readthedocs.io/zh_CN/latest/write_first_app.html)
进入fabric-samples/fabcar目录下,执行:
./startFabric.sh javascript
此命令将部署两个peer节点和一个排序节点的Fabric测试网络。我们将使用证书颁发机构(CA)启动测试网络,而不是使用cryptogen工具。我们将使用这些CA的其中一个来创建证书以及一些key,这些加密资料将在之后的步骤中被我们的应用程序使用。startFabric.sh脚本还将部署和初始化在mychannel 通道上的FabCar智能合约的JavaScript版本,然后调用智能合约来把初始数据存储在帐本上。
startFabric.sh 脚本中调用了fabric-samples/test-network
中的network.sh脚本,启动CA服务,设置状态数据库为couchdb,安装链码并调用initLedger函数
删除存放身份证书的目录
二、安装应用程序依赖
进入fabric-samples/fabcar/javascript目录下,执行:
npm install
fabric-network类(https://hyperledger.github.io/fabric-sdk-node/release-2.2/module-fabric-network.html):它使得应用程序可以使用身份、钱包和连接到通道的网关,以及提交交易和等待通知。本教程也将使用fabric-ca-client类来注册用户以及他们的授权证书,生成一个fabric-network在后边会用到的合法身份。
三、登记管理员用户
在fabric-samples/fabcar/javascript
目录下,执行:
node enrollAdmin.js
当我们创建网络的时候,一个管理员用户(admin)被证书授权服务器(CA)创建成了 注册员。我们第一步要使用enrollAdmin.js程序为admin生成私钥、公钥和x.509证书。这个程序使用一个证书签名请求(CSR)——现在本地生成公钥和私钥,然后把公钥发送到CA ,CA会发布会一个让应用程序使用的证书。这三个证书会保存在钱包中,以便于我们以管理员的身份使用CA。
四、注册和登记应用程序用户
在fabric-samples/fabcar/javascript
目录下,执行:
node registerUser.js
我们可以创建一个新的应用程序用户,它将被用于与区块链交互。现在,我们有了两个独立用户的身份—— admin和appUser ——它们可以被我们的应用程序使用。
五、查询帐本
在fabric-samples/fabcar/javascript目录下,执行:
node query.js
加载网络配置信息=>创建一个新的基于文件系统的Wallets实例,用于管理身份=>创建Gateway实例用于连接peer节点=
首先,程序使用Wallet类从文件系统获取应用程序用户身份文件。
const identity = await wallet.get('appUser');
有了身份文件,应用程序就使用Gateway类连接到test-network网络。
const gateway = new Gateway();
await gateway.connect(ccpPath, {
wallet, identity: 'appUser', discovery: {
enabled: true, asLocalhost: true }});
ccpPath 描述了连接配置文件的路径,我们的应用程序将使用该配置文件连接到我们的网络。 连接配置文件从fabric-samples/test-network目录中被加载进来,并解析为JSON文件。Identity提供的Wallet中的身份匹配的标签。
const ccpPath = path.resolve(__dirname, '..', '..', 'test-network','organizations','peerOrganizations','org1.example.com', 'connection-org1.json');
是将应用程序连接到网络中特定的通道mychannel 上。
const network = await gateway.getNetwork('mychannel');
通过 FabCar 智能合约来和账本进行交互。
const contract = network.getContract('fabcar');
const result = await contract.evaluateTransaction('queryAllCars');
evaluateTransaction方法代表了一种区块链网络中和智能合约最简单的交互,它根据配置文件中的定义连接一个节点,然后向节点发送请求,请求内容将在节点中执行。智能合约查询节点账本上的所有汽车,然后把结果返回给应用程序,这次交互没有导致账本的更新。
六、更新帐本
在fabric-samples/fabcar/javascript目录下
,执行:
node invoke.js
await contract.submitTransaction(‘createCar’, ‘CAR12’, ‘Honda’, ‘Accord’, ‘Black’, ‘Tom’);
submitTransaction比evaluateTransaction 更加复杂。除了跟一个单独的peer进行互动外,SDK 会将submitTransaction 提案发送给在区块链网络中的每个需要的组织的peer。其中的每个 peer将会使用这个提案来执行被请求的智能合约,以此来产生一个建议的回复,它会为这个回复签名并将其返回给SDK。SDK搜集所有签过名的交易反馈到一个单独的交易中,这个交易会被发送给排序节点。排序节点从每个应用程序那里搜集并将交易排序,然后打包进一个交易的区块中。接下来它会将这些区块分发给网络中的每个peer,在那里每笔交易会被验证并提交。最后,SDK 会被通知,这允许它能够将控制返回给应用程序。