向现有的Hyperledger Fabric网络添加了新的组织。现在在让对等方加入现有频道方面遇到问题

问题描述 投票:0回答:1

此问题来自我之前关于adding a new org to an existing channel using fabric node sdk的问题。

Gari通过使用Node SDK帮助解决了我的问题,并且我能够将组织成功地添加到频道mychannel(这是byfn.sh的一部分)。

[现在,按照我改编的原始tutorial,我想添加新的Org的对等方以加入频道mychannel。我现在停留在这里,尽管查看了Stackoverflow,HL列表和HL Jira,却找不到解决方案。

概括地说,我要遵循的步骤是这些:

  1. 将新的组织添加到频道(使用Client.updateChannel API)。我可以成功完成此操作。
  2. 然后,我为与新Org相关联的对等方打开对等方和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]

对等3的Docker日志这样说:

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

2020-01-24 19:46:47.774 UTC [comm.grpc.server] 1->信息03a一元通话已完成grpc.service = protos.Endorsergrpc.method = ProcessProposal grpc.peer_address = 192.168.240.1:49860错误=“访问被拒绝:频道[]创建者组织[Org1MSP]”grpc.code =未知grpc.call_duration = 329.567µs

我知道此错误是因为与Channel.joinChannel请求一起提交的MSP ID是Org1MSP,但我不确定为什么。我正在提交使用Org3客户端创建的同位体,并且事务ID也是Org3管理员事务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('[email protected]','Org3MSP');
            await gateway.connect(ccp, {
                identity: '[email protected]',
                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
1个回答
0
投票

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

对于那些感兴趣的人,ksachdeva的这些examples非常有用。

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

所以,解决方法是这个(从广义上讲)

假设组织已添加到频道,

  1. [使用新的Org的公共连接配置文件创建新的客户端实例,或者您可以使用ksachdeva的sample code从头开始创建新的客户端实例。
  2. 使用Client.newChannel("mychannel")或您要加入的任何频道创建新的频道实例。
  3. 使用Orderer调用创建一个新的Client.newOrderer实例,该实例充当您要加入的通道的Orderer。在byfn.sh术语中,这是grpcs://localhost:7050orderer.example.com
  4. 使用要添加到通道的对等方的对等方信息创建新的Peer实例。
  5. 将上述步骤3中的订购者添加到使用Channel.addOrderer(orderer) API在步骤2中创建的通道对象中。
  6. 然后,可以从Fabric Node SDK网站上的tutorial执行其余步骤,即获取创世块,创建加入对等方的请求并提交Channel.joinChannel(request)

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

© www.soinside.com 2019 - 2024. All rights reserved.