无法在添加到余额转移样本的新组织中注册用户

时间:2018-02-17 00:28:30

标签: hyperledger-fabric hyperledger

我正在跟踪来自此link的Hyperledger Fabric样本的余额转移。我已经修改了一下,现在我有3个Orgs,每个有1个Peer。一切顺利,直到我将用户注册到Org1和Org2,但是,当我尝试将用户注册到我的第3个组织时,我收到以下错误

  

无法获得注册用户:xyz,错误:错误:fabric-ca请求注册失败,错误[[{“code”:63,“message”:“无法获得关联:sql:结果集中没有行” }]]

我的Hyperledger Fabric二进制文件来自版本1.1.0 Alfa

6 个答案:

答案 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.yamlartifacts/channel/configtx.yamlartifacts/docker-compose.yamlartifacts/network-config.yamlconfig.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。

enter image description here

答案 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;
    }
};
相关问题