首页 > 解决方案 > 向现有的 Hyperledger Fabric 网络添加了一个新的组织。现在在让 Peer 加入现有频道时遇到问题

问题描述

这个问题来自我之前关于使用结构节点 sdk 将新组织添加到现有频道的问题。

Gari 帮助解决了我使用 Node SDK 的问题,并且我能够成功地将 Org 添加到通道 mychannel 中,该通道是 byfn.sh 的一部分。

现在,按照我改编的原始教程,我想添加新的 Org 的 peer 来加入频道 mychannel。我现在被困在这里,尽管查看了 Stackoverflow、HL Lists 和 HL Jira,但仍然无法找到解决方案。

在高层次上,我遵循的步骤如下:

  1. 将新组织添加到频道(使用 Client.updateChannel API)。我可以成功地做到这一点。
  2. 然后,我为与新组织关联的对等点启动对等点和 couchdb docker 容器。新组织是 Org3,这是连接配置文件
{
    "name": "first-network-org3",
    "version": "1.0.0",
    "client": {
        "organization": "Org3",
        "connection": {
            "timeout": {
                "peer": {
                    "endorser": "300"
                }
            }
        }
    },
    "organizations": {
        "Org3": {
            "mspid": "Org3MSP",
            "peers": [
                "peer0.org3.example.com"
            ]
        }
    },
    "peers": {
        "peer0.org3.example.com": {
            "url": "grpcs://localhost:11051",
            "tlsCACerts": {
                "path": "/usr/local/fabric/fabric-samples/first-network/crypto-config/peerOrganizations/org3.example.com/tlsca/tlsca.org3.example.com-cert.pem"
            },
            "grpcOptions": {
                "ssl-target-name-override": "peer0.org3.example.com"
            }
        }
    }
}
  1. 我使用指向 Org1 连接配置文件的客户端并提取 Network 和 Channel 对象,然后检索通道的创世块。
  2. 然后,我创建一个新的连接配置文件以指向 Org3 对等方并连接到它,并获得一个新的 (Org3) 客户端引用。
  3. 使用这个 Org3 客户端,我创建了一个新的 Peer 对象 ( Client.newPeer)
  4. 然后我发出一个channel.joinChannel(request).

每次,我都会从客户端应用程序中收到以下错误

错误:2 未知:访问被拒绝:频道 [] 创建者组织 [Org1MSP]

Peer 3 的 Docker 日志这样说:

2020-01-24 19:46:47.774 UTC [protoutils] ValidateProposalMessage -> WARN 039 频道 []:MSP 错误:预期的 MSP ID Org3MSP,收到 Org1MSP

2020-01-24 19:46:47.774 UTC [comm.grpc.server] 1 -> INFO 03a 一元调用完成 grpc.service=protos.Endorser grpc.method=ProcessProposal grpc.peer_address=192.168.240.1:49860 error="访问被拒绝:频道 [] 创建者组织 [Org1MSP]" grpc.code=未知 grpc.call_duration=329.567µs

我知道这个错误是因为与Channel.joinChannel请求一起提交的 MSP ID 是 Org1MSP,但我不知道为什么。我正在提交使用 Org3 客户端创建的对等点,并且事务 ID 也是 Org3 Admin 事务 ID。

这是我的代码:

public async addPeerToChannel(orgJSON) {
        try {
            let json = JSON.parse(JSON.stringify(orgJSON));

            if (json.name === undefined || json.msp === undefined || json.domain === undefined || json.peer === undefined
                ||
                json.peerport === undefined || json.channel === undefined || json.peerurl === undefined) {
                throw new Error("Invalid org info provided to addPeerToChannel method");
            }

            let client = this.loanGateway.getClient(); // get the client reference for Org1 ccp
            let cMSP = client.getMspid(); // confirms MSP ID is Org1MSP
            let network = await this.loanGateway.getNetwork(json.channel); // mychannel
            let channel = network.getChannel();

            if (client === undefined || network === undefined || channel === undefined) {
                throw new Error(`Invalid network, orderer, channel or client handle in function addPeerToChannel. Error.`);
            }

            let data = fs.readFileSync(SyndLoanConfig.chainconfig.networkpath + `/crypto-config/peerOrganizations/${json.domain}/peers/${json.peer}/tls/ca.crt`).toString();

            // load a new client for Org3
            const gateway = new Gateway();
            const wallet = this.localWallet;
            const ccpFile = fs.readFileSync(path.join(SyndLoanConfig.chainconfig.networkpath,'connection-org3_ac.json'));
            const ccp = JSON.parse(ccpFile.toString());
            await this.importWalletIdentityFromCryptoConfig('Admin@org3.example.com','Org3MSP');
            await gateway.connect(ccp, {
                identity: 'Admin@org3.example.com',
                wallet: wallet
            });

            let newClient = gateway.getClient();

            let peer = newClient.newPeer(json.peerurl,
                {
                    'pem': Buffer.from(data).toString(),
                    'ssl-target-name-override': json.peer,
                    'name': json.peer,
                    'grpc.keepalive_timeout_ms': 10000

                })

            if (peer === undefined) {
                throw new Error(`Could not create the peer for URL ${json.peerurl}. Error.`)
            }

            channel.addPeer(peer, json.msp);

            let request = {
                txId: client.newTransactionID() //the generated transaction id
            };

            let gBlock = await channel.getGenesisBlock(request);


          //  for(let p of ccp.peers)
          //  {
          //      ccp.peers[p].tlsCACerts.path = path.join(SyndLoanConfig.chainconfig.networkpath,ccp.peers[p].tlsCACerts.path);
          //  }

          //  let newNetwork = await gateway.getNetwork("mychannel");
          //  let newChannel = newNetwork.getChannel();

            let channel_request = {
                targets: [peer],
                block: gBlock,
                txId: newClient.newTransactionID(true)
            }


            let proposal_response = {};
            proposal_response = await channel.joinChannel(channel_request);

            if (proposal_response[0].code !== 200) 
            {
                    throw new Error(`Could not make the peer ${json.peer} join channel ${json.channel}. Error: ${proposal_response[0].message}`);

            }
        }
        catch (err) {
            throw new Error(err.message);
        }
    }

我确定我遗漏了一些东西,但我无法弄清楚是什么,以及为什么在 MSP 设置为 Org1MSP 的情况下提交 joinChannel 请求(顺便问一下,这个设置在哪里?)

感谢有关如何进行的任何建议。谢谢你。

标签: hyperledger-fabric

解决方案


终于能够找到一些示例代码Channel.joinChannel

对于那些感兴趣的人,ksachdeva 的这些例子非常有帮助。

本质上,我做错的是使用与 Org1MSP 客户端上下文关联的通道对象,并使用它来提交Channel.joinChannel调用。

所以,修复是这样的(广义上)

假设 Org 已经添加到频道中,

  1. 使用新组织的通用连接配置文件创建一个新的客户端实例,或者您可以使用ksachdeva 的这个示例代码从头开始创建一个新的客户端实例。
  2. Client.newChannel("mychannel")使用或您要加入的任何频道创建一个新频道实例。
  3. 使用 call创建一个新Orderer实例Client.newOrderer,作为Orderer您要加入的频道的实例。用byfn.sh术语来说,这是grpcs://localhost:7050aka orderer.example.com
  4. Peer使用要添加到通道的对等点的对等点信息创建一个新实例。
  5. Channel.addOrderer(orderer)使用API将上面第 3 步中的 orderer 添加到第 2 步中创建的通道对象中。
  6. 然后,可以按照 Fabric Node SDK 站点上的教程执行其余步骤,即获取创世块,创建加入对等点的请求,并提交Channel.joinChannel(request).

请查看 ksachdeva 的示例代码(此响应前面提供的链接)以获取完整的端到端代码示例。


推荐阅读