我正在跟踪来自此link的Hyperledger Fabric样本的余额转移。我已经修改了一下,现在我有3个Orgs,每个有1个Peer。一切顺利,直到我将用户注册到Org1和Org2,但是,当我尝试将用户注册到我的第3个组织时,我收到以下错误
无法获得注册用户:xyz,错误:错误:fabric-ca请求注册失败,错误[[{“code”:63,“message”:“无法获得关联:sql:结果集中没有行” }]]
我的Hyperledger Fabric二进制文件来自版本1.1.0 Alfa
答案 0 :(得分:7)
这可能是没有用的(并且很晚了),但是我想补充一下Gari的答案。您还可以使用节点客户端SDK的AffiliationService class添加从属关系。
要在余额转帐代码中执行此操作,请使用以下命令修改helper.js
:
let adminUserObj = await client.setUserContext({
username: admins[0].username,
password: admins[0].secret});
let caClient = client.getCertificateAuthority();
let affiliationService = caClient.newAffiliationService();
let registeredAffiliations = await affiliationService.getAll(adminUserObj);
if(!registeredAffiliations.result.affiliations.some(
x => x.name == userOrg.toLowerCase())){
let affiliation = 'org3.department1';
await affiliationService.create({
name: affiliation,
force: true}, adminUserObj);
}
注意:
上面的代码仅添加了从属关系(我认为这是您所缺少的唯一内容)。要成功为Org3用户注册,您还必须在artifacts/channel/cryptogen.yaml
,artifacts/channel/configtx.yaml
,artifacts/docker-compose.yaml
,artifacts/network-config.yaml
和config.json
中指定org3。并创建一个org3.yaml
文件。
我以余额转移示例为基础构建了一个chaincode sample app,该组织有3个组织。您可以查看一下以查看必要的更改。
答案 1 :(得分:6)
问题是样本中使用的fabric-ca不知道关联。默认情况下,fabric-ca仅具有以下附属关系:
org1.department1 org1.department2 org2.department1
注册和注册样本中的用户的code获取组织名称并将其与" department1"连接。 :
let secret = await caClient.register({
enrollmentID: username,
affiliation: userOrg.toLowerCase() + '.department1'
}, adminUserObj);
因此,当您传入Org3时,它会尝试使用不存在的关联org3.department1注册用户。
由于您使用的是1.1.0-alpha,因此您很幸运,因为此版本的fabric-ca支持具有用于添加新关联的API。最简单的方法是使用fabric-ca-client执行此操作:
fabric-ca-client affiliation add org3
fabric-ca-client affiliation add org3.department1
您可以查看fabric-ca docs(http://hyperledger-fabric-ca.readthedocs.io/)了解更多详情。您需要先注册具有密码的管理员用户" adminpw"使用fabric-ca-client然后运行上述命令。
答案 2 :(得分:1)
请注意helper.js中的这一行,
让秘密=等待caClient.register({ enrollmentID:用户名, 隶属关系: userOrg.toLowerCase() +'.department1' },adminUserObj);
确定要降低Org3的大小写(在配置yaml文件中)吗?
答案 3 :(得分:0)
我在结构1.3中看到了相同的问题,我更改了名称并配置了自己的名称。 通过删除以下声明对我有帮助
只需评论“ helper.js”中的以下行即可帮助我。
//affiliation: userOrg.toLowerCase() + '.department1'
答案 4 :(得分:0)
您可以通过转到fabric-ca docker容器来更改fabric-ca-server-config来添加更多组织和部门。
docker exec -it ca.org1.example.com bash
转到容器内的root@c3804e2852fd:/etc/hyperledger/fabric-ca-server#
目录
现在编辑fabric-ca-server-config.yaml文件。根据您的选择添加组织及其部门。
以下,我添加了一个“制造商”组织。您可以像这样添加Org3。
答案 5 :(得分:0)
在app / helper.js文件中的功能下方替换。重新启动节点服务器,并尝试在org3上注册用户。
var getRegisteredUser = async function(username, userOrg, isJson) {
try {
var client = await getClientForOrg(userOrg);
logger.debug('Successfully initialized the credential stores');
// client can now act as an agent for organization Org1
// first check to see if the user is already enrolled
var user = await client.getUserContext(username, true);
if (user && user.isEnrolled()) {
logger.info('Successfully loaded member from persistence');
var response = {
success: false,
};
return response;
} else {
// user was not enrolled, so we will need an admin user object to register
logger.info('User %s was not enrolled, so we will need an admin user object to register',username);
var admins = hfc.getConfigSetting('admins');
let adminUserObj = await client.setUserContext({username: admins[0].username, password: admins[0].secret});
//newly added
if(adminUserObj.getAffiliation() != userOrg.toLowerCase()){
logger.info('Admin affiliation not registered. Registering now.');
adminUserObj.setAffiliation(userOrg.toLowerCase());
adminUserObj.setRoles(['peer','orderer','client','user']);
adminUserObj = await client.setUserContext(adminUserObj);
}
logger.info('Admin User: %s', adminUserObj);
let affiliation = userOrg.toLowerCase() + '.department1';
let caClient = client.getCertificateAuthority();
//check if org exists
const affiliationService = caClient.newAffiliationService();
const registeredAffiliations = await affiliationService.getAll(adminUserObj);
if(!registeredAffiliations.result.affiliations.some(x => x.name == userOrg.toLowerCase())){
logger.info('Register the new affiliation: %s ', affiliation);
await affiliationService.create({name: affiliation, force: true}, adminUserObj);
}
let secret = await caClient.register({
enrollmentID: username,
affiliation: affiliation
}, adminUserObj);
logger.debug('Successfully got the secret for user %s — %s',username);
user = await client.setUserContext({username:username, password:secret});
logger.debug('Successfully enrolled username %s and setUserContext on the client object', username);
}
if(user && user.isEnrolled) {
if (isJson && isJson === true) {
var response = {
success: true,
secret: user._enrollmentSecret,
message: username + ' enrolled Successfully',
};
return response;
}
} else {
throw new Error('User was not enrolled ');
}
} catch(error) {
let message = 'Failed to register the username ' + username + ' for organization ' + userOrg + ' with error: ' + error.toString();
logger.error(message);
var response = {
success: false,
message: message,
};
return response;
}
};