我正在使用 Hyperledger Fabric 1.4.1 和最新版本的 fabric-contract-api 用于智能合约,fabric-client
用于管理通道创建和链码的低级 API,以及fabric-network
与对等方的交互。我已参考此示例来设置我的网络。
我已经编写了一个基本的链代码包,nodejs
并设置了一个简单的 1 个组织、1 个对等点、1 个排序网络。第一步是连接到对等节点并使用fabric-ca-client
创建管理员身份。根据示例,使用的注册 ID 和密码是admin
, adminpw
。这取决于此处使用的配置。
我用来创建和加入频道,然后安装和实例化链码的代码是
const CAClient = require('fabric-ca-client');
const client = require('fabric-client');
const User = client.User;
const fs = require('fs');
const path = require('path');
const basePath = path.resolve(__dirname, '../certs');
const readCryptoFile = filename => fs.readFileSync(path.resolve(basePath, filename)).toString();
const ccPath = path.resolve(__dirname, '../chaincode/src/ax-chaincode');
const url = require('url');
const http = require('http');
let myClient = new client();
const ordererConfig = {
hostname: 'orderer0',
url: 'grpc://localhost:7050',
pem: readCryptoFile('ordererOrg.pem')
};
const orderer = myClient.newOrderer(ordererConfig.url, {
pem: ordererConfig.pem,
'ssl-target-name-override': ordererConfig.hostname
});
let peerConfig = {
hostname: 'ax-peer',
url: 'grpc://localhost:7051', // change to grpcs://ax-peer:7051 in some condition (no idea?)
eventHubUrl: 'grpc://localhost:7053',
pem: readCryptoFile('axOrg.pem')
};
const defaultPeer = myClient.newPeer(peerConfig.url, {
pem: peerConfig.pem,
'ssl-target-name-override': peerConfig.hostname
});
// console.log(defaultPeer);
myClient.setStateStore(await client.newDefaultKeyValueStore({
path: './ax-peer'
}))
let url = 'http://localhost:7054'
const ca = new CAClient(url, {
verify: false
});
let enrollmentID = 'admin';
let enrollmentSecret = 'adminpw';
const enrollment = await ca.enroll({
enrollmentID: 'admin',
enrollmentSecret: 'adminpw'
});
user = new User(enrollmentID, myClient);
// console.log(enrollment);
await user.setEnrollment(enrollment.key, enrollment.certificate, 'AxOrgMSP');
以上将检查admin
用户是否在状态存储中可用。关于上述过程的一些疑问
- 假设只使用一个 CA,此处生成的管理员用户可用于与同一组织的任何和所有对等方进行交互?
- 这个身份的实际用途是什么,因为对于其余功能,
cryptogen
使用每个对等方生成的管理员身份(代码如下) - 在注册 admin 时,没有
attrs
传入ca.enroll()
,所以在查询身份roles
字段时自然返回 null。共享的ca-server
链接清楚地为其分配了角色client, user, peer, validator, auditor
。admin
既然它使用andadminpw
来注册 id 和 secret ,那不应该在这里反映出来吗?
继续代码
// crypto material got from cryptogen and shifted to new folder
let adminUser = await myClient.createUser({
username: `Admin@ax-peer`,
mspid: 'AxOrgMSP',
cryptoContent: {
privateKeyPEM: readCryptoFile('Admin@ax-org-key.pem'),
signedCertPEM: readCryptoFile('Admin@ax-org-cert.pem')
}
});
let txId = myClient.newTransactionID();
let envelope_bytes = fs.readFileSync('./channel.tx');
let channelConfig = myClient.extractChannelConfig(envelope_bytes);
let signature = myClient.signChannelConfig(channelConfig);
const request = {
name: 'default',
orderer: orderer,
config: channelConfig,
signatures: [signature],
txId: txId
};
const response = await myClient.createChannel(request); // should be 200
// rest of code joins channel, installs and instantiates chaincode
// docker logs show init function being called in new cc container
其中stateStore
有两个文件(如预期的那样),称为admin
和Admin@ax-peer
。这些看起来像
"name": "Admin@ax-peer",
"mspid": "AxOrgMSP",
"roles": null,
"affiliation": "",
"enrollmentSecret": "",
enrollment: {
"signingIdentity": "554a5f5cfc5a59231a04b7b051bcbcb4f79c4226ff336a4aa48b551de4a8428f",
"certificate": "-----BEGIN CERTIFICATE----- xyz -----END CERTIFICATE-----"
}
当这个用户从状态存储中被使用时await myClient.getUserContext('admin', true);
,客户端如何签署交易?fabric-client
我无法找到使用SDK创建的任何用户的私钥/证书。
现在,如果我使用fabric-network
API,FileSystemWallet()
则实现了一个函数,该函数存储由它创建的每个用户的私有和公共证书。
const enrollment = await ca.enroll({ enrollmentID: `admin`, enrollmentSecret: `adminpw` });
const identity = X509WalletMixin.createIdentity('AxOrgMSP', enrollment.certificate, enrollment.key.toBytes());
wallet.import('admin', identity);
此函数的用途与 相同,ca.enroll()
但以可见的方式存储私有证书。如果我想使用 SDK 中创建的用户fabric-client
,fabric-network
我需要转移证书,我该如何实现呢?
TLDR - 使用注册用户fabric-client
,然后使用Gateway()
class fromfabric-network
向同一用户提交交易。
非常感谢任何建议,指导。谢谢!