Hyperledger Fabric Node SDK和客户端应用程序演练

萨尔曼·达巴库蒂(Salman Dabbakuti)Designecologist在pexels中的照片

Hyperledger Fabric是基于容器的区块链框架,用于使用旨在使其模块化的即插即用组件来开发去中心化应用程序。这并不意味着我们不能在本地创建网络组件(对等和订购者)。但这不是软件的分发方式。但是,chaincode当前仅支持dockerized(沙盒)环境。

在上一篇文章中,我描述了Nodejs链码的核心组件和实现。我们已经设置了开发环境,开发了链代码,并在本地启动和运行了所有程序。我们通过CLI容器安装并调用了所有chaincode函数。一切看起来都很好。怎么办?这就是我们想要的一切吗?当然不是 我们根本不应该感到满意。我们需要做更多。作为开发人员,我们的目标是用户。毕竟,用户是否坐在那里并运行相应的docker命令以执行特定操作..?否。我们需要使用可点击的操作来构建简洁的图形界面。

自从最近发布Hyperledger Fabric 1.4最新版本以来,人们渴望使用Fabric来构建应用程序来解决其业务问题。但是,由于配置中光纤的复杂性,许多人在构建网络时遇到困难。如果那是一定程度的复杂性,那么构建中间件和客户端也是相同的。这是因为网络已获得许可,所以您无法直接访问Network API。您需要提供正确的身份和证书才能访问网络。证书颁发机构(CA)可以使用Hyperledger Fabric SDK向外部人员提供此证书。但是,官方文档中有一个很好的教程“编写您的第一个应用程序”,其中介绍了有关客户端应用程序的关键组件。在本文中,我将解释Hyperledger Fabric Node SDK中可用的各种模块,以及网络外部各种参与者颁发证书所涉及的代码演练,以及Fabric Node SDK如何提供除容器化环境之外的与Chaincode交互的访问权限。

连接配置文件

连接配置文件允许客户端与网络连接。连接配置文件描述了对等方,订购者和证书颁发机构的整个网络拓扑,以及哪些对等方是通道的一部分以及它们的位置。因此,无论何时客户端提交事务,都将使用连接配置文件中为特定通道定义的配置,在所有对等方上进行填充。您只能使用正确的连接配置文件连接到网络。连接配置文件通常由了解网络拓扑的管理员创建。连接配置文件在将客户端连接到网络中起关键作用。这是有关连接配置文件的结构说明。

在下一节中,我们将逐步介绍一些代码。因此,作为前提条件,我们需要对Hyperledger Fabric SDK中使用的模块,各种类和方法有基本的了解。因此,不建议跳过本节。

SDK包含三个主要模块

1.fabric-network:

该模块提供了用于与已部署的链码进行交互的高级API。交互包括提交事务和查询。

2.fabric-ca-client:

该模块提供各种认证操作,例如用户注册和注册,网络上的重新注册。

3.fabric-client:

该模块提供网络级别的操作,例如创建通道,将对等方加入通道,安装和实例化链代码,提交事务和查询链代码,查询事务详细信息,块高度,已安装的链代码等等。

即使fabric-client能够执行许多操作,对于客户端应用程序,仍建议使用fabric-network API,以使客户端应用程序与部署到Fabric网络的智能合约进行交互。因为客户端应用程序的大多数密钥类只能从结构网络继承。

光纤网络主要分为三类

1.网关

结构网络模块中的网关类用于连接运行中的结构网络并与之交互。此类包含各种方法。那些是,

一种。连接:

该方法使用对等者及其在连接配置文件中定义的IP地址(使用现有用户或Admin身份)连接正在运行的光纤网络。

b。断开:

此方法会断开与正在运行的光纤网络的连接并清理缓存。

C。 getClient:

此方法将当前注册的客户详细信息作为对象返回。

d。 getNetwork:

此方法与网络中的指定通道通信。

e。 getContract方法将有权访问连接配置文件中定义的网络顶部的通道中的特定方法。

F。 SubmitTransaction方法将向对等端(背书人)提交指定的链码方法和参数。

G。 validateTransaction与HTTP请求中的GET方法类似,它只能读取分类帐状态,并用于链码中的查询方法。

2. FileSystemWallet

此类定义了持久存储在结构文件系统中的身份钱包的实现。此类包含一些常见的方法存在,导入,删除。

一种。存在:

此方法检查文件系统中是否存在提供的标识。

b。进口:

此方法将生成的x509证书和密钥导入文件系统钱包。

C。删除:

此方法从文件系统钱包中删除特定用户的身份。

3. X509WalletMixin

基本上,CA以PKI格式(公钥基础结构)提供注册证书。此类用于使用PKI用户证书在x509凭据模型中创建身份。此类包括用于创建身份的createIdentity()方法。 X509证书用于在网络中签署交易。

fabric-ca-client具有用于CA操作的几种常用方法。这些是注册,注册,重新注册。

一种。寄存器:

此方法用于注册新参与者。注册成功后,将返回用户密码。注册时需要提供此秘密。

b。注册:

此方法用于在网络中注册已注册的参与者。为了注册,必须先注册用户。如果注册成功,则此方法将返回基于PKI的用户证书和私钥。

C。重新注册:

在某些情况下,证书将过期或受到破坏(因此必须将其吊销)。因此,这就是重新注册的时候,您又使用CA重新注册了相同的身份,以使用此方法获得新证书。

在代码演练的这一部分中,我们将看一看fabcar客户端应用程序。因此,请确保您正在查看此代码或克隆整个存储库,然后切换到本地克隆中的fabcar / javascript目录。您应该看到enrollAdmin.js,registerUser.js,invoke.js和query.js。这些是要查看的主要文件。这里的enrollAdmin.js用于在网络上注册Admin用户。当我们创建网络时,CA的管理员用户将创建为admin,秘密创建为adminpw。因此,我们只需要通过提供这些凭据来注册Admin。一旦注册了admin用户,便会向该admin用户颁发基于PKI的公钥和私钥,然后还将颁发基于x509的加密货币证书。然后,这三个凭证将导入到钱包中。

首先让我们打开enrollAdmin.js,但是,代码被巧妙地注释掉了。我们将回忆起到目前为止所学到的知识。

在这里,第7和第8行从fabric-network导入fabric-ca-client和类FileSystemWallet,X509WalletMixin。

const FabricCAServices = require('fabric-ca-client'); const {FileSystemWallet,X509WalletMixin} = require('fabric-network');

从第12行到第14行,定义了连接配置文件的绝对路径,并将连接配置文件的内容解析为JSON。该连接配置文件包含有关网络各个参与者的足够信息。该连接配置文件广泛用于与网络连接。

const ccpPath = path.resolve(__ dirname,'..','..','first-network','connection-org1.json');
const ccpJSON = fs.readFileSync(ccpPath,'utf8');
const ccp = JSON.parse(ccpJSON);

在主要功能的第20至24行中,使用连接配置文件配置定义了网络中使用的证书颁发机构。如果您可以看到第一个网络中的连接配置文件,则文件的底行有一个对象certificateAuthorities,其中包含与CA有关的所有信息。将使用连接配置文件中定义的url和caName创建FabricCAServices的新实例,并准备注册Admin。如果管理员注册成功,此ca实例也可以用于注册用户。

const caInfo = ccp.certificateAuthorities(‘ca.org1.example.com’);
const caTLSCACerts = caInfo.tlsCACerts.pem;
const ca = new FabricCAServices(caInfo.url,{trustRoots:caTLSCACerts,verify:false},caInfo.caName);

从第24行到第30行,将在当前目录中创建一个新的目录钱包。将创建一个新的Fabric FileSystemWallet实例,供钱包检查和导入身份。从第30行到第34行,它将使用FileSystemWallet类的exist方法检查管理员用户是否在钱包中。如果身份管理员不存在,它将继续进行注册。

const walletPath = path.join(process.cwd(),'wallet');
const wallet =新的FileSystemWallet(walletPath);
console.log(`钱包路径:${walletPath}`); //检查我们是否已经注册了管理员用户。
const adminExists =等待wallet.exists(“ admin”);
如果(adminExists){
console.log(“钱包中已经存在管理员用户admin的身份”);
返回;
}

在第37行中,使用enrollmentID和enrollmentSecret作为参数对象调用了fabric-ca-client模块的enroll方法。如前所述,如果enroll方法成功,它将返回基于PKI的证书的对象和已注册admin的私钥。

const enrollment = await ca.enroll({enrollmentID:'admin',enrollmentSecret:'adminpw'});

在第38行中,将通过提供先前注册中生成的证书和私钥作为createIdentity()方法的参数,为管理员创建x509身份标准。

const identity = X509WalletMixin.createIdentity('Org1MSP',enrollment.certificate,enrollment.key.toBytes());

成功执行此方法后,它将返回基于X509的加密货币签名证书。该证书可广泛用于注册新用户。在第39行中,然后将先前生成的PKI证书和x509签名证书导入钱包。

等待wallet.import('admin',身份);

注册用户:

我们已经知道,新用户的注册只能由CA进行,并且应该具有正确的x509标准签名证书才能为新用户颁发身份。在上一部分代码中,我们已经了解了如何完成管理员注册以及为管理员颁发了x509签名证书。相同的方法将应用于注册用户。为此,需要先注册用户。虽然registerUser.js中的大部分代码与enrollAdmin.js相似,但我们将逐步介绍registerUser.js中的一些新内容。因此,打开registerUser.js并在这里看第36行,来自fabric-network模块的Gateway类用于连接网络。众所周知,只有授权的参与者才能访问网络。在这种情况下,CA管理员已被授权,因此我们可以使用CA管理员身份连接网络。在下一行中,网关使用钱包中的连接配置文件和管理员身份启动到我们网络的连接。它说网关在我们的网络在本地运行时寻找本地主机(asLocalhost:true)。

const gateway = new Gateway();

等待网关.connect(ccpPath,{钱包,身份:'admin',发现:{启用:true,asLocalhost:true}});

第40、41行返回CA的基础管理员。该管理员用于注册用户

const ca = gateway.getClient()。getCertificateAuthority(); const adminIdentity = gateway.getCurrentIdentity();

第44行通过将隶属关系,管理员身份作为自变量的对象,使用register方法注册新用户。如前面的模块演练所述,注册方法将返回新注册用户的机密,此机密可用于将用户注册到网络。

const secret = await ca.register({会员:'org1.department1',enrollmentID:'user1',角色:'client'},adminIdentity);

在下一行中,将完成用户注册并颁发PKI证书,然后为该用户创建身份,然后将x509加密货币证书导入到钱包中。瞧…该身份将用于访问网络并与网络交互,而x509签名证书将用于签署交易。

const enrollment =等待ca.enroll({enrollmentID:'user1',enrollmentSecret:secret}); const userIdentity = X509WalletMixin.createIdentity('Org1MSP',enrollment.certificate,enrollment.key.toBytes());等待wallet.import( 'user1',userIdentity);
“`

查询和调用Chaincode:

在前面的部分中,我们已经了解了如何为管理员和用户分配身份。在本节中,我们将逐步介绍实际代码,这些代码将使用在上一节中创建的客户端用户身份来查询和调用Chaincode。因此,打开query.js(通常作为初始操作),它将导入所需的模块并定义连接配置文件,检查admin是否存在,然后检查用户是否已注册。

在第29-30行中,它将启动网关连接,并使用用户身份与网络连接。

const gateway = new Gateway();

等待网关.connect(ccpPath,{钱包,身份:'user1',发现:{启用:true,asLocalhost:true}});

在第33行,网关将使用getNetwork()方法访问网络中名为“ mychannel”的频道

const network =等待gateway.getNetwork('mychannel');

在第36行中,网关将使用网关类的getContract()方法访问“ mychannel”中已部署的合约(fabcar)。

合约= network.getContract('fabcar');

在第41行中,它将通过采用evaluteTransaction()中定义的参数(如果应用)来查询特定的chaincode方法。在这一行中,它查询queryAllCars chaincode方法。因此不需要参数。

const result = await contract.evaluateTransaction('queryAllCars');

evaluteTransaction()方法是一种获取方法,它将仅查询特定键的分类帐状态并立即返回结果。

在invoke.js代码中,有一个方法SubmitTransaction()用于通过采用链码函数名称和参数来提交事务。在这里,createCar函数将被带参数调用。

等待contract.submitTransaction('createCar','CAR12','Honda','Accord','Black','Tom');

由于它会将数据写入分类帐,因此交易将通过网络进行填充,一旦认可对等方执行交易,分类帐状态将被更新为新车。

现在,我们已经探索了Hyperledger Fabric Node SDK中的各种模块,以及涉及注册和注册用户的代码演练。我们研究了SDK如何提供与链码功能进行交互的Access。您应该对应用程序如何使用SDK与区块链网络进行交互有很好的了解。这不是结束。现在,通过REST API可以完成对应用程序的访问,而该功能尚未在Hyperledger Fabric中正式提供。但是,使用著名的JavaScript库Express之一构建API并不是很困难。我使用面向初学者的快速路由和传统前端东西制作了很少的Hyperledger Fabric应用程序。您可以在这里查看其中之一。

快乐的超级账本面料?

你可能还喜欢