Hyperledger Fabric:使用JsonPath

问题描述

我想向Hyperledger Fabric中的现有渠道添加新的组织。

首先,我使用以下代码获取JSON格式的通道配置:

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"
}

我已经使用JsonPath编写了一个代码段:

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中。

  1. 这会实现我打算做的事情吗?
  2. 我需要更改哪些值以防止与现有组织发生任何可能的冲突?

解决方法

  1. 为Org2生成加密材料
  2. 生成Org2专用的配置材料
  3. 从订购者那里获取最新的配置块,将其修剪并转换为JSON(我相信您已经完成了此步骤)
  4. 将Org2特定的配置材料添加到JSON
  5. 将原始JSON和新编辑的JSON转换为protobuf格式
  6. 计算新块和原始块(.pb文件)之间的差异
  7. 将其转换为JSON格式并重新添加标头
  8. 将其转换为protobuf格式
  9. 通过Org1签署交易

有关详细命令,请参阅此官方文档。 https://hyperledger-fabric.readthedocs.io/en/release-1.4/channel_update_tutorial.html