HyperLedger Fabric 1.2 自主Helloworld编写(9)
时间: 2024-02-06 22:04:09 浏览: 98
在上一篇文章中,我们介绍了如何在 Hyperledger Fabric 网络中安装并实例化链码。本篇文章将介绍如何调用链码进行数据读写操作。
## 调用链码
在 Hyperledger Fabric 网络中,我们可以使用 SDK 或 REST API 调用链码进行数据读写操作。这里我们将以 Node.js SDK 为例来演示如何调用链码。
### 准备工作
在开始之前,请确保已经按照上一篇文章中的步骤安装了 Node.js SDK,并且已经成功实例化了链码。
### 编写代码
我们将编写一个简单的 Node.js 应用程序,通过调用链码实现数据的读取和写入。
#### 1. 引入依赖
```javascript
const FabricCAServices = require('fabric-ca-client');
const { FileSystemWallet, Gateway } = require('fabric-network');
const path = require('path');
const ccpPath = path.resolve(__dirname, '..', 'connection.json');
const ccpJSON = fs.readFileSync(ccpPath, 'utf8');
const ccp = JSON.parse(ccpJSON);
```
首先,我们需要引入依赖。其中,`fabric-ca-client` 是用于与 Fabric CA 进行交互的 SDK;`fabric-network` 是用于与 Fabric 网络进行通信的 SDK;`path` 是 Node.js 内置的模块,用于处理文件路径;`fs` 是 Node.js 内置的模块,用于读取文件内容;`connection.json` 是我们在上一篇文章中下载的连接配置。
#### 2. 连接 Fabric 网络
```javascript
async function connectToNetwork() {
const walletPath = path.join(process.cwd(), 'wallet');
const wallet = new FileSystemWallet(walletPath);
console.log(`Wallet path: ${walletPath}`);
const userExists = await wallet.exists('user1');
if (!userExists) {
console.log('An identity for the user "user1" does not exist in the wallet');
console.log('Run the registerUser.js application before retrying');
return;
}
const gateway = new Gateway();
await gateway.connect(ccp, { wallet, identity: 'user1', discovery: { enabled: true, asLocalhost: true } });
const network = await gateway.getNetwork('mychannel');
const contract = network.getContract('mychaincode');
return { contract };
}
```
在 `connectToNetwork` 函数中,我们首先创建一个 `FileSystemWallet` 对象,用于管理用户身份。如果该用户身份不存在,则无法继续执行后续操作。接着,我们创建一个 `Gateway` 对象,并通过 `connect` 方法连接到 Fabric 网络。其中,`identity` 参数指定了使用哪个用户身份进行连接,`discovery` 参数可以让 SDK 自动发现网络中的节点。最后,我们获取指定通道和链码的 `Contract` 对象,并返回该对象。
#### 3. 调用链码
```javascript
async function queryData(contract, key) {
const result = await contract.evaluateTransaction('queryData', key);
return result.toString();
}
async function saveData(contract, key, value) {
await contract.submitTransaction('saveData', key, value);
console.log(`Data with key "${key}" saved to the ledger`);
}
```
我们分别编写了 `queryData` 和 `saveData` 函数,用于查询数据和保存数据。这里的参数 `contract` 是指 `Contract` 对象,`key` 是数据的键,`value` 是数据的值。
调用 `queryData` 函数时,我们使用 `evaluateTransaction` 方法执行链码中的 `queryData` 函数,并返回结果。
调用 `saveData` 函数时,我们使用 `submitTransaction` 方法执行链码中的 `saveData` 函数,将数据保存到账本中。
#### 4. 完整代码
```javascript
const FabricCAServices = require('fabric-ca-client');
const { FileSystemWallet, Gateway } = require('fabric-network');
const path = require('path');
const fs = require('fs');
const ccpPath = path.resolve(__dirname, '..', 'connection.json');
const ccpJSON = fs.readFileSync(ccpPath, 'utf8');
const ccp = JSON.parse(ccpJSON);
async function connectToNetwork() {
const walletPath = path.join(process.cwd(), 'wallet');
const wallet = new FileSystemWallet(walletPath);
console.log(`Wallet path: ${walletPath}`);
const userExists = await wallet.exists('user1');
if (!userExists) {
console.log('An identity for the user "user1" does not exist in the wallet');
console.log('Run the registerUser.js application before retrying');
return;
}
const gateway = new Gateway();
await gateway.connect(ccp, { wallet, identity: 'user1', discovery: { enabled: true, asLocalhost: true } });
const network = await gateway.getNetwork('mychannel');
const contract = network.getContract('mychaincode');
return { contract };
}
async function queryData(contract, key) {
const result = await contract.evaluateTransaction('queryData', key);
return result.toString();
}
async function saveData(contract, key, value) {
await contract.submitTransaction('saveData', key, value);
console.log(`Data with key "${key}" saved to the ledger`);
}
async function main() {
const { contract } = await connectToNetwork();
await saveData(contract, 'key1', 'value1');
const result = await queryData(contract, 'key1');
console.log(`Result: ${result}`);
process.exit(0);
}
main();
```
在 `main` 函数中,我们首先调用 `connectToNetwork` 函数连接到 Fabric 网络,并获取 `Contract` 对象。接着,我们调用 `saveData` 函数将数据保存到账本中,然后调用 `queryData` 函数读取保存的数据。最后,我们打印出查询结果,并退出程序。
## 总结
本篇文章介绍了如何使用 Node.js SDK 调用链码进行数据读写操作。在实际开发中,我们可以根据具体需求编写相应的应用程序,实现更加复杂的业务逻辑。
阅读全文