问题描述
我想向Hyperledger Fabric中的现有渠道添加新的组织。
byte[] configBytes = channel.getChannelConfigurationBytes();
String configtxlator = props.getProperty("configtxlator");
HttpPost httppost = new HttpPost(configtxlator + "/protolator/decode/common.Config");
httppost.setEntity(new ByteArrayEntity(configBytes));
HttpClient httpclient = HttpClients.createDefault();
HttpResponse response = httpclient.execute(httppost);
int statuscode = response.getStatusLine().getStatusCode();
if (statuscode == 200) {
return EntityUtils.toString(response.getEntity());
} else {
return "";
}
结果是以下JSON字符串:
{
"channel_group": {
"groups": {
"Application": {
"groups": {
"Org1MSP": {
"groups": {},"mod_policy": "Admins","policies": {
"Admins": {
"mod_policy": "Admins","policy": {
"type": 1,"value": {
"identities": [
{
"principal": {
"msp_identifier": "Org1MSP","role": "ADMIN"
},"principal_classification": "ROLE"
}
],"rule": {
"n_out_of": {
"n": 1,"rules": [
{
"signed_by": 0
}
]
}
},"version": 0
}
},"version": "0"
},"Readers": {
"mod_policy": "Admins","principal_classification": "ROLE"
},{
"principal": {
"msp_identifier": "Org1MSP","role": "PEER"
},"role": "CLIENT"
},"rules": [
{
"signed_by": 0
},{
"signed_by": 1
},{
"signed_by": 2
}
]
}
},"Writers": {
"mod_policy": "Admins",{
"signed_by": 1
}
]
}
},"version": "0"
}
},"values": {
"AnchorPeers": {
"mod_policy": "Admins","value": {
"anchor_peers": [
{
"host": "peer1.org1.isprint.com","port": 7051
},{
"host": "peer2.org1.isprint.com","port": 7051
}
]
},"MSP": {
"mod_policy": "Admins","value": {
"config": {
"admins": [],"crypto_config": {
"identity_identifier_hash_function": "SHA256","signature_hash_family": "SHA2"
},"fabric_node_ous": {
"admin_ou_identifier": {
"certificate": "...","organizational_unit_identifier": "admin"
},"client_ou_identifier": {
"certificate": "...","organizational_unit_identifier": "client"
},"enable": true,"orderer_ou_identifier": {
"certificate": "...","organizational_unit_identifier": "orderer"
},"peer_ou_identifier": {
"certificate": "...","organizational_unit_identifier": "peer"
}
},"intermediate_certs": [],"name": "Org1MSP","organizational_unit_identifiers": [],"revocation_list": [],"root_certs": [
"..."
],"signing_identity": null,"tls_intermediate_certs": [],"tls_root_certs": [
"..."
]
},"type": 0
},"version": "1"
}
},"policies": {
"Admins": {
"mod_policy": "Admins","policy": {
"type": 3,"value": {
"rule": "MAJORITY","sub_policy": "Admins"
}
},"version": "0"
},"Readers": {
"mod_policy": "Admins","value": {
"rule": "ANY","sub_policy": "Readers"
}
},"Writers": {
"mod_policy": "Admins","sub_policy": "Writers"
}
},"version": "0"
}
},"values": {
"Capabilities": {
"mod_policy": "Admins","value": {
"capabilities": {
"V1_4_2": {}
}
},"version": "1"
},"Orderer": {
"groups": {
"OrdererOrg": {
"groups": {},"value": {
"identities": [
{
"principal": {
"msp_identifier": "OrdererMSP","role": "MEMBER"
},"values": {
"MSP": {
"mod_policy": "Admins","name": "OrdererMSP","BlockValidation": {
"mod_policy": "Admins","values": {
"BatchSize": {
"mod_policy": "Admins","value": {
"absolute_max_bytes": 103809024,"max_message_count": 100,"preferred_max_bytes": 524288
},"BatchTimeout": {
"mod_policy": "Admins","value": {
"timeout": "30s"
},"Capabilities": {
"mod_policy": "Admins","ChannelRestrictions": {
"mod_policy": "Admins","value": null,"ConsensusType": {
"mod_policy": "Admins","value": {
"Metadata": {
"consenters": [
{
"client_tls_cert": "...","host": "orderer1.isprint.com","port": 7050,"server_tls_cert": "..."
},{
"client_tls_cert": "...","host": "orderer2.isprint.com","host": "orderer3.isprint.com","server_tls_cert": "..."
}
],"options": {
"election_tick": 10,"heartbeat_tick": 1,"max_inflight_blocks": 5,"snapshot_interval_size": 20971520,"tick_interval": "500ms"
}
},"state": "STATE_norMAL","type": "etcdraft"
},"version": "0"
}
},"policies": {
"Admins": {
"mod_policy": "Admins","policy": {
"type": 3,"value": {
"rule": "MAJORITY","sub_policy": "Admins"
}
},"version": "0"
},"Readers": {
"mod_policy": "Admins","value": {
"rule": "ANY","sub_policy": "Readers"
}
},"Writers": {
"mod_policy": "Admins","sub_policy": "Writers"
}
},"values": {
"BlockDataHashingStructure": {
"mod_policy": "Admins","value": {
"width": 4294967295
},"Capabilities": {
"mod_policy": "Admins","value": {
"capabilities": {
"V1_4_3": {}
}
},"Consortium": {
"mod_policy": "Admins","value": {
"name": "SampleConsortium"
},"Hashingalgorithm": {
"mod_policy": "Admins","value": {
"name": "SHA256"
},"OrdererAddresses": {
"mod_policy": "/Channel/Orderer/Admins","value": {
"addresses": [
"orderer1.isprint.com:7050","orderer2.isprint.com:7050","orderer3.isprint.com:7050"
]
},"version": "0"
},"sequence": "2"
}
DocumentContext context = JsonPath.parse(json);
String pathOrg1MSP = "$.channel_group.groups.Application.groups.Org1MSP";
Map<String,Object> mapOrg1MSP = context.read(pathOrg1MSP);
Map<String,Object> mapOrg2MSP = new LinkedHashMap<String,Object>();
mapOrg1MSP.forEach((k,v) -> {
mapOrg2MSP.put(k,v);
});
String pathOrg2MSP = "$.channel_group.groups.Application.groups";
context.put(pathOrg2MSP,"Org2MSP",mapOrg2MSP);
目的是首先创建一个精确的克隆,然后更改需要更改的任何值(对等,证书等),然后将其拼接到原始Json中。
- 这会实现我打算做的事情吗?
- 我需要更改哪些值以防止与现有组织发生任何可能的冲突?
解决方法
- 为Org2生成加密材料
- 生成Org2专用的配置材料
- 从订购者那里获取最新的配置块,将其修剪并转换为JSON(我相信您已经完成了此步骤)
- 将Org2特定的配置材料添加到JSON
- 将原始JSON和新编辑的JSON转换为protobuf格式
- 计算新块和原始块(.pb文件)之间的差异
- 将其转换为JSON格式并重新添加标头
- 将其转换为protobuf格式
- 通过Org1签署交易
有关详细命令,请参阅此官方文档。 https://hyperledger-fabric.readthedocs.io/en/release-1.4/channel_update_tutorial.html