hyperledger-fabric - 向现有的 Hyperledger Fabric 网络添加了一个新的组织。现在在让 Peer 加入现有频道时遇到问题
问题描述
这个问题来自我之前关于使用结构节点 sdk 将新组织添加到现有频道的问题。
Gari 帮助解决了我使用 Node SDK 的问题,并且我能够成功地将 Org 添加到通道 mychannel 中,该通道是 byfn.sh 的一部分。
现在,按照我改编的原始教程,我想添加新的 Org 的 peer 来加入频道 mychannel。我现在被困在这里,尽管查看了 Stackoverflow、HL Lists 和 HL Jira,但仍然无法找到解决方案。
在高层次上,我遵循的步骤如下:
- 将新组织添加到频道(使用 Client.updateChannel API)。我可以成功地做到这一点。
- 然后,我为与新组织关联的对等点启动对等点和 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"
}
}
}
}
- 我使用指向 Org1 连接配置文件的客户端并提取 Network 和 Channel 对象,然后检索通道的创世块。
- 然后,我创建一个新的连接配置文件以指向 Org3 对等方并连接到它,并获得一个新的 (Org3) 客户端引用。
- 使用这个 Org3 客户端,我创建了一个新的 Peer 对象 (
Client.newPeer
) - 然后我发出一个
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 请求(顺便问一下,这个设置在哪里?)
感谢有关如何进行的任何建议。谢谢你。
解决方案
终于能够找到一些示例代码Channel.joinChannel
。
对于那些感兴趣的人,ksachdeva 的这些例子非常有帮助。
本质上,我做错的是使用与 Org1MSP 客户端上下文关联的通道对象,并使用它来提交Channel.joinChannel
调用。
所以,修复是这样的(广义上)
假设 Org 已经添加到频道中,
- 使用新组织的通用连接配置文件创建一个新的客户端实例,或者您可以使用ksachdeva 的这个示例代码从头开始创建一个新的客户端实例。
Client.newChannel("mychannel")
使用或您要加入的任何频道创建一个新频道实例。- 使用 call创建一个新
Orderer
实例Client.newOrderer
,作为Orderer
您要加入的频道的实例。用byfn.sh
术语来说,这是grpcs://localhost:7050
akaorderer.example.com
。 Peer
使用要添加到通道的对等点的对等点信息创建一个新实例。Channel.addOrderer(orderer)
使用API将上面第 3 步中的 orderer 添加到第 2 步中创建的通道对象中。- 然后,可以按照 Fabric Node SDK 站点上的教程执行其余步骤,即获取创世块,创建加入对等点的请求,并提交
Channel.joinChannel(request)
.
请查看 ksachdeva 的示例代码(此响应前面提供的链接)以获取完整的端到端代码示例。
推荐阅读
- java - 无法将 java.lang.String[] 类型的属性值转换为所需的 java.util.List 类型
- wordpress - 当它没有出现时,我如何在 woocommerce 中设置我的价格?
- laravel - Laravel 中文件操作的事务
- google-apps-script - 在网页上显示可编辑的 Google 表格
- django - 如何使用 Django 管理内联表单自动邀请所选组的所有用户?
- amazon-web-services - 为什么在 s3 存储桶上托管 blazor webassembly 时出现内容类型错误?
- python - 句数错误
- c++ - C++ 中 sum 的异常行为?
- c# - C#在主程序中使用串口中的日期
- graphics - 在简单的体素渲染器中实现环境光遮蔽