Documentation ¶
Overview ¶
Package configtx allows the creation, retrieval, and modification of channel configtx.
Example (Usage) ¶
// Retrieve the config for the channel baseConfig := fetchChannelConfig() c := configtx.New(baseConfig) // Must retrieve the current orderer configuration from block and modify // the desired values orderer := configtx.Orderer{ OrdererType: configtx.ConsensusTypeKafka, Kafka: configtx.Kafka{ Brokers: []string{"kafka0:9092", "kafka1:9092", "kafka2:9092"}, // Add new broker }, Organizations: []configtx.Organization{ { Name: "OrdererOrg", Policies: map[string]configtx.Policy{ configtx.AdminsPolicyKey: { Type: configtx.ImplicitMetaPolicyType, Rule: "MAJORITY Admins", }, configtx.BlockValidationPolicyKey: { Type: configtx.ImplicitMetaPolicyType, Rule: "ANY Writers", }, configtx.ReadersPolicyKey: { Type: configtx.ImplicitMetaPolicyType, Rule: "ANY Readers", }, configtx.WritersPolicyKey: { Type: configtx.ImplicitMetaPolicyType, Rule: "ANY Writers", }, }, }, }, BatchSize: configtx.BatchSize{ MaxMessageCount: 500, // Updating from 100 AbsoluteMaxBytes: 100, PreferredMaxBytes: 100, }, Addresses: []configtx.Address{{Host: "127.0.0.1", Port: 7050}}, State: "STATE_NORMAL", } err := c.UpdateOrdererConfiguration(orderer) if err != nil { panic(nil) } newAnchorPeer := configtx.Address{ Host: "127.0.0.2", Port: 7051, } // Add a new anchor peer err = c.AddAnchorPeer("Org1", newAnchorPeer) if err != nil { panic(err) } // Remove an old anchor peer from Org1 oldAnchorPeer := configtx.Address{ Host: "127.0.0.2", Port: 7051, } err = c.RemoveAnchorPeer("Org1", oldAnchorPeer) if err != nil { panic(err) } appOrg := configtx.Organization{ Name: "Org2", MSP: baseMSP(&testing.T{}), Policies: map[string]configtx.Policy{ configtx.AdminsPolicyKey: { Type: configtx.ImplicitMetaPolicyType, Rule: "MAJORITY Admins", }, configtx.EndorsementPolicyKey: { Type: configtx.ImplicitMetaPolicyType, Rule: "MAJORITY Endorsement", }, configtx.LifecycleEndorsementPolicyKey: { Type: configtx.ImplicitMetaPolicyType, Rule: "MAJORITY Endorsement", }, configtx.ReadersPolicyKey: { Type: configtx.ImplicitMetaPolicyType, Rule: "ANY Readers", }, configtx.WritersPolicyKey: { Type: configtx.ImplicitMetaPolicyType, Rule: "ANY Writers", }, }, AnchorPeers: []configtx.Address{ { Host: "127.0.0.1", Port: 7051, }, }, } err = c.AddApplicationOrg(appOrg) if err != nil { panic(err) } org := configtx.Organization{ Name: "OrdererOrg2", MSP: baseMSP(&testing.T{}), OrdererEndpoints: []string{"127.0.0.1:7050", "127.0.0.1:9050"}, Policies: map[string]configtx.Policy{ configtx.AdminsPolicyKey: { Type: configtx.ImplicitMetaPolicyType, Rule: "MAJORITY Admins", }, configtx.BlockValidationPolicyKey: { Type: configtx.ImplicitMetaPolicyType, Rule: "ANY Writers", }, configtx.ReadersPolicyKey: { Type: configtx.ImplicitMetaPolicyType, Rule: "ANY Readers", }, configtx.WritersPolicyKey: { Type: configtx.ImplicitMetaPolicyType, Rule: "ANY Writers", }, }, } err = c.AddOrdererOrg(org) if err != nil { panic(err) } err = c.AddOrdererEndpoint("OrdererOrg2", configtx.Address{Host: "127.0.0.1", Port: 8050}) if err != nil { panic(err) } err = c.RemoveOrdererEndpoint("OrdererOrg2", configtx.Address{Host: "127.0.0.1", Port: 9050}) if err != nil { panic(err) } // Compute the delta configUpdate, err := c.ComputeUpdate("testchannel") if err != nil { panic(err) } // Collect the necessary signatures // The example respresents a 2 peer 1 org channel, to meet the policies defined // the transaction will be signed by both peers configSignatures := []*cb.ConfigSignature{} peer1SigningIdentity := createSigningIdentity() peer2SigningIdentity := createSigningIdentity() signingIdentities := []configtx.SigningIdentity{ peer1SigningIdentity, peer2SigningIdentity, } for _, si := range signingIdentities { // Sign the config update with the specified signer identity configSignature, err := configtx.SignConfigUpdate(configUpdate, si) if err != nil { panic(err) } configSignatures = append(configSignatures, configSignature) } // Sign the envelope with the list of signatures envelope, err := configtx.CreateSignedConfigUpdateEnvelope(configUpdate, peer1SigningIdentity, configSignatures...) if err != nil { panic(err) } // The below logic outputs the signed envelope in JSON format // The timestamps of the ChannelHeader varies so this comparison only considers the ConfigUpdateEnvelope JSON. payload := &cb.Payload{} err = proto.Unmarshal(envelope.Payload, payload) if err != nil { panic(err) } data := &cb.ConfigUpdateEnvelope{} err = proto.Unmarshal(payload.Data, data) if err != nil { panic(err) } // Signature and nonce is different on every example run data.Signatures = nil err = protolator.DeepMarshalJSON(os.Stdout, data) if err != nil { panic(err) }
Output: { "config_update": { "channel_id": "testchannel", "isolated_data": {}, "read_set": { "groups": { "Application": { "groups": { "Org1": { "groups": {}, "mod_policy": "", "policies": {}, "values": {}, "version": "0" } }, "mod_policy": "", "policies": { "Admins": { "mod_policy": "", "policy": null, "version": "0" }, "LifecycleEndorsement": { "mod_policy": "", "policy": null, "version": "0" }, "Readers": { "mod_policy": "", "policy": null, "version": "0" }, "Writers": { "mod_policy": "", "policy": null, "version": "0" } }, "values": { "ACLs": { "mod_policy": "", "value": null, "version": "0" }, "Capabilities": { "mod_policy": "", "value": null, "version": "0" } }, "version": "0" }, "Orderer": { "groups": { "OrdererOrg": { "groups": {}, "mod_policy": "", "policies": {}, "values": {}, "version": "0" } }, "mod_policy": "", "policies": { "Admins": { "mod_policy": "", "policy": null, "version": "0" }, "BlockValidation": { "mod_policy": "", "policy": null, "version": "0" }, "Readers": { "mod_policy": "", "policy": null, "version": "0" }, "Writers": { "mod_policy": "", "policy": null, "version": "0" } }, "values": { "Capabilities": { "mod_policy": "", "value": null, "version": "0" }, "ConsensusType": { "mod_policy": "", "value": null, "version": "0" } }, "version": "1" } }, "mod_policy": "", "policies": {}, "values": {}, "version": "0" }, "write_set": { "groups": { "Application": { "groups": { "Org1": { "groups": {}, "mod_policy": "", "policies": {}, "values": {}, "version": "0" }, "Org2": { "groups": {}, "mod_policy": "Admins", "policies": { "Admins": { "mod_policy": "Admins", "policy": { "type": 3, "value": { "rule": "MAJORITY", "sub_policy": "Admins" } }, "version": "0" }, "Endorsement": { "mod_policy": "Admins", "policy": { "type": 3, "value": { "rule": "MAJORITY", "sub_policy": "Endorsement" } }, "version": "0" }, "LifecycleEndorsement": { "mod_policy": "Admins", "policy": { "type": 3, "value": { "rule": "MAJORITY", "sub_policy": "Endorsement" } }, "version": "0" }, "Readers": { "mod_policy": "Admins", "policy": { "type": 3, "value": { "rule": "ANY", "sub_policy": "Readers" } }, "version": "0" }, "Writers": { "mod_policy": "Admins", "policy": { "type": 3, "value": { "rule": "ANY", "sub_policy": "Writers" } }, "version": "0" } }, "values": { "AnchorPeers": { "mod_policy": "Admins", "value": { "anchor_peers": [ { "host": "127.0.0.1", "port": 7051 } ] }, "version": "0" }, "MSP": { "mod_policy": "Admins", "value": { "config": { "admins": [ "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURBVENDQWVtZ0F3SUJBZ0lSQUtRa2tyRngxVC9kZ0IvR28veEJNNXN3RFFZSktvWklodmNOQVFFTEJRQXcKRWpFUU1BNEdBMVVFQ2hNSFFXTnRaU0JEYnpBZUZ3MHhOakE0TVRjeU1ETTJNRGRhRncweE56QTRNVGN5TURNMgpNRGRhTUJJeEVEQU9CZ05WQkFvVEIwRmpiV1VnUTI4d2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3CmdnRUtBb0lCQVFEQW9KdGpHN002SW5zV3dJbytsM3FxOXUrZzJyS0ZYTnU5L21aMjRYUThYaFY2UFVSKzVIUTQKalVGV0M1OEV4WWhvdHRxSzV6UXRLR2t3NU51aGpvd0ZVZ1dCL1ZsTkdBVUJIdEpjV1IvMDYyd1lySEJZUnhKSApxVlhPcFlLYklXd0ZLb1h1M2hjcGcvQ2tkT2xEV0dLb1pLQkN3UXdVQmhXRTdNRGhwVmRRK1psalVKV0wrRmxLCnlRSzVpUnNKZDVUR0o2VlV6THpkVDRmbU4yRHplSzZHTGV5TXBWcFUzc1dWOTBKSmJ4V1E0WXJ6a0t6WWhNbUIKRWNwWFRHMndtK3VqaUhVL2sycDh6bGY4U203VkJNL3NjbW5NRnQweW5OWG9wNEZXdkp6RW0xRzB4RDJ0K2UySQo1VXRyMDRkT1pQQ2drbSsrUUpnWWh0WnZnVzdaWmlHVEFnTUJBQUdqVWpCUU1BNEdBMVVkRHdFQi93UUVBd0lGCm9EQVRCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBVEFNQmdOVkhSTUJBZjhFQWpBQU1Cc0dBMVVkRVFRVU1CS0MKRUhSbGMzUXVaWGhoYlhCc1pTNWpiMjB3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQURwcUtReHJ0aEg1SW5DNwpYOTZVUDBPSkN1L2xMRU1rcmpvRVdZSVFhRmw3dUxQeEtINUFtUVBINGxZd0Y3dTdna3NSN293Vkc5UVU5ZnM2CjFmSzdJSTlDVmdDZC80dFowem05OEZtVTREMGxIR3RQQVJycnpvWmFxVlpjQXZSbkZUbFBYNXBGa1BoVmpqYWkKL21reFg5THBEOG9LMTQ0NURGSHhLNVVqTE1tUElJV2Q4RU9pK3Y1YStoZ0d3bkpwb1c3aG50U2w4a0hNdFRteQpmbm5rdHNibFNVVjRsUkNpdDB5bUM3T2poZStnekNDd2tnczVrRHpWVmFnK3RubC8wZTJEbG9JakFTd09ocGJICktWY2c3ZkJkNDg0aHQvc1MrbDBkc0I0S0RPU3BkOEp6VkRNRjhPWnFsYXlkaXpvSk8weVdyOUdiQ04xK09LcTUKRWhMckVxVT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=" ], "crypto_config": { "identity_identifier_hash_function": "SHA256", "signature_hash_family": "SHA3" }, "fabric_node_ous": { "admin_ou_identifier": { "certificate": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURBVENDQWVtZ0F3SUJBZ0lSQUtRa2tyRngxVC9kZ0IvR28veEJNNXN3RFFZSktvWklodmNOQVFFTEJRQXcKRWpFUU1BNEdBMVVFQ2hNSFFXTnRaU0JEYnpBZUZ3MHhOakE0TVRjeU1ETTJNRGRhRncweE56QTRNVGN5TURNMgpNRGRhTUJJeEVEQU9CZ05WQkFvVEIwRmpiV1VnUTI4d2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3CmdnRUtBb0lCQVFEQW9KdGpHN002SW5zV3dJbytsM3FxOXUrZzJyS0ZYTnU5L21aMjRYUThYaFY2UFVSKzVIUTQKalVGV0M1OEV4WWhvdHRxSzV6UXRLR2t3NU51aGpvd0ZVZ1dCL1ZsTkdBVUJIdEpjV1IvMDYyd1lySEJZUnhKSApxVlhPcFlLYklXd0ZLb1h1M2hjcGcvQ2tkT2xEV0dLb1pLQkN3UXdVQmhXRTdNRGhwVmRRK1psalVKV0wrRmxLCnlRSzVpUnNKZDVUR0o2VlV6THpkVDRmbU4yRHplSzZHTGV5TXBWcFUzc1dWOTBKSmJ4V1E0WXJ6a0t6WWhNbUIKRWNwWFRHMndtK3VqaUhVL2sycDh6bGY4U203VkJNL3NjbW5NRnQweW5OWG9wNEZXdkp6RW0xRzB4RDJ0K2UySQo1VXRyMDRkT1pQQ2drbSsrUUpnWWh0WnZnVzdaWmlHVEFnTUJBQUdqVWpCUU1BNEdBMVVkRHdFQi93UUVBd0lGCm9EQVRCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBVEFNQmdOVkhSTUJBZjhFQWpBQU1Cc0dBMVVkRVFRVU1CS0MKRUhSbGMzUXVaWGhoYlhCc1pTNWpiMjB3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQURwcUtReHJ0aEg1SW5DNwpYOTZVUDBPSkN1L2xMRU1rcmpvRVdZSVFhRmw3dUxQeEtINUFtUVBINGxZd0Y3dTdna3NSN293Vkc5UVU5ZnM2CjFmSzdJSTlDVmdDZC80dFowem05OEZtVTREMGxIR3RQQVJycnpvWmFxVlpjQXZSbkZUbFBYNXBGa1BoVmpqYWkKL21reFg5THBEOG9LMTQ0NURGSHhLNVVqTE1tUElJV2Q4RU9pK3Y1YStoZ0d3bkpwb1c3aG50U2w4a0hNdFRteQpmbm5rdHNibFNVVjRsUkNpdDB5bUM3T2poZStnekNDd2tnczVrRHpWVmFnK3RubC8wZTJEbG9JakFTd09ocGJICktWY2c3ZkJkNDg0aHQvc1MrbDBkc0I0S0RPU3BkOEp6VkRNRjhPWnFsYXlkaXpvSk8weVdyOUdiQ04xK09LcTUKRWhMckVxVT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=", "organizational_unit_identifier": "OUID" }, "client_ou_identifier": { "certificate": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURBVENDQWVtZ0F3SUJBZ0lSQUtRa2tyRngxVC9kZ0IvR28veEJNNXN3RFFZSktvWklodmNOQVFFTEJRQXcKRWpFUU1BNEdBMVVFQ2hNSFFXTnRaU0JEYnpBZUZ3MHhOakE0TVRjeU1ETTJNRGRhRncweE56QTRNVGN5TURNMgpNRGRhTUJJeEVEQU9CZ05WQkFvVEIwRmpiV1VnUTI4d2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3CmdnRUtBb0lCQVFEQW9KdGpHN002SW5zV3dJbytsM3FxOXUrZzJyS0ZYTnU5L21aMjRYUThYaFY2UFVSKzVIUTQKalVGV0M1OEV4WWhvdHRxSzV6UXRLR2t3NU51aGpvd0ZVZ1dCL1ZsTkdBVUJIdEpjV1IvMDYyd1lySEJZUnhKSApxVlhPcFlLYklXd0ZLb1h1M2hjcGcvQ2tkT2xEV0dLb1pLQkN3UXdVQmhXRTdNRGhwVmRRK1psalVKV0wrRmxLCnlRSzVpUnNKZDVUR0o2VlV6THpkVDRmbU4yRHplSzZHTGV5TXBWcFUzc1dWOTBKSmJ4V1E0WXJ6a0t6WWhNbUIKRWNwWFRHMndtK3VqaUhVL2sycDh6bGY4U203VkJNL3NjbW5NRnQweW5OWG9wNEZXdkp6RW0xRzB4RDJ0K2UySQo1VXRyMDRkT1pQQ2drbSsrUUpnWWh0WnZnVzdaWmlHVEFnTUJBQUdqVWpCUU1BNEdBMVVkRHdFQi93UUVBd0lGCm9EQVRCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBVEFNQmdOVkhSTUJBZjhFQWpBQU1Cc0dBMVVkRVFRVU1CS0MKRUhSbGMzUXVaWGhoYlhCc1pTNWpiMjB3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQURwcUtReHJ0aEg1SW5DNwpYOTZVUDBPSkN1L2xMRU1rcmpvRVdZSVFhRmw3dUxQeEtINUFtUVBINGxZd0Y3dTdna3NSN293Vkc5UVU5ZnM2CjFmSzdJSTlDVmdDZC80dFowem05OEZtVTREMGxIR3RQQVJycnpvWmFxVlpjQXZSbkZUbFBYNXBGa1BoVmpqYWkKL21reFg5THBEOG9LMTQ0NURGSHhLNVVqTE1tUElJV2Q4RU9pK3Y1YStoZ0d3bkpwb1c3aG50U2w4a0hNdFRteQpmbm5rdHNibFNVVjRsUkNpdDB5bUM3T2poZStnekNDd2tnczVrRHpWVmFnK3RubC8wZTJEbG9JakFTd09ocGJICktWY2c3ZkJkNDg0aHQvc1MrbDBkc0I0S0RPU3BkOEp6VkRNRjhPWnFsYXlkaXpvSk8weVdyOUdiQ04xK09LcTUKRWhMckVxVT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=", "organizational_unit_identifier": "OUID" }, "enable": false, "orderer_ou_identifier": { "certificate": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURBVENDQWVtZ0F3SUJBZ0lSQUtRa2tyRngxVC9kZ0IvR28veEJNNXN3RFFZSktvWklodmNOQVFFTEJRQXcKRWpFUU1BNEdBMVVFQ2hNSFFXTnRaU0JEYnpBZUZ3MHhOakE0TVRjeU1ETTJNRGRhRncweE56QTRNVGN5TURNMgpNRGRhTUJJeEVEQU9CZ05WQkFvVEIwRmpiV1VnUTI4d2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3CmdnRUtBb0lCQVFEQW9KdGpHN002SW5zV3dJbytsM3FxOXUrZzJyS0ZYTnU5L21aMjRYUThYaFY2UFVSKzVIUTQKalVGV0M1OEV4WWhvdHRxSzV6UXRLR2t3NU51aGpvd0ZVZ1dCL1ZsTkdBVUJIdEpjV1IvMDYyd1lySEJZUnhKSApxVlhPcFlLYklXd0ZLb1h1M2hjcGcvQ2tkT2xEV0dLb1pLQkN3UXdVQmhXRTdNRGhwVmRRK1psalVKV0wrRmxLCnlRSzVpUnNKZDVUR0o2VlV6THpkVDRmbU4yRHplSzZHTGV5TXBWcFUzc1dWOTBKSmJ4V1E0WXJ6a0t6WWhNbUIKRWNwWFRHMndtK3VqaUhVL2sycDh6bGY4U203VkJNL3NjbW5NRnQweW5OWG9wNEZXdkp6RW0xRzB4RDJ0K2UySQo1VXRyMDRkT1pQQ2drbSsrUUpnWWh0WnZnVzdaWmlHVEFnTUJBQUdqVWpCUU1BNEdBMVVkRHdFQi93UUVBd0lGCm9EQVRCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBVEFNQmdOVkhSTUJBZjhFQWpBQU1Cc0dBMVVkRVFRVU1CS0MKRUhSbGMzUXVaWGhoYlhCc1pTNWpiMjB3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQURwcUtReHJ0aEg1SW5DNwpYOTZVUDBPSkN1L2xMRU1rcmpvRVdZSVFhRmw3dUxQeEtINUFtUVBINGxZd0Y3dTdna3NSN293Vkc5UVU5ZnM2CjFmSzdJSTlDVmdDZC80dFowem05OEZtVTREMGxIR3RQQVJycnpvWmFxVlpjQXZSbkZUbFBYNXBGa1BoVmpqYWkKL21reFg5THBEOG9LMTQ0NURGSHhLNVVqTE1tUElJV2Q4RU9pK3Y1YStoZ0d3bkpwb1c3aG50U2w4a0hNdFRteQpmbm5rdHNibFNVVjRsUkNpdDB5bUM3T2poZStnekNDd2tnczVrRHpWVmFnK3RubC8wZTJEbG9JakFTd09ocGJICktWY2c3ZkJkNDg0aHQvc1MrbDBkc0I0S0RPU3BkOEp6VkRNRjhPWnFsYXlkaXpvSk8weVdyOUdiQ04xK09LcTUKRWhMckVxVT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=", "organizational_unit_identifier": "OUID" }, "peer_ou_identifier": { "certificate": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURBVENDQWVtZ0F3SUJBZ0lSQUtRa2tyRngxVC9kZ0IvR28veEJNNXN3RFFZSktvWklodmNOQVFFTEJRQXcKRWpFUU1BNEdBMVVFQ2hNSFFXTnRaU0JEYnpBZUZ3MHhOakE0TVRjeU1ETTJNRGRhRncweE56QTRNVGN5TURNMgpNRGRhTUJJeEVEQU9CZ05WQkFvVEIwRmpiV1VnUTI4d2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3CmdnRUtBb0lCQVFEQW9KdGpHN002SW5zV3dJbytsM3FxOXUrZzJyS0ZYTnU5L21aMjRYUThYaFY2UFVSKzVIUTQKalVGV0M1OEV4WWhvdHRxSzV6UXRLR2t3NU51aGpvd0ZVZ1dCL1ZsTkdBVUJIdEpjV1IvMDYyd1lySEJZUnhKSApxVlhPcFlLYklXd0ZLb1h1M2hjcGcvQ2tkT2xEV0dLb1pLQkN3UXdVQmhXRTdNRGhwVmRRK1psalVKV0wrRmxLCnlRSzVpUnNKZDVUR0o2VlV6THpkVDRmbU4yRHplSzZHTGV5TXBWcFUzc1dWOTBKSmJ4V1E0WXJ6a0t6WWhNbUIKRWNwWFRHMndtK3VqaUhVL2sycDh6bGY4U203VkJNL3NjbW5NRnQweW5OWG9wNEZXdkp6RW0xRzB4RDJ0K2UySQo1VXRyMDRkT1pQQ2drbSsrUUpnWWh0WnZnVzdaWmlHVEFnTUJBQUdqVWpCUU1BNEdBMVVkRHdFQi93UUVBd0lGCm9EQVRCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBVEFNQmdOVkhSTUJBZjhFQWpBQU1Cc0dBMVVkRVFRVU1CS0MKRUhSbGMzUXVaWGhoYlhCc1pTNWpiMjB3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQURwcUtReHJ0aEg1SW5DNwpYOTZVUDBPSkN1L2xMRU1rcmpvRVdZSVFhRmw3dUxQeEtINUFtUVBINGxZd0Y3dTdna3NSN293Vkc5UVU5ZnM2CjFmSzdJSTlDVmdDZC80dFowem05OEZtVTREMGxIR3RQQVJycnpvWmFxVlpjQXZSbkZUbFBYNXBGa1BoVmpqYWkKL21reFg5THBEOG9LMTQ0NURGSHhLNVVqTE1tUElJV2Q4RU9pK3Y1YStoZ0d3bkpwb1c3aG50U2w4a0hNdFRteQpmbm5rdHNibFNVVjRsUkNpdDB5bUM3T2poZStnekNDd2tnczVrRHpWVmFnK3RubC8wZTJEbG9JakFTd09ocGJICktWY2c3ZkJkNDg0aHQvc1MrbDBkc0I0S0RPU3BkOEp6VkRNRjhPWnFsYXlkaXpvSk8weVdyOUdiQ04xK09LcTUKRWhMckVxVT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=", "organizational_unit_identifier": "OUID" } }, "intermediate_certs": [ "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURBVENDQWVtZ0F3SUJBZ0lSQUtRa2tyRngxVC9kZ0IvR28veEJNNXN3RFFZSktvWklodmNOQVFFTEJRQXcKRWpFUU1BNEdBMVVFQ2hNSFFXTnRaU0JEYnpBZUZ3MHhOakE0TVRjeU1ETTJNRGRhRncweE56QTRNVGN5TURNMgpNRGRhTUJJeEVEQU9CZ05WQkFvVEIwRmpiV1VnUTI4d2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3CmdnRUtBb0lCQVFEQW9KdGpHN002SW5zV3dJbytsM3FxOXUrZzJyS0ZYTnU5L21aMjRYUThYaFY2UFVSKzVIUTQKalVGV0M1OEV4WWhvdHRxSzV6UXRLR2t3NU51aGpvd0ZVZ1dCL1ZsTkdBVUJIdEpjV1IvMDYyd1lySEJZUnhKSApxVlhPcFlLYklXd0ZLb1h1M2hjcGcvQ2tkT2xEV0dLb1pLQkN3UXdVQmhXRTdNRGhwVmRRK1psalVKV0wrRmxLCnlRSzVpUnNKZDVUR0o2VlV6THpkVDRmbU4yRHplSzZHTGV5TXBWcFUzc1dWOTBKSmJ4V1E0WXJ6a0t6WWhNbUIKRWNwWFRHMndtK3VqaUhVL2sycDh6bGY4U203VkJNL3NjbW5NRnQweW5OWG9wNEZXdkp6RW0xRzB4RDJ0K2UySQo1VXRyMDRkT1pQQ2drbSsrUUpnWWh0WnZnVzdaWmlHVEFnTUJBQUdqVWpCUU1BNEdBMVVkRHdFQi93UUVBd0lGCm9EQVRCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBVEFNQmdOVkhSTUJBZjhFQWpBQU1Cc0dBMVVkRVFRVU1CS0MKRUhSbGMzUXVaWGhoYlhCc1pTNWpiMjB3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQURwcUtReHJ0aEg1SW5DNwpYOTZVUDBPSkN1L2xMRU1rcmpvRVdZSVFhRmw3dUxQeEtINUFtUVBINGxZd0Y3dTdna3NSN293Vkc5UVU5ZnM2CjFmSzdJSTlDVmdDZC80dFowem05OEZtVTREMGxIR3RQQVJycnpvWmFxVlpjQXZSbkZUbFBYNXBGa1BoVmpqYWkKL21reFg5THBEOG9LMTQ0NURGSHhLNVVqTE1tUElJV2Q4RU9pK3Y1YStoZ0d3bkpwb1c3aG50U2w4a0hNdFRteQpmbm5rdHNibFNVVjRsUkNpdDB5bUM3T2poZStnekNDd2tnczVrRHpWVmFnK3RubC8wZTJEbG9JakFTd09ocGJICktWY2c3ZkJkNDg0aHQvc1MrbDBkc0I0S0RPU3BkOEp6VkRNRjhPWnFsYXlkaXpvSk8weVdyOUdiQ04xK09LcTUKRWhMckVxVT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=" ], "name": "MSPID", "organizational_unit_identifiers": [ { "certificate": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURBVENDQWVtZ0F3SUJBZ0lSQUtRa2tyRngxVC9kZ0IvR28veEJNNXN3RFFZSktvWklodmNOQVFFTEJRQXcKRWpFUU1BNEdBMVVFQ2hNSFFXTnRaU0JEYnpBZUZ3MHhOakE0TVRjeU1ETTJNRGRhRncweE56QTRNVGN5TURNMgpNRGRhTUJJeEVEQU9CZ05WQkFvVEIwRmpiV1VnUTI4d2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3CmdnRUtBb0lCQVFEQW9KdGpHN002SW5zV3dJbytsM3FxOXUrZzJyS0ZYTnU5L21aMjRYUThYaFY2UFVSKzVIUTQKalVGV0M1OEV4WWhvdHRxSzV6UXRLR2t3NU51aGpvd0ZVZ1dCL1ZsTkdBVUJIdEpjV1IvMDYyd1lySEJZUnhKSApxVlhPcFlLYklXd0ZLb1h1M2hjcGcvQ2tkT2xEV0dLb1pLQkN3UXdVQmhXRTdNRGhwVmRRK1psalVKV0wrRmxLCnlRSzVpUnNKZDVUR0o2VlV6THpkVDRmbU4yRHplSzZHTGV5TXBWcFUzc1dWOTBKSmJ4V1E0WXJ6a0t6WWhNbUIKRWNwWFRHMndtK3VqaUhVL2sycDh6bGY4U203VkJNL3NjbW5NRnQweW5OWG9wNEZXdkp6RW0xRzB4RDJ0K2UySQo1VXRyMDRkT1pQQ2drbSsrUUpnWWh0WnZnVzdaWmlHVEFnTUJBQUdqVWpCUU1BNEdBMVVkRHdFQi93UUVBd0lGCm9EQVRCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBVEFNQmdOVkhSTUJBZjhFQWpBQU1Cc0dBMVVkRVFRVU1CS0MKRUhSbGMzUXVaWGhoYlhCc1pTNWpiMjB3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQURwcUtReHJ0aEg1SW5DNwpYOTZVUDBPSkN1L2xMRU1rcmpvRVdZSVFhRmw3dUxQeEtINUFtUVBINGxZd0Y3dTdna3NSN293Vkc5UVU5ZnM2CjFmSzdJSTlDVmdDZC80dFowem05OEZtVTREMGxIR3RQQVJycnpvWmFxVlpjQXZSbkZUbFBYNXBGa1BoVmpqYWkKL21reFg5THBEOG9LMTQ0NURGSHhLNVVqTE1tUElJV2Q4RU9pK3Y1YStoZ0d3bkpwb1c3aG50U2w4a0hNdFRteQpmbm5rdHNibFNVVjRsUkNpdDB5bUM3T2poZStnekNDd2tnczVrRHpWVmFnK3RubC8wZTJEbG9JakFTd09ocGJICktWY2c3ZkJkNDg0aHQvc1MrbDBkc0I0S0RPU3BkOEp6VkRNRjhPWnFsYXlkaXpvSk8weVdyOUdiQ04xK09LcTUKRWhMckVxVT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=", "organizational_unit_identifier": "OUID" } ], "revocation_list": [ "LS0tLS1CRUdJTiBYNTA5IENSTC0tLS0tCk1JSUJZRENCeWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCRE1STXdFUVlLQ1pJbWlaUHlMR1FCR1JZRFkyOXQKTVJjd0ZRWUtDWkltaVpQeUxHUUJHUllIWlhoaGJYQnNaVEVUTUJFR0ExVUVBeE1LUlhoaGJYQnNaU0JEUVJjTgpNRFV3TWpBMU1USXdNREF3V2hjTk1EVXdNakEyTVRJd01EQXdXakFpTUNBQ0FSSVhEVEEwTVRFeE9URTFOVGN3Ck0xb3dEREFLQmdOVkhSVUVBd29CQWFBdk1DMHdId1lEVlIwakJCZ3dGb0FVQ0dpdmhUUElPVXA2K0lLVGpuQnEKU2lDRUxESXdDZ1lEVlIwVUJBTUNBUXd3RFFZSktvWklodmNOQVFFRkJRQURnWUVBSXR3WWZmY0l6c3gxME5CcQptNjBROUhZanRJRnV0VzIrRHZzVkZHeklGMjBmN3BBWG9tOWc1TDJxakZYZWpvUnZrdmlmRUJJbnIwclVMNFhpCk5rUjlxcU5NSlRnVi93RDlQbjd1UFNZUzY5am5LMkxpSzhOR2dPOTRndEVWeHRDY2Ntckx6bnJ0WjVtTGJuQ0IKZlVOQ2RNR21yOEZWRjZJelROWUdtQ3VrL0M0PQotLS0tLUVORCBYNTA5IENSTC0tLS0tCg==" ], "root_certs": [ "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURBVENDQWVtZ0F3SUJBZ0lSQUtRa2tyRngxVC9kZ0IvR28veEJNNXN3RFFZSktvWklodmNOQVFFTEJRQXcKRWpFUU1BNEdBMVVFQ2hNSFFXTnRaU0JEYnpBZUZ3MHhOakE0TVRjeU1ETTJNRGRhRncweE56QTRNVGN5TURNMgpNRGRhTUJJeEVEQU9CZ05WQkFvVEIwRmpiV1VnUTI4d2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3CmdnRUtBb0lCQVFEQW9KdGpHN002SW5zV3dJbytsM3FxOXUrZzJyS0ZYTnU5L21aMjRYUThYaFY2UFVSKzVIUTQKalVGV0M1OEV4WWhvdHRxSzV6UXRLR2t3NU51aGpvd0ZVZ1dCL1ZsTkdBVUJIdEpjV1IvMDYyd1lySEJZUnhKSApxVlhPcFlLYklXd0ZLb1h1M2hjcGcvQ2tkT2xEV0dLb1pLQkN3UXdVQmhXRTdNRGhwVmRRK1psalVKV0wrRmxLCnlRSzVpUnNKZDVUR0o2VlV6THpkVDRmbU4yRHplSzZHTGV5TXBWcFUzc1dWOTBKSmJ4V1E0WXJ6a0t6WWhNbUIKRWNwWFRHMndtK3VqaUhVL2sycDh6bGY4U203VkJNL3NjbW5NRnQweW5OWG9wNEZXdkp6RW0xRzB4RDJ0K2UySQo1VXRyMDRkT1pQQ2drbSsrUUpnWWh0WnZnVzdaWmlHVEFnTUJBQUdqVWpCUU1BNEdBMVVkRHdFQi93UUVBd0lGCm9EQVRCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBVEFNQmdOVkhSTUJBZjhFQWpBQU1Cc0dBMVVkRVFRVU1CS0MKRUhSbGMzUXVaWGhoYlhCc1pTNWpiMjB3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQURwcUtReHJ0aEg1SW5DNwpYOTZVUDBPSkN1L2xMRU1rcmpvRVdZSVFhRmw3dUxQeEtINUFtUVBINGxZd0Y3dTdna3NSN293Vkc5UVU5ZnM2CjFmSzdJSTlDVmdDZC80dFowem05OEZtVTREMGxIR3RQQVJycnpvWmFxVlpjQXZSbkZUbFBYNXBGa1BoVmpqYWkKL21reFg5THBEOG9LMTQ0NURGSHhLNVVqTE1tUElJV2Q4RU9pK3Y1YStoZ0d3bkpwb1c3aG50U2w4a0hNdFRteQpmbm5rdHNibFNVVjRsUkNpdDB5bUM3T2poZStnekNDd2tnczVrRHpWVmFnK3RubC8wZTJEbG9JakFTd09ocGJICktWY2c3ZkJkNDg0aHQvc1MrbDBkc0I0S0RPU3BkOEp6VkRNRjhPWnFsYXlkaXpvSk8weVdyOUdiQ04xK09LcTUKRWhMckVxVT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=" ], "signing_identity": { "private_signer": { "key_identifier": "SKI-1", "key_material": "LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JR0hBZ0VBTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEJHMHdhd0lCQVFRZ0RaVWdEdktpeGZMaThjSzgKL1RGTFk5N1REbVFWM0oyeWdQcHZ1SThqU2RpaFJBTkNBQVJSTjN4Z2JQSVI4M2RyMjdVdURhZjJPSmV6cEVKeApVQzN2MDYrRkQ4TVVOY1JBYm9xdDRha2VoYU5OU2g3TU1aSStIZG5zTTRSWE4yeThOZVBVUXNQTAotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tCg==" }, "public_signer": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURBVENDQWVtZ0F3SUJBZ0lSQUtRa2tyRngxVC9kZ0IvR28veEJNNXN3RFFZSktvWklodmNOQVFFTEJRQXcKRWpFUU1BNEdBMVVFQ2hNSFFXTnRaU0JEYnpBZUZ3MHhOakE0TVRjeU1ETTJNRGRhRncweE56QTRNVGN5TURNMgpNRGRhTUJJeEVEQU9CZ05WQkFvVEIwRmpiV1VnUTI4d2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3CmdnRUtBb0lCQVFEQW9KdGpHN002SW5zV3dJbytsM3FxOXUrZzJyS0ZYTnU5L21aMjRYUThYaFY2UFVSKzVIUTQKalVGV0M1OEV4WWhvdHRxSzV6UXRLR2t3NU51aGpvd0ZVZ1dCL1ZsTkdBVUJIdEpjV1IvMDYyd1lySEJZUnhKSApxVlhPcFlLYklXd0ZLb1h1M2hjcGcvQ2tkT2xEV0dLb1pLQkN3UXdVQmhXRTdNRGhwVmRRK1psalVKV0wrRmxLCnlRSzVpUnNKZDVUR0o2VlV6THpkVDRmbU4yRHplSzZHTGV5TXBWcFUzc1dWOTBKSmJ4V1E0WXJ6a0t6WWhNbUIKRWNwWFRHMndtK3VqaUhVL2sycDh6bGY4U203VkJNL3NjbW5NRnQweW5OWG9wNEZXdkp6RW0xRzB4RDJ0K2UySQo1VXRyMDRkT1pQQ2drbSsrUUpnWWh0WnZnVzdaWmlHVEFnTUJBQUdqVWpCUU1BNEdBMVVkRHdFQi93UUVBd0lGCm9EQVRCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBVEFNQmdOVkhSTUJBZjhFQWpBQU1Cc0dBMVVkRVFRVU1CS0MKRUhSbGMzUXVaWGhoYlhCc1pTNWpiMjB3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQURwcUtReHJ0aEg1SW5DNwpYOTZVUDBPSkN1L2xMRU1rcmpvRVdZSVFhRmw3dUxQeEtINUFtUVBINGxZd0Y3dTdna3NSN293Vkc5UVU5ZnM2CjFmSzdJSTlDVmdDZC80dFowem05OEZtVTREMGxIR3RQQVJycnpvWmFxVlpjQXZSbkZUbFBYNXBGa1BoVmpqYWkKL21reFg5THBEOG9LMTQ0NURGSHhLNVVqTE1tUElJV2Q4RU9pK3Y1YStoZ0d3bkpwb1c3aG50U2w4a0hNdFRteQpmbm5rdHNibFNVVjRsUkNpdDB5bUM3T2poZStnekNDd2tnczVrRHpWVmFnK3RubC8wZTJEbG9JakFTd09ocGJICktWY2c3ZkJkNDg0aHQvc1MrbDBkc0I0S0RPU3BkOEp6VkRNRjhPWnFsYXlkaXpvSk8weVdyOUdiQ04xK09LcTUKRWhMckVxVT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=" }, "tls_intermediate_certs": [ "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURBVENDQWVtZ0F3SUJBZ0lSQUtRa2tyRngxVC9kZ0IvR28veEJNNXN3RFFZSktvWklodmNOQVFFTEJRQXcKRWpFUU1BNEdBMVVFQ2hNSFFXTnRaU0JEYnpBZUZ3MHhOakE0TVRjeU1ETTJNRGRhRncweE56QTRNVGN5TURNMgpNRGRhTUJJeEVEQU9CZ05WQkFvVEIwRmpiV1VnUTI4d2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3CmdnRUtBb0lCQVFEQW9KdGpHN002SW5zV3dJbytsM3FxOXUrZzJyS0ZYTnU5L21aMjRYUThYaFY2UFVSKzVIUTQKalVGV0M1OEV4WWhvdHRxSzV6UXRLR2t3NU51aGpvd0ZVZ1dCL1ZsTkdBVUJIdEpjV1IvMDYyd1lySEJZUnhKSApxVlhPcFlLYklXd0ZLb1h1M2hjcGcvQ2tkT2xEV0dLb1pLQkN3UXdVQmhXRTdNRGhwVmRRK1psalVKV0wrRmxLCnlRSzVpUnNKZDVUR0o2VlV6THpkVDRmbU4yRHplSzZHTGV5TXBWcFUzc1dWOTBKSmJ4V1E0WXJ6a0t6WWhNbUIKRWNwWFRHMndtK3VqaUhVL2sycDh6bGY4U203VkJNL3NjbW5NRnQweW5OWG9wNEZXdkp6RW0xRzB4RDJ0K2UySQo1VXRyMDRkT1pQQ2drbSsrUUpnWWh0WnZnVzdaWmlHVEFnTUJBQUdqVWpCUU1BNEdBMVVkRHdFQi93UUVBd0lGCm9EQVRCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBVEFNQmdOVkhSTUJBZjhFQWpBQU1Cc0dBMVVkRVFRVU1CS0MKRUhSbGMzUXVaWGhoYlhCc1pTNWpiMjB3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQURwcUtReHJ0aEg1SW5DNwpYOTZVUDBPSkN1L2xMRU1rcmpvRVdZSVFhRmw3dUxQeEtINUFtUVBINGxZd0Y3dTdna3NSN293Vkc5UVU5ZnM2CjFmSzdJSTlDVmdDZC80dFowem05OEZtVTREMGxIR3RQQVJycnpvWmFxVlpjQXZSbkZUbFBYNXBGa1BoVmpqYWkKL21reFg5THBEOG9LMTQ0NURGSHhLNVVqTE1tUElJV2Q4RU9pK3Y1YStoZ0d3bkpwb1c3aG50U2w4a0hNdFRteQpmbm5rdHNibFNVVjRsUkNpdDB5bUM3T2poZStnekNDd2tnczVrRHpWVmFnK3RubC8wZTJEbG9JakFTd09ocGJICktWY2c3ZkJkNDg0aHQvc1MrbDBkc0I0S0RPU3BkOEp6VkRNRjhPWnFsYXlkaXpvSk8weVdyOUdiQ04xK09LcTUKRWhMckVxVT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=" ], "tls_root_certs": [ "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURBVENDQWVtZ0F3SUJBZ0lSQUtRa2tyRngxVC9kZ0IvR28veEJNNXN3RFFZSktvWklodmNOQVFFTEJRQXcKRWpFUU1BNEdBMVVFQ2hNSFFXTnRaU0JEYnpBZUZ3MHhOakE0TVRjeU1ETTJNRGRhRncweE56QTRNVGN5TURNMgpNRGRhTUJJeEVEQU9CZ05WQkFvVEIwRmpiV1VnUTI4d2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3CmdnRUtBb0lCQVFEQW9KdGpHN002SW5zV3dJbytsM3FxOXUrZzJyS0ZYTnU5L21aMjRYUThYaFY2UFVSKzVIUTQKalVGV0M1OEV4WWhvdHRxSzV6UXRLR2t3NU51aGpvd0ZVZ1dCL1ZsTkdBVUJIdEpjV1IvMDYyd1lySEJZUnhKSApxVlhPcFlLYklXd0ZLb1h1M2hjcGcvQ2tkT2xEV0dLb1pLQkN3UXdVQmhXRTdNRGhwVmRRK1psalVKV0wrRmxLCnlRSzVpUnNKZDVUR0o2VlV6THpkVDRmbU4yRHplSzZHTGV5TXBWcFUzc1dWOTBKSmJ4V1E0WXJ6a0t6WWhNbUIKRWNwWFRHMndtK3VqaUhVL2sycDh6bGY4U203VkJNL3NjbW5NRnQweW5OWG9wNEZXdkp6RW0xRzB4RDJ0K2UySQo1VXRyMDRkT1pQQ2drbSsrUUpnWWh0WnZnVzdaWmlHVEFnTUJBQUdqVWpCUU1BNEdBMVVkRHdFQi93UUVBd0lGCm9EQVRCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBVEFNQmdOVkhSTUJBZjhFQWpBQU1Cc0dBMVVkRVFRVU1CS0MKRUhSbGMzUXVaWGhoYlhCc1pTNWpiMjB3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQURwcUtReHJ0aEg1SW5DNwpYOTZVUDBPSkN1L2xMRU1rcmpvRVdZSVFhRmw3dUxQeEtINUFtUVBINGxZd0Y3dTdna3NSN293Vkc5UVU5ZnM2CjFmSzdJSTlDVmdDZC80dFowem05OEZtVTREMGxIR3RQQVJycnpvWmFxVlpjQXZSbkZUbFBYNXBGa1BoVmpqYWkKL21reFg5THBEOG9LMTQ0NURGSHhLNVVqTE1tUElJV2Q4RU9pK3Y1YStoZ0d3bkpwb1c3aG50U2w4a0hNdFRteQpmbm5rdHNibFNVVjRsUkNpdDB5bUM3T2poZStnekNDd2tnczVrRHpWVmFnK3RubC8wZTJEbG9JakFTd09ocGJICktWY2c3ZkJkNDg0aHQvc1MrbDBkc0I0S0RPU3BkOEp6VkRNRjhPWnFsYXlkaXpvSk8weVdyOUdiQ04xK09LcTUKRWhMckVxVT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=" ] }, "type": 0 }, "version": "0" } }, "version": "0" } }, "mod_policy": "", "policies": { "Admins": { "mod_policy": "", "policy": null, "version": "0" }, "LifecycleEndorsement": { "mod_policy": "", "policy": null, "version": "0" }, "Readers": { "mod_policy": "", "policy": null, "version": "0" }, "Writers": { "mod_policy": "", "policy": null, "version": "0" } }, "values": { "ACLs": { "mod_policy": "", "value": null, "version": "0" }, "Capabilities": { "mod_policy": "", "value": null, "version": "0" } }, "version": "1" }, "Orderer": { "groups": { "OrdererOrg": { "groups": {}, "mod_policy": "", "policies": {}, "values": {}, "version": "0" }, "OrdererOrg2": { "groups": {}, "mod_policy": "Admins", "policies": { "Admins": { "mod_policy": "Admins", "policy": { "type": 3, "value": { "rule": "MAJORITY", "sub_policy": "Admins" } }, "version": "0" }, "BlockValidation": { "mod_policy": "Admins", "policy": { "type": 3, "value": { "rule": "ANY", "sub_policy": "Writers" } }, "version": "0" }, "Readers": { "mod_policy": "Admins", "policy": { "type": 3, "value": { "rule": "ANY", "sub_policy": "Readers" } }, "version": "0" }, "Writers": { "mod_policy": "Admins", "policy": { "type": 3, "value": { "rule": "ANY", "sub_policy": "Writers" } }, "version": "0" } }, "values": { "Endpoints": { "mod_policy": "Admins", "value": { "addresses": [ "127.0.0.1:7050", "127.0.0.1:8050" ] }, "version": "0" }, "MSP": { "mod_policy": "Admins", "value": { "config": { "admins": [ "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURBVENDQWVtZ0F3SUJBZ0lSQUtRa2tyRngxVC9kZ0IvR28veEJNNXN3RFFZSktvWklodmNOQVFFTEJRQXcKRWpFUU1BNEdBMVVFQ2hNSFFXTnRaU0JEYnpBZUZ3MHhOakE0TVRjeU1ETTJNRGRhRncweE56QTRNVGN5TURNMgpNRGRhTUJJeEVEQU9CZ05WQkFvVEIwRmpiV1VnUTI4d2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3CmdnRUtBb0lCQVFEQW9KdGpHN002SW5zV3dJbytsM3FxOXUrZzJyS0ZYTnU5L21aMjRYUThYaFY2UFVSKzVIUTQKalVGV0M1OEV4WWhvdHRxSzV6UXRLR2t3NU51aGpvd0ZVZ1dCL1ZsTkdBVUJIdEpjV1IvMDYyd1lySEJZUnhKSApxVlhPcFlLYklXd0ZLb1h1M2hjcGcvQ2tkT2xEV0dLb1pLQkN3UXdVQmhXRTdNRGhwVmRRK1psalVKV0wrRmxLCnlRSzVpUnNKZDVUR0o2VlV6THpkVDRmbU4yRHplSzZHTGV5TXBWcFUzc1dWOTBKSmJ4V1E0WXJ6a0t6WWhNbUIKRWNwWFRHMndtK3VqaUhVL2sycDh6bGY4U203VkJNL3NjbW5NRnQweW5OWG9wNEZXdkp6RW0xRzB4RDJ0K2UySQo1VXRyMDRkT1pQQ2drbSsrUUpnWWh0WnZnVzdaWmlHVEFnTUJBQUdqVWpCUU1BNEdBMVVkRHdFQi93UUVBd0lGCm9EQVRCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBVEFNQmdOVkhSTUJBZjhFQWpBQU1Cc0dBMVVkRVFRVU1CS0MKRUhSbGMzUXVaWGhoYlhCc1pTNWpiMjB3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQURwcUtReHJ0aEg1SW5DNwpYOTZVUDBPSkN1L2xMRU1rcmpvRVdZSVFhRmw3dUxQeEtINUFtUVBINGxZd0Y3dTdna3NSN293Vkc5UVU5ZnM2CjFmSzdJSTlDVmdDZC80dFowem05OEZtVTREMGxIR3RQQVJycnpvWmFxVlpjQXZSbkZUbFBYNXBGa1BoVmpqYWkKL21reFg5THBEOG9LMTQ0NURGSHhLNVVqTE1tUElJV2Q4RU9pK3Y1YStoZ0d3bkpwb1c3aG50U2w4a0hNdFRteQpmbm5rdHNibFNVVjRsUkNpdDB5bUM3T2poZStnekNDd2tnczVrRHpWVmFnK3RubC8wZTJEbG9JakFTd09ocGJICktWY2c3ZkJkNDg0aHQvc1MrbDBkc0I0S0RPU3BkOEp6VkRNRjhPWnFsYXlkaXpvSk8weVdyOUdiQ04xK09LcTUKRWhMckVxVT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=" ], "crypto_config": { "identity_identifier_hash_function": "SHA256", "signature_hash_family": "SHA3" }, "fabric_node_ous": { "admin_ou_identifier": { "certificate": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURBVENDQWVtZ0F3SUJBZ0lSQUtRa2tyRngxVC9kZ0IvR28veEJNNXN3RFFZSktvWklodmNOQVFFTEJRQXcKRWpFUU1BNEdBMVVFQ2hNSFFXTnRaU0JEYnpBZUZ3MHhOakE0TVRjeU1ETTJNRGRhRncweE56QTRNVGN5TURNMgpNRGRhTUJJeEVEQU9CZ05WQkFvVEIwRmpiV1VnUTI4d2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3CmdnRUtBb0lCQVFEQW9KdGpHN002SW5zV3dJbytsM3FxOXUrZzJyS0ZYTnU5L21aMjRYUThYaFY2UFVSKzVIUTQKalVGV0M1OEV4WWhvdHRxSzV6UXRLR2t3NU51aGpvd0ZVZ1dCL1ZsTkdBVUJIdEpjV1IvMDYyd1lySEJZUnhKSApxVlhPcFlLYklXd0ZLb1h1M2hjcGcvQ2tkT2xEV0dLb1pLQkN3UXdVQmhXRTdNRGhwVmRRK1psalVKV0wrRmxLCnlRSzVpUnNKZDVUR0o2VlV6THpkVDRmbU4yRHplSzZHTGV5TXBWcFUzc1dWOTBKSmJ4V1E0WXJ6a0t6WWhNbUIKRWNwWFRHMndtK3VqaUhVL2sycDh6bGY4U203VkJNL3NjbW5NRnQweW5OWG9wNEZXdkp6RW0xRzB4RDJ0K2UySQo1VXRyMDRkT1pQQ2drbSsrUUpnWWh0WnZnVzdaWmlHVEFnTUJBQUdqVWpCUU1BNEdBMVVkRHdFQi93UUVBd0lGCm9EQVRCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBVEFNQmdOVkhSTUJBZjhFQWpBQU1Cc0dBMVVkRVFRVU1CS0MKRUhSbGMzUXVaWGhoYlhCc1pTNWpiMjB3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQURwcUtReHJ0aEg1SW5DNwpYOTZVUDBPSkN1L2xMRU1rcmpvRVdZSVFhRmw3dUxQeEtINUFtUVBINGxZd0Y3dTdna3NSN293Vkc5UVU5ZnM2CjFmSzdJSTlDVmdDZC80dFowem05OEZtVTREMGxIR3RQQVJycnpvWmFxVlpjQXZSbkZUbFBYNXBGa1BoVmpqYWkKL21reFg5THBEOG9LMTQ0NURGSHhLNVVqTE1tUElJV2Q4RU9pK3Y1YStoZ0d3bkpwb1c3aG50U2w4a0hNdFRteQpmbm5rdHNibFNVVjRsUkNpdDB5bUM3T2poZStnekNDd2tnczVrRHpWVmFnK3RubC8wZTJEbG9JakFTd09ocGJICktWY2c3ZkJkNDg0aHQvc1MrbDBkc0I0S0RPU3BkOEp6VkRNRjhPWnFsYXlkaXpvSk8weVdyOUdiQ04xK09LcTUKRWhMckVxVT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=", "organizational_unit_identifier": "OUID" }, "client_ou_identifier": { "certificate": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURBVENDQWVtZ0F3SUJBZ0lSQUtRa2tyRngxVC9kZ0IvR28veEJNNXN3RFFZSktvWklodmNOQVFFTEJRQXcKRWpFUU1BNEdBMVVFQ2hNSFFXTnRaU0JEYnpBZUZ3MHhOakE0TVRjeU1ETTJNRGRhRncweE56QTRNVGN5TURNMgpNRGRhTUJJeEVEQU9CZ05WQkFvVEIwRmpiV1VnUTI4d2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3CmdnRUtBb0lCQVFEQW9KdGpHN002SW5zV3dJbytsM3FxOXUrZzJyS0ZYTnU5L21aMjRYUThYaFY2UFVSKzVIUTQKalVGV0M1OEV4WWhvdHRxSzV6UXRLR2t3NU51aGpvd0ZVZ1dCL1ZsTkdBVUJIdEpjV1IvMDYyd1lySEJZUnhKSApxVlhPcFlLYklXd0ZLb1h1M2hjcGcvQ2tkT2xEV0dLb1pLQkN3UXdVQmhXRTdNRGhwVmRRK1psalVKV0wrRmxLCnlRSzVpUnNKZDVUR0o2VlV6THpkVDRmbU4yRHplSzZHTGV5TXBWcFUzc1dWOTBKSmJ4V1E0WXJ6a0t6WWhNbUIKRWNwWFRHMndtK3VqaUhVL2sycDh6bGY4U203VkJNL3NjbW5NRnQweW5OWG9wNEZXdkp6RW0xRzB4RDJ0K2UySQo1VXRyMDRkT1pQQ2drbSsrUUpnWWh0WnZnVzdaWmlHVEFnTUJBQUdqVWpCUU1BNEdBMVVkRHdFQi93UUVBd0lGCm9EQVRCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBVEFNQmdOVkhSTUJBZjhFQWpBQU1Cc0dBMVVkRVFRVU1CS0MKRUhSbGMzUXVaWGhoYlhCc1pTNWpiMjB3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQURwcUtReHJ0aEg1SW5DNwpYOTZVUDBPSkN1L2xMRU1rcmpvRVdZSVFhRmw3dUxQeEtINUFtUVBINGxZd0Y3dTdna3NSN293Vkc5UVU5ZnM2CjFmSzdJSTlDVmdDZC80dFowem05OEZtVTREMGxIR3RQQVJycnpvWmFxVlpjQXZSbkZUbFBYNXBGa1BoVmpqYWkKL21reFg5THBEOG9LMTQ0NURGSHhLNVVqTE1tUElJV2Q4RU9pK3Y1YStoZ0d3bkpwb1c3aG50U2w4a0hNdFRteQpmbm5rdHNibFNVVjRsUkNpdDB5bUM3T2poZStnekNDd2tnczVrRHpWVmFnK3RubC8wZTJEbG9JakFTd09ocGJICktWY2c3ZkJkNDg0aHQvc1MrbDBkc0I0S0RPU3BkOEp6VkRNRjhPWnFsYXlkaXpvSk8weVdyOUdiQ04xK09LcTUKRWhMckVxVT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=", "organizational_unit_identifier": "OUID" }, "enable": false, "orderer_ou_identifier": { "certificate": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURBVENDQWVtZ0F3SUJBZ0lSQUtRa2tyRngxVC9kZ0IvR28veEJNNXN3RFFZSktvWklodmNOQVFFTEJRQXcKRWpFUU1BNEdBMVVFQ2hNSFFXTnRaU0JEYnpBZUZ3MHhOakE0TVRjeU1ETTJNRGRhRncweE56QTRNVGN5TURNMgpNRGRhTUJJeEVEQU9CZ05WQkFvVEIwRmpiV1VnUTI4d2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3CmdnRUtBb0lCQVFEQW9KdGpHN002SW5zV3dJbytsM3FxOXUrZzJyS0ZYTnU5L21aMjRYUThYaFY2UFVSKzVIUTQKalVGV0M1OEV4WWhvdHRxSzV6UXRLR2t3NU51aGpvd0ZVZ1dCL1ZsTkdBVUJIdEpjV1IvMDYyd1lySEJZUnhKSApxVlhPcFlLYklXd0ZLb1h1M2hjcGcvQ2tkT2xEV0dLb1pLQkN3UXdVQmhXRTdNRGhwVmRRK1psalVKV0wrRmxLCnlRSzVpUnNKZDVUR0o2VlV6THpkVDRmbU4yRHplSzZHTGV5TXBWcFUzc1dWOTBKSmJ4V1E0WXJ6a0t6WWhNbUIKRWNwWFRHMndtK3VqaUhVL2sycDh6bGY4U203VkJNL3NjbW5NRnQweW5OWG9wNEZXdkp6RW0xRzB4RDJ0K2UySQo1VXRyMDRkT1pQQ2drbSsrUUpnWWh0WnZnVzdaWmlHVEFnTUJBQUdqVWpCUU1BNEdBMVVkRHdFQi93UUVBd0lGCm9EQVRCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBVEFNQmdOVkhSTUJBZjhFQWpBQU1Cc0dBMVVkRVFRVU1CS0MKRUhSbGMzUXVaWGhoYlhCc1pTNWpiMjB3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQURwcUtReHJ0aEg1SW5DNwpYOTZVUDBPSkN1L2xMRU1rcmpvRVdZSVFhRmw3dUxQeEtINUFtUVBINGxZd0Y3dTdna3NSN293Vkc5UVU5ZnM2CjFmSzdJSTlDVmdDZC80dFowem05OEZtVTREMGxIR3RQQVJycnpvWmFxVlpjQXZSbkZUbFBYNXBGa1BoVmpqYWkKL21reFg5THBEOG9LMTQ0NURGSHhLNVVqTE1tUElJV2Q4RU9pK3Y1YStoZ0d3bkpwb1c3aG50U2w4a0hNdFRteQpmbm5rdHNibFNVVjRsUkNpdDB5bUM3T2poZStnekNDd2tnczVrRHpWVmFnK3RubC8wZTJEbG9JakFTd09ocGJICktWY2c3ZkJkNDg0aHQvc1MrbDBkc0I0S0RPU3BkOEp6VkRNRjhPWnFsYXlkaXpvSk8weVdyOUdiQ04xK09LcTUKRWhMckVxVT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=", "organizational_unit_identifier": "OUID" }, "peer_ou_identifier": { "certificate": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURBVENDQWVtZ0F3SUJBZ0lSQUtRa2tyRngxVC9kZ0IvR28veEJNNXN3RFFZSktvWklodmNOQVFFTEJRQXcKRWpFUU1BNEdBMVVFQ2hNSFFXTnRaU0JEYnpBZUZ3MHhOakE0TVRjeU1ETTJNRGRhRncweE56QTRNVGN5TURNMgpNRGRhTUJJeEVEQU9CZ05WQkFvVEIwRmpiV1VnUTI4d2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3CmdnRUtBb0lCQVFEQW9KdGpHN002SW5zV3dJbytsM3FxOXUrZzJyS0ZYTnU5L21aMjRYUThYaFY2UFVSKzVIUTQKalVGV0M1OEV4WWhvdHRxSzV6UXRLR2t3NU51aGpvd0ZVZ1dCL1ZsTkdBVUJIdEpjV1IvMDYyd1lySEJZUnhKSApxVlhPcFlLYklXd0ZLb1h1M2hjcGcvQ2tkT2xEV0dLb1pLQkN3UXdVQmhXRTdNRGhwVmRRK1psalVKV0wrRmxLCnlRSzVpUnNKZDVUR0o2VlV6THpkVDRmbU4yRHplSzZHTGV5TXBWcFUzc1dWOTBKSmJ4V1E0WXJ6a0t6WWhNbUIKRWNwWFRHMndtK3VqaUhVL2sycDh6bGY4U203VkJNL3NjbW5NRnQweW5OWG9wNEZXdkp6RW0xRzB4RDJ0K2UySQo1VXRyMDRkT1pQQ2drbSsrUUpnWWh0WnZnVzdaWmlHVEFnTUJBQUdqVWpCUU1BNEdBMVVkRHdFQi93UUVBd0lGCm9EQVRCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBVEFNQmdOVkhSTUJBZjhFQWpBQU1Cc0dBMVVkRVFRVU1CS0MKRUhSbGMzUXVaWGhoYlhCc1pTNWpiMjB3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQURwcUtReHJ0aEg1SW5DNwpYOTZVUDBPSkN1L2xMRU1rcmpvRVdZSVFhRmw3dUxQeEtINUFtUVBINGxZd0Y3dTdna3NSN293Vkc5UVU5ZnM2CjFmSzdJSTlDVmdDZC80dFowem05OEZtVTREMGxIR3RQQVJycnpvWmFxVlpjQXZSbkZUbFBYNXBGa1BoVmpqYWkKL21reFg5THBEOG9LMTQ0NURGSHhLNVVqTE1tUElJV2Q4RU9pK3Y1YStoZ0d3bkpwb1c3aG50U2w4a0hNdFRteQpmbm5rdHNibFNVVjRsUkNpdDB5bUM3T2poZStnekNDd2tnczVrRHpWVmFnK3RubC8wZTJEbG9JakFTd09ocGJICktWY2c3ZkJkNDg0aHQvc1MrbDBkc0I0S0RPU3BkOEp6VkRNRjhPWnFsYXlkaXpvSk8weVdyOUdiQ04xK09LcTUKRWhMckVxVT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=", "organizational_unit_identifier": "OUID" } }, "intermediate_certs": [ "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURBVENDQWVtZ0F3SUJBZ0lSQUtRa2tyRngxVC9kZ0IvR28veEJNNXN3RFFZSktvWklodmNOQVFFTEJRQXcKRWpFUU1BNEdBMVVFQ2hNSFFXTnRaU0JEYnpBZUZ3MHhOakE0TVRjeU1ETTJNRGRhRncweE56QTRNVGN5TURNMgpNRGRhTUJJeEVEQU9CZ05WQkFvVEIwRmpiV1VnUTI4d2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3CmdnRUtBb0lCQVFEQW9KdGpHN002SW5zV3dJbytsM3FxOXUrZzJyS0ZYTnU5L21aMjRYUThYaFY2UFVSKzVIUTQKalVGV0M1OEV4WWhvdHRxSzV6UXRLR2t3NU51aGpvd0ZVZ1dCL1ZsTkdBVUJIdEpjV1IvMDYyd1lySEJZUnhKSApxVlhPcFlLYklXd0ZLb1h1M2hjcGcvQ2tkT2xEV0dLb1pLQkN3UXdVQmhXRTdNRGhwVmRRK1psalVKV0wrRmxLCnlRSzVpUnNKZDVUR0o2VlV6THpkVDRmbU4yRHplSzZHTGV5TXBWcFUzc1dWOTBKSmJ4V1E0WXJ6a0t6WWhNbUIKRWNwWFRHMndtK3VqaUhVL2sycDh6bGY4U203VkJNL3NjbW5NRnQweW5OWG9wNEZXdkp6RW0xRzB4RDJ0K2UySQo1VXRyMDRkT1pQQ2drbSsrUUpnWWh0WnZnVzdaWmlHVEFnTUJBQUdqVWpCUU1BNEdBMVVkRHdFQi93UUVBd0lGCm9EQVRCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBVEFNQmdOVkhSTUJBZjhFQWpBQU1Cc0dBMVVkRVFRVU1CS0MKRUhSbGMzUXVaWGhoYlhCc1pTNWpiMjB3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQURwcUtReHJ0aEg1SW5DNwpYOTZVUDBPSkN1L2xMRU1rcmpvRVdZSVFhRmw3dUxQeEtINUFtUVBINGxZd0Y3dTdna3NSN293Vkc5UVU5ZnM2CjFmSzdJSTlDVmdDZC80dFowem05OEZtVTREMGxIR3RQQVJycnpvWmFxVlpjQXZSbkZUbFBYNXBGa1BoVmpqYWkKL21reFg5THBEOG9LMTQ0NURGSHhLNVVqTE1tUElJV2Q4RU9pK3Y1YStoZ0d3bkpwb1c3aG50U2w4a0hNdFRteQpmbm5rdHNibFNVVjRsUkNpdDB5bUM3T2poZStnekNDd2tnczVrRHpWVmFnK3RubC8wZTJEbG9JakFTd09ocGJICktWY2c3ZkJkNDg0aHQvc1MrbDBkc0I0S0RPU3BkOEp6VkRNRjhPWnFsYXlkaXpvSk8weVdyOUdiQ04xK09LcTUKRWhMckVxVT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=" ], "name": "MSPID", "organizational_unit_identifiers": [ { "certificate": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURBVENDQWVtZ0F3SUJBZ0lSQUtRa2tyRngxVC9kZ0IvR28veEJNNXN3RFFZSktvWklodmNOQVFFTEJRQXcKRWpFUU1BNEdBMVVFQ2hNSFFXTnRaU0JEYnpBZUZ3MHhOakE0TVRjeU1ETTJNRGRhRncweE56QTRNVGN5TURNMgpNRGRhTUJJeEVEQU9CZ05WQkFvVEIwRmpiV1VnUTI4d2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3CmdnRUtBb0lCQVFEQW9KdGpHN002SW5zV3dJbytsM3FxOXUrZzJyS0ZYTnU5L21aMjRYUThYaFY2UFVSKzVIUTQKalVGV0M1OEV4WWhvdHRxSzV6UXRLR2t3NU51aGpvd0ZVZ1dCL1ZsTkdBVUJIdEpjV1IvMDYyd1lySEJZUnhKSApxVlhPcFlLYklXd0ZLb1h1M2hjcGcvQ2tkT2xEV0dLb1pLQkN3UXdVQmhXRTdNRGhwVmRRK1psalVKV0wrRmxLCnlRSzVpUnNKZDVUR0o2VlV6THpkVDRmbU4yRHplSzZHTGV5TXBWcFUzc1dWOTBKSmJ4V1E0WXJ6a0t6WWhNbUIKRWNwWFRHMndtK3VqaUhVL2sycDh6bGY4U203VkJNL3NjbW5NRnQweW5OWG9wNEZXdkp6RW0xRzB4RDJ0K2UySQo1VXRyMDRkT1pQQ2drbSsrUUpnWWh0WnZnVzdaWmlHVEFnTUJBQUdqVWpCUU1BNEdBMVVkRHdFQi93UUVBd0lGCm9EQVRCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBVEFNQmdOVkhSTUJBZjhFQWpBQU1Cc0dBMVVkRVFRVU1CS0MKRUhSbGMzUXVaWGhoYlhCc1pTNWpiMjB3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQURwcUtReHJ0aEg1SW5DNwpYOTZVUDBPSkN1L2xMRU1rcmpvRVdZSVFhRmw3dUxQeEtINUFtUVBINGxZd0Y3dTdna3NSN293Vkc5UVU5ZnM2CjFmSzdJSTlDVmdDZC80dFowem05OEZtVTREMGxIR3RQQVJycnpvWmFxVlpjQXZSbkZUbFBYNXBGa1BoVmpqYWkKL21reFg5THBEOG9LMTQ0NURGSHhLNVVqTE1tUElJV2Q4RU9pK3Y1YStoZ0d3bkpwb1c3aG50U2w4a0hNdFRteQpmbm5rdHNibFNVVjRsUkNpdDB5bUM3T2poZStnekNDd2tnczVrRHpWVmFnK3RubC8wZTJEbG9JakFTd09ocGJICktWY2c3ZkJkNDg0aHQvc1MrbDBkc0I0S0RPU3BkOEp6VkRNRjhPWnFsYXlkaXpvSk8weVdyOUdiQ04xK09LcTUKRWhMckVxVT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=", "organizational_unit_identifier": "OUID" } ], "revocation_list": [ "LS0tLS1CRUdJTiBYNTA5IENSTC0tLS0tCk1JSUJZRENCeWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCRE1STXdFUVlLQ1pJbWlaUHlMR1FCR1JZRFkyOXQKTVJjd0ZRWUtDWkltaVpQeUxHUUJHUllIWlhoaGJYQnNaVEVUTUJFR0ExVUVBeE1LUlhoaGJYQnNaU0JEUVJjTgpNRFV3TWpBMU1USXdNREF3V2hjTk1EVXdNakEyTVRJd01EQXdXakFpTUNBQ0FSSVhEVEEwTVRFeE9URTFOVGN3Ck0xb3dEREFLQmdOVkhSVUVBd29CQWFBdk1DMHdId1lEVlIwakJCZ3dGb0FVQ0dpdmhUUElPVXA2K0lLVGpuQnEKU2lDRUxESXdDZ1lEVlIwVUJBTUNBUXd3RFFZSktvWklodmNOQVFFRkJRQURnWUVBSXR3WWZmY0l6c3gxME5CcQptNjBROUhZanRJRnV0VzIrRHZzVkZHeklGMjBmN3BBWG9tOWc1TDJxakZYZWpvUnZrdmlmRUJJbnIwclVMNFhpCk5rUjlxcU5NSlRnVi93RDlQbjd1UFNZUzY5am5LMkxpSzhOR2dPOTRndEVWeHRDY2Ntckx6bnJ0WjVtTGJuQ0IKZlVOQ2RNR21yOEZWRjZJelROWUdtQ3VrL0M0PQotLS0tLUVORCBYNTA5IENSTC0tLS0tCg==" ], "root_certs": [ "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURBVENDQWVtZ0F3SUJBZ0lSQUtRa2tyRngxVC9kZ0IvR28veEJNNXN3RFFZSktvWklodmNOQVFFTEJRQXcKRWpFUU1BNEdBMVVFQ2hNSFFXTnRaU0JEYnpBZUZ3MHhOakE0TVRjeU1ETTJNRGRhRncweE56QTRNVGN5TURNMgpNRGRhTUJJeEVEQU9CZ05WQkFvVEIwRmpiV1VnUTI4d2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3CmdnRUtBb0lCQVFEQW9KdGpHN002SW5zV3dJbytsM3FxOXUrZzJyS0ZYTnU5L21aMjRYUThYaFY2UFVSKzVIUTQKalVGV0M1OEV4WWhvdHRxSzV6UXRLR2t3NU51aGpvd0ZVZ1dCL1ZsTkdBVUJIdEpjV1IvMDYyd1lySEJZUnhKSApxVlhPcFlLYklXd0ZLb1h1M2hjcGcvQ2tkT2xEV0dLb1pLQkN3UXdVQmhXRTdNRGhwVmRRK1psalVKV0wrRmxLCnlRSzVpUnNKZDVUR0o2VlV6THpkVDRmbU4yRHplSzZHTGV5TXBWcFUzc1dWOTBKSmJ4V1E0WXJ6a0t6WWhNbUIKRWNwWFRHMndtK3VqaUhVL2sycDh6bGY4U203VkJNL3NjbW5NRnQweW5OWG9wNEZXdkp6RW0xRzB4RDJ0K2UySQo1VXRyMDRkT1pQQ2drbSsrUUpnWWh0WnZnVzdaWmlHVEFnTUJBQUdqVWpCUU1BNEdBMVVkRHdFQi93UUVBd0lGCm9EQVRCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBVEFNQmdOVkhSTUJBZjhFQWpBQU1Cc0dBMVVkRVFRVU1CS0MKRUhSbGMzUXVaWGhoYlhCc1pTNWpiMjB3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQURwcUtReHJ0aEg1SW5DNwpYOTZVUDBPSkN1L2xMRU1rcmpvRVdZSVFhRmw3dUxQeEtINUFtUVBINGxZd0Y3dTdna3NSN293Vkc5UVU5ZnM2CjFmSzdJSTlDVmdDZC80dFowem05OEZtVTREMGxIR3RQQVJycnpvWmFxVlpjQXZSbkZUbFBYNXBGa1BoVmpqYWkKL21reFg5THBEOG9LMTQ0NURGSHhLNVVqTE1tUElJV2Q4RU9pK3Y1YStoZ0d3bkpwb1c3aG50U2w4a0hNdFRteQpmbm5rdHNibFNVVjRsUkNpdDB5bUM3T2poZStnekNDd2tnczVrRHpWVmFnK3RubC8wZTJEbG9JakFTd09ocGJICktWY2c3ZkJkNDg0aHQvc1MrbDBkc0I0S0RPU3BkOEp6VkRNRjhPWnFsYXlkaXpvSk8weVdyOUdiQ04xK09LcTUKRWhMckVxVT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=" ], "signing_identity": { "private_signer": { "key_identifier": "SKI-1", "key_material": "LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JR0hBZ0VBTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEJHMHdhd0lCQVFRZ0RaVWdEdktpeGZMaThjSzgKL1RGTFk5N1REbVFWM0oyeWdQcHZ1SThqU2RpaFJBTkNBQVJSTjN4Z2JQSVI4M2RyMjdVdURhZjJPSmV6cEVKeApVQzN2MDYrRkQ4TVVOY1JBYm9xdDRha2VoYU5OU2g3TU1aSStIZG5zTTRSWE4yeThOZVBVUXNQTAotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tCg==" }, "public_signer": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURBVENDQWVtZ0F3SUJBZ0lSQUtRa2tyRngxVC9kZ0IvR28veEJNNXN3RFFZSktvWklodmNOQVFFTEJRQXcKRWpFUU1BNEdBMVVFQ2hNSFFXTnRaU0JEYnpBZUZ3MHhOakE0TVRjeU1ETTJNRGRhRncweE56QTRNVGN5TURNMgpNRGRhTUJJeEVEQU9CZ05WQkFvVEIwRmpiV1VnUTI4d2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3CmdnRUtBb0lCQVFEQW9KdGpHN002SW5zV3dJbytsM3FxOXUrZzJyS0ZYTnU5L21aMjRYUThYaFY2UFVSKzVIUTQKalVGV0M1OEV4WWhvdHRxSzV6UXRLR2t3NU51aGpvd0ZVZ1dCL1ZsTkdBVUJIdEpjV1IvMDYyd1lySEJZUnhKSApxVlhPcFlLYklXd0ZLb1h1M2hjcGcvQ2tkT2xEV0dLb1pLQkN3UXdVQmhXRTdNRGhwVmRRK1psalVKV0wrRmxLCnlRSzVpUnNKZDVUR0o2VlV6THpkVDRmbU4yRHplSzZHTGV5TXBWcFUzc1dWOTBKSmJ4V1E0WXJ6a0t6WWhNbUIKRWNwWFRHMndtK3VqaUhVL2sycDh6bGY4U203VkJNL3NjbW5NRnQweW5OWG9wNEZXdkp6RW0xRzB4RDJ0K2UySQo1VXRyMDRkT1pQQ2drbSsrUUpnWWh0WnZnVzdaWmlHVEFnTUJBQUdqVWpCUU1BNEdBMVVkRHdFQi93UUVBd0lGCm9EQVRCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBVEFNQmdOVkhSTUJBZjhFQWpBQU1Cc0dBMVVkRVFRVU1CS0MKRUhSbGMzUXVaWGhoYlhCc1pTNWpiMjB3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQURwcUtReHJ0aEg1SW5DNwpYOTZVUDBPSkN1L2xMRU1rcmpvRVdZSVFhRmw3dUxQeEtINUFtUVBINGxZd0Y3dTdna3NSN293Vkc5UVU5ZnM2CjFmSzdJSTlDVmdDZC80dFowem05OEZtVTREMGxIR3RQQVJycnpvWmFxVlpjQXZSbkZUbFBYNXBGa1BoVmpqYWkKL21reFg5THBEOG9LMTQ0NURGSHhLNVVqTE1tUElJV2Q4RU9pK3Y1YStoZ0d3bkpwb1c3aG50U2w4a0hNdFRteQpmbm5rdHNibFNVVjRsUkNpdDB5bUM3T2poZStnekNDd2tnczVrRHpWVmFnK3RubC8wZTJEbG9JakFTd09ocGJICktWY2c3ZkJkNDg0aHQvc1MrbDBkc0I0S0RPU3BkOEp6VkRNRjhPWnFsYXlkaXpvSk8weVdyOUdiQ04xK09LcTUKRWhMckVxVT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=" }, "tls_intermediate_certs": [ "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURBVENDQWVtZ0F3SUJBZ0lSQUtRa2tyRngxVC9kZ0IvR28veEJNNXN3RFFZSktvWklodmNOQVFFTEJRQXcKRWpFUU1BNEdBMVVFQ2hNSFFXTnRaU0JEYnpBZUZ3MHhOakE0TVRjeU1ETTJNRGRhRncweE56QTRNVGN5TURNMgpNRGRhTUJJeEVEQU9CZ05WQkFvVEIwRmpiV1VnUTI4d2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3CmdnRUtBb0lCQVFEQW9KdGpHN002SW5zV3dJbytsM3FxOXUrZzJyS0ZYTnU5L21aMjRYUThYaFY2UFVSKzVIUTQKalVGV0M1OEV4WWhvdHRxSzV6UXRLR2t3NU51aGpvd0ZVZ1dCL1ZsTkdBVUJIdEpjV1IvMDYyd1lySEJZUnhKSApxVlhPcFlLYklXd0ZLb1h1M2hjcGcvQ2tkT2xEV0dLb1pLQkN3UXdVQmhXRTdNRGhwVmRRK1psalVKV0wrRmxLCnlRSzVpUnNKZDVUR0o2VlV6THpkVDRmbU4yRHplSzZHTGV5TXBWcFUzc1dWOTBKSmJ4V1E0WXJ6a0t6WWhNbUIKRWNwWFRHMndtK3VqaUhVL2sycDh6bGY4U203VkJNL3NjbW5NRnQweW5OWG9wNEZXdkp6RW0xRzB4RDJ0K2UySQo1VXRyMDRkT1pQQ2drbSsrUUpnWWh0WnZnVzdaWmlHVEFnTUJBQUdqVWpCUU1BNEdBMVVkRHdFQi93UUVBd0lGCm9EQVRCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBVEFNQmdOVkhSTUJBZjhFQWpBQU1Cc0dBMVVkRVFRVU1CS0MKRUhSbGMzUXVaWGhoYlhCc1pTNWpiMjB3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQURwcUtReHJ0aEg1SW5DNwpYOTZVUDBPSkN1L2xMRU1rcmpvRVdZSVFhRmw3dUxQeEtINUFtUVBINGxZd0Y3dTdna3NSN293Vkc5UVU5ZnM2CjFmSzdJSTlDVmdDZC80dFowem05OEZtVTREMGxIR3RQQVJycnpvWmFxVlpjQXZSbkZUbFBYNXBGa1BoVmpqYWkKL21reFg5THBEOG9LMTQ0NURGSHhLNVVqTE1tUElJV2Q4RU9pK3Y1YStoZ0d3bkpwb1c3aG50U2w4a0hNdFRteQpmbm5rdHNibFNVVjRsUkNpdDB5bUM3T2poZStnekNDd2tnczVrRHpWVmFnK3RubC8wZTJEbG9JakFTd09ocGJICktWY2c3ZkJkNDg0aHQvc1MrbDBkc0I0S0RPU3BkOEp6VkRNRjhPWnFsYXlkaXpvSk8weVdyOUdiQ04xK09LcTUKRWhMckVxVT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=" ], "tls_root_certs": [ "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURBVENDQWVtZ0F3SUJBZ0lSQUtRa2tyRngxVC9kZ0IvR28veEJNNXN3RFFZSktvWklodmNOQVFFTEJRQXcKRWpFUU1BNEdBMVVFQ2hNSFFXTnRaU0JEYnpBZUZ3MHhOakE0TVRjeU1ETTJNRGRhRncweE56QTRNVGN5TURNMgpNRGRhTUJJeEVEQU9CZ05WQkFvVEIwRmpiV1VnUTI4d2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3CmdnRUtBb0lCQVFEQW9KdGpHN002SW5zV3dJbytsM3FxOXUrZzJyS0ZYTnU5L21aMjRYUThYaFY2UFVSKzVIUTQKalVGV0M1OEV4WWhvdHRxSzV6UXRLR2t3NU51aGpvd0ZVZ1dCL1ZsTkdBVUJIdEpjV1IvMDYyd1lySEJZUnhKSApxVlhPcFlLYklXd0ZLb1h1M2hjcGcvQ2tkT2xEV0dLb1pLQkN3UXdVQmhXRTdNRGhwVmRRK1psalVKV0wrRmxLCnlRSzVpUnNKZDVUR0o2VlV6THpkVDRmbU4yRHplSzZHTGV5TXBWcFUzc1dWOTBKSmJ4V1E0WXJ6a0t6WWhNbUIKRWNwWFRHMndtK3VqaUhVL2sycDh6bGY4U203VkJNL3NjbW5NRnQweW5OWG9wNEZXdkp6RW0xRzB4RDJ0K2UySQo1VXRyMDRkT1pQQ2drbSsrUUpnWWh0WnZnVzdaWmlHVEFnTUJBQUdqVWpCUU1BNEdBMVVkRHdFQi93UUVBd0lGCm9EQVRCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBVEFNQmdOVkhSTUJBZjhFQWpBQU1Cc0dBMVVkRVFRVU1CS0MKRUhSbGMzUXVaWGhoYlhCc1pTNWpiMjB3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQURwcUtReHJ0aEg1SW5DNwpYOTZVUDBPSkN1L2xMRU1rcmpvRVdZSVFhRmw3dUxQeEtINUFtUVBINGxZd0Y3dTdna3NSN293Vkc5UVU5ZnM2CjFmSzdJSTlDVmdDZC80dFowem05OEZtVTREMGxIR3RQQVJycnpvWmFxVlpjQXZSbkZUbFBYNXBGa1BoVmpqYWkKL21reFg5THBEOG9LMTQ0NURGSHhLNVVqTE1tUElJV2Q4RU9pK3Y1YStoZ0d3bkpwb1c3aG50U2w4a0hNdFRteQpmbm5rdHNibFNVVjRsUkNpdDB5bUM3T2poZStnekNDd2tnczVrRHpWVmFnK3RubC8wZTJEbG9JakFTd09ocGJICktWY2c3ZkJkNDg0aHQvc1MrbDBkc0I0S0RPU3BkOEp6VkRNRjhPWnFsYXlkaXpvSk8weVdyOUdiQ04xK09LcTUKRWhMckVxVT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=" ] }, "type": 0 }, "version": "0" } }, "version": "0" } }, "mod_policy": "", "policies": { "Admins": { "mod_policy": "", "policy": null, "version": "0" }, "BlockValidation": { "mod_policy": "", "policy": null, "version": "0" }, "Readers": { "mod_policy": "", "policy": null, "version": "0" }, "Writers": { "mod_policy": "", "policy": null, "version": "0" } }, "values": { "BatchSize": { "mod_policy": "Admins", "value": { "absolute_max_bytes": 100, "max_message_count": 500, "preferred_max_bytes": 100 }, "version": "1" }, "BatchTimeout": { "mod_policy": "Admins", "value": { "timeout": "0s" }, "version": "1" }, "Capabilities": { "mod_policy": "", "value": null, "version": "0" }, "ChannelRestrictions": { "mod_policy": "Admins", "value": null, "version": "1" }, "ConsensusType": { "mod_policy": "", "value": null, "version": "0" }, "KafkaBrokers": { "mod_policy": "Admins", "value": { "brokers": [ "kafka0:9092", "kafka1:9092", "kafka2:9092" ] }, "version": "1" } }, "version": "2" } }, "mod_policy": "", "policies": {}, "values": { "OrdererAddresses": { "mod_policy": "/Channel/Orderer/Admins", "value": { "addresses": [ "127.0.0.1:7050" ] }, "version": "1" } }, "version": "0" } }, "signatures": [] }
Index ¶
- Constants
- func AddApplicationOrg(config *cb.Config, org Organization) error
- func CreateSignedConfigUpdateEnvelope(configUpdate *cb.ConfigUpdate, signingIdentity SigningIdentity, ...) (*cb.Envelope, error)
- func NewCreateChannelTx(channelConfig Channel) (*cb.Envelope, error)
- func SignConfigUpdate(configUpdate *cb.ConfigUpdate, signingIdentity SigningIdentity) (*cb.ConfigSignature, error)
- type Address
- type Application
- type BatchSize
- type Channel
- type ConfigTx
- func (c *ConfigTx) AddACLs(acls map[string]string) error
- func (c *ConfigTx) AddAnchorPeer(orgName string, newAnchorPeer Address) error
- func (c *ConfigTx) AddApplicationCapability(capability string) error
- func (c *ConfigTx) AddApplicationOrg(org Organization) error
- func (c *ConfigTx) AddApplicationOrgPolicy(orgName, modPolicy, policyName string, policy Policy) error
- func (c *ConfigTx) AddApplicationPolicy(modPolicy, policyName string, policy Policy) error
- func (c *ConfigTx) AddChannelCapability(capability string) error
- func (c *ConfigTx) AddConsortiumOrgPolicy(consortiumName, orgName, policyName string, policy Policy) error
- func (c *ConfigTx) AddOrdererCapability(capability string) error
- func (c *ConfigTx) AddOrdererEndpoint(orgName string, endpoint Address) error
- func (c *ConfigTx) AddOrdererOrg(org Organization) error
- func (c *ConfigTx) AddOrdererOrgPolicy(orgName, modPolicy, policyName string, policy Policy) error
- func (c *ConfigTx) AddOrdererPolicy(modPolicy, policyName string, policy Policy) error
- func (c *ConfigTx) AddOrgToConsortium(org Organization, consortium string) error
- func (c *ConfigTx) AddRootCAToMSP(rootCA *x509.Certificate, orgName string) error
- func (c *ConfigTx) Base() *cb.Config
- func (c *ConfigTx) ComputeUpdate(channelID string) (*cb.ConfigUpdate, error)
- func (c *ConfigTx) GetAnchorPeers(orgName string) ([]Address, error)
- func (c *ConfigTx) GetApplicationCapabilities() ([]string, error)
- func (c *ConfigTx) GetApplicationOrg(orgName string) (Organization, error)
- func (c *ConfigTx) GetChannelCapabilities() ([]string, error)
- func (c *ConfigTx) GetConsortiumOrg(consortiumName, orgName string) (Organization, error)
- func (c *ConfigTx) GetMSPConfigurationForApplicationOrg(orgName string) (MSP, error)
- func (c *ConfigTx) GetMSPConfigurationForConsortiumOrg(consortiumName, orgName string) (MSP, error)
- func (c *ConfigTx) GetMSPConfigurationForOrdererOrg(orgName string) (MSP, error)
- func (c *ConfigTx) GetOrdererCapabilities() ([]string, error)
- func (c *ConfigTx) GetOrdererConfiguration() (Orderer, error)
- func (c *ConfigTx) GetOrdererOrg(orgName string) (Organization, error)
- func (c *ConfigTx) GetPoliciesForApplication() (map[string]Policy, error)
- func (c *ConfigTx) GetPoliciesForApplicationOrg(orgName string) (map[string]Policy, error)
- func (c *ConfigTx) GetPoliciesForConsortium(consortiumName string) (map[string]Policy, error)
- func (c *ConfigTx) GetPoliciesForConsortiumOrg(consortiumName, orgName string) (map[string]Policy, error)
- func (c *ConfigTx) GetPoliciesForConsortiums() (map[string]Policy, error)
- func (c *ConfigTx) GetPoliciesForOrderer() (map[string]Policy, error)
- func (c *ConfigTx) GetPoliciesForOrdererOrg(orgName string) (map[string]Policy, error)
- func (c *ConfigTx) RemoveACLs(acls []string) error
- func (c *ConfigTx) RemoveAnchorPeer(orgName string, anchorPeerToRemove Address) error
- func (c *ConfigTx) RemoveApplicationCapability(capability string) error
- func (c *ConfigTx) RemoveApplicationOrgPolicy(orgName, policyName string) error
- func (c *ConfigTx) RemoveApplicationPolicy(policyName string) error
- func (c *ConfigTx) RemoveChannelCapability(capability string) error
- func (c *ConfigTx) RemoveConsortiumOrgPolicy(consortiumName, orgName, policyName string) error
- func (c *ConfigTx) RemoveOrdererCapability(capability string) error
- func (c *ConfigTx) RemoveOrdererEndpoint(orgName string, endpoint Address) error
- func (c *ConfigTx) RemoveOrdererOrgPolicy(orgName, policyName string) error
- func (c *ConfigTx) RemoveOrdererPolicy(policyName string) error
- func (c *ConfigTx) RevokeCertificateFromMSP(orgName string, caCert *x509.Certificate, caPrivKey *ecdsa.PrivateKey, ...) error
- func (c *ConfigTx) UpdateMSP(updatedMSP MSP, orgName string) error
- func (c *ConfigTx) UpdateOrdererConfiguration(o Orderer) error
- func (c *ConfigTx) Updated() *cb.Config
- type ConsensusState
- type Consenter
- type Consortium
- type CryptoConfig
- type EtcdRaft
- type EtcdRaftOptions
- type Kafka
- type KeyInfo
- type MSP
- type NodeOUs
- type OUIdentifier
- type Orderer
- type Organization
- type Policy
- type SigningIdentity
- type SigningIdentityInfo
Examples ¶
Constants ¶
const ( // ConsortiumKey is the key for the common.ConfigValue for the Consortium message. ConsortiumKey = "Consortium" // HashingAlgorithmKey is the common.ConfigValue type key name for the HashingAlgorithm message. HashingAlgorithmKey = "HashingAlgorithm" // BlockDataHashingStructureKey is the common.ConfigValue type key name for the BlockDataHashingStructure message. BlockDataHashingStructureKey = "BlockDataHashingStructure" // OrdererAddressesKey is the common.ConfigValue type key name for the OrdererAddresses message. OrdererAddressesKey = "OrdererAddresses" // CapabilitiesKey is the name of the key which refers to capabilities, it appears at the channel, // application, and orderer levels and this constant is used for all three. CapabilitiesKey = "Capabilities" // EndpointsKey is the common.ConfigValue key name for the Endpoints message in the OrdererOrgGroup. EndpointsKey = "Endpoints" // MSPKey is the key for the MSP definition in orderer groups. MSPKey = "MSP" // BatchSizeKey is the common.ConfigValue type key name for the BatchSize message. BatchSizeKey = "BatchSize" // BatchTimeoutKey is the common.ConfigValue type key name for the BatchTimeout message. BatchTimeoutKey = "BatchTimeout" // AdminsPolicyKey is the key used for the admin policy. AdminsPolicyKey = "Admins" // ReadersPolicyKey is the key used for the read policy. ReadersPolicyKey = "Readers" // WritersPolicyKey is the key used for the write policy. WritersPolicyKey = "Writers" // EndorsementPolicyKey is the key used for the endorsement policy. EndorsementPolicyKey = "Endorsement" // LifecycleEndorsementPolicyKey is the key used for the lifecycle endorsement policy. LifecycleEndorsementPolicyKey = "LifecycleEndorsement" // BlockValidationPolicyKey is the key used for the block validation policy in the OrdererOrgGroup. BlockValidationPolicyKey = "BlockValidation" // ChannelCreationPolicyKey is the key used in the consortium config to denote the policy // to be used in evaluating whether a channel creation request is authorized. ChannelCreationPolicyKey = "ChannelCreationPolicy" // ChannelRestrictionsKey is the key name for the ChannelRestrictions message. ChannelRestrictionsKey = "ChannelRestrictions" // ConsensusTypeSolo identifies the solo consensus implementation. ConsensusTypeSolo = "solo" // ConsensusTypeKafka identifies the Kafka-based consensus implementation. ConsensusTypeKafka = "kafka" // ConsensusTypeEtcdRaft identifies the Raft-based consensus implementation. ConsensusTypeEtcdRaft = "etcdraft" // KafkaBrokersKey is the common.ConfigValue type key name for the KafkaBrokers message. KafkaBrokersKey = "KafkaBrokers" // ConsensusTypeKey is the common.ConfigValue type key name for the ConsensusType message. ConsensusTypeKey = "ConsensusType" // ChannelGroupKey is the group name for the channel config. ChannelGroupKey = "Channel" // ConsortiumsGroupKey is the group name for the consortiums config. ConsortiumsGroupKey = "Consortiums" // OrdererGroupKey is the group name for the orderer config. OrdererGroupKey = "Orderer" // ApplicationGroupKey is the group name for the Application config. ApplicationGroupKey = "Application" // ACLsKey is the name of the ACLs config. ACLsKey = "ACLs" // AnchorPeersKey is the key name for the AnchorPeers ConfigValue. AnchorPeersKey = "AnchorPeers" // ImplicitMetaPolicyType is the 'Type' string for implicit meta policies. ImplicitMetaPolicyType = "ImplicitMeta" // SignaturePolicyType is the 'Type' string for signature policies. SignaturePolicyType = "Signature" // ConsensusStateNormal indicates normal orderer operation. ConsensusStateNormal ConsensusState = "STATE_NORMAL" // ConsensusStateMaintenance indicates the orderer is in consensus type migration. ConsensusStateMaintenance ConsensusState = "STATE_MAINTENANCE" )
const YEAR = 365 * 24 * time.Hour
YEAR is a time duration for a standard 365 day year.
Variables ¶
This section is empty.
Functions ¶
func AddApplicationOrg ¶
func AddApplicationOrg(config *cb.Config, org Organization) error
AddApplicationOrg adds an organization to an existing config's Application configuration. Will not error if organization already exists.
func CreateSignedConfigUpdateEnvelope ¶
func CreateSignedConfigUpdateEnvelope(configUpdate *cb.ConfigUpdate, signingIdentity SigningIdentity, signatures ...*cb.ConfigSignature) (*cb.Envelope, error)
CreateSignedConfigUpdateEnvelope creates a signed configuration update envelope.
func NewCreateChannelTx ¶
NewCreateChannelTx creates a create channel tx using the provided application channel configuration and returns an unsigned envelope for an application channel creation transaction.
Example ¶
channel := configtx.Channel{ ChannelID: "testchannel", Consortium: "SampleConsortium", Application: configtx.Application{ Organizations: []configtx.Organization{ { Name: "Org1", }, { Name: "Org2", }, }, Capabilities: []string{"V1_3"}, ACLs: map[string]string{"event/Block": "/Channel/Application/Readers"}, Policies: map[string]configtx.Policy{ configtx.ReadersPolicyKey: { Type: configtx.ImplicitMetaPolicyType, Rule: "ANY Readers", }, configtx.WritersPolicyKey: { Type: configtx.ImplicitMetaPolicyType, Rule: "ANY Writers", }, configtx.AdminsPolicyKey: { Type: configtx.ImplicitMetaPolicyType, Rule: "MAJORITY Admins", }, configtx.EndorsementPolicyKey: { Type: configtx.ImplicitMetaPolicyType, Rule: "MAJORITY Endorsement", }, configtx.LifecycleEndorsementPolicyKey: { Type: configtx.ImplicitMetaPolicyType, Rule: "MAJORITY Endorsement", }, }, }, } envelope, err := configtx.NewCreateChannelTx(channel) if err != nil { panic(err) } // The timestamps of the ChannelHeader varies so this comparison only considers the ConfigUpdateEnvelope JSON. payload := &cb.Payload{} err = proto.Unmarshal(envelope.Payload, payload) if err != nil { panic(err) } data := &cb.ConfigUpdateEnvelope{} err = proto.Unmarshal(payload.Data, data) if err != nil { panic(err) } err = protolator.DeepMarshalJSON(os.Stdout, data) if err != nil { panic(err) }
Output: { "config_update": { "channel_id": "testchannel", "isolated_data": {}, "read_set": { "groups": { "Application": { "groups": { "Org1": { "groups": {}, "mod_policy": "", "policies": {}, "values": {}, "version": "0" }, "Org2": { "groups": {}, "mod_policy": "", "policies": {}, "values": {}, "version": "0" } }, "mod_policy": "", "policies": {}, "values": {}, "version": "0" } }, "mod_policy": "", "policies": {}, "values": { "Consortium": { "mod_policy": "", "value": null, "version": "0" } }, "version": "0" }, "write_set": { "groups": { "Application": { "groups": { "Org1": { "groups": {}, "mod_policy": "", "policies": {}, "values": {}, "version": "0" }, "Org2": { "groups": {}, "mod_policy": "", "policies": {}, "values": {}, "version": "0" } }, "mod_policy": "Admins", "policies": { "Admins": { "mod_policy": "Admins", "policy": { "type": 3, "value": { "rule": "MAJORITY", "sub_policy": "Admins" } }, "version": "0" }, "Endorsement": { "mod_policy": "Admins", "policy": { "type": 3, "value": { "rule": "MAJORITY", "sub_policy": "Endorsement" } }, "version": "0" }, "LifecycleEndorsement": { "mod_policy": "Admins", "policy": { "type": 3, "value": { "rule": "MAJORITY", "sub_policy": "Endorsement" } }, "version": "0" }, "Readers": { "mod_policy": "Admins", "policy": { "type": 3, "value": { "rule": "ANY", "sub_policy": "Readers" } }, "version": "0" }, "Writers": { "mod_policy": "Admins", "policy": { "type": 3, "value": { "rule": "ANY", "sub_policy": "Writers" } }, "version": "0" } }, "values": { "ACLs": { "mod_policy": "Admins", "value": { "acls": { "event/Block": { "policy_ref": "/Channel/Application/Readers" } } }, "version": "0" }, "Capabilities": { "mod_policy": "Admins", "value": { "capabilities": { "V1_3": {} } }, "version": "0" } }, "version": "1" } }, "mod_policy": "", "policies": {}, "values": { "Consortium": { "mod_policy": "", "value": { "name": "SampleConsortium" }, "version": "0" } }, "version": "0" } }, "signatures": [] }
func SignConfigUpdate ¶
func SignConfigUpdate(configUpdate *cb.ConfigUpdate, signingIdentity SigningIdentity) (*cb.ConfigSignature, error)
SignConfigUpdate signs the given configuration update with a specified signing identity and returns a config signature.
Types ¶
type Application ¶
type Application struct { Organizations []Organization Capabilities []string Policies map[string]Policy ACLs map[string]string }
Application is a copy of the orderer configuration with the addition of an anchor peers list in the organization definition.
type BatchSize ¶
type BatchSize struct { // MaxMessageCount is the max message count. MaxMessageCount uint32 // AbsoluteMaxBytes is the max block size (not including headers). AbsoluteMaxBytes uint32 // PreferredMaxBytes is the preferred size of blocks. PreferredMaxBytes uint32 }
BatchSize is the configuration affecting the size of batches.
type Channel ¶
type Channel struct { Consortium string Application Application Orderer Orderer Consortiums []Consortium Capabilities []string Policies map[string]Policy ChannelID string }
Channel is a channel configuration.
type ConfigTx ¶
type ConfigTx struct {
// contains filtered or unexported fields
}
ConfigTx wraps a config transaction
func New ¶
New returns an config.
Example ¶
baseConfig := fetchChannelConfig() _ = configtx.New(baseConfig)
Output:
func (*ConfigTx) AddAnchorPeer ¶
AddAnchorPeer adds an anchor peer to an existing channel config transaction. It must add the anchor peer to an existing org and the anchor peer must not already exist in the org.
func (*ConfigTx) AddApplicationCapability ¶
AddApplicationCapability adds capability to the provided channel config.
Example ¶
baseConfig := fetchChannelConfig() c := configtx.New(baseConfig) err := c.AddChannelCapability("V1_3") if err != nil { panic(err) }
Output:
func (*ConfigTx) AddApplicationOrg ¶
func (c *ConfigTx) AddApplicationOrg(org Organization) error
AddApplicationOrg adds an organization to an existing config's Application configuration. Will not error if organization already exists.
func (*ConfigTx) AddApplicationOrgPolicy ¶
func (c *ConfigTx) AddApplicationOrgPolicy(orgName, modPolicy, policyName string, policy Policy) error
AddApplicationOrgPolicy modifies an existing organization in a application configuration's policies. When the policy exists it will overwrite the existing policy.
func (*ConfigTx) AddApplicationPolicy ¶
AddApplicationPolicy modifies an existing application policy configuration. When the policy exists it will overwrite the existing policy.
func (*ConfigTx) AddChannelCapability ¶
AddChannelCapability adds capability to the provided channel config.
Example ¶
baseConfig := fetchChannelConfig() c := configtx.New(baseConfig) err := c.AddChannelCapability("V1_3") if err != nil { panic(err) } err = protolator.DeepMarshalJSON(os.Stdout, c.Updated()) if err != nil { panic(err) }
Output: { "channel_group": { "groups": { "Application": { "groups": { "Org1": { "groups": {}, "mod_policy": "", "policies": {}, "values": { "AnchorPeers": { "mod_policy": "Admins", "value": { "anchor_peers": [ { "host": "127.0.0.1", "port": 7050 } ] }, "version": "0" }, "MSP": { "mod_policy": "Admins", "value": null, "version": "0" } }, "version": "0" } }, "mod_policy": "", "policies": { "Admins": { "mod_policy": "Admins", "policy": { "type": 3, "value": { "rule": "MAJORITY", "sub_policy": "Admins" } }, "version": "0" }, "LifecycleEndorsement": { "mod_policy": "Admins", "policy": { "type": 3, "value": { "rule": "MAJORITY", "sub_policy": "Admins" } }, "version": "0" }, "Readers": { "mod_policy": "Admins", "policy": { "type": 3, "value": { "rule": "ANY", "sub_policy": "Readers" } }, "version": "0" }, "Writers": { "mod_policy": "Admins", "policy": { "type": 3, "value": { "rule": "ANY", "sub_policy": "Writers" } }, "version": "0" } }, "values": { "ACLs": { "mod_policy": "Admins", "value": { "acls": { "event/block": { "policy_ref": "/Channel/Application/Readers" } } }, "version": "0" }, "Capabilities": { "mod_policy": "Admins", "value": { "capabilities": { "V1_3": {} } }, "version": "0" } }, "version": "0" }, "Orderer": { "groups": { "OrdererOrg": { "groups": {}, "mod_policy": "Admins", "policies": { "Admins": { "mod_policy": "Admins", "policy": { "type": 3, "value": { "rule": "MAJORITY", "sub_policy": "Admins" } }, "version": "0" }, "Readers": { "mod_policy": "Admins", "policy": { "type": 3, "value": { "rule": "ANY", "sub_policy": "Readers" } }, "version": "0" }, "Writers": { "mod_policy": "Admins", "policy": { "type": 3, "value": { "rule": "ANY", "sub_policy": "Writers" } }, "version": "0" } }, "values": { "Endpoints": { "mod_policy": "Admins", "value": { "addresses": [ "127.0.0.1:7050" ] }, "version": "0" }, "MSP": { "mod_policy": "Admins", "value": null, "version": "0" } }, "version": "0" } }, "mod_policy": "", "policies": { "Admins": { "mod_policy": "Admins", "policy": { "type": 3, "value": { "rule": "MAJORITY", "sub_policy": "Admins" } }, "version": "0" }, "BlockValidation": { "mod_policy": "Admins", "policy": { "type": 3, "value": { "rule": "ANY", "sub_policy": "Writers" } }, "version": "0" }, "Readers": { "mod_policy": "Admins", "policy": { "type": 3, "value": { "rule": "ANY", "sub_policy": "Readers" } }, "version": "0" }, "Writers": { "mod_policy": "Admins", "policy": { "type": 3, "value": { "rule": "ANY", "sub_policy": "Writers" } }, "version": "0" } }, "values": { "BatchSize": { "mod_policy": "", "value": { "absolute_max_bytes": 100, "max_message_count": 100, "preferred_max_bytes": 100 }, "version": "0" }, "BatchTimeout": { "mod_policy": "", "value": { "timeout": "15s" }, "version": "0" }, "Capabilities": { "mod_policy": "Admins", "value": { "capabilities": { "V1_3": {} } }, "version": "0" }, "ChannelRestrictions": { "mod_policy": "Admins", "value": { "max_count": "1" }, "version": "0" }, "ConsensusType": { "mod_policy": "Admins", "value": { "metadata": null, "state": "STATE_NORMAL", "type": "kafka" }, "version": "0" }, "KafkaBrokers": { "mod_policy": "Admins", "value": { "brokers": [ "kafka0:9092", "kafka1:9092" ] }, "version": "0" } }, "version": "1" } }, "mod_policy": "", "policies": { "Admins": { "mod_policy": "Admins", "policy": { "type": 3, "value": { "rule": "MAJORITY", "sub_policy": "Admins" } }, "version": "0" }, "Readers": { "mod_policy": "Admins", "policy": { "type": 3, "value": { "rule": "ANY", "sub_policy": "Readers" } }, "version": "0" }, "Writers": { "mod_policy": "Admins", "policy": { "type": 3, "value": { "rule": "ANY", "sub_policy": "Writers" } }, "version": "0" } }, "values": { "Capabilities": { "mod_policy": "Admins", "value": { "capabilities": { "V1_3": {} } }, "version": "0" }, "OrdererAddresses": { "mod_policy": "Admins", "value": { "addresses": [ "127.0.0.1:7050" ] }, "version": "0" } }, "version": "0" }, "sequence": "0" }
func (*ConfigTx) AddConsortiumOrgPolicy ¶
func (c *ConfigTx) AddConsortiumOrgPolicy(consortiumName, orgName, policyName string, policy Policy) error
AddConsortiumOrgPolicy modifies an existing organization in a consortiums configuration's policies. When the policy exists it will overwrite the existing policy.
func (*ConfigTx) AddOrdererCapability ¶
AddOrdererCapability adds capability to the provided channel config.
Example ¶
baseConfig := fetchChannelConfig() c := configtx.New(baseConfig) err := c.AddOrdererCapability("V1_4") if err != nil { panic(err) }
Output:
func (*ConfigTx) AddOrdererEndpoint ¶
AddOrdererEndpoint adds an orderer's endpoint to an existing channel config transaction. It must add the endpoint to an existing org and the endpoint must not already exist in the org.
func (*ConfigTx) AddOrdererOrg ¶
func (c *ConfigTx) AddOrdererOrg(org Organization) error
AddOrdererOrg adds a organization to an existing config's Orderer configuration. Will not error if organization already exists.
func (*ConfigTx) AddOrdererOrgPolicy ¶
AddOrdererOrgPolicy modifies an existing organization in a orderer configuration's policies. When the policy exists it will overwrite the existing policy.
func (*ConfigTx) AddOrdererPolicy ¶
AddOrdererPolicy modifies an existing orderer policy configuration. When the policy exists it will overwrite the existing policy.
func (*ConfigTx) AddOrgToConsortium ¶
func (c *ConfigTx) AddOrgToConsortium(org Organization, consortium string) error
AddOrgToConsortium adds an org definition to a named consortium in a given channel configuration.
func (*ConfigTx) AddRootCAToMSP ¶
func (c *ConfigTx) AddRootCAToMSP(rootCA *x509.Certificate, orgName string) error
AddRootCAToMSP takes a root CA x509 certificate and adds it to the list of rootCerts for the specified application org MSP.
func (*ConfigTx) ComputeUpdate ¶
func (c *ConfigTx) ComputeUpdate(channelID string) (*cb.ConfigUpdate, error)
ComputeUpdate computes the ConfigUpdate from a base and modified config transaction.
func (*ConfigTx) GetAnchorPeers ¶
GetAnchorPeers retrieves existing anchor peers from a application organization.
func (*ConfigTx) GetApplicationCapabilities ¶
GetApplicationCapabilities returns a map of enabled application capabilities from a config transaction.
func (*ConfigTx) GetApplicationOrg ¶
func (c *ConfigTx) GetApplicationOrg(orgName string) (Organization, error)
GetApplicationOrg retrieves an existing org from an application organization config group.
func (*ConfigTx) GetChannelCapabilities ¶
GetChannelCapabilities returns a map of enabled channel capabilities from a config transaction.
func (*ConfigTx) GetConsortiumOrg ¶
func (c *ConfigTx) GetConsortiumOrg(consortiumName, orgName string) (Organization, error)
GetConsortiumOrg retrieves an existing org from a consortium organization config group.
func (*ConfigTx) GetMSPConfigurationForApplicationOrg ¶
GetMSPConfigurationForApplicationOrg returns the MSP configuration for an existing application org in a config transaction.
func (*ConfigTx) GetMSPConfigurationForConsortiumOrg ¶
GetMSPConfigurationForConsortiumOrg returns the MSP configuration for an existing consortium org in a config transaction.
func (*ConfigTx) GetMSPConfigurationForOrdererOrg ¶
GetMSPConfigurationForOrdererOrg returns the MSP configuration for an existing orderer org in a config transaction.
func (*ConfigTx) GetOrdererCapabilities ¶
GetOrdererCapabilities returns a map of enabled orderer capabilities from a config transaction.
func (*ConfigTx) GetOrdererConfiguration ¶
GetOrdererConfiguration returns the existing orderer configuration values from a config transaction as an Orderer type. This can be used to retrieve existing values for the orderer prior to updating the orderer configuration.
func (*ConfigTx) GetOrdererOrg ¶
func (c *ConfigTx) GetOrdererOrg(orgName string) (Organization, error)
GetOrdererOrg retrieves an existing org from an orderer organization config group.
func (*ConfigTx) GetPoliciesForApplication ¶
GetPoliciesForApplication returns a map of policies for application config group.
func (*ConfigTx) GetPoliciesForApplicationOrg ¶
GetPoliciesForApplicationOrg returns a map of policies for specific application organization.
func (*ConfigTx) GetPoliciesForConsortium ¶
GetPoliciesForConsortium returns a map of policies for a specific consortium.
func (*ConfigTx) GetPoliciesForConsortiumOrg ¶
func (c *ConfigTx) GetPoliciesForConsortiumOrg(consortiumName, orgName string) (map[string]Policy, error)
GetPoliciesForConsortiumOrg returns a map of policies for a specific consortium org.
func (*ConfigTx) GetPoliciesForConsortiums ¶
GetPoliciesForConsortiums returns a map of policies for channel consortiums.
func (*ConfigTx) GetPoliciesForOrderer ¶
GetPoliciesForOrderer returns a map of policies for channel orderer.
func (*ConfigTx) GetPoliciesForOrdererOrg ¶
GetPoliciesForOrdererOrg returns a map of policies for a specific org.
func (*ConfigTx) RemoveACLs ¶
RemoveACLs a list of ACLs from given channel config application.
func (*ConfigTx) RemoveAnchorPeer ¶
RemoveAnchorPeer removes an anchor peer from an existing channel config transaction. The removed anchor peer and org it belongs to must both already exist.
func (*ConfigTx) RemoveApplicationCapability ¶
RemoveApplicationCapability removes capability to the provided channel config.
Example ¶
baseConfig := fetchChannelConfig() c := configtx.New(baseConfig) err := c.RemoveChannelCapability("V1_3") if err != nil { panic(err) }
Output:
func (*ConfigTx) RemoveApplicationOrgPolicy ¶
RemoveApplicationOrgPolicy removes an existing policy from an application organization. The removed policy must exist.
func (*ConfigTx) RemoveApplicationPolicy ¶
RemoveApplicationPolicy removes an existing application policy configuration. The policy must exist in the config.
func (*ConfigTx) RemoveChannelCapability ¶
RemoveChannelCapability removes capability to the provided channel config.
Example ¶
baseConfig := fetchChannelConfig() c := configtx.New(baseConfig) err := c.RemoveChannelCapability("V1_3") if err != nil { panic(err) }
Output:
func (*ConfigTx) RemoveConsortiumOrgPolicy ¶
RemoveConsortiumOrgPolicy removes an existing policy from an consortiums organization. The removed policy must exist however will not error if it does not exist in configuration.
func (*ConfigTx) RemoveOrdererCapability ¶
RemoveOrdererCapability removes capability to the provided channel config.
Example ¶
baseConfig := fetchChannelConfig() c := configtx.New(baseConfig) err := c.RemoveOrdererCapability("V1_4") if err != nil { panic(err) }
Output:
func (*ConfigTx) RemoveOrdererEndpoint ¶
RemoveOrdererEndpoint removes an orderer's endpoint from an existing channel config transaction. The removed endpoint and org it belongs to must both already exist.
func (*ConfigTx) RemoveOrdererOrgPolicy ¶
RemoveOrdererOrgPolicy removes an existing policy from an orderer organization. The removed policy must exist however will not error if it does not exist in configuration.
func (*ConfigTx) RemoveOrdererPolicy ¶
RemoveOrdererPolicy removes an existing orderer policy configuration. The policy must exist in the config.
func (*ConfigTx) RevokeCertificateFromMSP ¶
func (c *ConfigTx) RevokeCertificateFromMSP(orgName string, caCert *x509.Certificate, caPrivKey *ecdsa.PrivateKey, certs ...*x509.Certificate) error
RevokeCertificateFromMSP takes a variadic list of x509 certificates, creates a new CRL signed by the specified ca certificate and private key, and appends it to the revocation list for the specified application org MSP.
func (*ConfigTx) UpdateMSP ¶
UpdateMSP updates the MSP for the provided config application org group.
func (*ConfigTx) UpdateOrdererConfiguration ¶
UpdateOrdererConfiguration modifies an existing config tx's Orderer configuration via the passed in Orderer values. It skips updating OrdererOrgGroups and Policies.
type ConsensusState ¶
type ConsensusState string
ConsensusState defines the orderer mode of operation.
type Consenter ¶
type Consenter struct { Address Address ClientTLSCert *x509.Certificate ServerTLSCert *x509.Certificate }
Consenter represents a consenting node (i.e. replica).
type Consortium ¶
type Consortium struct { Name string Organizations []Organization }
Consortium is a group of non-orderer organizations used in channel transactions.
type CryptoConfig ¶
type CryptoConfig struct { // SignatureHashFamily is a string representing the hash family to be used // during sign and verify operations. // Allowed values are "SHA2" and "SHA3". SignatureHashFamily string // IdentityIdentifierHashFunction is a string representing the hash function // to be used during the computation of the identity identifier of an MSP identity. // Allowed values are "SHA256", "SHA384" and "SHA3_256", "SHA3_384". IdentityIdentifierHashFunction string }
CryptoConfig contains configuration parameters for the cryptographic algorithms used by the MSP this configuration refers to.
type EtcdRaft ¶
type EtcdRaft struct { Consenters []Consenter Options EtcdRaftOptions }
EtcdRaft is serialized and set as the value of ConsensusType.Metadata in a channel configuration when the ConsensusType.Type is set to "etcdraft".
type EtcdRaftOptions ¶
type EtcdRaftOptions struct { TickInterval string ElectionTick uint32 HeartbeatTick uint32 MaxInflightBlocks uint32 // Take snapshot when cumulative data exceeds certain size in bytes. SnapshotIntervalSize uint32 }
EtcdRaftOptions to be specified for all the etcd/raft nodes. These can be modified on a per-channel basis.
type Kafka ¶
type Kafka struct { // Brokers contains the addresses of *at least two* kafka brokers // Must be in `IP:port` notation Brokers []string }
Kafka is a list of Kafka broker endpoints.
type KeyInfo ¶
type KeyInfo struct { // Identifier of the key inside the default keystore; this for // the case of Software BCCSP as well as the HSM BCCSP would be // the SKI of the key. KeyIdentifier string // KeyMaterial (optional) for the key to be imported; this // must be a supported PKCS#8 private key type of either // *rsa.PrivateKey, *ecdsa.PrivateKey, or ed25519.PrivateKey. KeyMaterial crypto.PrivateKey }
KeyInfo represents a (secret) key that is either already stored in the bccsp/keystore or key material to be imported to the bccsp key-store. In later versions it may contain also a keystore identifier.
type MSP ¶
type MSP struct { // Name holds the identifier of the MSP; MSP identifier // is chosen by the application that governs this MSP. // For example, and assuming the default implementation of MSP, // that is X.509-based and considers a single Issuer, // this can refer to the Subject OU field or the Issuer OU field. Name string // List of root certificates trusted by this MSP // they are used upon certificate validation (see // comment for IntermediateCerts below). RootCerts []*x509.Certificate // List of intermediate certificates trusted by this MSP; // they are used upon certificate validation as follows: // validation attempts to build a path from the certificate // to be validated (which is at one end of the path) and // one of the certs in the RootCerts field (which is at // the other end of the path). If the path is longer than // 2, certificates in the middle are searched within the // IntermediateCerts pool. IntermediateCerts []*x509.Certificate // Identity denoting the administrator of this MSP. Admins []*x509.Certificate // Identity revocation list. RevocationList []*pkix.CertificateList // SigningIdentity holds information on the signing identity // this peer is to use, and which is to be imported by the // MSP defined before. SigningIdentity SigningIdentityInfo // OrganizationalUnitIdentifiers holds one or more // fabric organizational unit identifiers that belong to // this MSP configuration. OrganizationalUnitIdentifiers []OUIdentifier // CryptoConfig contains the configuration parameters // for the cryptographic algorithms used by this MSP. CryptoConfig CryptoConfig // List of TLS root certificates trusted by this MSP. // They are returned by GetTLSRootCerts. TLSRootCerts []*x509.Certificate // List of TLS intermediate certificates trusted by this MSP; // They are returned by GetTLSIntermediateCerts. TLSIntermediateCerts []*x509.Certificate // fabric_node_ous contains the configuration to distinguish clients from peers from orderers // based on the OUs. NodeOus NodeOUs }
MSP is the configuration information for a Fabric MSP. Here we assume a default certificate validation policy, where any certificate signed by any of the listed rootCA certs would be considered as valid under this MSP. This MSP may or may not come with a signing identity. If it does, it can also issue signing identities. If it does not, it can only be used to validate and verify certificates.
type NodeOUs ¶
type NodeOUs struct { // If true then an msp identity that does not contain any of the specified OU will be considered invalid. Enable bool // OU Identifier of the clients. ClientOUIdentifier OUIdentifier // OU Identifier of the peers. PeerOUIdentifier OUIdentifier // OU Identifier of the admins. AdminOUIdentifier OUIdentifier // OU Identifier of the orderers. OrdererOUIdentifier OUIdentifier }
NodeOUs contains configuration to tell apart clients from peers from orderers based on OUs. If NodeOUs recognition is enabled then an msp identity that does not contain any of the specified OU will be considered invalid.
type OUIdentifier ¶
type OUIdentifier struct { // Certificate represents the second certificate in a certification chain. // (Notice that the first certificate in a certification chain is supposed // to be the certificate of an identity). // It must correspond to the certificate of root or intermediate CA // recognized by the MSP this message belongs to. // Starting from this certificate, a certification chain is computed // and bound to the OrganizationUnitIdentifier specified. Certificate *x509.Certificate // OrganizationUnitIdentifier defines the organizational unit under the // MSP identified with MSPIdentifier. OrganizationalUnitIdentifier string }
OUIdentifier represents an organizational unit and its related chain of trust identifier.
type Orderer ¶
type Orderer struct { // OrdererType is the type of orderer // Options: `Solo`, `Kafka` or `Raft` OrdererType string // Addresses is the list of orderer addresses. Addresses []Address // BatchTimeout is the wait time between transactions. BatchTimeout time.Duration BatchSize BatchSize Kafka Kafka EtcdRaft EtcdRaft Organizations []Organization // MaxChannels is the maximum count of channels an orderer supports. MaxChannels uint64 // Capabilities is a map of the capabilities the orderer supports. Capabilities []string Policies map[string]Policy // Options: `ConsensusStateNormal` and `ConsensusStateMaintenance` State ConsensusState }
Orderer configures the ordering service behavior for a channel.
type Organization ¶
type Organization struct { Name string Policies map[string]Policy MSP MSP // AnchorPeers contains the endpoints of anchor peers for each application organization. AnchorPeers []Address OrdererEndpoints []string }
Organization is an organization in the channel configuration.
type SigningIdentity ¶
type SigningIdentity struct { Certificate *x509.Certificate PrivateKey crypto.PrivateKey MSPID string }
SigningIdentity is an MSP Identity that can be used to sign configuration updates.
func (*SigningIdentity) Public ¶
func (s *SigningIdentity) Public() crypto.PublicKey
Public returns the public key associated with this signing identity's certificate.
func (*SigningIdentity) Sign ¶
func (s *SigningIdentity) Sign(reader io.Reader, digest []byte, opts crypto.SignerOpts) (signature []byte, err error)
Sign performs ECDSA sign with this signing identity's private key on the given digest. It ensures signatures are created with Low S values since Fabric normalizes all signatures to Low S. See https://github.com/bitcoin/bips/blob/master/bip-0146.mediawiki#low_s for more detail.
type SigningIdentityInfo ¶
type SigningIdentityInfo struct { // PublicSigner carries the public information of the signing // identity. For an X.509 provider this would be represented by // an X.509 certificate. PublicSigner *x509.Certificate // PrivateSigner denotes a reference to the private key of the // peer's signing identity. PrivateSigner KeyInfo }
SigningIdentityInfo represents the configuration information related to the signing identity the peer is to use for generating endorsements.