此问题来自我之前关于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,却找不到解决方案。
概括地说,我要遵循的步骤是这些:
{
"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"
}
}
}
}
Client.newPeer
)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请求(顺便说一下,这个设置在哪里?)
赞赏有关如何进行的任何建议。谢谢。
终于能够找到Channel.joinChannel
的一些示例代码。
对于那些感兴趣的人,ksachdeva的这些examples非常有用。
本质上,我做错的是使用与Org1MSP客户端上下文关联的通道对象,并使用该对象来提交Channel.joinChannel
调用。
所以,解决方法是这个(从广义上讲)
假设组织已添加到频道,
Client.newChannel("mychannel")
或您要加入的任何频道创建新的频道实例。Orderer
调用创建一个新的Client.newOrderer
实例,该实例充当您要加入的通道的Orderer
。在byfn.sh
术语中,这是grpcs://localhost:7050
或orderer.example.com
。 Peer
实例。Channel.addOrderer(orderer)
API在步骤2中创建的通道对象中。Channel.joinChannel(request)
。请查看ksachdeva的示例代码(此响应前面提供的链接),以获取完整的端到端代码示例。