我对这个问题感到很累。 如果你知道,请和我解释如何解决这个问题。我求求
我正在研究“Fabcar”样本,它在fabric-samples文件夹中有1个peer / 1 orderer / 1 ca服务器。
我想再添加2个对等网络并将它们加入到频道(称为我的频道)
所以我已经修改了3个文件:crypto-config.yaml,docker-compose.yml,start.sh(在基本网络文件夹中)。
我也使用加密工具为新的2个同行制作了加密材料。
但问题是当我在peer0.org1.example.com容器中执行“peer channel join -b myblock.block”以便将这些新对等体加入到通道时,会显示以下错误消息:
它说“JoinChain”请求通道[mychannel]的授权检查失败:[在使用策略[管理员]的无渠道检查策略期间验证提案的创建者是否满足本地MSP主体:[此身份不是管理员]]))< / p>
我也用peerer exec命令在peer0.org1.example内外尝试了这个命令,并且使用了sudo并且没有任何效果。
似乎我需要使用管理员的证书启动交易,但我真的不知道如何制作它以及如何解决此授权问题。
请知道如何处理此问题的人向我详细解释这一点。
我很长一段时间都遇到了这个问题。我真的很绝望。
如果你告诉我如何,我真的很感激。期待你的回复。谢谢。
答案 0 :(得分:0)
错误消息是告诉:peer channel join
。您需要为给定的peer / org使用admin的标识才能执行fabric-samples/basic-network/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
命令。
cryptogen创建加密材料的方式是填充特定结构的目录树。对于管理员证书,您需要使用此身份:
users.collect {
case SomeClass(_, id, _, Some(someVariable), time) =>
// bunch of stuff here
}
以成为Org1的管理员。创建通道并加入默认样本中的一个对等体的脚本使用以下命令完成:
答案 1 :(得分:0)
此问题归因于您所使用的凭据的访问级别。 您需要成为管理员才能向频道添加对等方,因此您可以访问系统链码cscc。
另一个可能的问题是,在网络配置(通常是configtx.yaml文件)中,有一些策略会限制您将对等方加入通道的访问权限,如果您希望我可以查看一下configtx文件,看看我能不能帮忙。
在使用Fabcar示例时,它被Node SDK调用,您也可以使用SDK添加对等体。
请尝试:
实例化Fabric Client对象并注册一个admin用户。您可以根据Fabcar的enrollAdmin.js在脚本中完成此操作,
在Fabcar的enrollAdmin.js第72行中,您可以看到以下行:
console.log('Assigned the admin user to the fabric client ::' + admin_user.toString());
从此处开始,在第71行开始的“ then”内部。 您必须使用该方法以管理员身份注册
fabric_client.setAdminSigningIdentity(pk, cert, MSPID);
pk参数是管理员私钥,cert是他的证书,MSPID是您在configtx.yaml文件中为其组织指定的证书。
您可以使用Node addins中的文件系统模块来获取pk和证书:
let fs = require('fs');
let cert = fs.readFileSync(path.join(__dirname, 'PATH_TO_CERT/CERT_NAME.pem'))
let pk = fs.readFileSync(path.join(__dirname, 'PATH_TO_PK','PK_NAME'))
管理员证书的常用路径是
/fabric-samples/basic-network/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/admincerts
私钥是:
/fabric-samples/basic-network/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/keystore
现在,您刚刚将管理员身份添加到客户的实例中,如果一切正常,则需要使用对等方的地址创建一个对等方实例,如下例:
peer=fabric_client.newPeer(grpc://localhost:7051);
别忘了使用grpc协议,如果启用了tls,则必须使用grpcs。
现在使用channel id作为参数创建您的频道的频道实例:
let channel_i=fabric_client.newChannel('mychannel')
然后创建一个对通道生成(配置)块的请求:
let orderer = fabric_client.newOrderer(ORDERER_URL);//the urlalso with grpc protocol
let tx_id=fabric.client.newTransactionID(true); //true means it's an administrative request
let g_request={
txId: tx_id,
orderer : orderer
}
最后,发出阻止请求,然后使用它加入频道:
channel_i.getGenesisBlock(g_request).then((block) =>{
tx_id = fabric.client.newTransactionID(true);
let j_request = {
targets : peer,
block : block,
txId : tx_id,
};
// send genesis block to the peer
return channel_i.joinChannel(j_request, 10000).then((results) =>{
if(results[0].response.status == 200) {
// join successful
console.log("Join successful!!!");
} else {
// not good
console.log("Error:: "+ results);
throw results;
}
})
答案 2 :(得分:0)
对于管理员身份错误,请将该身份签名证书复制到Org MSP admincerts文件夹中,然后生成频道tx文件。