Commit bdcaea24 authored by Aiden X's avatar Aiden X

feat(*): init project

parents
---
name: 'Bug Report'
about: 'As a User, I want to report a Bug.'
labels: bug
---
## Bug Report
Please answer these questions before submitting your issue. Thanks!
### 1. What did you do?
<!-- If possible, provide a recipe for reproducing the error. -->
### 2. What did you expect to see?
### 3. What did you see instead?
### 4. What version of BitXHub are you using? (`bitxhub version` on BitXHub)
---
name: 'Development Task'
about: 'As a BitXHub developer, I want to record a development task.'
labels: enhancement
---
## Development Task
---
name: 'Feature Request'
about: 'As a user, I want to request a New Feature on the product.'
labels: feature
---
## Feature Request
**Is your feature request related to a problem? Please describe:**
<!-- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] -->
**Describe the feature you'd like:**
<!-- A clear and concise description of what you want to happen. -->
**Describe alternatives you've considered:**
<!-- A clear and concise description of any alternative solutions or features you've considered. -->
**Teachability, Documentation, Adoption, Migration Strategy:**
<!-- If you can, explain some scenarios how users might use this, situations it would be helpful in. Any API designs, mockups, or diagrams are also helpful. -->
---
name: 'Ask a Question'
about: 'I want to ask a question.'
labels: question
---
## General Question
.DS_Store
build
.idea
\ No newline at end of file
# Contributing
## <a name="submit"></a> Submission Guidelines
### <a name="submit-pr"></a> Submitting a Pull Request (PR)
Before you submit your Pull Request (PR) consider the following guidelines:
1. Search [GitHub](https://github.com/meshplus/bitxhub/pulls) for an open or closed PR
that relates to your submission. You don't want to duplicate effort.
1. Be sure that an issue describes the problem you're fixing, or documents the design for the feature you'd like to add.
Discussing the design up front helps to ensure that we're ready to accept your work.
1. Fork the meshplus/bitxhub repo.
1. Make your changes in a new git branch:
```shell
git checkout -b my-fix-branch master
```
1. Create your patch, **including appropriate test cases**.
1. Follow gofmt and golint specifications.
1. Run the full test suite and ensure that all tests pass.
1. Commit your changes using a descriptive commit message that follows our
[commit message conventions](#commit). Adherence to these conventions
is necessary because release notes are automatically generated from these messages.
```shell
git commit -a
```
Note: the optional commit `-a` command line option will automatically "add" and "rm" edited files.
1. Push your branch to GitHub:
```shell
git push origin my-fix-branch
```
1. In GitHub, send a pull request to `bitxhub:master`.
* If we suggest changes then:
* Make the required updates.
* Re-run the test suites to ensure tests are still passing.
* Rebase your branch and force push to your GitHub repository (this will update your Pull Request):
```shell
git rebase master -i
git push -f
```
That's it! Thank you for your contribution!
#### After your pull request is merged
After your pull request is merged, you can safely delete your branch and pull the changes
from the main (upstream) repository:
* Delete the remote branch on GitHub either through the GitHub web UI or your local shell as follows:
```shell
git push origin --delete my-fix-branch
```
* Check out the master branch:
```shell
git checkout master -f
```
* Delete the local branch:
```shell
git branch -D my-fix-branch
```
* Update your master with the latest upstream version:
```shell
git pull --ff upstream master
```
## <a name="commit"> Commit Message Guidelines
Commit Message in this repository should strictly follow the [AngularJS Git Commit Message Conventions](https://github.com/angular/angular/blob/master/CONTRIBUTING.md#-commit-message-guidelines). We explain the conventions below. For detail explanation, it can be found in this [document](https://docs.google.com/document/d/1QrDFcIiPjSLDn3EL15IJygNPiHORgU1_OOAqWjiDU5Y/edit#).
### Commit Message Format
Each commit message consists of a **header**, a **body** and a **footer**. The header has a special
format that includes a **type**, a **scope** and a **subject**:
```
<type>(<scope>): <subject>
<BLANK LINE>
<body>
<BLANK LINE>
<footer>
```
The **header** is mandatory and the **scope** of the header is optional.
Any line of the commit message cannot be longer than 100 characters! This allows the message to be easier
to read on GitHub as well as in various git tools.
The footer should contain a [closing reference to an issue](https://help.github.com/articles/closing-issues-via-commit-messages/) if any.
### Revert
If the commit reverts a previous commit, it should begin with `revert:`, followed by the header of the reverted commit. In the body it should say: `This reverts commit <hash>.`, where the hash is the SHA of the commit being reverted.
### Type
Must be one of the following:
* **build**: Changes that affect the build system or external dependencies (example scopes: gulp, broccoli, npm)
* **ci**: Changes to our CI configuration files and scripts (example scopes: Circle, BrowserStack, SauceLabs)
* **docs**: Documentation only changes
* **feat**: A new feature
* **fix**: A bug fix
* **perf**: A code change that improves performance
* **refactor**: A code change that neither fixes a bug nor adds a feature
* **style**: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)
* **test**: Adding missing tests or correcting existing tests
### Subject
The subject contains a succinct description of the change:
* use the imperative, present tense: "change" not "changed" nor "changes"
* don't capitalize the first letter
* no dot (.) at the end
### Body
Just as in the **subject**, use the imperative, present tense: "change" not "changed" nor "changes".
The body should include the motivation for the change and contrast this with previous behavior.
### Footer
The footer should contain any information about **Breaking Changes** and is also the place to
reference GitHub issues that this commit **Closes**.
**Breaking Changes** should start with the word `BREAKING CHANGE:` with a space or two newlines. The rest of the commit message is then used for this.
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "{}"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright {yyyy} {name of copyright owner}
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
\ No newline at end of file
SHELL := /bin/bash
CURRENT_PATH = $(shell pwd)
GO = GO111MODULE=on go
help: Makefile
@echo "Choose a command run:"
@sed -n 's/^##//p' $< | column -t -s ':' | sed -e 's/^/ /'
## make fabric1.4: build fabric(1.4) client plugin
fabric1.4:
mkdir -p build
$(GO) build --buildmode=plugin -o build/fabric-client-1.4.so ./*.go
fabric1.4-linux:
cd scripts && sh cross_compile.sh linux-amd64 ${CURRENT_PATH}
## make linter: Run golanci-lint
linter:
golangci-lint run -E goimports --skip-dirs-use-default -D staticcheck
# Pier Client Fabric
\ No newline at end of file
package main
import (
"encoding/json"
"fmt"
"strconv"
"strings"
"time"
"github.com/Rican7/retry"
"github.com/Rican7/retry/strategy"
"github.com/golang/protobuf/proto"
"github.com/hyperledger/fabric-sdk-go/pkg/client/channel"
"github.com/hyperledger/fabric-sdk-go/pkg/client/ledger"
"github.com/hyperledger/fabric-sdk-go/pkg/common/providers/fab"
"github.com/hyperledger/fabric/common/util"
"github.com/hyperledger/fabric/core/chaincode/shim"
"github.com/hyperledger/fabric/protos/common"
"github.com/hyperledger/fabric/protos/peer"
"github.com/meshplus/bitxhub-kit/log"
"github.com/meshplus/bitxhub-model/pb"
"github.com/meshplus/pier/pkg/model"
"github.com/meshplus/pier/pkg/plugins/client"
"github.com/sirupsen/logrus"
)
var logger = log.NewWithModule("client")
var _ client.Client = (*Client)(nil)
const (
GetInnerMetaMethod = "getInnerMeta" // get last index of each source chain executing tx
GetOutMetaMethod = "getOuterMeta" // get last index of each receiving chain crosschain event
GetCallbackMetaMethod = "getCallbackMeta" // get last index of each receiving chain callback tx
GetInMessageMethod = "getInMessage"
GetOutMessageMethod = "getOutMessage"
PollingEventMethod = "pollingEvent"
FabricType = "fabric"
)
type ContractMeta struct {
EventFilter string `json:"event_filter"`
Username string `json:"username"`
CCID string `json:"ccid"`
ChannelID string `json:"channel_id"`
ORG string `json:"org"`
}
type Client struct {
meta *ContractMeta
consumer *Consumer
eventC chan *pb.IBTP
pierId string
name string
outMeta map[string]uint64
ticker *time.Ticker
done chan bool
}
func NewClient(configPath, pierId string, extra []byte) (client.Client, error) {
eventC := make(chan *pb.IBTP)
fabricConfig, err := UnmarshalConfig(configPath)
if err != nil {
return nil, fmt.Errorf("unmarshal config for plugin :%w", err)
}
c := &ContractMeta{
EventFilter: fabricConfig.EventFilter,
Username: fabricConfig.Username,
CCID: fabricConfig.CCID,
ChannelID: fabricConfig.ChannelId,
ORG: fabricConfig.Org,
}
m := make(map[string]uint64)
if err := json.Unmarshal(extra, &m); err != nil {
return nil, fmt.Errorf("unmarshal extra for plugin :%w", err)
}
if m == nil {
m = make(map[string]uint64)
}
mgh, err := newFabricHandler(c.EventFilter, eventC, pierId)
if err != nil {
return nil, err
}
done := make(chan bool)
csm, err := NewConsumer(configPath, c, mgh, done)
if err != nil {
return nil, err
}
return &Client{
consumer: csm,
eventC: eventC,
meta: c,
pierId: pierId,
name: fabricConfig.Name,
outMeta: m,
ticker: time.NewTicker(2 * time.Second),
done: done,
}, nil
}
func (c *Client) Start() error {
logger.Info("Fabric consumer started")
go c.polling()
return c.consumer.Start()
}
// polling event from broker
func (c *Client) polling() {
for {
select {
case <-c.ticker.C:
args, err := json.Marshal(c.outMeta)
if err != nil {
logger.WithFields(logrus.Fields{
"error": err.Error(),
}).Error("Marshal outMeta of plugin")
continue
}
request := channel.Request{
ChaincodeID: c.meta.CCID,
Fcn: PollingEventMethod,
Args: [][]byte{args},
}
var response channel.Response
response, err = c.consumer.ChannelClient.Execute(request)
if err != nil {
logger.WithFields(logrus.Fields{
"error": err.Error(),
}).Error("Polling events from contract")
continue
}
if response.Payload == nil {
continue
}
proof, err := c.getProof(response)
if err != nil {
continue
}
evs := make([]*Event, 0)
if err := json.Unmarshal(response.Payload, &evs); err != nil {
logger.WithFields(logrus.Fields{
"error": err.Error(),
}).Error("Unmarshal response payload")
continue
}
for _, ev := range evs {
ev.Proof = proof
c.eventC <- ev.Convert2IBTP(c.pierId, pb.IBTP_INTERCHAIN)
if c.outMeta == nil {
c.outMeta = make(map[string]uint64)
}
c.outMeta[ev.DstChainID]++
}
case <-c.done:
logger.Info("Stop long polling")
return
}
}
}
func (c *Client) getProof(response channel.Response) ([]byte, error) {
var proof []byte
var handle = func(response channel.Response) ([]byte, error) {
// query proof from fabric
l, err := ledger.New(c.consumer.channelProvider)
if err != nil {
return nil, err
}
t, err := l.QueryTransaction(response.TransactionID)
if err != nil {
return nil, err
}
pd := &common.Payload{}
if err := proto.Unmarshal(t.TransactionEnvelope.Payload, pd); err != nil {
return nil, err
}
pt := &peer.Transaction{}
if err := proto.Unmarshal(pd.Data, pt); err != nil {
return nil, err
}
return pt.Actions[0].Payload, nil
}
if err := retry.Retry(func(attempt uint) error {
var err error
proof, err = handle(response)
if err != nil {
logger.Errorf("can't get proof: %s", err.Error())
return err
}
return nil
}, strategy.Wait(2*time.Second)); err != nil {
logger.Panicf("can't get proof: %s", err.Error())
}
return proof, nil
}
func (c *Client) Stop() error {
c.ticker.Stop()
c.done <- true
return c.consumer.Shutdown()
}
func (c *Client) Name() string {
return c.name
}
func (c *Client) Type() string {
return FabricType
}
func (c *Client) GetIBTP() chan *pb.IBTP {
return c.eventC
}
func (c *Client) SubmitIBTP(ibtp *pb.IBTP) (*model.PluginResponse, error) {
pd := &pb.Payload{}
ret := &model.PluginResponse{}
if err := pd.Unmarshal(ibtp.Payload); err != nil {
return ret, fmt.Errorf("ibtp payload unmarshal: %w", err)
}
args := util.ToChaincodeArgs(ibtp.From, strconv.FormatUint(ibtp.Index, 10), pd.DstContractId)
args = append(args, pd.Args...)
request := channel.Request{
ChaincodeID: c.meta.CCID,
Fcn: pd.Func,
Args: args,
}
// retry executing
var res channel.Response
var proof []byte
var err error
if err := retry.Retry(func(attempt uint) error {
res, err = c.consumer.ChannelClient.Execute(request)
if err != nil {
if strings.Contains(err.Error(), "Chaincode status Code: (500)") {
res.ChaincodeStatus = shim.ERROR
return nil
}
return fmt.Errorf("execute request: %w", err)
}
return nil
}, strategy.Wait(2*time.Second)); err != nil {
logger.Panicf("Can't send rollback ibtp back to bitxhub: %s", err.Error())
}
response := &Response{}
if err := json.Unmarshal(res.Payload, response); err != nil {
return nil, err
}
// if there is callback function, parse returned value
result := util.ToChaincodeArgs(strings.Split(string(response.Data), ",")...)
newArgs := make([][]byte, 0)
ret.Status = response.OK
ret.Message = response.Message
// If no callback function to invoke, then simply return
if pd.Callback == "" {
return ret, nil
}
proof, err = c.getProof(res)
if err != nil {
return ret, err
}
switch pd.Func {
case "interchainGet":
newArgs = append(newArgs, pd.Args[0])
newArgs = append(newArgs, result...)
case "interchainCharge":
newArgs = append(newArgs, []byte("false"), pd.Args[0])
if response.OK {
newArgs[0] = []byte("true")
}
newArgs = append(newArgs, pd.Args[2:]...)
}
ret.Result, err = c.generateCallback(ibtp, newArgs, proof)
if err != nil {
return nil, err
}
return ret, nil
}
func (c *Client) GetOutMessage(to string, idx uint64) (*pb.IBTP, error) {
args := util.ToChaincodeArgs(to, strconv.FormatUint(idx, 10))
request := channel.Request{
ChaincodeID: c.meta.CCID,
Fcn: GetOutMessageMethod,
Args: args,
}
var response channel.Response
response, err := c.consumer.ChannelClient.Execute(request)
if err != nil {
return nil, err
}
return c.unpackIBTP(&response, pb.IBTP_INTERCHAIN)
}
func (c *Client) GetInMessage(from string, index uint64) ([][]byte, error) {
request := channel.Request{
ChaincodeID: c.meta.CCID,
Fcn: GetInMessageMethod,
Args: util.ToChaincodeArgs(from, strconv.FormatUint(index, 10)),
}
var response channel.Response
response, err := c.consumer.ChannelClient.Execute(request)
if err != nil {
return nil, fmt.Errorf("execute req: %w", err)
}
results := strings.Split(string(response.Payload), ",")
return util.ToChaincodeArgs(results...), nil
}
func (c *Client) GetInMeta() (map[string]uint64, error) {
request := channel.Request{
ChaincodeID: c.meta.CCID,
Fcn: GetInnerMetaMethod,
}
var response channel.Response
response, err := c.consumer.ChannelClient.Execute(request)
if err != nil {
return nil, err
}
return c.unpackMap(response)
}
func (c *Client) GetOutMeta() (map[string]uint64, error) {
request := channel.Request{
ChaincodeID: c.meta.CCID,
Fcn: GetOutMetaMethod,
}
var response channel.Response
response, err := c.consumer.ChannelClient.Execute(request)
if err != nil {
return nil, err
}
return c.unpackMap(response)
}
func (c Client) GetCallbackMeta() (map[string]uint64, error) {
request := channel.Request{
ChaincodeID: c.meta.CCID,
Fcn: GetCallbackMetaMethod,
}
var response channel.Response
response, err := c.consumer.ChannelClient.Execute(request)
if err != nil {
return nil, err
}
return c.unpackMap(response)
}
func (c *Client) CommitCallback(ibtp *pb.IBTP) error {
return nil
}
func (c *Client) unpackRet(response *channel.Response) (*peer.ChaincodeAction, error) {
txHash := response.Payload
l, err := ledger.New(c.consumer.channelProvider)
if err != nil {
return nil, fmt.Errorf("new ledger: %w", err)
}
t, err := l.QueryTransaction(fab.TransactionID(txHash))
if err != nil {
return nil, fmt.Errorf("query tx: %w", err)
}
pd := &common.Payload{}
if err := proto.Unmarshal(t.TransactionEnvelope.Payload, pd); err != nil {
return nil, fmt.Errorf("unmarshal envelope: %w", err)
}
pt := &peer.Transaction{}
if err := proto.Unmarshal(pd.Data, pt); err != nil {
return nil, fmt.Errorf("unmarshal peer tx: %w", err)
}
action := &peer.ChaincodeActionPayload{}
if err := proto.Unmarshal(pt.Actions[0].Payload, action); err != nil {
return nil, fmt.Errorf("unmarshal action: %w", err)
}
payload := &peer.ProposalResponsePayload{}
if err := proto.Unmarshal(action.Action.ProposalResponsePayload, payload); err != nil {
return nil, fmt.Errorf("unmarshal proposal: %w", err)
}
result := &peer.ChaincodeAction{}
if err := proto.Unmarshal(payload.Extension, result); err != nil {
return nil, fmt.Errorf("unmarshal chaincode action: %w", err)
}
return result, nil
}
func (c *Client) unpackIBTP(response *channel.Response, ibtpType pb.IBTP_Type) (*pb.IBTP, error) {
ret := &Event{}
if err := json.Unmarshal(response.Payload, ret); err != nil {
return nil, err
}
return ret.Convert2IBTP(c.pierId, ibtpType), nil
}
func (c *Client) unpackMap(response channel.Response) (map[string]uint64, error) {
if response.Payload == nil {
return nil, nil
}
r := make(map[string]uint64)
err := json.Unmarshal(response.Payload, &r)
if err != nil {
return nil, fmt.Errorf("unmarshal payload :%w", err)
}
return r, nil
}
type handler struct {
eventFilter string
eventC chan *pb.IBTP
ID string
}
func newFabricHandler(eventFilter string, eventC chan *pb.IBTP, pierId string) (*handler, error) {
return &handler{
eventC: eventC,
eventFilter: eventFilter,
ID: pierId,
}, nil
}
func (h *handler) HandleMessage(deliveries *fab.CCEvent, payload []byte) {
if deliveries.EventName == h.eventFilter {
e := &pb.IBTP{}
if err := e.Unmarshal(deliveries.Payload); err != nil {
return
}
e.Proof = payload
h.eventC <- e
}
}
package main
import (
"path/filepath"
"strings"
"github.com/spf13/viper"
)
const (
ConfigName = "fabric.toml"
)
type Fabric struct {
Addr string `toml:"addr" json:"addr"`
Name string `toml:"name" json:"name"`
EventFilter string `mapstructure:"event_filter" toml:"event_filter" json:"event_filter"`
Username string `toml:"username" json:"username"`
CCID string `toml:"ccid" json:"ccid"`
ChannelId string `mapstructure:"channel_id" toml:"channel_id" json:"channel_id"`
Org string `toml:"org" json:"org"`
}
func DefaultConfig() *Fabric {
return &Fabric{
Addr: "40.125.164.122:10053",
Name: "fabric",
EventFilter: "CrosschainEventName",
Username: "Admin",
CCID: "Broker-001",
ChannelId: "mychannel",
Org: "org2",
}
}
func UnmarshalConfig(configPath string) (*Fabric, error) {
viper.SetConfigFile(filepath.Join(configPath, ConfigName))
viper.SetConfigType("toml")
viper.AutomaticEnv()
viper.SetEnvPrefix("FABRIC")
replacer := strings.NewReplacer(".", "_")
viper.SetEnvKeyReplacer(replacer)
if err := viper.ReadInConfig(); err != nil {
return nil, err
}
config := DefaultConfig()
if err := viper.Unmarshal(config); err != nil {
return nil, err
}
return config, nil
}
version: 1.0.0
client:
# Which organization does this application instance belong to? The value must be the name of an org
# defined under "organizations"
organization: org2
logging:
level: info
# Root of the MSP directories with keys and certs.
cryptoconfig:
path: ${CONFIG_PATH}/crypto-config
# Some SDKs support pluggable KV stores, the properties under "credentialStore"
# are implementation specific
credentialStore:
# [Optional]. Used by user store. Not needed if all credentials are embedded in configuration
# and enrollments are performed elswhere.
path: "/tmp/state-store"
# [Optional]. Specific to the CryptoSuite implementation used by GO SDK. Software-based implementations
# requiring a key store. PKCS#11 based implementations does not.
cryptoStore:
# Specific to the underlying KeyValueStore that backs the crypto key store.
path: /tmp/msp
# BCCSP config for the client. Used by GO SDK.
BCCSP:
security:
enabled: true
default:
provider: "SW"
hashAlgorithm: "SHA2"
softVerify: true
level: 256
tlsCerts:
#[Optional]. Use system certificate pool when connecting to peers, orderers (for negotiating TLS) Default: false
systemCertPool: true
#[Optional]. Client key and cert for TLS handshake with peers and orderers
client:
key:
path: ${CONFIG_PATH}/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/tls/server.key
cert:
path: ${CONFIG_PATH}/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/tls/server.crt
#
# [Optional]. But most apps would have this section so that channel objects can be constructed
# based on the content below. If an app is creating channels, then it likely will not need this
# section.
#
channels:
#[Required if _default not defined; Optional if _default defined].
# name of the channel
mychannel:
# list of orderers designated by the application to use for transactions on this
# channel. This list can be a result of access control ("FBI" can only access "ordererA"), or
# operational decisions to share loads from applications among the orderers. The values must
# be "names" of orgs defined under "organizations/p unable to load config backend: loading config feers"
# deprecated: not recommended, to override any orderer configuration items, entity matchers should be used.
# orderers:
# - orderer.citizens.com
#[Required if _default peers not defined; Optional if _default peers defined].
# list of peers from participating orgs
peers:
peer1.org2.example.com:
endorsingPeer: true
chaincodeQuery: true
ledgerQuery: true
eventSource: true
# peer0.org2.example.com:
# endorsingPeer: true
# chaincodeQuery: true
# ledgerQuery: true
# eventSource: true
#
# list of participating organizations in this network
#
organizations:
org1:
mspid: Org1MSP
# This org's MSP store (absolute path or relative to client.cryptoconfig)
cryptoPath: peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
peers:
- peer0.org1.example.com
- peer1.org1.example.com
# [Optional]. Certificate Authorities issue certificates for identification purposes in a Fab based
# network. Typically certificates provisioning is done in a separate process outside of the
# runtime network. CA is a special certificate authority that provides a REST APIs for
# dynamic certificate management (enroll, revoke, re-enroll). The following section is only for
# CA servers.
# certificateAuthorities:
# - ca.fbi.citizens.com
# the profile will contain public information about organizations other than the one it belongs to.
# These are necessary information to make transaction lifecycles work, including MSP IDs and
# peers with a public URL to send transaction proposals. The file will not contain private
# information reserved for members of the organization, such as admin key and certificate,
# ca registrar enroll ID and secret, etc.
org2:
mspid: Org2MSP
# This org's MSP store (absolute path or relative to client.cryptoconfig)
cryptoPath: peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
peers:
- peer0.org2.example.com
- peer1.org2.example.com
#
# List of orderers to send transaction and channel create/update requests to. For the time
# being only one orderer is needed. If more than one is defined, which one get used by the
# SDK is implementation specific. Consult each SDK's documentation for its handling of orderers.
#
orderers:
orderer.example.com:
url: grpcs://10.1.16.48:7050
# these are standard properties defined by the gRPC library
# they will be passed in as-is to gRPC client constructor
grpcOptions:
ssl-target-name-override: orderer.example.com
# These parameters should be set in coordination with the keepalive policy on the server,
# as incompatible settings can result in closing of connection.
# When duration of the 'keep-alive-time' is set to 0 or less the keep alive client parameters are disabled
keep-alive-time: 0s
keep-alive-timeout: 20s
keep-alive-permit: false
fail-fast: false
# allow-insecure will be taken into consideration if address has no protocol defined, if true then grpc or else grpcs
allow-insecure: false
tlsCACerts:
# Certificate location absolute path
path: ${CONFIG_PATH}/crypto-config/ordererOrganizations/example.com/tlsca/tlsca.example.com-cert.pem
#
# List of peers to send various requests to, including endorsement, query
# and event listener registration.
#
peers:
peer0.org1.example.com:
# this URL is used to send endorsement and query requests
url: grpcs://10.1.16.48:7051
eventUrl: grpcs://10.1.16.48:7053
grpcOptions:
ssl-target-name-override: peer0.org1.example.com
# These parameters should be set in coordination with the keepalive policy on the server,
# as incompatible settings can result in closing of connection.
# When duration of the 'keep-alive-time' is set to 0 or less the keep alive client parameters are disabled
keep-alive-time: 0s
keep-alive-timeout: 20s
keep-alive-permit: false
fail-fast: false
# allow-insecure will be taken into consideration if address has no protocol defined, if true then grpc or else grpcs
allow-insecure: false
tlsCACerts:
# Certificate location absolute path
path: ${CONFIG_PATH}/crypto-config/peerOrganizations/org1.example.com/tlsca/tlsca.org1.example.com-cert.pem
peer1.org1.example.com:
# this URL is used to send endorsement and query requests
url: grpcs://10.1.16.48:8051
eventUrl: grpcs://10.1.16.48:8053
grpcOptions:
ssl-target-name-override: peer1.org1.example.com
# These parameters should be set in coordination with the keepalive policy on the server,
# as incompatible settings can result in closing of connection.
# When duration of the 'keep-alive-time' is set to 0 or less the keep alive client parameters are disabled
keep-alive-time: 0s
keep-alive-timeout: 20s
keep-alive-permit: false
fail-fast: false
# allow-insecure will be taken into consideration if address has no protocol defined, if true then grpc or else grpcs
allow-insecure: false
tlsCACerts:
# Certificate location absolute path
path: ${CONFIG_PATH}/crypto-config/peerOrganizations/org1.example.com/tlsca/tlsca.org1.example.com-cert.pem
peer0.org2.example.com:
# this URL is used to send endorsement and query requests
url: grpcs://10.1.16.48:9051
eventUrl: grpcs://10.1.16.48:9053
grpcOptions:
ssl-target-name-override: peer0.org2.example.com
# These parameters should be set in coordination with the keepalive policy on the server,
# as incompatible settings can result in closing of connection.
# When duration of the 'keep-alive-time' is set to 0 or less the keep alive client parameters are disabled
keep-alive-time: 0s
keep-alive-timeout: 20s
keep-alive-permit: false
fail-fast: false
# allow-insecure will be taken into consideration if address has no protocol defined, if true then grpc or else grpcs
allow-insecure: false
tlsCACerts:
# Certificate location absolute path
path: ${CONFIG_PATH}/crypto-config/peerOrganizations/org2.example.com/tlsca/tlsca.org2.example.com-cert.pem
peer1.org2.example.com:
# this URL is used to send endorsement and query requests
url: grpcs://10.1.16.48:10051
eventUrl: grpcs://10.1.16.48:10053
grpcOptions:
ssl-target-name-override: peer1.org2.example.com
# These parameters should be set in coordination with the keepalive policy on the server,
# as incompatible settings can result in closing of connection.
# When duration of the 'keep-alive-time' is set to 0 or less the keep alive client parameters are disabled
keep-alive-time: 0s
keep-alive-timeout: 20s
keep-alive-permit: false
fail-fast: false
# allow-insecure will be taken into consideration if address has no protocol defined, if true then grpc or else grpcs
allow-insecure: false
tlsCACerts:
# Certificate location absolute path
path: ${CONFIG_PATH}/crypto-config/peerOrganizations/org2.example.com/tlsca/tlsca.org2.example.com-cert.pem
#
# CA is a special kind of Certificate Authority provided by Hyperledger Fab which allows
# certificate management to be done via REST APIs. Application may choose to use a standard
# Certificate Authority instead of CA, in which case this section would not be specified.
#
# certificateAuthorities:
# ca.org1.example.com:
# url: https://ca.org1.example.com:7053
# tlsCACerts:
# # Comma-Separated list of paths
# path: /home/shaojie/config_v1/crypto-config/peerOrganizations/org1.example.com/tlsca/tlsca.org1.example.com-cert.pem
# # Client key and cert for SSL handshake with Fab CA
# client:
# key:
# path: /home/shaojie/config_v1/crypto-config/peerOrganizations/org1.example.com/users/User1@org1.example.com/tls/client.key
# cert:
# path: /home/shaojie/config_v1/crypto-config/peerOrganizations/org1.example.com/users/User1@org1.example.com/tls/client.crt
# # CA supports dynamic user enrollment via REST APIs. A "root" user, a.k.a registrar, is
# # needed to enroll and invoke new users.
# registrar:
# enrollId: admin
# enrollSecret: adminpw
# # [Optional] The optional name of the CA.
# caName: ca.org1.example.com
# EntityMatchers enable substitution of network hostnames with static configurations
# so that properties can be mapped. Regex can be used for this purpose
# UrlSubstitutionExp can be empty which means the same network hostname will be used
# UrlSubstitutionExp can be given same as mapped peer url, so that mapped peer url can be used
# UrlSubstitutionExp can have golang regex matchers like 1.local.example.2:3 for pattern
# like peer0.fbi.citizens.com:1234 which converts peer0.fbi.citizens.com to peer0.FBI.local.citizens.com:1234
# sslTargetOverrideUrlSubstitutionExp follow in the same lines as
# SubstitutionExp for the fields gprcOptions.ssl-target-name-override respectively
# In any case mappedHost's config will be used, so mapped host cannot be empty, if entityMatchers are used
#entityMatchers:
entityMatchers:
peer:
- pattern: (\w*)peer0.org1.example.com:(\w*)
urlSubstitutionExp: grpcs://10.1.16.48:7051
eventUrlSubstitutionExp: grpcs://10.1.16.48:7053
sslTargetOverrideUrlSubstitutionExp: peer0.org1.example.com
mappedHost: peer0.org1.example.com
- pattern: (\w*)peer1.org1.example.com:(\w*)
urlSubstitutionExp: grpcs://10.1.16.48:8051
eventUrlSubstitutionExp: grpcs://10.1.16.48:8053
sslTargetOverrideUrlSubstitutionExp: peer1.org1.example.com
mappedHost: peer1.org1.example.com
- pattern: (\w*)peer0.org2.example.com:(\w*)
urlSubstitutionExp: grpcs://10.1.16.48:9051
eventUrlSubstitutionExp: grpcs://10.1.16.48:9053
sslTargetOverrideUrlSubstitutionExp: peer0.org2.example.com
mappedHost: peer0.org2.example.com
- pattern: (\w*)peer1.org2.example.com:(\w*)
urlSubstitutionExp: grpcs://10.1.16.48:10051
eventUrlSubstitutionExp: grpcs://10.1.16.48:10053
sslTargetOverrideUrlSubstitutionExp: peer1.org2.example.com
mappedHost: peer1.org2.example.com
# orderer:
# - pattern: (\w+).example.(\w+)
# urlSubstitutionExp: orderer.citizens.com:7050
# sslTargetOverrideUrlSubstitutionExp: orderer.citizens.com
# mappedHost: orderer.citizens.com
#
# - pattern: (\w+).example2.(\w+)
# urlSubstitutionExp: localhost:7050
# sslTargetOverrideUrlSubstitutionExp: localhost
# mappedHost: orderer.citizens.com
#
# - pattern: (\w+).example3.(\w+)
# urlSubstitutionExp:
# sslTargetOverrideUrlSubstitutionExp:
# mappedHost: orderer.citizens.com
#
# - pattern: (\w+).example4.(\w+):(\d+)
# urlSubstitutionExp: 1.example.2:3
# sslTargetOverrideUrlSubstitutionExp: 1.example.2
# mappedHost: orderer.citizens.com
#
# certificateAuthority:
# - pattern: (\w+).fbi.citizens.com.(\w+)
# urlSubstitutionExp:
# mappedHost: ca.fbi.citizens.com
#
#entityMatchers:
orderer:
- pattern: (\w*)orderer.example.com(\w*)
urlSubstitutionExp: grpcs://10.1.16.48:7050
sslTargetOverrideUrlSubstitutionExp: orderer.example.com
mappedHost: orderer.example.com
-----BEGIN CERTIFICATE-----
MIICPjCCAeSgAwIBAgIRANzgptpH5rKbTAqTnDY+RdwwCgYIKoZIzj0EAwIwaTEL
MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
cmFuY2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRcwFQYDVQQDEw5jYS5leGFt
cGxlLmNvbTAeFw0yMDAyMDUwODIyMDBaFw0zMDAyMDIwODIyMDBaMGkxCzAJBgNV
BAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNp
c2NvMRQwEgYDVQQKEwtleGFtcGxlLmNvbTEXMBUGA1UEAxMOY2EuZXhhbXBsZS5j
b20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASBzwYcOSXpBzwCDlYMrJAd01V7
TQHbGkCnFOhvSG3rklHy1/X3ku1DljA970wi05FUgyME8+uBRokz6KRU/Cefo20w
azAOBgNVHQ8BAf8EBAMCAaYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMB
MA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIOsMje7jvZcX05nRhnE817Ni+CeC
wlhNnFZVTx4G/lx8MAoGCCqGSM49BAMCA0gAMEUCIQD0w0Yk++NxSsnYrubDzxPA
A1pjyywNiDV9Si8EFu52+wIgQ3vuhPLOoaVElb0CeTGcMp2LLaJOtwA6EwwL23UQ
/kY=
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg6Kze8036gJ3wykEJ
0lPXcSnRHqELCCyktp/QEEgfh0ShRANCAASBzwYcOSXpBzwCDlYMrJAd01V7TQHb
GkCnFOhvSG3rklHy1/X3ku1DljA970wi05FUgyME8+uBRokz6KRU/Cef
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIICPjCCAeSgAwIBAgIRANzgptpH5rKbTAqTnDY+RdwwCgYIKoZIzj0EAwIwaTEL
MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
cmFuY2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRcwFQYDVQQDEw5jYS5leGFt
cGxlLmNvbTAeFw0yMDAyMDUwODIyMDBaFw0zMDAyMDIwODIyMDBaMGkxCzAJBgNV
BAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNp
c2NvMRQwEgYDVQQKEwtleGFtcGxlLmNvbTEXMBUGA1UEAxMOY2EuZXhhbXBsZS5j
b20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASBzwYcOSXpBzwCDlYMrJAd01V7
TQHbGkCnFOhvSG3rklHy1/X3ku1DljA970wi05FUgyME8+uBRokz6KRU/Cefo20w
azAOBgNVHQ8BAf8EBAMCAaYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMB
MA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIOsMje7jvZcX05nRhnE817Ni+CeC
wlhNnFZVTx4G/lx8MAoGCCqGSM49BAMCA0gAMEUCIQD0w0Yk++NxSsnYrubDzxPA
A1pjyywNiDV9Si8EFu52+wIgQ3vuhPLOoaVElb0CeTGcMp2LLaJOtwA6EwwL23UQ
/kY=
-----END CERTIFICATE-----
NodeOUs:
Enable: true
ClientOUIdentifier:
Certificate: cacerts/ca.example.com-cert.pem
OrganizationalUnitIdentifier: client
PeerOUIdentifier:
Certificate: cacerts/ca.example.com-cert.pem
OrganizationalUnitIdentifier: peer
AdminOUIdentifier:
Certificate: cacerts/ca.example.com-cert.pem
OrganizationalUnitIdentifier: admin
OrdererOUIdentifier:
Certificate: cacerts/ca.example.com-cert.pem
OrganizationalUnitIdentifier: orderer
-----BEGIN CERTIFICATE-----
MIICQzCCAemgAwIBAgIQAT9ufXTKHsaf3FePfHQIazAKBggqhkjOPQQDAjBsMQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xGjAYBgNVBAMTEXRsc2NhLmV4
YW1wbGUuY29tMB4XDTIwMDIwNTA4MjIwMFoXDTMwMDIwMjA4MjIwMFowbDELMAkG
A1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFu
Y2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRowGAYDVQQDExF0bHNjYS5leGFt
cGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABNa1DY9sQJSm5qlKDDAP
ZHG2uVnYb4UIDonhssuRmfgl2h22Syx/WE703yMDxdaX4GYSs7pPuszyj3F9HCcS
BNijbTBrMA4GA1UdDwEB/wQEAwIBpjAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYB
BQUHAwEwDwYDVR0TAQH/BAUwAwEB/zApBgNVHQ4EIgQgKP262WZIDcasrdgPeL4F
cs1ehed8aJByB1p6HOUwmp8wCgYIKoZIzj0EAwIDSAAwRQIhAMl0+SAt/xlyqNiE
giZK01ho31vBVWvDt1VWsINca/ytAiAQ1qDK2Eb/pleni56Fw/6Ee1mBRR/Sh3H7
SNbe1oR5KA==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICPjCCAeSgAwIBAgIRANzgptpH5rKbTAqTnDY+RdwwCgYIKoZIzj0EAwIwaTEL
MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
cmFuY2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRcwFQYDVQQDEw5jYS5leGFt
cGxlLmNvbTAeFw0yMDAyMDUwODIyMDBaFw0zMDAyMDIwODIyMDBaMGkxCzAJBgNV
BAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNp
c2NvMRQwEgYDVQQKEwtleGFtcGxlLmNvbTEXMBUGA1UEAxMOY2EuZXhhbXBsZS5j
b20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASBzwYcOSXpBzwCDlYMrJAd01V7
TQHbGkCnFOhvSG3rklHy1/X3ku1DljA970wi05FUgyME8+uBRokz6KRU/Cefo20w
azAOBgNVHQ8BAf8EBAMCAaYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMB
MA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIOsMje7jvZcX05nRhnE817Ni+CeC
wlhNnFZVTx4G/lx8MAoGCCqGSM49BAMCA0gAMEUCIQD0w0Yk++NxSsnYrubDzxPA
A1pjyywNiDV9Si8EFu52+wIgQ3vuhPLOoaVElb0CeTGcMp2LLaJOtwA6EwwL23UQ
/kY=
-----END CERTIFICATE-----
NodeOUs:
Enable: true
ClientOUIdentifier:
Certificate: cacerts/ca.example.com-cert.pem
OrganizationalUnitIdentifier: client
PeerOUIdentifier:
Certificate: cacerts/ca.example.com-cert.pem
OrganizationalUnitIdentifier: peer
AdminOUIdentifier:
Certificate: cacerts/ca.example.com-cert.pem
OrganizationalUnitIdentifier: admin
OrdererOUIdentifier:
Certificate: cacerts/ca.example.com-cert.pem
OrganizationalUnitIdentifier: orderer
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgZMC9yBU0JaRZnTQe
hD8Lz2zWPbFkgKpY551ib8+ey0ehRANCAARzfoQvGDeU1klODS5okk06V/g4euv7
u7SyqPbCCjioEgqebaCaEIikqOzhpLUmu0GIQY5N7F6OQ1+3g8YL9t98
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIICHjCCAcSgAwIBAgIQHJGNbeHeBWsHY3MZ9NZlTDAKBggqhkjOPQQDAjBpMQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xFzAVBgNVBAMTDmNhLmV4YW1w
bGUuY29tMB4XDTIwMDIwNTA4MjIwMFoXDTMwMDIwMjA4MjIwMFowajELMAkGA1UE
BhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lz
Y28xEDAOBgNVBAsTB29yZGVyZXIxHDAaBgNVBAMTE29yZGVyZXIuZXhhbXBsZS5j
b20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARzfoQvGDeU1klODS5okk06V/g4
euv7u7SyqPbCCjioEgqebaCaEIikqOzhpLUmu0GIQY5N7F6OQ1+3g8YL9t98o00w
SzAOBgNVHQ8BAf8EBAMCB4AwDAYDVR0TAQH/BAIwADArBgNVHSMEJDAigCDrDI3u
472XF9OZ0YZxPNezYvgngsJYTZxWVU8eBv5cfDAKBggqhkjOPQQDAgNIADBFAiEA
7FFubIklu4iJq+F5OqV/ZtnC89bH2l0sYpcDta46ovECIGstoooRawvlv7IhyfAo
Bb5Dxp8s3moNCLjYz4ObZgUo
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICQzCCAemgAwIBAgIQAT9ufXTKHsaf3FePfHQIazAKBggqhkjOPQQDAjBsMQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xGjAYBgNVBAMTEXRsc2NhLmV4
YW1wbGUuY29tMB4XDTIwMDIwNTA4MjIwMFoXDTMwMDIwMjA4MjIwMFowbDELMAkG
A1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFu
Y2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRowGAYDVQQDExF0bHNjYS5leGFt
cGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABNa1DY9sQJSm5qlKDDAP
ZHG2uVnYb4UIDonhssuRmfgl2h22Syx/WE703yMDxdaX4GYSs7pPuszyj3F9HCcS
BNijbTBrMA4GA1UdDwEB/wQEAwIBpjAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYB
BQUHAwEwDwYDVR0TAQH/BAUwAwEB/zApBgNVHQ4EIgQgKP262WZIDcasrdgPeL4F
cs1ehed8aJByB1p6HOUwmp8wCgYIKoZIzj0EAwIDSAAwRQIhAMl0+SAt/xlyqNiE
giZK01ho31vBVWvDt1VWsINca/ytAiAQ1qDK2Eb/pleni56Fw/6Ee1mBRR/Sh3H7
SNbe1oR5KA==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICQzCCAemgAwIBAgIQAT9ufXTKHsaf3FePfHQIazAKBggqhkjOPQQDAjBsMQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xGjAYBgNVBAMTEXRsc2NhLmV4
YW1wbGUuY29tMB4XDTIwMDIwNTA4MjIwMFoXDTMwMDIwMjA4MjIwMFowbDELMAkG
A1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFu
Y2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRowGAYDVQQDExF0bHNjYS5leGFt
cGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABNa1DY9sQJSm5qlKDDAP
ZHG2uVnYb4UIDonhssuRmfgl2h22Syx/WE703yMDxdaX4GYSs7pPuszyj3F9HCcS
BNijbTBrMA4GA1UdDwEB/wQEAwIBpjAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYB
BQUHAwEwDwYDVR0TAQH/BAUwAwEB/zApBgNVHQ4EIgQgKP262WZIDcasrdgPeL4F
cs1ehed8aJByB1p6HOUwmp8wCgYIKoZIzj0EAwIDSAAwRQIhAMl0+SAt/xlyqNiE
giZK01ho31vBVWvDt1VWsINca/ytAiAQ1qDK2Eb/pleni56Fw/6Ee1mBRR/Sh3H7
SNbe1oR5KA==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICWDCCAf+gAwIBAgIQZzo2octxbc4uWmUbqBOJxjAKBggqhkjOPQQDAjBsMQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xGjAYBgNVBAMTEXRsc2NhLmV4
YW1wbGUuY29tMB4XDTIwMDIwNTA4MjIwMFoXDTMwMDIwMjA4MjIwMFowWDELMAkG
A1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFu
Y2lzY28xHDAaBgNVBAMTE29yZGVyZXIuZXhhbXBsZS5jb20wWTATBgcqhkjOPQIB
BggqhkjOPQMBBwNCAATLgVER25nf4fzsYjfSS6VntF5ma7t8ITJakDR2iLl/VT3n
3iq4E0/Dx1u7nWek6bYKb0VS0nNz3TkPxMh388c5o4GWMIGTMA4GA1UdDwEB/wQE
AwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDAYDVR0TAQH/BAIw
ADArBgNVHSMEJDAigCAo/brZZkgNxqyt2A94vgVyzV6F53xokHIHWnoc5TCanzAn
BgNVHREEIDAeghNvcmRlcmVyLmV4YW1wbGUuY29tggdvcmRlcmVyMAoGCCqGSM49
BAMCA0cAMEQCIEXKmh7drYCxhulPDh93j6tCK+EArL1Y9rxafawbJd/8AiAgLTPU
rBp0HmgxWjOzAVpShxVzcmcE3A8NgSCSDB3OEg==
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg0MAHx9D9tSjRfOhf
0IxWUo8SXoI8rv7idTsvI0qOcdOhRANCAATLgVER25nf4fzsYjfSS6VntF5ma7t8
ITJakDR2iLl/VT3n3iq4E0/Dx1u7nWek6bYKb0VS0nNz3TkPxMh388c5
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIICPjCCAeSgAwIBAgIRANzgptpH5rKbTAqTnDY+RdwwCgYIKoZIzj0EAwIwaTEL
MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
cmFuY2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRcwFQYDVQQDEw5jYS5leGFt
cGxlLmNvbTAeFw0yMDAyMDUwODIyMDBaFw0zMDAyMDIwODIyMDBaMGkxCzAJBgNV
BAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNp
c2NvMRQwEgYDVQQKEwtleGFtcGxlLmNvbTEXMBUGA1UEAxMOY2EuZXhhbXBsZS5j
b20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASBzwYcOSXpBzwCDlYMrJAd01V7
TQHbGkCnFOhvSG3rklHy1/X3ku1DljA970wi05FUgyME8+uBRokz6KRU/Cefo20w
azAOBgNVHQ8BAf8EBAMCAaYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMB
MA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIOsMje7jvZcX05nRhnE817Ni+CeC
wlhNnFZVTx4G/lx8MAoGCCqGSM49BAMCA0gAMEUCIQD0w0Yk++NxSsnYrubDzxPA
A1pjyywNiDV9Si8EFu52+wIgQ3vuhPLOoaVElb0CeTGcMp2LLaJOtwA6EwwL23UQ
/kY=
-----END CERTIFICATE-----
NodeOUs:
Enable: true
ClientOUIdentifier:
Certificate: cacerts/ca.example.com-cert.pem
OrganizationalUnitIdentifier: client
PeerOUIdentifier:
Certificate: cacerts/ca.example.com-cert.pem
OrganizationalUnitIdentifier: peer
AdminOUIdentifier:
Certificate: cacerts/ca.example.com-cert.pem
OrganizationalUnitIdentifier: admin
OrdererOUIdentifier:
Certificate: cacerts/ca.example.com-cert.pem
OrganizationalUnitIdentifier: orderer
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgOb/K+4ZNLlD4XkxM
DDaSVKpxDhbifG/7wFWPZybdeimhRANCAATApfheY/kiRzy39QvtTZc2RdLNvbHb
DtM4FKC+etco8cWpxRvfag3NJRMerjKDUhMouMbBVkb3qvCakvc84zpy
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIICIDCCAcagAwIBAgIRALN98foSnwcOdL+v50fyrgwwCgYIKoZIzj0EAwIwaTEL
MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
cmFuY2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRcwFQYDVQQDEw5jYS5leGFt
cGxlLmNvbTAeFw0yMDAyMDUwODIyMDBaFw0zMDAyMDIwODIyMDBaMGsxCzAJBgNV
BAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNp
c2NvMRAwDgYDVQQLEwdvcmRlcmVyMR0wGwYDVQQDExRvcmRlcmVyMi5leGFtcGxl
LmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABMCl+F5j+SJHPLf1C+1NlzZF
0s29sdsO0zgUoL561yjxxanFG99qDc0lEx6uMoNSEyi4xsFWRveq8JqS9zzjOnKj
TTBLMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIOsM
je7jvZcX05nRhnE817Ni+CeCwlhNnFZVTx4G/lx8MAoGCCqGSM49BAMCA0gAMEUC
IQC5Ma8dv5GHOAgs93SU+jSlBCXfOGaOXJa6NzXC8sf8rwIgWwTk/PL0bmJ9l7UT
lC/U89wAMc02+8hgKn143vsAwYY=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICQzCCAemgAwIBAgIQAT9ufXTKHsaf3FePfHQIazAKBggqhkjOPQQDAjBsMQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xGjAYBgNVBAMTEXRsc2NhLmV4
YW1wbGUuY29tMB4XDTIwMDIwNTA4MjIwMFoXDTMwMDIwMjA4MjIwMFowbDELMAkG
A1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFu
Y2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRowGAYDVQQDExF0bHNjYS5leGFt
cGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABNa1DY9sQJSm5qlKDDAP
ZHG2uVnYb4UIDonhssuRmfgl2h22Syx/WE703yMDxdaX4GYSs7pPuszyj3F9HCcS
BNijbTBrMA4GA1UdDwEB/wQEAwIBpjAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYB
BQUHAwEwDwYDVR0TAQH/BAUwAwEB/zApBgNVHQ4EIgQgKP262WZIDcasrdgPeL4F
cs1ehed8aJByB1p6HOUwmp8wCgYIKoZIzj0EAwIDSAAwRQIhAMl0+SAt/xlyqNiE
giZK01ho31vBVWvDt1VWsINca/ytAiAQ1qDK2Eb/pleni56Fw/6Ee1mBRR/Sh3H7
SNbe1oR5KA==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICQzCCAemgAwIBAgIQAT9ufXTKHsaf3FePfHQIazAKBggqhkjOPQQDAjBsMQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xGjAYBgNVBAMTEXRsc2NhLmV4
YW1wbGUuY29tMB4XDTIwMDIwNTA4MjIwMFoXDTMwMDIwMjA4MjIwMFowbDELMAkG
A1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFu
Y2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRowGAYDVQQDExF0bHNjYS5leGFt
cGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABNa1DY9sQJSm5qlKDDAP
ZHG2uVnYb4UIDonhssuRmfgl2h22Syx/WE703yMDxdaX4GYSs7pPuszyj3F9HCcS
BNijbTBrMA4GA1UdDwEB/wQEAwIBpjAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYB
BQUHAwEwDwYDVR0TAQH/BAUwAwEB/zApBgNVHQ4EIgQgKP262WZIDcasrdgPeL4F
cs1ehed8aJByB1p6HOUwmp8wCgYIKoZIzj0EAwIDSAAwRQIhAMl0+SAt/xlyqNiE
giZK01ho31vBVWvDt1VWsINca/ytAiAQ1qDK2Eb/pleni56Fw/6Ee1mBRR/Sh3H7
SNbe1oR5KA==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICXDCCAgKgAwIBAgIQO/HmtN3HgSM7clLjtoK/kDAKBggqhkjOPQQDAjBsMQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xGjAYBgNVBAMTEXRsc2NhLmV4
YW1wbGUuY29tMB4XDTIwMDIwNTA4MjIwMFoXDTMwMDIwMjA4MjIwMFowWTELMAkG
A1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFu
Y2lzY28xHTAbBgNVBAMTFG9yZGVyZXIyLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0C
AQYIKoZIzj0DAQcDQgAEuaME+/KGGRDyX/02FO7yauve4xX0Ab3CWNp1EvqkZ+H6
vdRTcvuh93UttMt4VHr06fyfwb1R7G5drXRQ2r/KyqOBmDCBlTAOBgNVHQ8BAf8E
BAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQC
MAAwKwYDVR0jBCQwIoAgKP262WZIDcasrdgPeL4Fcs1ehed8aJByB1p6HOUwmp8w
KQYDVR0RBCIwIIIUb3JkZXJlcjIuZXhhbXBsZS5jb22CCG9yZGVyZXIyMAoGCCqG
SM49BAMCA0gAMEUCIQCfW75WAP59H4NmRC4kH5s8pNr4XZAbpkKEKRZEPH1hrgIg
HkjCCuveTTsAC70ql8bywFOb/8cEhEOsucjtiJr2QuY=
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgf6O343qdsASV0mS+
gEZYZwUOT76VH65D33wpnNVp0AyhRANCAAS5owT78oYZEPJf/TYU7vJq697jFfQB
vcJY2nUS+qRn4fq91FNy+6H3dS20y3hUevTp/J/BvVHsbl2tdFDav8rK
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIICPjCCAeSgAwIBAgIRANzgptpH5rKbTAqTnDY+RdwwCgYIKoZIzj0EAwIwaTEL
MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
cmFuY2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRcwFQYDVQQDEw5jYS5leGFt
cGxlLmNvbTAeFw0yMDAyMDUwODIyMDBaFw0zMDAyMDIwODIyMDBaMGkxCzAJBgNV
BAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNp
c2NvMRQwEgYDVQQKEwtleGFtcGxlLmNvbTEXMBUGA1UEAxMOY2EuZXhhbXBsZS5j
b20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASBzwYcOSXpBzwCDlYMrJAd01V7
TQHbGkCnFOhvSG3rklHy1/X3ku1DljA970wi05FUgyME8+uBRokz6KRU/Cefo20w
azAOBgNVHQ8BAf8EBAMCAaYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMB
MA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIOsMje7jvZcX05nRhnE817Ni+CeC
wlhNnFZVTx4G/lx8MAoGCCqGSM49BAMCA0gAMEUCIQD0w0Yk++NxSsnYrubDzxPA
A1pjyywNiDV9Si8EFu52+wIgQ3vuhPLOoaVElb0CeTGcMp2LLaJOtwA6EwwL23UQ
/kY=
-----END CERTIFICATE-----
NodeOUs:
Enable: true
ClientOUIdentifier:
Certificate: cacerts/ca.example.com-cert.pem
OrganizationalUnitIdentifier: client
PeerOUIdentifier:
Certificate: cacerts/ca.example.com-cert.pem
OrganizationalUnitIdentifier: peer
AdminOUIdentifier:
Certificate: cacerts/ca.example.com-cert.pem
OrganizationalUnitIdentifier: admin
OrdererOUIdentifier:
Certificate: cacerts/ca.example.com-cert.pem
OrganizationalUnitIdentifier: orderer
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgaDENP0dYfwqme98K
ytCzAg3fXWFGT3Lt1zHhnmLP9AOhRANCAATuySTLTPJttEYBLh8zo1CJC+5g2MFF
seY8vBHpIAyUkN+3QZsJU76lupjoagh8tEBAh5ofEr96btGJ7av0xwjh
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIICIDCCAcagAwIBAgIRANMTAz1krNTN45khmrhDGnYwCgYIKoZIzj0EAwIwaTEL
MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
cmFuY2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRcwFQYDVQQDEw5jYS5leGFt
cGxlLmNvbTAeFw0yMDAyMDUwODIyMDBaFw0zMDAyMDIwODIyMDBaMGsxCzAJBgNV
BAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNp
c2NvMRAwDgYDVQQLEwdvcmRlcmVyMR0wGwYDVQQDExRvcmRlcmVyMy5leGFtcGxl
LmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABO7JJMtM8m20RgEuHzOjUIkL
7mDYwUWx5jy8EekgDJSQ37dBmwlTvqW6mOhqCHy0QECHmh8Sv3pu0Yntq/THCOGj
TTBLMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIOsM
je7jvZcX05nRhnE817Ni+CeCwlhNnFZVTx4G/lx8MAoGCCqGSM49BAMCA0gAMEUC
IQCPHStcDlMbVJIDNfOmH0u+wCr/oROiQc2sXtRY4LY7UgIgbDiTCTdCmWYfZAU8
aug1tDP7EpLg+8kpd3OBTmSPCLM=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICQzCCAemgAwIBAgIQAT9ufXTKHsaf3FePfHQIazAKBggqhkjOPQQDAjBsMQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xGjAYBgNVBAMTEXRsc2NhLmV4
YW1wbGUuY29tMB4XDTIwMDIwNTA4MjIwMFoXDTMwMDIwMjA4MjIwMFowbDELMAkG
A1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFu
Y2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRowGAYDVQQDExF0bHNjYS5leGFt
cGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABNa1DY9sQJSm5qlKDDAP
ZHG2uVnYb4UIDonhssuRmfgl2h22Syx/WE703yMDxdaX4GYSs7pPuszyj3F9HCcS
BNijbTBrMA4GA1UdDwEB/wQEAwIBpjAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYB
BQUHAwEwDwYDVR0TAQH/BAUwAwEB/zApBgNVHQ4EIgQgKP262WZIDcasrdgPeL4F
cs1ehed8aJByB1p6HOUwmp8wCgYIKoZIzj0EAwIDSAAwRQIhAMl0+SAt/xlyqNiE
giZK01ho31vBVWvDt1VWsINca/ytAiAQ1qDK2Eb/pleni56Fw/6Ee1mBRR/Sh3H7
SNbe1oR5KA==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICQzCCAemgAwIBAgIQAT9ufXTKHsaf3FePfHQIazAKBggqhkjOPQQDAjBsMQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xGjAYBgNVBAMTEXRsc2NhLmV4
YW1wbGUuY29tMB4XDTIwMDIwNTA4MjIwMFoXDTMwMDIwMjA4MjIwMFowbDELMAkG
A1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFu
Y2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRowGAYDVQQDExF0bHNjYS5leGFt
cGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABNa1DY9sQJSm5qlKDDAP
ZHG2uVnYb4UIDonhssuRmfgl2h22Syx/WE703yMDxdaX4GYSs7pPuszyj3F9HCcS
BNijbTBrMA4GA1UdDwEB/wQEAwIBpjAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYB
BQUHAwEwDwYDVR0TAQH/BAUwAwEB/zApBgNVHQ4EIgQgKP262WZIDcasrdgPeL4F
cs1ehed8aJByB1p6HOUwmp8wCgYIKoZIzj0EAwIDSAAwRQIhAMl0+SAt/xlyqNiE
giZK01ho31vBVWvDt1VWsINca/ytAiAQ1qDK2Eb/pleni56Fw/6Ee1mBRR/Sh3H7
SNbe1oR5KA==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICWzCCAgKgAwIBAgIQBWif3+q0IMWwFqUgTmbPnzAKBggqhkjOPQQDAjBsMQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xGjAYBgNVBAMTEXRsc2NhLmV4
YW1wbGUuY29tMB4XDTIwMDIwNTA4MjIwMFoXDTMwMDIwMjA4MjIwMFowWTELMAkG
A1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFu
Y2lzY28xHTAbBgNVBAMTFG9yZGVyZXIzLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0C
AQYIKoZIzj0DAQcDQgAEUl1/oLYBFQgqWi3dQn1YQRpdZFOdD3Fu0nX05iJcQNJD
pyq5r66uF1AzR2bW5WCrNt/sZquPohcwl5Cd7SaTTqOBmDCBlTAOBgNVHQ8BAf8E
BAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQC
MAAwKwYDVR0jBCQwIoAgKP262WZIDcasrdgPeL4Fcs1ehed8aJByB1p6HOUwmp8w
KQYDVR0RBCIwIIIUb3JkZXJlcjMuZXhhbXBsZS5jb22CCG9yZGVyZXIzMAoGCCqG
SM49BAMCA0cAMEQCICRIMl+Gool22Gr27PedYkWtjZ93Jkcoyf1UBM7XziL4AiB7
O4K4YEG9RuQr8Eea1G3wTmGnoONx1VcbgpYgppBkKg==
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgAT/L8TZL+IpII5UO
x1nQUebiPo6gwgl/qo+YC9geXzmhRANCAARSXX+gtgEVCCpaLd1CfVhBGl1kU50P
cW7SdfTmIlxA0kOnKrmvrq4XUDNHZtblYKs23+xmq4+iFzCXkJ3tJpNO
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIICPjCCAeSgAwIBAgIRANzgptpH5rKbTAqTnDY+RdwwCgYIKoZIzj0EAwIwaTEL
MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
cmFuY2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRcwFQYDVQQDEw5jYS5leGFt
cGxlLmNvbTAeFw0yMDAyMDUwODIyMDBaFw0zMDAyMDIwODIyMDBaMGkxCzAJBgNV
BAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNp
c2NvMRQwEgYDVQQKEwtleGFtcGxlLmNvbTEXMBUGA1UEAxMOY2EuZXhhbXBsZS5j
b20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASBzwYcOSXpBzwCDlYMrJAd01V7
TQHbGkCnFOhvSG3rklHy1/X3ku1DljA970wi05FUgyME8+uBRokz6KRU/Cefo20w
azAOBgNVHQ8BAf8EBAMCAaYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMB
MA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIOsMje7jvZcX05nRhnE817Ni+CeC
wlhNnFZVTx4G/lx8MAoGCCqGSM49BAMCA0gAMEUCIQD0w0Yk++NxSsnYrubDzxPA
A1pjyywNiDV9Si8EFu52+wIgQ3vuhPLOoaVElb0CeTGcMp2LLaJOtwA6EwwL23UQ
/kY=
-----END CERTIFICATE-----
NodeOUs:
Enable: true
ClientOUIdentifier:
Certificate: cacerts/ca.example.com-cert.pem
OrganizationalUnitIdentifier: client
PeerOUIdentifier:
Certificate: cacerts/ca.example.com-cert.pem
OrganizationalUnitIdentifier: peer
AdminOUIdentifier:
Certificate: cacerts/ca.example.com-cert.pem
OrganizationalUnitIdentifier: admin
OrdererOUIdentifier:
Certificate: cacerts/ca.example.com-cert.pem
OrganizationalUnitIdentifier: orderer
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgFaiVrGTJRjHy3nH3
V0qLk1HyxZZDzt+DrQcF9scOrnGhRANCAATcLIRt1UTxwiMqkkrlYghksLZ5KbRC
43mpP5yu8M4x0AOnar5R6Gt5vbMMBcWjhIEEL89Fl4IPBdnLdBAeYkbE
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIICIDCCAcagAwIBAgIRAId6mr8EAewQFnk9Om3PB70wCgYIKoZIzj0EAwIwaTEL
MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
cmFuY2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRcwFQYDVQQDEw5jYS5leGFt
cGxlLmNvbTAeFw0yMDAyMDUwODIyMDBaFw0zMDAyMDIwODIyMDBaMGsxCzAJBgNV
BAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNp
c2NvMRAwDgYDVQQLEwdvcmRlcmVyMR0wGwYDVQQDExRvcmRlcmVyNC5leGFtcGxl
LmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABNwshG3VRPHCIyqSSuViCGSw
tnkptELjeak/nK7wzjHQA6dqvlHoa3m9swwFxaOEgQQvz0WXgg8F2ct0EB5iRsSj
TTBLMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIOsM
je7jvZcX05nRhnE817Ni+CeCwlhNnFZVTx4G/lx8MAoGCCqGSM49BAMCA0gAMEUC
IQDOzrwxpxYh9zRKt/fII1oGzscv9tKgFNidMt3aG34wXwIgaOUM7121uFvQi1WH
/e11GrKIsc7DFFL0QvVxOdApsVc=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICQzCCAemgAwIBAgIQAT9ufXTKHsaf3FePfHQIazAKBggqhkjOPQQDAjBsMQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xGjAYBgNVBAMTEXRsc2NhLmV4
YW1wbGUuY29tMB4XDTIwMDIwNTA4MjIwMFoXDTMwMDIwMjA4MjIwMFowbDELMAkG
A1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFu
Y2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRowGAYDVQQDExF0bHNjYS5leGFt
cGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABNa1DY9sQJSm5qlKDDAP
ZHG2uVnYb4UIDonhssuRmfgl2h22Syx/WE703yMDxdaX4GYSs7pPuszyj3F9HCcS
BNijbTBrMA4GA1UdDwEB/wQEAwIBpjAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYB
BQUHAwEwDwYDVR0TAQH/BAUwAwEB/zApBgNVHQ4EIgQgKP262WZIDcasrdgPeL4F
cs1ehed8aJByB1p6HOUwmp8wCgYIKoZIzj0EAwIDSAAwRQIhAMl0+SAt/xlyqNiE
giZK01ho31vBVWvDt1VWsINca/ytAiAQ1qDK2Eb/pleni56Fw/6Ee1mBRR/Sh3H7
SNbe1oR5KA==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICQzCCAemgAwIBAgIQAT9ufXTKHsaf3FePfHQIazAKBggqhkjOPQQDAjBsMQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xGjAYBgNVBAMTEXRsc2NhLmV4
YW1wbGUuY29tMB4XDTIwMDIwNTA4MjIwMFoXDTMwMDIwMjA4MjIwMFowbDELMAkG
A1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFu
Y2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRowGAYDVQQDExF0bHNjYS5leGFt
cGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABNa1DY9sQJSm5qlKDDAP
ZHG2uVnYb4UIDonhssuRmfgl2h22Syx/WE703yMDxdaX4GYSs7pPuszyj3F9HCcS
BNijbTBrMA4GA1UdDwEB/wQEAwIBpjAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYB
BQUHAwEwDwYDVR0TAQH/BAUwAwEB/zApBgNVHQ4EIgQgKP262WZIDcasrdgPeL4F
cs1ehed8aJByB1p6HOUwmp8wCgYIKoZIzj0EAwIDSAAwRQIhAMl0+SAt/xlyqNiE
giZK01ho31vBVWvDt1VWsINca/ytAiAQ1qDK2Eb/pleni56Fw/6Ee1mBRR/Sh3H7
SNbe1oR5KA==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICWzCCAgKgAwIBAgIQTM0LWSVVjTYEG6UKJihUvjAKBggqhkjOPQQDAjBsMQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xGjAYBgNVBAMTEXRsc2NhLmV4
YW1wbGUuY29tMB4XDTIwMDIwNTA4MjIwMFoXDTMwMDIwMjA4MjIwMFowWTELMAkG
A1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFu
Y2lzY28xHTAbBgNVBAMTFG9yZGVyZXI0LmV4YW1wbGUuY29tMFkwEwYHKoZIzj0C
AQYIKoZIzj0DAQcDQgAEBV46S+jEwrDeAdw5PK93x4ou/uKgojwan89Vx0NdcJkm
6Uf/lBT+flewTrDPP+RRFb6rKyZQEQsZ6PpEShwjk6OBmDCBlTAOBgNVHQ8BAf8E
BAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQC
MAAwKwYDVR0jBCQwIoAgKP262WZIDcasrdgPeL4Fcs1ehed8aJByB1p6HOUwmp8w
KQYDVR0RBCIwIIIUb3JkZXJlcjQuZXhhbXBsZS5jb22CCG9yZGVyZXI0MAoGCCqG
SM49BAMCA0cAMEQCIBCLY8QLYtJ+LqTV48dYVa5Hj0gcg3ej4De/190jUT2nAiAB
YugFRdKgzzjzJSJDxYsI2QBpg1JIc1rraGc9tc0FCg==
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgCRJXk6cx+Lz4MqDc
KqRkt4NqNCWaU+RxdJarU8TJE2mhRANCAAQFXjpL6MTCsN4B3Dk8r3fHii7+4qCi
PBqfz1XHQ11wmSbpR/+UFP5+V7BOsM8/5FEVvqsrJlARCxno+kRKHCOT
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIICPjCCAeSgAwIBAgIRANzgptpH5rKbTAqTnDY+RdwwCgYIKoZIzj0EAwIwaTEL
MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
cmFuY2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRcwFQYDVQQDEw5jYS5leGFt
cGxlLmNvbTAeFw0yMDAyMDUwODIyMDBaFw0zMDAyMDIwODIyMDBaMGkxCzAJBgNV
BAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNp
c2NvMRQwEgYDVQQKEwtleGFtcGxlLmNvbTEXMBUGA1UEAxMOY2EuZXhhbXBsZS5j
b20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASBzwYcOSXpBzwCDlYMrJAd01V7
TQHbGkCnFOhvSG3rklHy1/X3ku1DljA970wi05FUgyME8+uBRokz6KRU/Cefo20w
azAOBgNVHQ8BAf8EBAMCAaYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMB
MA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIOsMje7jvZcX05nRhnE817Ni+CeC
wlhNnFZVTx4G/lx8MAoGCCqGSM49BAMCA0gAMEUCIQD0w0Yk++NxSsnYrubDzxPA
A1pjyywNiDV9Si8EFu52+wIgQ3vuhPLOoaVElb0CeTGcMp2LLaJOtwA6EwwL23UQ
/kY=
-----END CERTIFICATE-----
NodeOUs:
Enable: true
ClientOUIdentifier:
Certificate: cacerts/ca.example.com-cert.pem
OrganizationalUnitIdentifier: client
PeerOUIdentifier:
Certificate: cacerts/ca.example.com-cert.pem
OrganizationalUnitIdentifier: peer
AdminOUIdentifier:
Certificate: cacerts/ca.example.com-cert.pem
OrganizationalUnitIdentifier: admin
OrdererOUIdentifier:
Certificate: cacerts/ca.example.com-cert.pem
OrganizationalUnitIdentifier: orderer
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgwlYYwYIfS6MIu2qy
LqNZvcciKwYTSBVeX+eAmgswZYGhRANCAASfpq9ReY7ms9/zTb7O6WIz+WkGqBEn
A9Ib9w/ZP6VkA/AKWVr9+luByOKvodBi422oNWygtdbCkNKLESSBPEgf
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIICHjCCAcWgAwIBAgIQWnsp5O0Twn8RY/Uk8nwm7jAKBggqhkjOPQQDAjBpMQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xFzAVBgNVBAMTDmNhLmV4YW1w
bGUuY29tMB4XDTIwMDIwNTA4MjIwMFoXDTMwMDIwMjA4MjIwMFowazELMAkGA1UE
BhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lz
Y28xEDAOBgNVBAsTB29yZGVyZXIxHTAbBgNVBAMTFG9yZGVyZXI1LmV4YW1wbGUu
Y29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEn6avUXmO5rPf802+zuliM/lp
BqgRJwPSG/cP2T+lZAPwClla/fpbgcjir6HQYuNtqDVsoLXWwpDSixEkgTxIH6NN
MEswDgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwKwYDVR0jBCQwIoAg6wyN
7uO9lxfTmdGGcTzXs2L4J4LCWE2cVlVPHgb+XHwwCgYIKoZIzj0EAwIDRwAwRAIg
LGKI1I4++7eEg230Q0SqOUx8LsMw8PcBMISE94KQYPwCICGKrYrKaWkN8kc1A5yp
KqNRw01KQTg5B45NNi8i19F5
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICQzCCAemgAwIBAgIQAT9ufXTKHsaf3FePfHQIazAKBggqhkjOPQQDAjBsMQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xGjAYBgNVBAMTEXRsc2NhLmV4
YW1wbGUuY29tMB4XDTIwMDIwNTA4MjIwMFoXDTMwMDIwMjA4MjIwMFowbDELMAkG
A1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFu
Y2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRowGAYDVQQDExF0bHNjYS5leGFt
cGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABNa1DY9sQJSm5qlKDDAP
ZHG2uVnYb4UIDonhssuRmfgl2h22Syx/WE703yMDxdaX4GYSs7pPuszyj3F9HCcS
BNijbTBrMA4GA1UdDwEB/wQEAwIBpjAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYB
BQUHAwEwDwYDVR0TAQH/BAUwAwEB/zApBgNVHQ4EIgQgKP262WZIDcasrdgPeL4F
cs1ehed8aJByB1p6HOUwmp8wCgYIKoZIzj0EAwIDSAAwRQIhAMl0+SAt/xlyqNiE
giZK01ho31vBVWvDt1VWsINca/ytAiAQ1qDK2Eb/pleni56Fw/6Ee1mBRR/Sh3H7
SNbe1oR5KA==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICQzCCAemgAwIBAgIQAT9ufXTKHsaf3FePfHQIazAKBggqhkjOPQQDAjBsMQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xGjAYBgNVBAMTEXRsc2NhLmV4
YW1wbGUuY29tMB4XDTIwMDIwNTA4MjIwMFoXDTMwMDIwMjA4MjIwMFowbDELMAkG
A1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFu
Y2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRowGAYDVQQDExF0bHNjYS5leGFt
cGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABNa1DY9sQJSm5qlKDDAP
ZHG2uVnYb4UIDonhssuRmfgl2h22Syx/WE703yMDxdaX4GYSs7pPuszyj3F9HCcS
BNijbTBrMA4GA1UdDwEB/wQEAwIBpjAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYB
BQUHAwEwDwYDVR0TAQH/BAUwAwEB/zApBgNVHQ4EIgQgKP262WZIDcasrdgPeL4F
cs1ehed8aJByB1p6HOUwmp8wCgYIKoZIzj0EAwIDSAAwRQIhAMl0+SAt/xlyqNiE
giZK01ho31vBVWvDt1VWsINca/ytAiAQ1qDK2Eb/pleni56Fw/6Ee1mBRR/Sh3H7
SNbe1oR5KA==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICXDCCAgOgAwIBAgIRAN47pTVXJki2dbSdbF431MEwCgYIKoZIzj0EAwIwbDEL
MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
cmFuY2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRowGAYDVQQDExF0bHNjYS5l
eGFtcGxlLmNvbTAeFw0yMDAyMDUwODIyMDBaFw0zMDAyMDIwODIyMDBaMFkxCzAJ
BgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJh
bmNpc2NvMR0wGwYDVQQDExRvcmRlcmVyNS5leGFtcGxlLmNvbTBZMBMGByqGSM49
AgEGCCqGSM49AwEHA0IABJ4xDsl0rYPP6P/tkK3TqRe/HpqRhZ/F40NROgAJyc2h
yIhk3OC0XThx5BD8rnK8JXIR1eVw9uZSEVLqSF3qxxKjgZgwgZUwDgYDVR0PAQH/
BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAMBgNVHRMBAf8E
AjAAMCsGA1UdIwQkMCKAICj9utlmSA3GrK3YD3i+BXLNXoXnfGiQcgdaehzlMJqf
MCkGA1UdEQQiMCCCFG9yZGVyZXI1LmV4YW1wbGUuY29tgghvcmRlcmVyNTAKBggq
hkjOPQQDAgNHADBEAiAdjQFmFIvFA06D/egwcIvxaUZ4l6ewkCS1rs+LlMVa9gIg
UmiwQ9kNpR7gB3CNjXMK5cSgzJHaXSTF9hWfwtD2Jv4=
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgZgC6xiGCNHBnaKej
JveKcc293b+zySAyqS6vA39yZZShRANCAASeMQ7JdK2Dz+j/7ZCt06kXvx6akYWf
xeNDUToACcnNociIZNzgtF04ceQQ/K5yvCVyEdXlcPbmUhFS6khd6scS
-----END PRIVATE KEY-----
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgtmbusZX7ep1psTvB
wur9RjbnHULdFVaro5QzHzyAMAShRANCAATWtQ2PbECUpuapSgwwD2RxtrlZ2G+F
CA6J4bLLkZn4Jdodtkssf1hO9N8jA8XWl+BmErO6T7rM8o9xfRwnEgTY
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIICQzCCAemgAwIBAgIQAT9ufXTKHsaf3FePfHQIazAKBggqhkjOPQQDAjBsMQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xGjAYBgNVBAMTEXRsc2NhLmV4
YW1wbGUuY29tMB4XDTIwMDIwNTA4MjIwMFoXDTMwMDIwMjA4MjIwMFowbDELMAkG
A1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFu
Y2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRowGAYDVQQDExF0bHNjYS5leGFt
cGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABNa1DY9sQJSm5qlKDDAP
ZHG2uVnYb4UIDonhssuRmfgl2h22Syx/WE703yMDxdaX4GYSs7pPuszyj3F9HCcS
BNijbTBrMA4GA1UdDwEB/wQEAwIBpjAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYB
BQUHAwEwDwYDVR0TAQH/BAUwAwEB/zApBgNVHQ4EIgQgKP262WZIDcasrdgPeL4F
cs1ehed8aJByB1p6HOUwmp8wCgYIKoZIzj0EAwIDSAAwRQIhAMl0+SAt/xlyqNiE
giZK01ho31vBVWvDt1VWsINca/ytAiAQ1qDK2Eb/pleni56Fw/6Ee1mBRR/Sh3H7
SNbe1oR5KA==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICPjCCAeSgAwIBAgIRANzgptpH5rKbTAqTnDY+RdwwCgYIKoZIzj0EAwIwaTEL
MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
cmFuY2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRcwFQYDVQQDEw5jYS5leGFt
cGxlLmNvbTAeFw0yMDAyMDUwODIyMDBaFw0zMDAyMDIwODIyMDBaMGkxCzAJBgNV
BAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNp
c2NvMRQwEgYDVQQKEwtleGFtcGxlLmNvbTEXMBUGA1UEAxMOY2EuZXhhbXBsZS5j
b20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASBzwYcOSXpBzwCDlYMrJAd01V7
TQHbGkCnFOhvSG3rklHy1/X3ku1DljA970wi05FUgyME8+uBRokz6KRU/Cefo20w
azAOBgNVHQ8BAf8EBAMCAaYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMB
MA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIOsMje7jvZcX05nRhnE817Ni+CeC
wlhNnFZVTx4G/lx8MAoGCCqGSM49BAMCA0gAMEUCIQD0w0Yk++NxSsnYrubDzxPA
A1pjyywNiDV9Si8EFu52+wIgQ3vuhPLOoaVElb0CeTGcMp2LLaJOtwA6EwwL23UQ
/kY=
-----END CERTIFICATE-----
NodeOUs:
Enable: true
ClientOUIdentifier:
Certificate: cacerts/ca.example.com-cert.pem
OrganizationalUnitIdentifier: client
PeerOUIdentifier:
Certificate: cacerts/ca.example.com-cert.pem
OrganizationalUnitIdentifier: peer
AdminOUIdentifier:
Certificate: cacerts/ca.example.com-cert.pem
OrganizationalUnitIdentifier: admin
OrdererOUIdentifier:
Certificate: cacerts/ca.example.com-cert.pem
OrganizationalUnitIdentifier: orderer
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgxcFlaz7kvzKjsdzg
/vivn5jbC8i9FuE4KMqBJjF7z9GhRANCAARWUytOa1xvjNXvPXIQBSpYTfIotcwI
e0MEtNmNGnJRfiM4IiaepFlVLRDyLwuJuEfxJjVdk3XyIIBkloPW/W6g
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIICGzCCAcGgAwIBAgIQeeWX/f3/4miRug8DZL/FUjAKBggqhkjOPQQDAjBpMQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xFzAVBgNVBAMTDmNhLmV4YW1w
bGUuY29tMB4XDTIwMDIwNTA4MjIwMFoXDTMwMDIwMjA4MjIwMFowZzELMAkGA1UE
BhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lz
Y28xDzANBgNVBAsTBmNsaWVudDEaMBgGA1UEAwwRQWRtaW5AZXhhbXBsZS5jb20w
WTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARWUytOa1xvjNXvPXIQBSpYTfIotcwI
e0MEtNmNGnJRfiM4IiaepFlVLRDyLwuJuEfxJjVdk3XyIIBkloPW/W6go00wSzAO
BgNVHQ8BAf8EBAMCB4AwDAYDVR0TAQH/BAIwADArBgNVHSMEJDAigCDrDI3u472X
F9OZ0YZxPNezYvgngsJYTZxWVU8eBv5cfDAKBggqhkjOPQQDAgNIADBFAiEA5kr1
KViBb1HnY3sPsp6jFkhY4bSZuvndVQXtak4cve4CIFjOAwA+4zIfDRo/Zpj1Lo+u
Ga7QuehanxPB6QwhV8Mv
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICQzCCAemgAwIBAgIQAT9ufXTKHsaf3FePfHQIazAKBggqhkjOPQQDAjBsMQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xGjAYBgNVBAMTEXRsc2NhLmV4
YW1wbGUuY29tMB4XDTIwMDIwNTA4MjIwMFoXDTMwMDIwMjA4MjIwMFowbDELMAkG
A1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFu
Y2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRowGAYDVQQDExF0bHNjYS5leGFt
cGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABNa1DY9sQJSm5qlKDDAP
ZHG2uVnYb4UIDonhssuRmfgl2h22Syx/WE703yMDxdaX4GYSs7pPuszyj3F9HCcS
BNijbTBrMA4GA1UdDwEB/wQEAwIBpjAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYB
BQUHAwEwDwYDVR0TAQH/BAUwAwEB/zApBgNVHQ4EIgQgKP262WZIDcasrdgPeL4F
cs1ehed8aJByB1p6HOUwmp8wCgYIKoZIzj0EAwIDSAAwRQIhAMl0+SAt/xlyqNiE
giZK01ho31vBVWvDt1VWsINca/ytAiAQ1qDK2Eb/pleni56Fw/6Ee1mBRR/Sh3H7
SNbe1oR5KA==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICQzCCAemgAwIBAgIQAT9ufXTKHsaf3FePfHQIazAKBggqhkjOPQQDAjBsMQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xGjAYBgNVBAMTEXRsc2NhLmV4
YW1wbGUuY29tMB4XDTIwMDIwNTA4MjIwMFoXDTMwMDIwMjA4MjIwMFowbDELMAkG
A1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFu
Y2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRowGAYDVQQDExF0bHNjYS5leGFt
cGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABNa1DY9sQJSm5qlKDDAP
ZHG2uVnYb4UIDonhssuRmfgl2h22Syx/WE703yMDxdaX4GYSs7pPuszyj3F9HCcS
BNijbTBrMA4GA1UdDwEB/wQEAwIBpjAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYB
BQUHAwEwDwYDVR0TAQH/BAUwAwEB/zApBgNVHQ4EIgQgKP262WZIDcasrdgPeL4F
cs1ehed8aJByB1p6HOUwmp8wCgYIKoZIzj0EAwIDSAAwRQIhAMl0+SAt/xlyqNiE
giZK01ho31vBVWvDt1VWsINca/ytAiAQ1qDK2Eb/pleni56Fw/6Ee1mBRR/Sh3H7
SNbe1oR5KA==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICLDCCAdKgAwIBAgIQC5wg86MVBWgymdroH0fkejAKBggqhkjOPQQDAjBsMQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xGjAYBgNVBAMTEXRsc2NhLmV4
YW1wbGUuY29tMB4XDTIwMDIwNTA4MjIwMFoXDTMwMDIwMjA4MjIwMFowVjELMAkG
A1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFu
Y2lzY28xGjAYBgNVBAMMEUFkbWluQGV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYI
KoZIzj0DAQcDQgAEaDKD8UDhIXFAbpnww/9ldXJR7o9kEAbzNjz65aDfrEtjVHC4
XXDncmotWp/oUcSXfVvvpRatoO0ei+hnw8n3AqNsMGowDgYDVR0PAQH/BAQDAgWg
MB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAMBgNVHRMBAf8EAjAAMCsG
A1UdIwQkMCKAICj9utlmSA3GrK3YD3i+BXLNXoXnfGiQcgdaehzlMJqfMAoGCCqG
SM49BAMCA0gAMEUCIQC4RbCEFQxDqqoFaIcbh1Joh4/BXCqDcJJlUllBgS7yQwIg
NluTysw022YaDuS4XbxXMUgwK2ohKUOVF+sm7gGrwu0=
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQggCEWkw5I1asCXzFd
Iwuyu/O3FUPqIJJIXJvUkT1ZfhOhRANCAARoMoPxQOEhcUBumfDD/2V1clHuj2QQ
BvM2PPrloN+sS2NUcLhdcOdyai1an+hRxJd9W++lFq2g7R6L6GfDyfcC
-----END PRIVATE KEY-----
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgG/AQkfqTe2+KMmEb
NZmlnNvjAytygYC7HPnErij3hcahRANCAAQBiTzuikO/cXWcMU8jO/B1N6M0DKzm
6yz2qzcL0FWbNK90IunBK/EnkWBUExBTJPl5aGDJw7V0mRYvJxwD16ZY
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIICUTCCAfegAwIBAgIQRjOCgYVRiKNLAKMZ7gH6iTAKBggqhkjOPQQDAjBzMQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eu
b3JnMS5leGFtcGxlLmNvbTAeFw0yMDAyMDUwODIyMDBaFw0zMDAyMDIwODIyMDBa
MHMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1T
YW4gRnJhbmNpc2NvMRkwFwYDVQQKExBvcmcxLmV4YW1wbGUuY29tMRwwGgYDVQQD
ExNjYS5vcmcxLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE
AYk87opDv3F1nDFPIzvwdTejNAys5uss9qs3C9BVmzSvdCLpwSvxJ5FgVBMQUyT5
eWhgycO1dJkWLyccA9emWKNtMGswDgYDVR0PAQH/BAQDAgGmMB0GA1UdJQQWMBQG
CCsGAQUFBwMCBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1UdDgQiBCCD
2RLxnfds2FQ0CARP+j58qmhujdp0rV/JaAx4O6RQhjAKBggqhkjOPQQDAgNIADBF
AiEArPP2HJ+fpJ5/B6kpA30zsYsFaxqqC5yGS1hcNUSwGkgCIAvOFv7CUXTrd0qn
FtMeiClbcFbF2skGXXmw+/LhvTS9
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICUTCCAfegAwIBAgIQRjOCgYVRiKNLAKMZ7gH6iTAKBggqhkjOPQQDAjBzMQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eu
b3JnMS5leGFtcGxlLmNvbTAeFw0yMDAyMDUwODIyMDBaFw0zMDAyMDIwODIyMDBa
MHMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1T
YW4gRnJhbmNpc2NvMRkwFwYDVQQKExBvcmcxLmV4YW1wbGUuY29tMRwwGgYDVQQD
ExNjYS5vcmcxLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE
AYk87opDv3F1nDFPIzvwdTejNAys5uss9qs3C9BVmzSvdCLpwSvxJ5FgVBMQUyT5
eWhgycO1dJkWLyccA9emWKNtMGswDgYDVR0PAQH/BAQDAgGmMB0GA1UdJQQWMBQG
CCsGAQUFBwMCBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1UdDgQiBCCD
2RLxnfds2FQ0CARP+j58qmhujdp0rV/JaAx4O6RQhjAKBggqhkjOPQQDAgNIADBF
AiEArPP2HJ+fpJ5/B6kpA30zsYsFaxqqC5yGS1hcNUSwGkgCIAvOFv7CUXTrd0qn
FtMeiClbcFbF2skGXXmw+/LhvTS9
-----END CERTIFICATE-----
NodeOUs:
Enable: true
ClientOUIdentifier:
Certificate: cacerts/ca.org1.example.com-cert.pem
OrganizationalUnitIdentifier: client
PeerOUIdentifier:
Certificate: cacerts/ca.org1.example.com-cert.pem
OrganizationalUnitIdentifier: peer
AdminOUIdentifier:
Certificate: cacerts/ca.org1.example.com-cert.pem
OrganizationalUnitIdentifier: admin
OrdererOUIdentifier:
Certificate: cacerts/ca.org1.example.com-cert.pem
OrganizationalUnitIdentifier: orderer
-----BEGIN CERTIFICATE-----
MIICVzCCAf2gAwIBAgIQf3G6fCLqBl6of6Mne0kgrjAKBggqhkjOPQQDAjB2MQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEfMB0GA1UEAxMWdGxz
Y2Eub3JnMS5leGFtcGxlLmNvbTAeFw0yMDAyMDUwODIyMDBaFw0zMDAyMDIwODIy
MDBaMHYxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH
Ew1TYW4gRnJhbmNpc2NvMRkwFwYDVQQKExBvcmcxLmV4YW1wbGUuY29tMR8wHQYD
VQQDExZ0bHNjYS5vcmcxLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0D
AQcDQgAEnOg10EXRyXMIdXulFZ8A/C74TP93sPlv6VGeuJL45BE0KDfduZTlAFSq
i8JzyWuYoeyMmXNgn4MVKf8dUNrGCKNtMGswDgYDVR0PAQH/BAQDAgGmMB0GA1Ud
JQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1Ud
DgQiBCB5+011QxrNtHNxk53Hlc0+6dJwUYB9zjTCSnBlSRRuCTAKBggqhkjOPQQD
AgNIADBFAiEA0iXoxQ2QYwB58E/OlH67EXixxy+y8MWn3nHqQxcFbj8CIDiuiBYn
6BPE4Vni3TtITEUoKr1Zk9FEArFqd4jZckyY
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICUTCCAfegAwIBAgIQRjOCgYVRiKNLAKMZ7gH6iTAKBggqhkjOPQQDAjBzMQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eu
b3JnMS5leGFtcGxlLmNvbTAeFw0yMDAyMDUwODIyMDBaFw0zMDAyMDIwODIyMDBa
MHMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1T
YW4gRnJhbmNpc2NvMRkwFwYDVQQKExBvcmcxLmV4YW1wbGUuY29tMRwwGgYDVQQD
ExNjYS5vcmcxLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE
AYk87opDv3F1nDFPIzvwdTejNAys5uss9qs3C9BVmzSvdCLpwSvxJ5FgVBMQUyT5
eWhgycO1dJkWLyccA9emWKNtMGswDgYDVR0PAQH/BAQDAgGmMB0GA1UdJQQWMBQG
CCsGAQUFBwMCBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1UdDgQiBCCD
2RLxnfds2FQ0CARP+j58qmhujdp0rV/JaAx4O6RQhjAKBggqhkjOPQQDAgNIADBF
AiEArPP2HJ+fpJ5/B6kpA30zsYsFaxqqC5yGS1hcNUSwGkgCIAvOFv7CUXTrd0qn
FtMeiClbcFbF2skGXXmw+/LhvTS9
-----END CERTIFICATE-----
NodeOUs:
Enable: true
ClientOUIdentifier:
Certificate: cacerts/ca.org1.example.com-cert.pem
OrganizationalUnitIdentifier: client
PeerOUIdentifier:
Certificate: cacerts/ca.org1.example.com-cert.pem
OrganizationalUnitIdentifier: peer
AdminOUIdentifier:
Certificate: cacerts/ca.org1.example.com-cert.pem
OrganizationalUnitIdentifier: admin
OrdererOUIdentifier:
Certificate: cacerts/ca.org1.example.com-cert.pem
OrganizationalUnitIdentifier: orderer
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgMjkLHVeBts1D3T5I
UfeM46sTzOpAKHi8NqSM3C5/X/KhRANCAASvo3edsEkEyHyb7GPKjffOv5vqz4Va
Jhlfq6LFAY/gSIfsmU0FxzD/r6HxoGgHhs9KPcPxbPxlN68MG1tX5GRn
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIICKDCCAc+gAwIBAgIRAJ4R1Ju0n0iz4rIV3XK5XLUwCgYIKoZIzj0EAwIwczEL
MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
cmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh
Lm9yZzEuZXhhbXBsZS5jb20wHhcNMjAwMjA1MDgyMjAwWhcNMzAwMjAyMDgyMjAw
WjBqMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN
U2FuIEZyYW5jaXNjbzENMAsGA1UECxMEcGVlcjEfMB0GA1UEAxMWcGVlcjAub3Jn
MS5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABK+jd52wSQTI
fJvsY8qN986/m+rPhVomGV+rosUBj+BIh+yZTQXHMP+vofGgaAeGz0o9w/Fs/GU3
rwwbW1fkZGejTTBLMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMCsGA1Ud
IwQkMCKAIIPZEvGd92zYVDQIBE/6PnyqaG6N2nStX8loDHg7pFCGMAoGCCqGSM49
BAMCA0cAMEQCIDHMldq/wwfjlCw8ga3Yt/mFL9XEDdD0BQrue81RTujdAiAYfN2X
uf1yDkIctecNf84JBjGgQ7N+UYBN0wPHTQ1zjA==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICVzCCAf2gAwIBAgIQf3G6fCLqBl6of6Mne0kgrjAKBggqhkjOPQQDAjB2MQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEfMB0GA1UEAxMWdGxz
Y2Eub3JnMS5leGFtcGxlLmNvbTAeFw0yMDAyMDUwODIyMDBaFw0zMDAyMDIwODIy
MDBaMHYxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH
Ew1TYW4gRnJhbmNpc2NvMRkwFwYDVQQKExBvcmcxLmV4YW1wbGUuY29tMR8wHQYD
VQQDExZ0bHNjYS5vcmcxLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0D
AQcDQgAEnOg10EXRyXMIdXulFZ8A/C74TP93sPlv6VGeuJL45BE0KDfduZTlAFSq
i8JzyWuYoeyMmXNgn4MVKf8dUNrGCKNtMGswDgYDVR0PAQH/BAQDAgGmMB0GA1Ud
JQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1Ud
DgQiBCB5+011QxrNtHNxk53Hlc0+6dJwUYB9zjTCSnBlSRRuCTAKBggqhkjOPQQD
AgNIADBFAiEA0iXoxQ2QYwB58E/OlH67EXixxy+y8MWn3nHqQxcFbj8CIDiuiBYn
6BPE4Vni3TtITEUoKr1Zk9FEArFqd4jZckyY
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICVzCCAf2gAwIBAgIQf3G6fCLqBl6of6Mne0kgrjAKBggqhkjOPQQDAjB2MQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEfMB0GA1UEAxMWdGxz
Y2Eub3JnMS5leGFtcGxlLmNvbTAeFw0yMDAyMDUwODIyMDBaFw0zMDAyMDIwODIy
MDBaMHYxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH
Ew1TYW4gRnJhbmNpc2NvMRkwFwYDVQQKExBvcmcxLmV4YW1wbGUuY29tMR8wHQYD
VQQDExZ0bHNjYS5vcmcxLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0D
AQcDQgAEnOg10EXRyXMIdXulFZ8A/C74TP93sPlv6VGeuJL45BE0KDfduZTlAFSq
i8JzyWuYoeyMmXNgn4MVKf8dUNrGCKNtMGswDgYDVR0PAQH/BAQDAgGmMB0GA1Ud
JQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1Ud
DgQiBCB5+011QxrNtHNxk53Hlc0+6dJwUYB9zjTCSnBlSRRuCTAKBggqhkjOPQQD
AgNIADBFAiEA0iXoxQ2QYwB58E/OlH67EXixxy+y8MWn3nHqQxcFbj8CIDiuiBYn
6BPE4Vni3TtITEUoKr1Zk9FEArFqd4jZckyY
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICaDCCAg6gAwIBAgIRANFR6GjyJXWDsl5RmWLuh5IwCgYIKoZIzj0EAwIwdjEL
MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
cmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHzAdBgNVBAMTFnRs
c2NhLm9yZzEuZXhhbXBsZS5jb20wHhcNMjAwMjA1MDgyMjAwWhcNMzAwMjAyMDgy
MjAwWjBbMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE
BxMNU2FuIEZyYW5jaXNjbzEfMB0GA1UEAxMWcGVlcjAub3JnMS5leGFtcGxlLmNv
bTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABMUmepXFM0nEYGwI8ICcSkZiEDLW
XmErBfwIW8XHCcRgocIxBb+dPJykDStj+AG1JX1acI7oiPo/iKb3hwzsNm2jgZcw
gZQwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcD
AjAMBgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIHn7TXVDGs20c3GTnceVzT7p0nBR
gH3ONMJKcGVJFG4JMCgGA1UdEQQhMB+CFnBlZXIwLm9yZzEuZXhhbXBsZS5jb22C
BXBlZXIwMAoGCCqGSM49BAMCA0gAMEUCIQDj3DwWr+JUOrhZ7BUhkEyu/o3jwmJR
sPBS96TQ/vHOkgIgIpz1/2GypCGyG1I6xpkrh/S2Q1AaDf156XsOmAufINM=
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgMymOddcBf2vMMoug
xKX5bfqY/+U0ys2EvEjXalmv3duhRANCAATFJnqVxTNJxGBsCPCAnEpGYhAy1l5h
KwX8CFvFxwnEYKHCMQW/nTycpA0rY/gBtSV9WnCO6Ij6P4im94cM7DZt
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIICUTCCAfegAwIBAgIQRjOCgYVRiKNLAKMZ7gH6iTAKBggqhkjOPQQDAjBzMQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eu
b3JnMS5leGFtcGxlLmNvbTAeFw0yMDAyMDUwODIyMDBaFw0zMDAyMDIwODIyMDBa
MHMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1T
YW4gRnJhbmNpc2NvMRkwFwYDVQQKExBvcmcxLmV4YW1wbGUuY29tMRwwGgYDVQQD
ExNjYS5vcmcxLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE
AYk87opDv3F1nDFPIzvwdTejNAys5uss9qs3C9BVmzSvdCLpwSvxJ5FgVBMQUyT5
eWhgycO1dJkWLyccA9emWKNtMGswDgYDVR0PAQH/BAQDAgGmMB0GA1UdJQQWMBQG
CCsGAQUFBwMCBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1UdDgQiBCCD
2RLxnfds2FQ0CARP+j58qmhujdp0rV/JaAx4O6RQhjAKBggqhkjOPQQDAgNIADBF
AiEArPP2HJ+fpJ5/B6kpA30zsYsFaxqqC5yGS1hcNUSwGkgCIAvOFv7CUXTrd0qn
FtMeiClbcFbF2skGXXmw+/LhvTS9
-----END CERTIFICATE-----
NodeOUs:
Enable: true
ClientOUIdentifier:
Certificate: cacerts/ca.org1.example.com-cert.pem
OrganizationalUnitIdentifier: client
PeerOUIdentifier:
Certificate: cacerts/ca.org1.example.com-cert.pem
OrganizationalUnitIdentifier: peer
AdminOUIdentifier:
Certificate: cacerts/ca.org1.example.com-cert.pem
OrganizationalUnitIdentifier: admin
OrdererOUIdentifier:
Certificate: cacerts/ca.org1.example.com-cert.pem
OrganizationalUnitIdentifier: orderer
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgWT8qi1JQd1jLQfYp
QVtNWDmkPAqg0ING3Fb3k4LyiGyhRANCAATnS8fHbMxPPBMYCZKayfT3HHFfwr1r
GdY5PFXV/K+ZdhX0f6N4KmYu8RvXQvM//k8AgOS/EVVX7Bjyn7u6pGB4
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIICKTCCAc+gAwIBAgIRAMW+IXb5p49eQQmbtoUX6EwwCgYIKoZIzj0EAwIwczEL
MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
cmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh
Lm9yZzEuZXhhbXBsZS5jb20wHhcNMjAwMjA1MDgyMjAwWhcNMzAwMjAyMDgyMjAw
WjBqMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN
U2FuIEZyYW5jaXNjbzENMAsGA1UECxMEcGVlcjEfMB0GA1UEAxMWcGVlcjEub3Jn
MS5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABOdLx8dszE88
ExgJkprJ9PcccV/CvWsZ1jk8VdX8r5l2FfR/o3gqZi7xG9dC8z/+TwCA5L8RVVfs
GPKfu7qkYHijTTBLMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMCsGA1Ud
IwQkMCKAIIPZEvGd92zYVDQIBE/6PnyqaG6N2nStX8loDHg7pFCGMAoGCCqGSM49
BAMCA0gAMEUCIQDuvzXZURMzVSrgSThfWiyUW0azup2YiHN2RGrogUW9mwIgFmO7
dYEeCMiVRo3nCzUmATqADJnrmt/90e1eoWtEFMg=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICVzCCAf2gAwIBAgIQf3G6fCLqBl6of6Mne0kgrjAKBggqhkjOPQQDAjB2MQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEfMB0GA1UEAxMWdGxz
Y2Eub3JnMS5leGFtcGxlLmNvbTAeFw0yMDAyMDUwODIyMDBaFw0zMDAyMDIwODIy
MDBaMHYxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH
Ew1TYW4gRnJhbmNpc2NvMRkwFwYDVQQKExBvcmcxLmV4YW1wbGUuY29tMR8wHQYD
VQQDExZ0bHNjYS5vcmcxLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0D
AQcDQgAEnOg10EXRyXMIdXulFZ8A/C74TP93sPlv6VGeuJL45BE0KDfduZTlAFSq
i8JzyWuYoeyMmXNgn4MVKf8dUNrGCKNtMGswDgYDVR0PAQH/BAQDAgGmMB0GA1Ud
JQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1Ud
DgQiBCB5+011QxrNtHNxk53Hlc0+6dJwUYB9zjTCSnBlSRRuCTAKBggqhkjOPQQD
AgNIADBFAiEA0iXoxQ2QYwB58E/OlH67EXixxy+y8MWn3nHqQxcFbj8CIDiuiBYn
6BPE4Vni3TtITEUoKr1Zk9FEArFqd4jZckyY
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICVzCCAf2gAwIBAgIQf3G6fCLqBl6of6Mne0kgrjAKBggqhkjOPQQDAjB2MQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEfMB0GA1UEAxMWdGxz
Y2Eub3JnMS5leGFtcGxlLmNvbTAeFw0yMDAyMDUwODIyMDBaFw0zMDAyMDIwODIy
MDBaMHYxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH
Ew1TYW4gRnJhbmNpc2NvMRkwFwYDVQQKExBvcmcxLmV4YW1wbGUuY29tMR8wHQYD
VQQDExZ0bHNjYS5vcmcxLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0D
AQcDQgAEnOg10EXRyXMIdXulFZ8A/C74TP93sPlv6VGeuJL45BE0KDfduZTlAFSq
i8JzyWuYoeyMmXNgn4MVKf8dUNrGCKNtMGswDgYDVR0PAQH/BAQDAgGmMB0GA1Ud
JQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1Ud
DgQiBCB5+011QxrNtHNxk53Hlc0+6dJwUYB9zjTCSnBlSRRuCTAKBggqhkjOPQQD
AgNIADBFAiEA0iXoxQ2QYwB58E/OlH67EXixxy+y8MWn3nHqQxcFbj8CIDiuiBYn
6BPE4Vni3TtITEUoKr1Zk9FEArFqd4jZckyY
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICZjCCAg2gAwIBAgIQGFgmRt4DN6grN2OXNO6oPTAKBggqhkjOPQQDAjB2MQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEfMB0GA1UEAxMWdGxz
Y2Eub3JnMS5leGFtcGxlLmNvbTAeFw0yMDAyMDUwODIyMDBaFw0zMDAyMDIwODIy
MDBaMFsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH
Ew1TYW4gRnJhbmNpc2NvMR8wHQYDVQQDExZwZWVyMS5vcmcxLmV4YW1wbGUuY29t
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE0ytL5OaGxKafXfjOX2llvAY6I1Wr
0YRN6BV1ia0G1wImHtGDvEEfDAl/ux3rVOSro7Uu7qKkpjdx9Py/8GVmhKOBlzCB
lDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMC
MAwGA1UdEwEB/wQCMAAwKwYDVR0jBCQwIoAgeftNdUMazbRzcZOdx5XNPunScFGA
fc40wkpwZUkUbgkwKAYDVR0RBCEwH4IWcGVlcjEub3JnMS5leGFtcGxlLmNvbYIF
cGVlcjEwCgYIKoZIzj0EAwIDRwAwRAIgaykbKQWKt+MSUMzpCPL/m4LuG6zThMps
apkIOirkRX8CIH4qRG93sSgGVTLYdWa9C8+KXgPYezobMiSlQyL9TzS1
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg0OvNlLnc0IHrtjvw
tFd6pTRtN4JQmZNL8rigbhZ1V6ihRANCAATTK0vk5obEpp9d+M5faWW8BjojVavR
hE3oFXWJrQbXAiYe0YO8QR8MCX+7HetU5KujtS7uoqSmN3H0/L/wZWaE
-----END PRIVATE KEY-----
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgq04MDfGo8RbYFHGt
GW2FsHmmYJ97QDCF3K2BI/2xnNuhRANCAASc6DXQRdHJcwh1e6UVnwD8LvhM/3ew
+W/pUZ64kvjkETQoN925lOUAVKqLwnPJa5ih7IyZc2CfgxUp/x1Q2sYI
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIICVzCCAf2gAwIBAgIQf3G6fCLqBl6of6Mne0kgrjAKBggqhkjOPQQDAjB2MQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEfMB0GA1UEAxMWdGxz
Y2Eub3JnMS5leGFtcGxlLmNvbTAeFw0yMDAyMDUwODIyMDBaFw0zMDAyMDIwODIy
MDBaMHYxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH
Ew1TYW4gRnJhbmNpc2NvMRkwFwYDVQQKExBvcmcxLmV4YW1wbGUuY29tMR8wHQYD
VQQDExZ0bHNjYS5vcmcxLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0D
AQcDQgAEnOg10EXRyXMIdXulFZ8A/C74TP93sPlv6VGeuJL45BE0KDfduZTlAFSq
i8JzyWuYoeyMmXNgn4MVKf8dUNrGCKNtMGswDgYDVR0PAQH/BAQDAgGmMB0GA1Ud
JQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1Ud
DgQiBCB5+011QxrNtHNxk53Hlc0+6dJwUYB9zjTCSnBlSRRuCTAKBggqhkjOPQQD
AgNIADBFAiEA0iXoxQ2QYwB58E/OlH67EXixxy+y8MWn3nHqQxcFbj8CIDiuiBYn
6BPE4Vni3TtITEUoKr1Zk9FEArFqd4jZckyY
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICUTCCAfegAwIBAgIQRjOCgYVRiKNLAKMZ7gH6iTAKBggqhkjOPQQDAjBzMQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eu
b3JnMS5leGFtcGxlLmNvbTAeFw0yMDAyMDUwODIyMDBaFw0zMDAyMDIwODIyMDBa
MHMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1T
YW4gRnJhbmNpc2NvMRkwFwYDVQQKExBvcmcxLmV4YW1wbGUuY29tMRwwGgYDVQQD
ExNjYS5vcmcxLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE
AYk87opDv3F1nDFPIzvwdTejNAys5uss9qs3C9BVmzSvdCLpwSvxJ5FgVBMQUyT5
eWhgycO1dJkWLyccA9emWKNtMGswDgYDVR0PAQH/BAQDAgGmMB0GA1UdJQQWMBQG
CCsGAQUFBwMCBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1UdDgQiBCCD
2RLxnfds2FQ0CARP+j58qmhujdp0rV/JaAx4O6RQhjAKBggqhkjOPQQDAgNIADBF
AiEArPP2HJ+fpJ5/B6kpA30zsYsFaxqqC5yGS1hcNUSwGkgCIAvOFv7CUXTrd0qn
FtMeiClbcFbF2skGXXmw+/LhvTS9
-----END CERTIFICATE-----
NodeOUs:
Enable: true
ClientOUIdentifier:
Certificate: cacerts/ca.org1.example.com-cert.pem
OrganizationalUnitIdentifier: client
PeerOUIdentifier:
Certificate: cacerts/ca.org1.example.com-cert.pem
OrganizationalUnitIdentifier: peer
AdminOUIdentifier:
Certificate: cacerts/ca.org1.example.com-cert.pem
OrganizationalUnitIdentifier: admin
OrdererOUIdentifier:
Certificate: cacerts/ca.org1.example.com-cert.pem
OrganizationalUnitIdentifier: orderer
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg+IupIfExzx2gRK4i
1Lvk5NlAiq/s3cDP4Zizi49GLBOhRANCAARdBYYS7N/ci1Qg7CSrMdptXr3rwywq
8Xwr/ZEnwoQfMxJd6IytlVahYwzjjeZlI9k+JvlDonNN6r9zo8tgYepm
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIICKjCCAdCgAwIBAgIRAL8A9rTllX4WUMGFzzbPbyIwCgYIKoZIzj0EAwIwczEL
MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
cmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh
Lm9yZzEuZXhhbXBsZS5jb20wHhcNMjAwMjA1MDgyMjAwWhcNMzAwMjAyMDgyMjAw
WjBrMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN
U2FuIEZyYW5jaXNjbzEOMAwGA1UECxMFYWRtaW4xHzAdBgNVBAMMFkFkbWluQG9y
ZzEuZXhhbXBsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARdBYYS7N/c
i1Qg7CSrMdptXr3rwywq8Xwr/ZEnwoQfMxJd6IytlVahYwzjjeZlI9k+JvlDonNN
6r9zo8tgYepmo00wSzAOBgNVHQ8BAf8EBAMCB4AwDAYDVR0TAQH/BAIwADArBgNV
HSMEJDAigCCD2RLxnfds2FQ0CARP+j58qmhujdp0rV/JaAx4O6RQhjAKBggqhkjO
PQQDAgNIADBFAiEA4ZPhjDQNlrrXxXX/ZkLhlvIr2UALxnHrZvgf2LIrsRkCIHoG
EV6tVOyfsHlchvsKA1hA+zmFusZyVSD6Mb+F2WXy
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICVzCCAf2gAwIBAgIQf3G6fCLqBl6of6Mne0kgrjAKBggqhkjOPQQDAjB2MQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEfMB0GA1UEAxMWdGxz
Y2Eub3JnMS5leGFtcGxlLmNvbTAeFw0yMDAyMDUwODIyMDBaFw0zMDAyMDIwODIy
MDBaMHYxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH
Ew1TYW4gRnJhbmNpc2NvMRkwFwYDVQQKExBvcmcxLmV4YW1wbGUuY29tMR8wHQYD
VQQDExZ0bHNjYS5vcmcxLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0D
AQcDQgAEnOg10EXRyXMIdXulFZ8A/C74TP93sPlv6VGeuJL45BE0KDfduZTlAFSq
i8JzyWuYoeyMmXNgn4MVKf8dUNrGCKNtMGswDgYDVR0PAQH/BAQDAgGmMB0GA1Ud
JQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1Ud
DgQiBCB5+011QxrNtHNxk53Hlc0+6dJwUYB9zjTCSnBlSRRuCTAKBggqhkjOPQQD
AgNIADBFAiEA0iXoxQ2QYwB58E/OlH67EXixxy+y8MWn3nHqQxcFbj8CIDiuiBYn
6BPE4Vni3TtITEUoKr1Zk9FEArFqd4jZckyY
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICVzCCAf2gAwIBAgIQf3G6fCLqBl6of6Mne0kgrjAKBggqhkjOPQQDAjB2MQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEfMB0GA1UEAxMWdGxz
Y2Eub3JnMS5leGFtcGxlLmNvbTAeFw0yMDAyMDUwODIyMDBaFw0zMDAyMDIwODIy
MDBaMHYxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH
Ew1TYW4gRnJhbmNpc2NvMRkwFwYDVQQKExBvcmcxLmV4YW1wbGUuY29tMR8wHQYD
VQQDExZ0bHNjYS5vcmcxLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0D
AQcDQgAEnOg10EXRyXMIdXulFZ8A/C74TP93sPlv6VGeuJL45BE0KDfduZTlAFSq
i8JzyWuYoeyMmXNgn4MVKf8dUNrGCKNtMGswDgYDVR0PAQH/BAQDAgGmMB0GA1Ud
JQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1Ud
DgQiBCB5+011QxrNtHNxk53Hlc0+6dJwUYB9zjTCSnBlSRRuCTAKBggqhkjOPQQD
AgNIADBFAiEA0iXoxQ2QYwB58E/OlH67EXixxy+y8MWn3nHqQxcFbj8CIDiuiBYn
6BPE4Vni3TtITEUoKr1Zk9FEArFqd4jZckyY
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICOzCCAeKgAwIBAgIRAPQJzxNxfVGui8ThRIe/0CcwCgYIKoZIzj0EAwIwdjEL
MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
cmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHzAdBgNVBAMTFnRs
c2NhLm9yZzEuZXhhbXBsZS5jb20wHhcNMjAwMjA1MDgyMjAwWhcNMzAwMjAyMDgy
MjAwWjBbMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE
BxMNU2FuIEZyYW5jaXNjbzEfMB0GA1UEAwwWQWRtaW5Ab3JnMS5leGFtcGxlLmNv
bTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABNbU/o6MpRAZP/Wo1WzK/MmL7Ysu
y1zCipHQlGh4wQ/ve67FunkWCfn+cPXgX6C/YGIvAHF6HxFjeuzINyCfl3mjbDBq
MA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw
DAYDVR0TAQH/BAIwADArBgNVHSMEJDAigCB5+011QxrNtHNxk53Hlc0+6dJwUYB9
zjTCSnBlSRRuCTAKBggqhkjOPQQDAgNHADBEAiBc76+4Jisa35bqQhdulJ8cvkiV
A69yOKKtf/B/ttrGMAIgNbdoVe01YpuSebJLLcdhI4Cq39GMgQkCt3mYf1uofGU=
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg/V7FD51itaLiZlF0
2ScsRrLRqR+L+KVNDF9uwIVe48GhRANCAATW1P6OjKUQGT/1qNVsyvzJi+2LLstc
woqR0JRoeMEP73uuxbp5Fgn5/nD14F+gv2BiLwBxeh8RY3rsyDcgn5d5
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIICUTCCAfegAwIBAgIQRjOCgYVRiKNLAKMZ7gH6iTAKBggqhkjOPQQDAjBzMQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eu
b3JnMS5leGFtcGxlLmNvbTAeFw0yMDAyMDUwODIyMDBaFw0zMDAyMDIwODIyMDBa
MHMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1T
YW4gRnJhbmNpc2NvMRkwFwYDVQQKExBvcmcxLmV4YW1wbGUuY29tMRwwGgYDVQQD
ExNjYS5vcmcxLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE
AYk87opDv3F1nDFPIzvwdTejNAys5uss9qs3C9BVmzSvdCLpwSvxJ5FgVBMQUyT5
eWhgycO1dJkWLyccA9emWKNtMGswDgYDVR0PAQH/BAQDAgGmMB0GA1UdJQQWMBQG
CCsGAQUFBwMCBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1UdDgQiBCCD
2RLxnfds2FQ0CARP+j58qmhujdp0rV/JaAx4O6RQhjAKBggqhkjOPQQDAgNIADBF
AiEArPP2HJ+fpJ5/B6kpA30zsYsFaxqqC5yGS1hcNUSwGkgCIAvOFv7CUXTrd0qn
FtMeiClbcFbF2skGXXmw+/LhvTS9
-----END CERTIFICATE-----
NodeOUs:
Enable: true
ClientOUIdentifier:
Certificate: cacerts/ca.org1.example.com-cert.pem
OrganizationalUnitIdentifier: client
PeerOUIdentifier:
Certificate: cacerts/ca.org1.example.com-cert.pem
OrganizationalUnitIdentifier: peer
AdminOUIdentifier:
Certificate: cacerts/ca.org1.example.com-cert.pem
OrganizationalUnitIdentifier: admin
OrdererOUIdentifier:
Certificate: cacerts/ca.org1.example.com-cert.pem
OrganizationalUnitIdentifier: orderer
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgC29Hez3b9lPi+8y1
ChRd9MNYCYsiyOz0yFeGv0W2B2mhRANCAASqQf74se0gmlfdfSWMPJ8X0Rh0N9Am
nMKHxz1AmGXKykLUBrIreskaRMj5j/oYasEsGS5Luso+xjE+shR9TXrg
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIICKjCCAdCgAwIBAgIQKs4twlfnVVeFKzaoo7e2xjAKBggqhkjOPQQDAjBzMQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eu
b3JnMS5leGFtcGxlLmNvbTAeFw0yMDAyMDUwODIyMDBaFw0zMDAyMDIwODIyMDBa
MGwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1T
YW4gRnJhbmNpc2NvMQ8wDQYDVQQLEwZjbGllbnQxHzAdBgNVBAMMFlVzZXIxQG9y
ZzEuZXhhbXBsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASqQf74se0g
mlfdfSWMPJ8X0Rh0N9AmnMKHxz1AmGXKykLUBrIreskaRMj5j/oYasEsGS5Luso+
xjE+shR9TXrgo00wSzAOBgNVHQ8BAf8EBAMCB4AwDAYDVR0TAQH/BAIwADArBgNV
HSMEJDAigCCD2RLxnfds2FQ0CARP+j58qmhujdp0rV/JaAx4O6RQhjAKBggqhkjO
PQQDAgNIADBFAiEA5lFv60oXmpaPAVbSgQti66Y4QB8Vvraeek6jTPTiIKcCIFSN
uVcPrp2J960hemZxI9V4GWR+ceD8fyJFYFSsdiqU
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICVzCCAf2gAwIBAgIQf3G6fCLqBl6of6Mne0kgrjAKBggqhkjOPQQDAjB2MQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEfMB0GA1UEAxMWdGxz
Y2Eub3JnMS5leGFtcGxlLmNvbTAeFw0yMDAyMDUwODIyMDBaFw0zMDAyMDIwODIy
MDBaMHYxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH
Ew1TYW4gRnJhbmNpc2NvMRkwFwYDVQQKExBvcmcxLmV4YW1wbGUuY29tMR8wHQYD
VQQDExZ0bHNjYS5vcmcxLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0D
AQcDQgAEnOg10EXRyXMIdXulFZ8A/C74TP93sPlv6VGeuJL45BE0KDfduZTlAFSq
i8JzyWuYoeyMmXNgn4MVKf8dUNrGCKNtMGswDgYDVR0PAQH/BAQDAgGmMB0GA1Ud
JQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1Ud
DgQiBCB5+011QxrNtHNxk53Hlc0+6dJwUYB9zjTCSnBlSRRuCTAKBggqhkjOPQQD
AgNIADBFAiEA0iXoxQ2QYwB58E/OlH67EXixxy+y8MWn3nHqQxcFbj8CIDiuiBYn
6BPE4Vni3TtITEUoKr1Zk9FEArFqd4jZckyY
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICVzCCAf2gAwIBAgIQf3G6fCLqBl6of6Mne0kgrjAKBggqhkjOPQQDAjB2MQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEfMB0GA1UEAxMWdGxz
Y2Eub3JnMS5leGFtcGxlLmNvbTAeFw0yMDAyMDUwODIyMDBaFw0zMDAyMDIwODIy
MDBaMHYxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH
Ew1TYW4gRnJhbmNpc2NvMRkwFwYDVQQKExBvcmcxLmV4YW1wbGUuY29tMR8wHQYD
VQQDExZ0bHNjYS5vcmcxLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0D
AQcDQgAEnOg10EXRyXMIdXulFZ8A/C74TP93sPlv6VGeuJL45BE0KDfduZTlAFSq
i8JzyWuYoeyMmXNgn4MVKf8dUNrGCKNtMGswDgYDVR0PAQH/BAQDAgGmMB0GA1Ud
JQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1Ud
DgQiBCB5+011QxrNtHNxk53Hlc0+6dJwUYB9zjTCSnBlSRRuCTAKBggqhkjOPQQD
AgNIADBFAiEA0iXoxQ2QYwB58E/OlH67EXixxy+y8MWn3nHqQxcFbj8CIDiuiBYn
6BPE4Vni3TtITEUoKr1Zk9FEArFqd4jZckyY
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICOzCCAeGgAwIBAgIQYTKPPJVpCDFk3QE+80oIXTAKBggqhkjOPQQDAjB2MQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEfMB0GA1UEAxMWdGxz
Y2Eub3JnMS5leGFtcGxlLmNvbTAeFw0yMDAyMDUwODIyMDBaFw0zMDAyMDIwODIy
MDBaMFsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH
Ew1TYW4gRnJhbmNpc2NvMR8wHQYDVQQDDBZVc2VyMUBvcmcxLmV4YW1wbGUuY29t
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEVlFNTe0NAn32Ecbi+s5Rb/34xswS
0CMoN2zlAOh8c+yhQj3UAgmcpEF1BvAPlZivwEYlIpzwlW6vB0AvNBr3V6NsMGow
DgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAM
BgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIHn7TXVDGs20c3GTnceVzT7p0nBRgH3O
NMJKcGVJFG4JMAoGCCqGSM49BAMCA0gAMEUCIQDURPTU8Ilr00ZRnLQNm7JMfm1W
77J7gNV7dXpulIb3LwIgTvbYObADWIqHVEjfPqaZ1JrQrhuK2eLB9FTwdqhbObU=
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgJdeaBfaiSBte6hLc
L6pInECSjcBki87e5FEReDAAV16hRANCAARWUU1N7Q0CffYRxuL6zlFv/fjGzBLQ
Iyg3bOUA6Hxz7KFCPdQCCZykQXUG8A+VmK/ARiUinPCVbq8HQC80GvdX
-----END PRIVATE KEY-----
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgOIl23/7U+1/SLnuX
pHPxOgd8YdRFVo6+XBd+3koFqcyhRANCAATc9Hv2O/Et9d62qgvQFPcPMx2YZCa+
jp4stMrx7SoGnIOqbLa9Baf4GEUfvhNUh154ng68ZLoXu5AZYOf3BUHF
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIICUDCCAfegAwIBAgIQC1pZAjSfaiv0KlgBkVcF/DAKBggqhkjOPQQDAjBzMQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eu
b3JnMi5leGFtcGxlLmNvbTAeFw0yMDAyMDUwODIyMDBaFw0zMDAyMDIwODIyMDBa
MHMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1T
YW4gRnJhbmNpc2NvMRkwFwYDVQQKExBvcmcyLmV4YW1wbGUuY29tMRwwGgYDVQQD
ExNjYS5vcmcyLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE
3PR79jvxLfXetqoL0BT3DzMdmGQmvo6eLLTK8e0qBpyDqmy2vQWn+BhFH74TVIde
eJ4OvGS6F7uQGWDn9wVBxaNtMGswDgYDVR0PAQH/BAQDAgGmMB0GA1UdJQQWMBQG
CCsGAQUFBwMCBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1UdDgQiBCDF
S/nWiu5zBq9vwECF00jxZHXd1Ij1Q5FrZIebo52pRDAKBggqhkjOPQQDAgNHADBE
AiBg9ebmCyWjfw6SAE6Ke+Itp6o+TvmIOwdSrpY/D9uOgwIgBY0chdl3VfhmOizW
zw+3Rij9yNAoaRvE1OhP5uErO1g=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICUDCCAfegAwIBAgIQC1pZAjSfaiv0KlgBkVcF/DAKBggqhkjOPQQDAjBzMQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eu
b3JnMi5leGFtcGxlLmNvbTAeFw0yMDAyMDUwODIyMDBaFw0zMDAyMDIwODIyMDBa
MHMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1T
YW4gRnJhbmNpc2NvMRkwFwYDVQQKExBvcmcyLmV4YW1wbGUuY29tMRwwGgYDVQQD
ExNjYS5vcmcyLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE
3PR79jvxLfXetqoL0BT3DzMdmGQmvo6eLLTK8e0qBpyDqmy2vQWn+BhFH74TVIde
eJ4OvGS6F7uQGWDn9wVBxaNtMGswDgYDVR0PAQH/BAQDAgGmMB0GA1UdJQQWMBQG
CCsGAQUFBwMCBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1UdDgQiBCDF
S/nWiu5zBq9vwECF00jxZHXd1Ij1Q5FrZIebo52pRDAKBggqhkjOPQQDAgNHADBE
AiBg9ebmCyWjfw6SAE6Ke+Itp6o+TvmIOwdSrpY/D9uOgwIgBY0chdl3VfhmOizW
zw+3Rij9yNAoaRvE1OhP5uErO1g=
-----END CERTIFICATE-----
NodeOUs:
Enable: true
ClientOUIdentifier:
Certificate: cacerts/ca.org2.example.com-cert.pem
OrganizationalUnitIdentifier: client
PeerOUIdentifier:
Certificate: cacerts/ca.org2.example.com-cert.pem
OrganizationalUnitIdentifier: peer
AdminOUIdentifier:
Certificate: cacerts/ca.org2.example.com-cert.pem
OrganizationalUnitIdentifier: admin
OrdererOUIdentifier:
Certificate: cacerts/ca.org2.example.com-cert.pem
OrganizationalUnitIdentifier: orderer
-----BEGIN CERTIFICATE-----
MIICVzCCAf6gAwIBAgIRALeI2n3d7i8NYA0k5uYSudcwCgYIKoZIzj0EAwIwdjEL
MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
cmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHzAdBgNVBAMTFnRs
c2NhLm9yZzIuZXhhbXBsZS5jb20wHhcNMjAwMjA1MDgyMjAwWhcNMzAwMjAyMDgy
MjAwWjB2MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE
BxMNU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEfMB0G
A1UEAxMWdGxzY2Eub3JnMi5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49
AwEHA0IABAqomq221xDTSYx9u+X6QRdTvEbLUT0aUHf35tIEpxghbcYlCQJjNH7h
25ORrmZn+2d/drhzrgcgmHNw+uSjBiWjbTBrMA4GA1UdDwEB/wQEAwIBpjAdBgNV
HSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEwDwYDVR0TAQH/BAUwAwEB/zApBgNV
HQ4EIgQgVlPMVnzAIjgWLk+hbqH4mqiABZRJY6XqXnzGaxiPo5gwCgYIKoZIzj0E
AwIDRwAwRAIgGv1DhSuU8PNcopHgMIWbY6SMxPOVp7x5zGL6n7RHK58CIBtPepLU
EBf+fYV6i/JXaaolTvdLvlStkoTR6RuuGzV6
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICUDCCAfegAwIBAgIQC1pZAjSfaiv0KlgBkVcF/DAKBggqhkjOPQQDAjBzMQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eu
b3JnMi5leGFtcGxlLmNvbTAeFw0yMDAyMDUwODIyMDBaFw0zMDAyMDIwODIyMDBa
MHMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1T
YW4gRnJhbmNpc2NvMRkwFwYDVQQKExBvcmcyLmV4YW1wbGUuY29tMRwwGgYDVQQD
ExNjYS5vcmcyLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE
3PR79jvxLfXetqoL0BT3DzMdmGQmvo6eLLTK8e0qBpyDqmy2vQWn+BhFH74TVIde
eJ4OvGS6F7uQGWDn9wVBxaNtMGswDgYDVR0PAQH/BAQDAgGmMB0GA1UdJQQWMBQG
CCsGAQUFBwMCBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1UdDgQiBCDF
S/nWiu5zBq9vwECF00jxZHXd1Ij1Q5FrZIebo52pRDAKBggqhkjOPQQDAgNHADBE
AiBg9ebmCyWjfw6SAE6Ke+Itp6o+TvmIOwdSrpY/D9uOgwIgBY0chdl3VfhmOizW
zw+3Rij9yNAoaRvE1OhP5uErO1g=
-----END CERTIFICATE-----
NodeOUs:
Enable: true
ClientOUIdentifier:
Certificate: cacerts/ca.org2.example.com-cert.pem
OrganizationalUnitIdentifier: client
PeerOUIdentifier:
Certificate: cacerts/ca.org2.example.com-cert.pem
OrganizationalUnitIdentifier: peer
AdminOUIdentifier:
Certificate: cacerts/ca.org2.example.com-cert.pem
OrganizationalUnitIdentifier: admin
OrdererOUIdentifier:
Certificate: cacerts/ca.org2.example.com-cert.pem
OrganizationalUnitIdentifier: orderer
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQglublVISEZJmsZnM2
dzH652qdWoj2bKhAw+pXszFaNLKhRANCAARvrGe8azTJopGUTOtbIu2pSGihf3MU
oslvzirpYaRjZSU7XPuMAMhdPCwOJK/W9uvA5rYJe4euXs0IkyLenDb+
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIICKDCCAc6gAwIBAgIQNT557asINym62le6/A3urTAKBggqhkjOPQQDAjBzMQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eu
b3JnMi5leGFtcGxlLmNvbTAeFw0yMDAyMDUwODIyMDBaFw0zMDAyMDIwODIyMDBa
MGoxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1T
YW4gRnJhbmNpc2NvMQ0wCwYDVQQLEwRwZWVyMR8wHQYDVQQDExZwZWVyMC5vcmcy
LmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEb6xnvGs0yaKR
lEzrWyLtqUhooX9zFKLJb84q6WGkY2UlO1z7jADIXTwsDiSv1vbrwOa2CXuHrl7N
CJMi3pw2/qNNMEswDgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwKwYDVR0j
BCQwIoAgxUv51orucwavb8BAhdNI8WR13dSI9UORa2SHm6OdqUQwCgYIKoZIzj0E
AwIDSAAwRQIhANw8snmn7Ba5+apvtUzottQfwrK3lQA43a7U43VlsAXhAiAU4Xy7
PAWAF507iwrZ1Wxr6NE5QyyM0h5xq9jK8w/NDw==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICVzCCAf6gAwIBAgIRALeI2n3d7i8NYA0k5uYSudcwCgYIKoZIzj0EAwIwdjEL
MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
cmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHzAdBgNVBAMTFnRs
c2NhLm9yZzIuZXhhbXBsZS5jb20wHhcNMjAwMjA1MDgyMjAwWhcNMzAwMjAyMDgy
MjAwWjB2MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE
BxMNU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEfMB0G
A1UEAxMWdGxzY2Eub3JnMi5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49
AwEHA0IABAqomq221xDTSYx9u+X6QRdTvEbLUT0aUHf35tIEpxghbcYlCQJjNH7h
25ORrmZn+2d/drhzrgcgmHNw+uSjBiWjbTBrMA4GA1UdDwEB/wQEAwIBpjAdBgNV
HSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEwDwYDVR0TAQH/BAUwAwEB/zApBgNV
HQ4EIgQgVlPMVnzAIjgWLk+hbqH4mqiABZRJY6XqXnzGaxiPo5gwCgYIKoZIzj0E
AwIDRwAwRAIgGv1DhSuU8PNcopHgMIWbY6SMxPOVp7x5zGL6n7RHK58CIBtPepLU
EBf+fYV6i/JXaaolTvdLvlStkoTR6RuuGzV6
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICVzCCAf6gAwIBAgIRALeI2n3d7i8NYA0k5uYSudcwCgYIKoZIzj0EAwIwdjEL
MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
cmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHzAdBgNVBAMTFnRs
c2NhLm9yZzIuZXhhbXBsZS5jb20wHhcNMjAwMjA1MDgyMjAwWhcNMzAwMjAyMDgy
MjAwWjB2MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE
BxMNU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEfMB0G
A1UEAxMWdGxzY2Eub3JnMi5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49
AwEHA0IABAqomq221xDTSYx9u+X6QRdTvEbLUT0aUHf35tIEpxghbcYlCQJjNH7h
25ORrmZn+2d/drhzrgcgmHNw+uSjBiWjbTBrMA4GA1UdDwEB/wQEAwIBpjAdBgNV
HSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEwDwYDVR0TAQH/BAUwAwEB/zApBgNV
HQ4EIgQgVlPMVnzAIjgWLk+hbqH4mqiABZRJY6XqXnzGaxiPo5gwCgYIKoZIzj0E
AwIDRwAwRAIgGv1DhSuU8PNcopHgMIWbY6SMxPOVp7x5zGL6n7RHK58CIBtPepLU
EBf+fYV6i/JXaaolTvdLvlStkoTR6RuuGzV6
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICZzCCAg2gAwIBAgIQX17p51azUCi9RPVrsibGzzAKBggqhkjOPQQDAjB2MQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEfMB0GA1UEAxMWdGxz
Y2Eub3JnMi5leGFtcGxlLmNvbTAeFw0yMDAyMDUwODIyMDBaFw0zMDAyMDIwODIy
MDBaMFsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH
Ew1TYW4gRnJhbmNpc2NvMR8wHQYDVQQDExZwZWVyMC5vcmcyLmV4YW1wbGUuY29t
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE1X8MtzcmV3Ap31TB2ldcZEMlBbbH
fikYKa+NXtX+1w0PilWWDC2XH/Q1jg2eYULBKQhMVG0RbFFJV0bRmo/o4KOBlzCB
lDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMC
MAwGA1UdEwEB/wQCMAAwKwYDVR0jBCQwIoAgVlPMVnzAIjgWLk+hbqH4mqiABZRJ
Y6XqXnzGaxiPo5gwKAYDVR0RBCEwH4IWcGVlcjAub3JnMi5leGFtcGxlLmNvbYIF
cGVlcjAwCgYIKoZIzj0EAwIDSAAwRQIhAMNswGdkiL9u05PXwKrPBA4rPqzbFSpB
6FSNTw7jXokrAiBVkVUa479yGhVsly8RrzxzRdPxzAtvOA9zUDBYwbUY0g==
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgsZlcnrIzNcs1hUks
0yC0F3n0TFzePs/dn85vzqEoPEqhRANCAATVfwy3NyZXcCnfVMHaV1xkQyUFtsd+
KRgpr41e1f7XDQ+KVZYMLZcf9DWODZ5hQsEpCExUbRFsUUlXRtGaj+jg
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIICUDCCAfegAwIBAgIQC1pZAjSfaiv0KlgBkVcF/DAKBggqhkjOPQQDAjBzMQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eu
b3JnMi5leGFtcGxlLmNvbTAeFw0yMDAyMDUwODIyMDBaFw0zMDAyMDIwODIyMDBa
MHMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1T
YW4gRnJhbmNpc2NvMRkwFwYDVQQKExBvcmcyLmV4YW1wbGUuY29tMRwwGgYDVQQD
ExNjYS5vcmcyLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE
3PR79jvxLfXetqoL0BT3DzMdmGQmvo6eLLTK8e0qBpyDqmy2vQWn+BhFH74TVIde
eJ4OvGS6F7uQGWDn9wVBxaNtMGswDgYDVR0PAQH/BAQDAgGmMB0GA1UdJQQWMBQG
CCsGAQUFBwMCBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1UdDgQiBCDF
S/nWiu5zBq9vwECF00jxZHXd1Ij1Q5FrZIebo52pRDAKBggqhkjOPQQDAgNHADBE
AiBg9ebmCyWjfw6SAE6Ke+Itp6o+TvmIOwdSrpY/D9uOgwIgBY0chdl3VfhmOizW
zw+3Rij9yNAoaRvE1OhP5uErO1g=
-----END CERTIFICATE-----
NodeOUs:
Enable: true
ClientOUIdentifier:
Certificate: cacerts/ca.org2.example.com-cert.pem
OrganizationalUnitIdentifier: client
PeerOUIdentifier:
Certificate: cacerts/ca.org2.example.com-cert.pem
OrganizationalUnitIdentifier: peer
AdminOUIdentifier:
Certificate: cacerts/ca.org2.example.com-cert.pem
OrganizationalUnitIdentifier: admin
OrdererOUIdentifier:
Certificate: cacerts/ca.org2.example.com-cert.pem
OrganizationalUnitIdentifier: orderer
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgVP5SCbZkuibYca5o
zAQ1l31haxq90KIyvA1zCnzrAvChRANCAARt47MxT02xpnQGINgcZhzEwyn0EXjc
N6fbbTCtd9KheZUKOcywRvEmt74jgi57444OgPz/sip8L4rCP4xFRPE9
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIICKTCCAc+gAwIBAgIRAIBO31aZaSZoEYSy2AJuhJcwCgYIKoZIzj0EAwIwczEL
MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
cmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh
Lm9yZzIuZXhhbXBsZS5jb20wHhcNMjAwMjA1MDgyMjAwWhcNMzAwMjAyMDgyMjAw
WjBqMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN
U2FuIEZyYW5jaXNjbzENMAsGA1UECxMEcGVlcjEfMB0GA1UEAxMWcGVlcjEub3Jn
Mi5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABG3jszFPTbGm
dAYg2BxmHMTDKfQReNw3p9ttMK130qF5lQo5zLBG8Sa3viOCLnvjjg6A/P+yKnwv
isI/jEVE8T2jTTBLMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMCsGA1Ud
IwQkMCKAIMVL+daK7nMGr2/AQIXTSPFkdd3UiPVDkWtkh5ujnalEMAoGCCqGSM49
BAMCA0gAMEUCIQDMYOQiYeMiQZTxlRkj/3/jjYvwwdCcX5AWuFmraiHkugIgFkX/
6uiTSD0lz8P+wwlLf24cIABq2aZyi8q4gj0YfwA=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICVzCCAf6gAwIBAgIRALeI2n3d7i8NYA0k5uYSudcwCgYIKoZIzj0EAwIwdjEL
MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
cmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHzAdBgNVBAMTFnRs
c2NhLm9yZzIuZXhhbXBsZS5jb20wHhcNMjAwMjA1MDgyMjAwWhcNMzAwMjAyMDgy
MjAwWjB2MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE
BxMNU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEfMB0G
A1UEAxMWdGxzY2Eub3JnMi5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49
AwEHA0IABAqomq221xDTSYx9u+X6QRdTvEbLUT0aUHf35tIEpxghbcYlCQJjNH7h
25ORrmZn+2d/drhzrgcgmHNw+uSjBiWjbTBrMA4GA1UdDwEB/wQEAwIBpjAdBgNV
HSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEwDwYDVR0TAQH/BAUwAwEB/zApBgNV
HQ4EIgQgVlPMVnzAIjgWLk+hbqH4mqiABZRJY6XqXnzGaxiPo5gwCgYIKoZIzj0E
AwIDRwAwRAIgGv1DhSuU8PNcopHgMIWbY6SMxPOVp7x5zGL6n7RHK58CIBtPepLU
EBf+fYV6i/JXaaolTvdLvlStkoTR6RuuGzV6
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICVzCCAf6gAwIBAgIRALeI2n3d7i8NYA0k5uYSudcwCgYIKoZIzj0EAwIwdjEL
MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
cmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHzAdBgNVBAMTFnRs
c2NhLm9yZzIuZXhhbXBsZS5jb20wHhcNMjAwMjA1MDgyMjAwWhcNMzAwMjAyMDgy
MjAwWjB2MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE
BxMNU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEfMB0G
A1UEAxMWdGxzY2Eub3JnMi5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49
AwEHA0IABAqomq221xDTSYx9u+X6QRdTvEbLUT0aUHf35tIEpxghbcYlCQJjNH7h
25ORrmZn+2d/drhzrgcgmHNw+uSjBiWjbTBrMA4GA1UdDwEB/wQEAwIBpjAdBgNV
HSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEwDwYDVR0TAQH/BAUwAwEB/zApBgNV
HQ4EIgQgVlPMVnzAIjgWLk+hbqH4mqiABZRJY6XqXnzGaxiPo5gwCgYIKoZIzj0E
AwIDRwAwRAIgGv1DhSuU8PNcopHgMIWbY6SMxPOVp7x5zGL6n7RHK58CIBtPepLU
EBf+fYV6i/JXaaolTvdLvlStkoTR6RuuGzV6
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICZzCCAg6gAwIBAgIRAOqmF8w1B/SWH53RUyBUU14wCgYIKoZIzj0EAwIwdjEL
MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
cmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHzAdBgNVBAMTFnRs
c2NhLm9yZzIuZXhhbXBsZS5jb20wHhcNMjAwMjA1MDgyMjAwWhcNMzAwMjAyMDgy
MjAwWjBbMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE
BxMNU2FuIEZyYW5jaXNjbzEfMB0GA1UEAxMWcGVlcjEub3JnMi5leGFtcGxlLmNv
bTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABHj52yahr2NP2+wlU0H9ittTP/jn
HjMp99bX93IUNqEHk/oCBjU2BlbVrbg3TMMEKtd7wfhAbYnTf7aRC5y4kzmjgZcw
gZQwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcD
AjAMBgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIFZTzFZ8wCI4Fi5PoW6h+JqogAWU
SWOl6l58xmsYj6OYMCgGA1UdEQQhMB+CFnBlZXIxLm9yZzIuZXhhbXBsZS5jb22C
BXBlZXIxMAoGCCqGSM49BAMCA0cAMEQCIAViGi6kG5HsRQj0QTDCOH1tqU70LJ2q
Vn82B50ghDqaAiARvT4meCX/XLvp8lfqbAKp1qU0KsKBzevtO4NGMeuwgg==
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg3kjDd5tBL9/eg1ei
ZQfhjxFf1Kz8IO2yrAgzLObySHihRANCAAR4+dsmoa9jT9vsJVNB/YrbUz/45x4z
KffW1/dyFDahB5P6AgY1NgZW1a24N0zDBCrXe8H4QG2J03+2kQucuJM5
-----END PRIVATE KEY-----
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgwxi8KjnUAG+aogSc
suy7GKt8vMQJ68QEeafuyEmProChRANCAAQKqJqtttcQ00mMfbvl+kEXU7xGy1E9
GlB39+bSBKcYIW3GJQkCYzR+4duTka5mZ/tnf3a4c64HIJhzcPrkowYl
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIICVzCCAf6gAwIBAgIRALeI2n3d7i8NYA0k5uYSudcwCgYIKoZIzj0EAwIwdjEL
MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
cmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHzAdBgNVBAMTFnRs
c2NhLm9yZzIuZXhhbXBsZS5jb20wHhcNMjAwMjA1MDgyMjAwWhcNMzAwMjAyMDgy
MjAwWjB2MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE
BxMNU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEfMB0G
A1UEAxMWdGxzY2Eub3JnMi5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49
AwEHA0IABAqomq221xDTSYx9u+X6QRdTvEbLUT0aUHf35tIEpxghbcYlCQJjNH7h
25ORrmZn+2d/drhzrgcgmHNw+uSjBiWjbTBrMA4GA1UdDwEB/wQEAwIBpjAdBgNV
HSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEwDwYDVR0TAQH/BAUwAwEB/zApBgNV
HQ4EIgQgVlPMVnzAIjgWLk+hbqH4mqiABZRJY6XqXnzGaxiPo5gwCgYIKoZIzj0E
AwIDRwAwRAIgGv1DhSuU8PNcopHgMIWbY6SMxPOVp7x5zGL6n7RHK58CIBtPepLU
EBf+fYV6i/JXaaolTvdLvlStkoTR6RuuGzV6
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICUDCCAfegAwIBAgIQC1pZAjSfaiv0KlgBkVcF/DAKBggqhkjOPQQDAjBzMQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eu
b3JnMi5leGFtcGxlLmNvbTAeFw0yMDAyMDUwODIyMDBaFw0zMDAyMDIwODIyMDBa
MHMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1T
YW4gRnJhbmNpc2NvMRkwFwYDVQQKExBvcmcyLmV4YW1wbGUuY29tMRwwGgYDVQQD
ExNjYS5vcmcyLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE
3PR79jvxLfXetqoL0BT3DzMdmGQmvo6eLLTK8e0qBpyDqmy2vQWn+BhFH74TVIde
eJ4OvGS6F7uQGWDn9wVBxaNtMGswDgYDVR0PAQH/BAQDAgGmMB0GA1UdJQQWMBQG
CCsGAQUFBwMCBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1UdDgQiBCDF
S/nWiu5zBq9vwECF00jxZHXd1Ij1Q5FrZIebo52pRDAKBggqhkjOPQQDAgNHADBE
AiBg9ebmCyWjfw6SAE6Ke+Itp6o+TvmIOwdSrpY/D9uOgwIgBY0chdl3VfhmOizW
zw+3Rij9yNAoaRvE1OhP5uErO1g=
-----END CERTIFICATE-----
NodeOUs:
Enable: true
ClientOUIdentifier:
Certificate: cacerts/ca.org2.example.com-cert.pem
OrganizationalUnitIdentifier: client
PeerOUIdentifier:
Certificate: cacerts/ca.org2.example.com-cert.pem
OrganizationalUnitIdentifier: peer
AdminOUIdentifier:
Certificate: cacerts/ca.org2.example.com-cert.pem
OrganizationalUnitIdentifier: admin
OrdererOUIdentifier:
Certificate: cacerts/ca.org2.example.com-cert.pem
OrganizationalUnitIdentifier: orderer
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgW3VeS6J5dxHztU90
7zZpsiMgJn1NfOivO5C9mrSPWAihRANCAAQZ20NLAj8JxTeQm+Y/NYq6FgNTA5T3
WzRWDnQ081K1xxZIll2pw++ehG4572yEz+qyqN4H5GQjK71sHGrzAYun
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIICKTCCAdCgAwIBAgIRAOemCiTekaLKfOmQ4FmyOtEwCgYIKoZIzj0EAwIwczEL
MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
cmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh
Lm9yZzIuZXhhbXBsZS5jb20wHhcNMjAwMjA1MDgyMjAwWhcNMzAwMjAyMDgyMjAw
WjBrMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN
U2FuIEZyYW5jaXNjbzEOMAwGA1UECxMFYWRtaW4xHzAdBgNVBAMMFkFkbWluQG9y
ZzIuZXhhbXBsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQZ20NLAj8J
xTeQm+Y/NYq6FgNTA5T3WzRWDnQ081K1xxZIll2pw++ehG4572yEz+qyqN4H5GQj
K71sHGrzAYuno00wSzAOBgNVHQ8BAf8EBAMCB4AwDAYDVR0TAQH/BAIwADArBgNV
HSMEJDAigCDFS/nWiu5zBq9vwECF00jxZHXd1Ij1Q5FrZIebo52pRDAKBggqhkjO
PQQDAgNHADBEAiBWc5lBXcl4Tf+zToqMG0X1xorwS470t734q96UolpDfQIgEHfi
FPLL7ZhZpa5FgnbQlbxuFcZnvm0NOV3noeXEcEE=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICVzCCAf6gAwIBAgIRALeI2n3d7i8NYA0k5uYSudcwCgYIKoZIzj0EAwIwdjEL
MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
cmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHzAdBgNVBAMTFnRs
c2NhLm9yZzIuZXhhbXBsZS5jb20wHhcNMjAwMjA1MDgyMjAwWhcNMzAwMjAyMDgy
MjAwWjB2MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE
BxMNU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEfMB0G
A1UEAxMWdGxzY2Eub3JnMi5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49
AwEHA0IABAqomq221xDTSYx9u+X6QRdTvEbLUT0aUHf35tIEpxghbcYlCQJjNH7h
25ORrmZn+2d/drhzrgcgmHNw+uSjBiWjbTBrMA4GA1UdDwEB/wQEAwIBpjAdBgNV
HSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEwDwYDVR0TAQH/BAUwAwEB/zApBgNV
HQ4EIgQgVlPMVnzAIjgWLk+hbqH4mqiABZRJY6XqXnzGaxiPo5gwCgYIKoZIzj0E
AwIDRwAwRAIgGv1DhSuU8PNcopHgMIWbY6SMxPOVp7x5zGL6n7RHK58CIBtPepLU
EBf+fYV6i/JXaaolTvdLvlStkoTR6RuuGzV6
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICVzCCAf6gAwIBAgIRALeI2n3d7i8NYA0k5uYSudcwCgYIKoZIzj0EAwIwdjEL
MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
cmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHzAdBgNVBAMTFnRs
c2NhLm9yZzIuZXhhbXBsZS5jb20wHhcNMjAwMjA1MDgyMjAwWhcNMzAwMjAyMDgy
MjAwWjB2MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE
BxMNU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEfMB0G
A1UEAxMWdGxzY2Eub3JnMi5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49
AwEHA0IABAqomq221xDTSYx9u+X6QRdTvEbLUT0aUHf35tIEpxghbcYlCQJjNH7h
25ORrmZn+2d/drhzrgcgmHNw+uSjBiWjbTBrMA4GA1UdDwEB/wQEAwIBpjAdBgNV
HSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEwDwYDVR0TAQH/BAUwAwEB/zApBgNV
HQ4EIgQgVlPMVnzAIjgWLk+hbqH4mqiABZRJY6XqXnzGaxiPo5gwCgYIKoZIzj0E
AwIDRwAwRAIgGv1DhSuU8PNcopHgMIWbY6SMxPOVp7x5zGL6n7RHK58CIBtPepLU
EBf+fYV6i/JXaaolTvdLvlStkoTR6RuuGzV6
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICOjCCAeGgAwIBAgIQOG4ANFp1T4kHD1egM8jQcTAKBggqhkjOPQQDAjB2MQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEfMB0GA1UEAxMWdGxz
Y2Eub3JnMi5leGFtcGxlLmNvbTAeFw0yMDAyMDUwODIyMDBaFw0zMDAyMDIwODIy
MDBaMFsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH
Ew1TYW4gRnJhbmNpc2NvMR8wHQYDVQQDDBZBZG1pbkBvcmcyLmV4YW1wbGUuY29t
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIheJJN/ABjxG7MgJ20xVZiQHUCDt
m6Y2jcGwOtrk3+qJb2Tqr0wzvlMuHVSV3EIDBgqIWJj7RycdBoOw1D5TNKNsMGow
DgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAM
BgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIFZTzFZ8wCI4Fi5PoW6h+JqogAWUSWOl
6l58xmsYj6OYMAoGCCqGSM49BAMCA0cAMEQCIGaO3EGF3YDmcOavu8pSJAEMKSti
zgL0TwxZxoqE8Z3QAiB3qtAdmiqykV91FSBJvjwwvo6lpW+ezVOYW1BrfIofZA==
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgPHE26ZEAV0GPYYun
QP7xo0JclShIC4dAFToMMmT0zaehRANCAAQiF4kk38AGPEbsyAnbTFVmJAdQIO2b
pjaNwbA62uTf6olvZOqvTDO+Uy4dVJXcQgMGCohYmPtHJx0Gg7DUPlM0
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIICUDCCAfegAwIBAgIQC1pZAjSfaiv0KlgBkVcF/DAKBggqhkjOPQQDAjBzMQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eu
b3JnMi5leGFtcGxlLmNvbTAeFw0yMDAyMDUwODIyMDBaFw0zMDAyMDIwODIyMDBa
MHMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1T
YW4gRnJhbmNpc2NvMRkwFwYDVQQKExBvcmcyLmV4YW1wbGUuY29tMRwwGgYDVQQD
ExNjYS5vcmcyLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE
3PR79jvxLfXetqoL0BT3DzMdmGQmvo6eLLTK8e0qBpyDqmy2vQWn+BhFH74TVIde
eJ4OvGS6F7uQGWDn9wVBxaNtMGswDgYDVR0PAQH/BAQDAgGmMB0GA1UdJQQWMBQG
CCsGAQUFBwMCBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1UdDgQiBCDF
S/nWiu5zBq9vwECF00jxZHXd1Ij1Q5FrZIebo52pRDAKBggqhkjOPQQDAgNHADBE
AiBg9ebmCyWjfw6SAE6Ke+Itp6o+TvmIOwdSrpY/D9uOgwIgBY0chdl3VfhmOizW
zw+3Rij9yNAoaRvE1OhP5uErO1g=
-----END CERTIFICATE-----
NodeOUs:
Enable: true
ClientOUIdentifier:
Certificate: cacerts/ca.org2.example.com-cert.pem
OrganizationalUnitIdentifier: client
PeerOUIdentifier:
Certificate: cacerts/ca.org2.example.com-cert.pem
OrganizationalUnitIdentifier: peer
AdminOUIdentifier:
Certificate: cacerts/ca.org2.example.com-cert.pem
OrganizationalUnitIdentifier: admin
OrdererOUIdentifier:
Certificate: cacerts/ca.org2.example.com-cert.pem
OrganizationalUnitIdentifier: orderer
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg7vXenAUEqzS2rjxw
Z4ES0uEtkuJV/eSoc9DINgPvsDOhRANCAASCJZ9hVdn7wDiHYs/RPE2U6iBPJ7Dt
XW/vpx2IJER1mi3YMnLNXbmu5iIfO9tIJthx6u+4eNyJfPChoIYJU+Sz
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIICKjCCAdCgAwIBAgIQYSL7m1mczFMxAb11yZC48DAKBggqhkjOPQQDAjBzMQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eu
b3JnMi5leGFtcGxlLmNvbTAeFw0yMDAyMDUwODIyMDBaFw0zMDAyMDIwODIyMDBa
MGwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1T
YW4gRnJhbmNpc2NvMQ8wDQYDVQQLEwZjbGllbnQxHzAdBgNVBAMMFlVzZXIxQG9y
ZzIuZXhhbXBsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASCJZ9hVdn7
wDiHYs/RPE2U6iBPJ7DtXW/vpx2IJER1mi3YMnLNXbmu5iIfO9tIJthx6u+4eNyJ
fPChoIYJU+Szo00wSzAOBgNVHQ8BAf8EBAMCB4AwDAYDVR0TAQH/BAIwADArBgNV
HSMEJDAigCDFS/nWiu5zBq9vwECF00jxZHXd1Ij1Q5FrZIebo52pRDAKBggqhkjO
PQQDAgNIADBFAiEAiKjxzmIHsK/CbRBQYt7JPW5C4urxHbyZx6KiJubGgm8CIHkj
Hlw057bg0DLJsK4c4MSzIahe+Jlb+DrE8tbyCtwF
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICVzCCAf6gAwIBAgIRALeI2n3d7i8NYA0k5uYSudcwCgYIKoZIzj0EAwIwdjEL
MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
cmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHzAdBgNVBAMTFnRs
c2NhLm9yZzIuZXhhbXBsZS5jb20wHhcNMjAwMjA1MDgyMjAwWhcNMzAwMjAyMDgy
MjAwWjB2MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE
BxMNU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEfMB0G
A1UEAxMWdGxzY2Eub3JnMi5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49
AwEHA0IABAqomq221xDTSYx9u+X6QRdTvEbLUT0aUHf35tIEpxghbcYlCQJjNH7h
25ORrmZn+2d/drhzrgcgmHNw+uSjBiWjbTBrMA4GA1UdDwEB/wQEAwIBpjAdBgNV
HSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEwDwYDVR0TAQH/BAUwAwEB/zApBgNV
HQ4EIgQgVlPMVnzAIjgWLk+hbqH4mqiABZRJY6XqXnzGaxiPo5gwCgYIKoZIzj0E
AwIDRwAwRAIgGv1DhSuU8PNcopHgMIWbY6SMxPOVp7x5zGL6n7RHK58CIBtPepLU
EBf+fYV6i/JXaaolTvdLvlStkoTR6RuuGzV6
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICVzCCAf6gAwIBAgIRALeI2n3d7i8NYA0k5uYSudcwCgYIKoZIzj0EAwIwdjEL
MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
cmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHzAdBgNVBAMTFnRs
c2NhLm9yZzIuZXhhbXBsZS5jb20wHhcNMjAwMjA1MDgyMjAwWhcNMzAwMjAyMDgy
MjAwWjB2MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE
BxMNU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEfMB0G
A1UEAxMWdGxzY2Eub3JnMi5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49
AwEHA0IABAqomq221xDTSYx9u+X6QRdTvEbLUT0aUHf35tIEpxghbcYlCQJjNH7h
25ORrmZn+2d/drhzrgcgmHNw+uSjBiWjbTBrMA4GA1UdDwEB/wQEAwIBpjAdBgNV
HSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEwDwYDVR0TAQH/BAUwAwEB/zApBgNV
HQ4EIgQgVlPMVnzAIjgWLk+hbqH4mqiABZRJY6XqXnzGaxiPo5gwCgYIKoZIzj0E
AwIDRwAwRAIgGv1DhSuU8PNcopHgMIWbY6SMxPOVp7x5zGL6n7RHK58CIBtPepLU
EBf+fYV6i/JXaaolTvdLvlStkoTR6RuuGzV6
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICPDCCAeKgAwIBAgIRALQ6PhwBbfFGdKWMR4nOsacwCgYIKoZIzj0EAwIwdjEL
MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
cmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHzAdBgNVBAMTFnRs
c2NhLm9yZzIuZXhhbXBsZS5jb20wHhcNMjAwMjA1MDgyMjAwWhcNMzAwMjAyMDgy
MjAwWjBbMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE
BxMNU2FuIEZyYW5jaXNjbzEfMB0GA1UEAwwWVXNlcjFAb3JnMi5leGFtcGxlLmNv
bTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABBtv0hskyoTJAuOA5RoXGuRK6BBC
JVeE3N2dd4OBwOVwk5mGvHnpuJF5YvUPyOXusp2nqq4HJwJo7BwcFwHwOdOjbDBq
MA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw
DAYDVR0TAQH/BAIwADArBgNVHSMEJDAigCBWU8xWfMAiOBYuT6FuofiaqIAFlElj
pepefMZrGI+jmDAKBggqhkjOPQQDAgNIADBFAiEA4xE1vs3lVE4Eaewafnlx8z7k
Xu3fk8v4xMnfUqR9r00CIHUTMPD1AeXhRD0/nHQJENkz4OjC/g2fADo0GygHIkqc
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgKPnbzqPGGDyJDiuV
wLeUSvZXmQNFMIJO97o0OVCOUWehRANCAAQbb9IbJMqEyQLjgOUaFxrkSugQQiVX
hNzdnXeDgcDlcJOZhrx56biReWL1D8jl7rKdp6quBycCaOwcHBcB8DnT
-----END PRIVATE KEY-----
addr = "localhost:7053"
event_filter = "interchain-event-name"
username = "Admin"
ccid = "broker"
channel_id = "mychannel"
org = "org2"
\ No newline at end of file
-----BEGIN CERTIFICATE-----
MIICKTCCAc+gAwIBAgIRAIBO31aZaSZoEYSy2AJuhJcwCgYIKoZIzj0EAwIwczEL
MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
cmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh
Lm9yZzIuZXhhbXBsZS5jb20wHhcNMjAwMjA1MDgyMjAwWhcNMzAwMjAyMDgyMjAw
WjBqMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN
U2FuIEZyYW5jaXNjbzENMAsGA1UECxMEcGVlcjEfMB0GA1UEAxMWcGVlcjEub3Jn
Mi5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABG3jszFPTbGm
dAYg2BxmHMTDKfQReNw3p9ttMK130qF5lQo5zLBG8Sa3viOCLnvjjg6A/P+yKnwv
isI/jEVE8T2jTTBLMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMCsGA1Ud
IwQkMCKAIMVL+daK7nMGr2/AQIXTSPFkdd3UiPVDkWtkh5ujnalEMAoGCCqGSM49
BAMCA0gAMEUCIQDMYOQiYeMiQZTxlRkj/3/jjYvwwdCcX5AWuFmraiHkugIgFkX/
6uiTSD0lz8P+wwlLf24cIABq2aZyi8q4gj0YfwA=
-----END CERTIFICATE-----
package main
import (
"fmt"
"path/filepath"
"github.com/hyperledger/fabric/protos/common"
"github.com/hyperledger/fabric/protos/peer"
"github.com/golang/protobuf/proto"
"github.com/hyperledger/fabric-sdk-go/pkg/client/channel"
"github.com/hyperledger/fabric-sdk-go/pkg/client/event"
"github.com/hyperledger/fabric-sdk-go/pkg/client/ledger"
"github.com/hyperledger/fabric-sdk-go/pkg/common/providers/context"
"github.com/hyperledger/fabric-sdk-go/pkg/common/providers/fab"
"github.com/hyperledger/fabric-sdk-go/pkg/core/config"
"github.com/hyperledger/fabric-sdk-go/pkg/fabsdk"
)
type MessageHandler interface {
HandleMessage(deliveries *fab.CCEvent, payload []byte)
}
type Consumer struct {
eventClient *event.Client
meta *ContractMeta
msgH MessageHandler
channelProvider context.ChannelProvider
ChannelClient *channel.Client
registration fab.Registration
ctx chan bool
}
func NewConsumer(configPath string, meta *ContractMeta, msgH MessageHandler, ctx chan bool) (*Consumer, error) {
configProvider := config.FromFile(filepath.Join(configPath, "config.yaml"))
sdk, err := fabsdk.New(configProvider)
if err != nil {
return nil, fmt.Errorf("create sdk fail: %s\n", err)
}
channelProvider := sdk.ChannelContext(meta.ChannelID, fabsdk.WithUser(meta.Username), fabsdk.WithOrg(meta.ORG))
channelClient, err := channel.New(channelProvider)
if err != nil {
return nil, fmt.Errorf("create channel fabcli fail: %s\n", err.Error())
}
c := &Consumer{
msgH: msgH,
ChannelClient: channelClient,
channelProvider: channelProvider,
meta: meta,
ctx: ctx,
}
return c, nil
}
func (c *Consumer) Start() error {
var err error
ec, err := event.New(c.channelProvider, event.WithBlockEvents())
if err != nil {
return fmt.Errorf("failed to create fabcli, error: %v", err)
}
c.eventClient = ec
registration, notifier, err := ec.RegisterChaincodeEvent(c.meta.CCID, c.meta.EventFilter)
if err != nil {
return fmt.Errorf("failed to register chaincode event, error: %v", err)
}
c.registration = registration
// todo: add context
go func() {
for {
select {
case ccEvent := <-notifier:
if ccEvent != nil {
c.handle(ccEvent)
}
case <-c.ctx:
return
}
}
}()
return nil
}
func (c *Consumer) Shutdown() error {
c.eventClient.Unregister(c.registration)
return nil
}
func (c *Consumer) handle(deliveries *fab.CCEvent) {
l, err := ledger.New(c.channelProvider)
if err != nil {
return
}
t, err := l.QueryTransaction(fab.TransactionID(deliveries.TxID))
if err != nil {
return
}
pd := &common.Payload{}
if err := proto.Unmarshal(t.TransactionEnvelope.Payload, pd); err != nil {
return
}
pt := &peer.Transaction{}
if err := proto.Unmarshal(pd.Data, pt); err != nil {
return
}
c.msgH.HandleMessage(deliveries, pt.Actions[0].Payload)
}
package main
import (
"strings"
"time"
"github.com/cloudflare/cfssl/log"
"github.com/meshplus/bitxhub-model/pb"
)
type Event struct {
Index uint64 `json:"index"`
DstChainID string `json:"dst_chain_id"`
SrcContractID string `json:"src_contract_id"`
DstContractID string `json:"dst_contract_id"`
Func string `json:"func"`
Args string `json:"args"`
Callback string `json:"callback"`
Proof []byte `json:"proof"`
Extra []byte `json:"extra"`
}
func (ev *Event) Convert2IBTP(from string, ibtpType pb.IBTP_Type) *pb.IBTP {
pd, err := ev.encryptPayload()
if err != nil {
log.Fatalf("Get ibtp payload :%s", err)
}
return &pb.IBTP{
From: from,
To: ev.DstChainID,
Index: ev.Index,
Type: ibtpType,
Timestamp: time.Now().UnixNano(),
Proof: ev.Proof,
Payload: pd,
Extra: ev.Extra,
}
}
func (ev *Event) encryptPayload() ([]byte, error) {
args := make([][]byte, 0)
as := strings.Split(ev.Args, ",")
for _, a := range as {
args = append(args, []byte(a))
}
ibtppd := &pb.Payload{
SrcContractId: ev.SrcContractID,
DstContractId: ev.DstContractID,
Func: ev.Func,
Args: args,
Callback: ev.Callback,
}
return ibtppd.Marshal()
}
type Response struct {
OK bool `json:"ok"`
Message string `json:"message"`
Data []byte `json:"data"`
}
package main
import (
"encoding/json"
"fmt"
"strconv"
"strings"
"github.com/hyperledger/fabric/core/chaincode/lib/cid"
"github.com/hyperledger/fabric/core/chaincode/shim"
pb "github.com/hyperledger/fabric/protos/peer"
)
const (
interchainEventName = "interchain-event-name"
innerMeta = "inner-meta"
outterMeta = "outter-meta"
callbackMeta = "callback-meta"
whiteList = "white-list"
adminList = "admin-list"
passed = "1"
rejected = "2"
delimiter = "&"
)
type Broker struct{}
type Event struct {
Index uint64 `json:"index"`
DstChainID string `json:"dst_chain_id"`
SrcContractID string `json:"src_contract_id"`
DstContractID string `json:"dst_contract_id"`
Func string `json:"func"`
Args string `json:"args"`
Callback string `json:"callback"`
}
func (broker *Broker) Init(stub shim.ChaincodeStubInterface) pb.Response {
c, err := cid.New(stub)
if err != nil {
return shim.Error(fmt.Sprintf("new cid: %s", err.Error()))
}
clientID, err := c.GetID()
if err != nil {
return shim.Error(fmt.Sprintf("get client id: %s", err.Error()))
}
m := make(map[string]uint64)
m[clientID] = 1
err = broker.putMap(stub, adminList, m)
if err != nil {
return shim.Error(fmt.Sprintf("Initialize admin list fail %s", err.Error()))
}
return broker.initialize(stub)
}
func (broker *Broker) Invoke(stub shim.ChaincodeStubInterface) pb.Response {
function, args := stub.GetFunctionAndParameters()
if ok := broker.checkAdmin(stub, function); !ok {
return shim.Error("Not allowed to invoke interchain function by non-admin client")
}
if ok := broker.checkWhitelist(stub, function); !ok {
return shim.Error("Not allowed to invoke interchain function by unregister chaincode")
}
fmt.Printf("invoke: %s\n", function)
switch function {
case "register":
return broker.register(stub)
case "audit":
return broker.audit(stub, args)
case "getInnerMeta":
return broker.getInnerMeta(stub)
case "getOuterMeta":
return broker.getOuterMeta(stub)
case "getCallbackMeta":
return broker.getCallbackMeta(stub)
case "getInMessage":
return broker.getInMessage(stub, args)
case "getOutMessage":
return broker.getOutMessage(stub, args)
case "InterchainTransferInvoke":
return broker.InterchainTransferInvoke(stub, args)
case "InterchainDataSwapInvoke":
return broker.InterchainDataSwapInvoke(stub, args)
case "InterchainInvoke":
return broker.InterchainInvoke(stub, args)
case "interchainCharge":
return broker.interchainCharge(stub, args)
case "interchainConfirm":
return broker.interchainConfirm(stub, args)
case "interchainGet":
return broker.interchainGet(stub, args)
case "interchainSet":
return broker.interchainSet(stub, args)
case "getList":
return broker.getList(stub)
case "pollingEvent":
return broker.pollingEvent(stub, args)
case "initialize":
return broker.initialize(stub)
default:
return shim.Error("invalid function: " + function + ", args: " + strings.Join(args, ","))
}
}
func (broker *Broker) initialize(stub shim.ChaincodeStubInterface) pb.Response {
inCounter := make(map[string]uint64)
outCounter := make(map[string]uint64)
callbackCounter := make(map[string]uint64)
if err := broker.putMap(stub, innerMeta, inCounter); err != nil {
return shim.Error(err.Error())
}
if err := broker.putMap(stub, outterMeta, outCounter); err != nil {
return shim.Error(err.Error())
}
if err := broker.putMap(stub, callbackMeta, callbackCounter); err != nil {
return shim.Error(err.Error())
}
return shim.Success(nil)
}
func (broker *Broker) InterchainTransferInvoke(stub shim.ChaincodeStubInterface, args []string) pb.Response {
if len(args) < 5 {
return shim.Error("incorrect number of arguments, expecting 5")
}
cid, err := getChaincodeID(stub)
if err != nil {
return shim.Error(err.Error())
}
newArgs := make([]string, 0)
newArgs = append(newArgs, args[0], cid, args[1], "interchainCharge", strings.Join(args[2:], ","), "interchainConfirm")
return broker.InterchainInvoke(stub, newArgs)
}
func (broker *Broker) InterchainDataSwapInvoke(stub shim.ChaincodeStubInterface, args []string) pb.Response {
if len(args) < 3 {
return shim.Error("incorrect number of arguments, expecting 3")
}
cid, err := getChaincodeID(stub)
if err != nil {
return shim.Error(err.Error())
}
newArgs := make([]string, 0)
newArgs = append(newArgs, args[0], cid, args[1], "interchainGet", args[2], "interchainSet")
return broker.InterchainInvoke(stub, newArgs)
}
// InterchainInvoke
// address to,
// address fid,
// address tid,
// string func,
// string args,
// string callback;
func (broker *Broker) InterchainInvoke(stub shim.ChaincodeStubInterface, args []string) pb.Response {
if len(args) < 6 {
return shim.Error("incorrect number of arguments, expecting 6")
}
destChainID := args[0]
outMeta, err := broker.getMap(stub, outterMeta)
if err != nil {
return shim.Error(err.Error())
}
if _, ok := outMeta[destChainID]; !ok {
outMeta[destChainID] = 0
}
tx := &Event{
Index: outMeta[destChainID] + 1,
DstChainID: destChainID,
SrcContractID: args[1],
DstContractID: args[2],
Func: args[3],
Args: args[4],
Callback: args[5],
}
outMeta[tx.DstChainID]++
if err := broker.putMap(stub, outterMeta, outMeta); err != nil {
return shim.Error(err.Error())
}
txValue, err := json.Marshal(tx)
// persist out message
key := broker.outMsgKey(tx.DstChainID, strconv.FormatUint(tx.Index, 10))
if err := stub.PutState(key, txValue); err != nil {
return shim.Error(fmt.Errorf("persist event: %w", err).Error())
}
if err := stub.SetEvent(interchainEventName, txValue); err != nil {
return shim.Error(fmt.Errorf("set event: %w", err).Error())
}
return shim.Success(nil)
}
// 业务合约通过该接口进行注册: 0表示正在审核,1表示审核通过,2表示审核失败
func (broker *Broker) register(stub shim.ChaincodeStubInterface) pb.Response {
list, err := broker.getMap(stub, whiteList)
if err != nil {
return shim.Error(fmt.Sprintf("Get white list :%s", err.Error()))
}
key, err := getChaincodeID(stub)
if err != nil {
return shim.Error(fmt.Sprintf("get chaincode uniuqe id %s", err.Error()))
}
if list[key] == 1 {
return shim.Error(fmt.Sprintf("your chaincode %s has already passed", key))
} else if list[key] == 2 {
return shim.Error(fmt.Sprintf("chaincode %s registeration is rejected", key))
}
list[key] = 0
if err = broker.putMap(stub, whiteList, list); err != nil {
return shim.Error(err.Error())
}
return shim.Success([]byte(key))
}
// 通过chaincode自带的CID库可以验证调用者的相关信息
func (broker *Broker) audit(stub shim.ChaincodeStubInterface, args []string) pb.Response {
channel := args[0]
chaincodeName := args[1]
status := args[2]
if status != passed && status != rejected {
return shim.Error(fmt.Sprintf("status is not one of `1`, `2`"))
}
st, err := strconv.ParseUint(status, 10, 64)
if err != nil {
return shim.Error(err.Error())
}
list, err := broker.getMap(stub, whiteList)
if err != nil {
return shim.Error(fmt.Sprintf("Get white list :%s", err.Error()))
}
list[getKey(channel, chaincodeName)] = st
if err = broker.putMap(stub, whiteList, list); err != nil {
return shim.Error(err.Error())
}
return shim.Success([]byte(fmt.Sprintf("set status of chaincode %s to %s", getKey(channel, chaincodeName), status)))
}
// polling m(m is the out meta plugin has received)
func (broker *Broker) pollingEvent(stub shim.ChaincodeStubInterface, args []string) pb.Response {
m := make(map[string]uint64)
if err := json.Unmarshal([]byte(args[0]), &m); err != nil {
return shim.Error(fmt.Errorf("unmarshal out meta: %s", err).Error())
}
outMeta, err := broker.getMap(stub, outterMeta)
if err != nil {
return shim.Error(err.Error())
}
events := make([]*Event, 0)
for addr, idx := range outMeta {
startPos, ok := m[addr]
if !ok {
startPos = 0
}
for i := startPos + 1; i <= idx; i++ {
eb, err := stub.GetState(broker.outMsgKey(addr, strconv.FormatUint(i, 10)))
if err != nil {
fmt.Printf("get out event by key %s fail", broker.outMsgKey(addr, strconv.FormatUint(i, 10)))
continue
}
e := &Event{}
if err := json.Unmarshal(eb, e); err != nil {
fmt.Println("unmarshal event fail")
continue
}
events = append(events, e)
}
}
ret, err := json.Marshal(events)
if err != nil {
return shim.Error(err.Error())
}
return shim.Success(ret)
}
func main() {
err := shim.Start(new(Broker))
if err != nil {
fmt.Printf("Error starting chaincode: %s", err)
}
}
package main
import (
"fmt"
"strconv"
"strings"
"github.com/hyperledger/fabric/common/util"
"github.com/hyperledger/fabric/core/chaincode/shim"
pb "github.com/hyperledger/fabric/protos/peer"
)
// get interchain account for transfer contract: setData from,index,tid,name_id,amount
func (broker *Broker) interchainSet(stub shim.ChaincodeStubInterface, args []string) pb.Response {
if len(args) < 5 {
return errorResponse("incorrect number of arguments, expecting 5")
}
sourceChainID := args[0]
sequenceNum := args[1]
targetCID := args[2]
key := args[3]
data := args[4]
if err := broker.checkIndex(stub, sourceChainID, sequenceNum, callbackMeta); err != nil {
return errorResponse(err.Error())
}
idx, err := strconv.ParseUint(sequenceNum, 10, 64)
if err != nil {
return errorResponse(err.Error())
}
if err := broker.markCallbackCounter(stub, sourceChainID, idx); err != nil {
return errorResponse(err.Error())
}
splitedCID := strings.Split(targetCID, delimiter)
if len(splitedCID) != 2 {
return errorResponse(fmt.Sprintf("Target chaincode id %s is not valid", targetCID))
}
b := util.ToChaincodeArgs("interchainSet", key, data)
response := stub.InvokeChaincode(splitedCID[1], b, splitedCID[0])
if response.Status != shim.OK {
return errorResponse(fmt.Sprintf("invoke chaincode '%s' err: %s", splitedCID[1], response.Message))
}
return successResponse(nil)
}
// example for calling get: getData from,index,tid,id
func (broker *Broker) interchainGet(stub shim.ChaincodeStubInterface, args []string) pb.Response {
if len(args) < 4 {
return errorResponse("incorrect number of arguments, expecting 4")
}
sourceChainID := args[0]
sequenceNum := args[1]
targetCID := args[2]
key := args[3]
if err := broker.checkIndex(stub, sourceChainID, sequenceNum, innerMeta); err != nil {
return errorResponse(err.Error())
}
if err := broker.markInCounter(stub, sourceChainID); err != nil {
return errorResponse(err.Error())
}
splitedCID := strings.Split(targetCID, delimiter)
if len(splitedCID) != 2 {
return errorResponse(fmt.Sprintf("Target chaincode id %s is not valid", targetCID))
}
b := util.ToChaincodeArgs("interchainGet", key)
response := stub.InvokeChaincode(splitedCID[1], b, splitedCID[0])
if response.Status != shim.OK {
return errorResponse(fmt.Sprintf("invoke chaincode '%s' err: %s", splitedCID[1], response.Message))
}
inKey := broker.inMsgKey(sourceChainID, sequenceNum)
if err := stub.PutState(inKey, response.Payload); err != nil {
return errorResponse(err.Error())
}
return successResponse(response.Payload)
}
package main
import (
"bytes"
"encoding/json"
"fmt"
"strconv"
"github.com/golang/protobuf/proto"
"github.com/hyperledger/fabric/core/chaincode/shim"
pb "github.com/hyperledger/fabric/protos/peer"
)
type response struct {
OK bool `json:"ok"`
Message string `json:"message"`
Data []byte `json:"data"`
}
func successResponse(data []byte) pb.Response {
res := &response{
OK: true,
Data: data,
}
data, err := json.Marshal(res)
if err != nil {
panic(err)
}
return shim.Success(data)
}
func errorResponse(msg string) pb.Response {
res := &response{
OK: false,
Message: msg,
}
data, err := json.Marshal(res)
if err != nil {
panic(err)
}
return shim.Success(data)
}
// putMap for persisting meta state into ledger
func (broker *Broker) putMap(stub shim.ChaincodeStubInterface, metaName string, meta map[string]uint64) error {
if meta == nil {
return nil
}
metaBytes, err := json.Marshal(meta)
if err != nil {
return err
}
return stub.PutState(metaName, metaBytes)
}
func (broker *Broker) getMap(stub shim.ChaincodeStubInterface, metaName string) (map[string]uint64, error) {
metaBytes, err := stub.GetState(metaName)
if err != nil {
return nil, err
}
meta := make(map[string]uint64)
if metaBytes == nil {
return meta, nil
}
if err := json.Unmarshal(metaBytes, &meta); err != nil {
return nil, err
}
return meta, nil
}
func getChaincodeID(stub shim.ChaincodeStubInterface) (string, error) {
sp, err := stub.GetSignedProposal()
if err != nil {
return "", err
}
proposal := &pb.Proposal{}
if err := proto.Unmarshal(sp.ProposalBytes, proposal); err != nil {
return "", err
}
payload := &pb.ChaincodeProposalPayload{}
if err := proto.Unmarshal(proposal.Payload, payload); err != nil {
return "", err
}
spec := &pb.ChaincodeInvocationSpec{}
if err := proto.Unmarshal(payload.Input, spec); err != nil {
return "", err
}
return getKey(stub.GetChannelID(), spec.ChaincodeSpec.ChaincodeId.Name), nil
}
func getKey(channel, chaincodeName string) string {
return channel + delimiter + chaincodeName
}
func (broker *Broker) checkIndex(stub shim.ChaincodeStubInterface, addr string, index string, metaName string) error {
idx, err := strconv.ParseUint(index, 10, 64)
if err != nil {
return err
}
meta, err := broker.getMap(stub, metaName)
if err != nil {
return err
}
if idx != meta[addr]+1 {
return fmt.Errorf("incorrect index, expect %d", meta[addr]+1)
}
return nil
}
func (broker *Broker) outMsgKey(to string, idx string) string {
return fmt.Sprintf("out-msg-%s-%s", to, idx)
}
func (broker *Broker) inMsgKey(from string, idx string) string {
return fmt.Sprintf("in-msg-%s-%s", from, idx)
}
func (broker *Broker) onlyAdmin(stub shim.ChaincodeStubInterface) bool {
key, err := getChaincodeID(stub)
if err != nil {
fmt.Printf("Get cert public key %s\n", err.Error())
return false
}
adminList, err := broker.getMap(stub, adminList)
if err != nil {
fmt.Println("Get admin list info failed")
return false
}
if adminList[key] == 1 {
return false
}
return true
}
func (broker *Broker) onlyWhitelist(stub shim.ChaincodeStubInterface) bool {
key, err := getChaincodeID(stub)
if err != nil {
fmt.Printf("Get cert public key %s\n", err.Error())
return false
}
whiteList, err := broker.getMap(stub, whiteList)
if err != nil {
fmt.Println("Get white list info failed")
return false
}
if whiteList[key] != 1 {
return false
}
return true
}
func (broker *Broker) getList(stub shim.ChaincodeStubInterface) pb.Response {
whiteList, err := broker.getMap(stub, whiteList)
if err != nil {
return shim.Error(fmt.Sprintf("Get white list :%s", err.Error()))
}
var list [][]byte
for k, v := range whiteList {
if v == 0 {
list = append(list, []byte(k))
}
}
return shim.Success(bytes.Join(list, []byte(",")))
}
func (broker *Broker) checkAdmin(stub shim.ChaincodeStubInterface, function string) bool {
checks := map[string]struct{}{
"audit": {},
"interchainCharge": {},
"interchainConfirm": {},
"interchainGet": {},
"interchainSet": {},
}
if _, ok := checks[function]; !ok {
return true
}
return broker.onlyAdmin(stub)
}
func (broker *Broker) checkWhitelist(stub shim.ChaincodeStubInterface, function string) bool {
checks := map[string]struct{}{
"InterchainTransferInvoke": {},
"InterchainDataSwapInvoke": {},
"InterchainInvoke": {},
}
if _, ok := checks[function]; !ok {
return true
}
return broker.onlyWhitelist(stub)
}
package main
import (
"github.com/hyperledger/fabric/core/chaincode/shim"
pb "github.com/hyperledger/fabric/protos/peer"
)
// getOutMeta
func (broker *Broker) getOuterMeta(stub shim.ChaincodeStubInterface) pb.Response {
v, err := stub.GetState(outterMeta)
if err != nil {
return shim.Error(err.Error())
}
return shim.Success(v)
}
// getOutMessage to,index
func (broker *Broker) getOutMessage(stub shim.ChaincodeStubInterface, args []string) pb.Response {
if len(args) < 2 {
return shim.Error("incorrect number of arguments, expecting 2")
}
destChainID := args[0]
sequenceNum := args[1]
key := broker.outMsgKey(destChainID, sequenceNum)
v, err := stub.GetState(key)
if err != nil {
return shim.Error(err.Error())
}
return shim.Success(v)
}
func (broker *Broker) getInnerMeta(stub shim.ChaincodeStubInterface) pb.Response {
v, err := stub.GetState(innerMeta)
if err != nil {
return shim.Error(err.Error())
}
return shim.Success(v)
}
// getInMessage from,index
func (broker *Broker) getInMessage(stub shim.ChaincodeStubInterface, args []string) pb.Response {
if len(args) < 2 {
return shim.Error("incorrect number of arguments, expecting 2")
}
sourceChainID := args[0]
sequenceNum := args[1]
key := broker.inMsgKey(sourceChainID, sequenceNum)
v, err := stub.GetState(key)
if err != nil {
return shim.Error(err.Error())
}
return shim.Success(v)
}
func (broker *Broker) getCallbackMeta(stub shim.ChaincodeStubInterface) pb.Response {
v, err := stub.GetState(callbackMeta)
if err != nil {
return shim.Error(err.Error())
}
return shim.Success(v)
}
func (broker *Broker) markInCounter(stub shim.ChaincodeStubInterface, from string) error {
inMeta, err := broker.getMap(stub, innerMeta)
if err != nil {
return err
}
inMeta[from]++
return broker.putMap(stub, innerMeta, inMeta)
}
func (broker *Broker) markCallbackCounter(stub shim.ChaincodeStubInterface, from string, index uint64) error {
meta, err := broker.getMap(stub, callbackMeta)
if err != nil {
return err
}
meta[from] = index
return broker.putMap(stub, callbackMeta, meta)
}
package main
import (
"fmt"
"strconv"
"strings"
"github.com/hyperledger/fabric/common/util"
"github.com/hyperledger/fabric/core/chaincode/shim"
pb "github.com/hyperledger/fabric/protos/peer"
)
// recharge for transfer contract: charge from,index,tid,name_id,amount
func (broker *Broker) interchainCharge(stub shim.ChaincodeStubInterface, args []string) pb.Response {
if len(args) < 6 {
return errorResponse("incorrect number of arguments, expecting 6")
}
sourceChainID := args[0]
sequenceNum := args[1]
targetCID := args[2]
sender := args[3]
receiver := args[4]
amount := args[5]
if err := broker.checkIndex(stub, sourceChainID, sequenceNum, innerMeta); err != nil {
return errorResponse(err.Error())
}
if err := broker.markInCounter(stub, sourceChainID); err != nil {
return errorResponse(err.Error())
}
splitedCID := strings.Split(targetCID, delimiter)
if len(splitedCID) != 2 {
return errorResponse(fmt.Sprintf("Target chaincode id %s is not valid", targetCID))
}
b := util.ToChaincodeArgs("interchainCharge", sender, receiver, amount)
response := stub.InvokeChaincode(splitedCID[1], b, splitedCID[0])
if response.Status != shim.OK {
return errorResponse(fmt.Sprintf("invoke chaincode '%s' err: %s", splitedCID[1], response.Message))
}
// persist execution result
key := broker.inMsgKey(sourceChainID, sequenceNum)
if err := stub.PutState(key, response.Payload); err != nil {
return errorResponse(err.Error())
}
return successResponse(nil)
}
func (broker *Broker) interchainConfirm(stub shim.ChaincodeStubInterface, args []string) pb.Response {
// check args
if len(args) < 6 {
return errorResponse("incorrect number of arguments, expecting 6")
}
sourceChainID := args[0]
sequenceNum := args[1]
targetCID := args[2]
status := args[3]
receiver := args[4]
amount := args[5]
if err := broker.checkIndex(stub, sourceChainID, sequenceNum, callbackMeta); err != nil {
return errorResponse(err.Error())
}
idx, err := strconv.ParseUint(sequenceNum, 10, 64)
if err != nil {
return errorResponse(err.Error())
}
if err := broker.markCallbackCounter(stub, sourceChainID, idx); err != nil {
return errorResponse(err.Error())
}
// confirm interchain tx execution
if status == "true" {
return successResponse(nil)
}
splitedCID := strings.Split(targetCID, delimiter)
if len(splitedCID) != 2 {
return errorResponse(fmt.Sprintf("Target chaincode id %s is not valid", targetCID))
}
b := util.ToChaincodeArgs("interchainRollback", receiver, amount)
response := stub.InvokeChaincode(splitedCID[1], b, splitedCID[0])
if response.Status != shim.OK {
return errorResponse(fmt.Sprintf("invoke chaincode '%s' err: %s", splitedCID[1], response.Message))
}
return successResponse(nil)
}
package main
import (
"fmt"
"strings"
"github.com/hyperledger/fabric/common/util"
"github.com/hyperledger/fabric/core/chaincode/shim"
pb "github.com/hyperledger/fabric/protos/peer"
)
const (
channelID = "mychannel"
brokerContractName = "broker"
interchainInvokeFunc = "InterchainDataSwapInvoke"
)
type DataSwapper struct{}
func (s *DataSwapper) Init(stub shim.ChaincodeStubInterface) pb.Response {
return shim.Success(nil)
}
func (s *DataSwapper) Invoke(stub shim.ChaincodeStubInterface) pb.Response {
function, args := stub.GetFunctionAndParameters()
fmt.Printf("invoke: %s\n", function)
switch function {
case "register":
return s.register(stub)
case "interchainGet":
return s.interchainGet(stub, args)
case "interchainSet":
return s.interchainSet(stub, args)
case "get":
return s.get(stub, args)
case "set":
return s.set(stub, args)
default:
return shim.Error("invalid function: " + function + ", args: " + strings.Join(args, ","))
}
}
func (s *DataSwapper) register(stub shim.ChaincodeStubInterface) pb.Response {
args := util.ToChaincodeArgs("register")
response := stub.InvokeChaincode(brokerContractName, args, channelID)
if response.Status != shim.OK {
return shim.Error(fmt.Sprintf("invoke chaincode '%s' err: %s", brokerContractName, response.Message))
}
return response
}
// get is business function which will invoke the to,tid,id
func (s *DataSwapper) get(stub shim.ChaincodeStubInterface, args []string) pb.Response {
switch len(args) {
case 1:
// args[0]: key
value, err := stub.GetState(args[0])
if err != nil {
return shim.Error(err.Error())
}
return shim.Success(value)
case 3:
// args[0]: destination appchain id
// args[1]: destination contract address
// args[2]: key
b := util.ToChaincodeArgs(interchainInvokeFunc, args[0], args[1], args[2])
response := stub.InvokeChaincode(brokerContractName, b, channelID)
if response.Status != shim.OK {
return shim.Error(fmt.Errorf("invoke broker chaincode %s error: %s", brokerContractName, response.Message).Error())
}
return shim.Success(nil)
default:
return shim.Error("incorrect number of arguments")
}
}
// get is business function which will invoke the to,tid,id
func (s *DataSwapper) set(stub shim.ChaincodeStubInterface, args []string) pb.Response {
if len(args) != 2 {
return shim.Error("incorrect number of arguments")
}
err := stub.PutState(args[0], []byte(args[1]))
if err != nil {
return shim.Error(err.Error())
}
return shim.Success(nil)
}
// interchainSet is the callback function getting data by interchain
func (s *DataSwapper) interchainSet(stub shim.ChaincodeStubInterface, args []string) pb.Response {
return s.set(stub, args)
}
// interchainGet gets data by interchain
func (s *DataSwapper) interchainGet(stub shim.ChaincodeStubInterface, args []string) pb.Response {
value, err := stub.GetState(args[0])
if err != nil {
return shim.Error(err.Error())
}
return shim.Success(value)
}
func main() {
err := shim.Start(new(DataSwapper))
if err != nil {
fmt.Printf("Error starting chaincode: %s", err)
}
}
package main
import (
"fmt"
"github.com/hyperledger/fabric/core/chaincode/shim"
"strconv"
)
func getUint64(stub shim.ChaincodeStubInterface, key string) (uint64, error) {
value, err := stub.GetState(key)
if err != nil {
return 0, err
}
ret, err := strconv.ParseUint(string(value), 10, 64)
if err != nil {
return 0, err
}
return ret, nil
}
func getAmountArg(arg string) (uint64, error) {
amount, err := strconv.ParseUint(arg, 10, 64)
if err != nil {
shim.Error(fmt.Errorf("amount must be an interger %w", err).Error())
return 0, err
}
if amount < 0 {
return 0, fmt.Errorf("amount must be a positive integer, got %s", arg)
}
return amount, nil
}
package main
import (
"fmt"
"strconv"
"strings"
"github.com/hyperledger/fabric/common/util"
"github.com/hyperledger/fabric/core/chaincode/shim"
pb "github.com/hyperledger/fabric/protos/peer"
)
const (
channelID = "mychannel"
brokerContractName = "broker"
interchainInvokeFunc = "InterchainTransferInvoke"
)
type Transfer struct{}
func (t *Transfer) Init(stub shim.ChaincodeStubInterface) pb.Response {
return shim.Success(nil)
}
func (t *Transfer) Invoke(stub shim.ChaincodeStubInterface) pb.Response {
function, args := stub.GetFunctionAndParameters()
fmt.Printf("invoke: %s\n", function)
switch function {
case "register":
return t.register(stub)
case "transfer":
return t.transfer(stub, args)
case "getBalance":
return t.getBalance(stub, args)
case "setBalance":
return t.setBalance(stub, args)
case "interchainCharge":
return t.interchainCharge(stub, args)
case "interchainRollback":
return t.interchainRollback(stub, args)
default:
return shim.Error("invalid function: " + function + ", args: " + strings.Join(args, ","))
}
}
func (t *Transfer) register(stub shim.ChaincodeStubInterface) pb.Response {
args := util.ToChaincodeArgs("register")
response := stub.InvokeChaincode(brokerContractName, args, channelID)
if response.Status != shim.OK {
return shim.Error(fmt.Sprintf("invoke chaincode '%s' err: %s", brokerContractName, response.Message))
}
return response
}
func (t *Transfer) transfer(stub shim.ChaincodeStubInterface, args []string) pb.Response {
switch len(args) {
case 3:
sender := args[0]
receiver := args[1]
amountArg := args[2]
amount, err := getAmountArg(amountArg)
if err != nil {
return shim.Error(fmt.Errorf("get amount from arg: %w", err).Error())
}
balance, err := getUint64(stub, sender)
if err != nil {
return shim.Error(fmt.Errorf("got account value from %s %w", sender, err).Error())
}
if balance < amount {
return shim.Error("not sufficient funds")
}
balance -= amount
err = stub.PutState(sender, []byte(strconv.FormatUint(balance, 10)))
if err != nil {
return shim.Error(err.Error())
}
receiverBalance, err := getUint64(stub, receiver)
if err != nil {
return shim.Error(fmt.Errorf("got account value from %s %w", receiver, err).Error())
}
err = stub.PutState(receiver, []byte(strconv.FormatUint(receiverBalance+amount, 10)))
if err != nil {
return shim.Error(err.Error())
}
return shim.Success(nil)
case 5:
// args[0]: destination appchain id
// args[1]: destination contract address
dest := args[0]
address := args[1]
sender := args[2]
receiver := args[3]
amountArg := args[4]
amount, err := getAmountArg(amountArg)
if err != nil {
return shim.Error(fmt.Errorf("get amount from arg: %w", err).Error())
}
balance, err := getUint64(stub, sender)
if err != nil {
return shim.Error(fmt.Errorf("got account value from %s %w", sender, err).Error())
}
if balance < amount {
return shim.Error("not sufficient funds")
}
balance -= amount
err = stub.PutState(sender, []byte(strconv.FormatUint(balance, 10)))
if err != nil {
return shim.Error(err.Error())
}
b := util.ToChaincodeArgs(interchainInvokeFunc, dest, address, sender, receiver, amountArg)
response := stub.InvokeChaincode(brokerContractName, b, channelID)
if response.Status != shim.OK {
return shim.Error(fmt.Errorf("invoke broker chaincode %s", response.Message).Error())
}
return shim.Success(nil)
default:
return shim.Error("incorrect number of arguments")
}
}
// getBalance gets account balance
func (t *Transfer) getBalance(stub shim.ChaincodeStubInterface, args []string) pb.Response {
if len(args) != 1 {
return shim.Error("incorrect number of arguments")
}
name := args[0]
value, err := stub.GetState(name)
if err != nil {
return shim.Error(err.Error())
}
return shim.Success(value)
}
// setBalance sets account balance
func (t *Transfer) setBalance(stub shim.ChaincodeStubInterface, args []string) pb.Response {
if len(args) != 2 {
return shim.Error("incorrect number of arguments")
}
name := args[0]
amount := args[1]
if err := stub.PutState(name, []byte(amount)); err != nil {
return shim.Error(err.Error())
}
return shim.Success(nil)
}
// charge user,amount
func (t *Transfer) interchainCharge(stub shim.ChaincodeStubInterface, args []string) pb.Response {
if len(args) != 3 {
return shim.Error("incorrect number of arguments, expect 3")
}
sender := args[0]
receiver := args[1]
amountArg := args[2]
// check for sender info
if sender == "" {
return shim.Error("incorrect sender info")
}
amount, err := getAmountArg(amountArg)
if err != nil {
return shim.Error(fmt.Errorf("get amount from arg: %w", err).Error())
}
balance, err := getUint64(stub, receiver)
if err != nil {
return shim.Error(fmt.Errorf("get balancee from %s %w", receiver, err).Error())
}
balance += amount
err = stub.PutState(receiver, []byte(strconv.FormatUint(balance, 10)))
if err != nil {
return shim.Error(err.Error())
}
return shim.Success(nil)
}
func (t *Transfer) interchainRollback(stub shim.ChaincodeStubInterface, args []string) pb.Response {
if len(args) != 2 {
return shim.Error("incorrect number of arguments, expecting 2")
}
name := args[0]
amountArg := args[1]
amount, err := getAmountArg(amountArg)
if err != nil {
return shim.Error(fmt.Errorf("get amount from arg: %w", err).Error())
}
balance, err := getUint64(stub, name)
if err != nil {
return shim.Error(fmt.Errorf("get balancee from %s %w", name, err).Error())
}
balance += amount
err = stub.PutState(name, []byte(strconv.FormatUint(balance, 10)))
if err != nil {
return shim.Error(err.Error())
}
return shim.Success(nil)
}
func main() {
err := shim.Start(new(Transfer))
if err != nil {
fmt.Printf("Error starting chaincode: %s", err)
}
}
module github.com/meshplus/pier-client-fabric
go 1.13
require (
github.com/Knetic/govaluate v3.0.0+incompatible // indirect
github.com/Rican7/retry v0.1.0
github.com/Shopify/sarama v1.26.1 // indirect
github.com/VividCortex/gohistogram v1.0.0 // indirect
github.com/cloudflare/cfssl v0.0.0-20180223231731-4e2dcbde5004
github.com/fsouza/go-dockerclient v1.6.3 // indirect
github.com/golang/protobuf v1.3.2
github.com/google/certificate-transparency-go v1.1.0 // indirect
github.com/hashicorp/go-version v1.2.0 // indirect
github.com/hyperledger/fabric v1.4.6
github.com/hyperledger/fabric-amcl v0.0.0-20200128223036-d1aa2665426a // indirect
github.com/hyperledger/fabric-lib-go v1.0.0 // indirect
github.com/hyperledger/fabric-sdk-go v1.0.0-alpha5
github.com/meshplus/bitxhub-kit v0.0.0-20200329124935-585edb85ca63
github.com/meshplus/bitxhub-model v0.0.0-20200329125320-a37501c7a13e
github.com/meshplus/pier v0.0.0-00010101000000-000000000000
github.com/miekg/pkcs11 v1.0.3 // indirect
github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 // indirect
github.com/sirupsen/logrus v1.4.2
github.com/spf13/viper v1.4.0
github.com/sykesm/zap-logfmt v0.0.3 // indirect
)
replace gopkg.in/yaml.v2 => gopkg.in/yaml.v2 v2.2.7
replace golang.org/x/net => golang.org/x/net v0.0.0-20200202094626-16171245cfb2
replace github.com/meshplus/pier => ../pier
replace golang.org/x/text => golang.org/x/text v0.3.2
replace github.com/spf13/afero => github.com/spf13/afero v1.1.2
replace github.com/pelletier/go-toml => github.com/pelletier/go-toml v1.2.0
replace github.com/spf13/jwalterweatherman => github.com/spf13/jwalterweatherman v1.0.0
replace github.com/mholt/archiver => github.com/mholt/archiver v0.0.0-20180417220235-e4ef56d48eb0
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
contrib.go.opencensus.io/exporter/stackdriver v0.12.1/go.mod h1:iwB6wGarfphGGe/e5CWqyUk/cLzKnWsOKPVW3no6OTw=
contrib.go.opencensus.io/resource v0.1.1/go.mod h1:F361eGI91LCmW1I/Saf+rX0+OFcigGlFvXwEGEnkRLA=
github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 h1:w+iIsaOQNcT7OZ575w+acHgRric5iCyQh+xv+KJ4HB8=
github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8=
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/Knetic/govaluate v3.0.0+incompatible h1:7o6+MAPhYTCF0+fdvoz1xDedhRb4f6s9Tn1Tt7/WTEg=
github.com/Knetic/govaluate v3.0.0+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5 h1:ygIc8M6trr62pF5DucadTWGdEB4mEyvzi0e2nbcmcyA=
github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw=
github.com/Microsoft/hcsshim v0.8.7-0.20191101173118-65519b62243c h1:YMP6olTU903X3gxQJckdmiP8/zkSMq4kN3uipsU9XjU=
github.com/Microsoft/hcsshim v0.8.7-0.20191101173118-65519b62243c/go.mod h1:7xhjOwRV2+0HXGmM0jxaEu+ZiXJFoVZOTfL/dmqbrD8=
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
github.com/OpenPeeDeeP/depguard v1.0.0 h1:k9QF73nrHT3nPLz3lu6G5s+3Hi8Je36ODr1F5gjAXXM=
github.com/OpenPeeDeeP/depguard v1.0.0/go.mod h1:7/4sitnI9YlQgTLLk734QlzXT8DuHVnAyztLplQjk+o=
github.com/Rican7/retry v0.1.0 h1:FqK94z34ly8Baa6K+G8Mmza9rYWTKOJk+yckIBB5qVk=
github.com/Rican7/retry v0.1.0/go.mod h1:FgOROf8P5bebcC1DS0PdOQiqGUridaZvikzUmkFW6gg=
github.com/Shopify/sarama v1.26.1 h1:3jnfWKD7gVwbB1KSy/lE0szA9duPuSFLViK0o/d3DgA=
github.com/Shopify/sarama v1.26.1/go.mod h1:NbSGBSSndYaIhRcBtY9V0U7AyH+x71bG668AuWys/yU=
github.com/Shopify/toxiproxy v2.1.4+incompatible h1:TKdv8HiTLgE5wdJuEML90aBgNWsokNbMijUGhmcoBJc=
github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE=
github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g=
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q=
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
github.com/aws/aws-sdk-go v1.19.18/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
github.com/beorn7/perks v1.0.0 h1:HWo1m869IqiPhD389kmkxeTalrjNbbJTC8LXupb+sl0=
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY=
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
github.com/cbergoon/merkletree v0.2.0 h1:Bttqr3OuoiZEo4ed1L7fTasHka9II+BF9fhBfbNEEoQ=
github.com/cbergoon/merkletree v0.2.0/go.mod h1:5c15eckUgiucMGDOCanvalj/yJnD+KAZj1qyJtRW5aM=
github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cloudflare/cfssl v0.0.0-20180223231731-4e2dcbde5004 h1:lkAMpLVBDaj17e85keuznYcH5rqI438v41pKcBl4ZxQ=
github.com/cloudflare/cfssl v0.0.0-20180223231731-4e2dcbde5004/go.mod h1:yMWuSON2oQp+43nFtAV/uvKQIFpSPerB57DCt9t8sSA=
github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko=
github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw=
github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
github.com/containerd/containerd v1.3.0 h1:xjvXQWABwS2uiv3TWgQt5Uth60Gu86LTGZXMJkjc7rY=
github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc h1:TP+534wVlf61smEIq1nwLLAjQVEK2EADoW3CX9AuT+8=
github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI=
github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0=
github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o=
github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc=
github.com/coreos/bbolt v1.3.2 h1:wZwiHHUieZCquLkDL0B8UhzreNWsPHooDAG3q34zk0s=
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
github.com/coreos/etcd v3.3.13+incompatible h1:8F3hqu9fGYLBifCmRCJsicFqDx/D68Rt3q1JMazcgBQ=
github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM=
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e h1:Wf6HqHfScWJN9/ZjdUKyjop4mf3Qdd+1TvvltAvM3m8=
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f h1:lBNOc5arjvs8E5mO2tbpBpLoyyu8B6e44T7hJy6potg=
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk=
github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d h1:U+s90UTSYgptZMwQh2aRr3LuazLJIa+Pg3Kc1ylSYVY=
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BUmsJpcB+cRlLU7cSug=
github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
github.com/docker/docker v1.4.2-0.20191101170500-ac7306503d23 h1:oqgGT9O61YAYvI41EBsLePOr+LE6roB0xY4gpkZuFSE=
github.com/docker/docker v1.4.2-0.20191101170500-ac7306503d23/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ=
github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw=
github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo=
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/eapache/go-resiliency v1.2.0 h1:v7g92e/KSN71Rq7vSThKaWIq68fL4YHvWyiUKorFR1Q=
github.com/eapache/go-resiliency v1.2.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21 h1:YEetp8/yCZMuEPMUDHG0CW/brkkEp8mzqk2+ODEitlw=
github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc=
github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239 h1:Ghm4eQYC0nEPnSJdVkTrXpu9KtoVCSo1hg7mtI7G9KU=
github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239/go.mod h1:Gdwt2ce0yfBxPvZrHkprdPPTTS3N5rwmLE8T22KBXlw=
github.com/fatih/color v1.6.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s=
github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw=
github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
github.com/frankban/quicktest v1.7.2 h1:2QxQoC1TS09S7fhCPsrvqYdvP1H5M1P1ih5ABm3BTYk=
github.com/frankban/quicktest v1.7.2/go.mod h1:jaStnuzAqU1AJdCO0l53JDCJrVDKcS03DbaAcR7Ks/o=
github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/fsouza/go-dockerclient v1.6.3 h1:VS/I3mxieZVIeaWXd57JKvSjheELafUJYtblGg75RIQ=
github.com/fsouza/go-dockerclient v1.6.3/go.mod h1:OiSy/IhZIF+zheikZkXK7LVpGzxWchJPJKGWhBqOK4M=
github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/go-critic/go-critic v0.3.5-0.20190526074819-1df300866540 h1:djv/qAomOVj8voCHt0M0OYwR/4vfDq1zNKSPKjJCexs=
github.com/go-critic/go-critic v0.3.5-0.20190526074819-1df300866540/go.mod h1:+sE8vrLDS2M0pZkBk0wy6+nLdKexVDrl/jBqQOTDThA=
github.com/go-kit/kit v0.8.0 h1:Wz+5lgoB0kkuqLEc6NVmwRknTKP6dTGbSqvhZtBI/j0=
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
github.com/go-lintpack/lintpack v0.5.2 h1:DI5mA3+eKdWeJ40nU4d6Wc26qmdG8RCi/btYq0TuRN0=
github.com/go-lintpack/lintpack v0.5.2/go.mod h1:NwZuYi2nUHho8XEIZ6SIxihrnPoqBTDqfpXvXAN0sXM=
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
github.com/go-logfmt/logfmt v0.4.0 h1:MP4Eh7ZCb31lleYCFuwm0oe4/YGak+5l1vA2NOE80nA=
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8=
github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/go-toolsmith/astcast v1.0.0 h1:JojxlmI6STnFVG9yOImLeGREv8W2ocNUM+iOhR6jE7g=
github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4=
github.com/go-toolsmith/astcopy v1.0.0 h1:OMgl1b1MEpjFQ1m5ztEO06rz5CUd3oBv9RF7+DyvdG8=
github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ=
github.com/go-toolsmith/astequal v0.0.0-20180903214952-dcb477bfacd6/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY=
github.com/go-toolsmith/astequal v1.0.0 h1:4zxD8j3JRFNyLN46lodQuqz3xdKSrur7U/sr0SDS/gQ=
github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY=
github.com/go-toolsmith/astfmt v0.0.0-20180903215011-8f8ee99c3086/go.mod h1:mP93XdblcopXwlyN4X4uodxXQhldPGZbcEJIimQHrkg=
github.com/go-toolsmith/astfmt v1.0.0 h1:A0vDDXt+vsvLEdbMFJAUBI/uTbRw1ffOPnxsILnFL6k=
github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw=
github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU=
github.com/go-toolsmith/astp v0.0.0-20180903215135-0af7e3c24f30/go.mod h1:SV2ur98SGypH1UjcPpCatrV5hPazG6+IfNHbkDXBRrk=
github.com/go-toolsmith/astp v1.0.0 h1:alXE75TXgcmupDsMK1fRAy0YUzLzqPVvBKoyWV+KPXg=
github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI=
github.com/go-toolsmith/pkgload v0.0.0-20181119091011-e9e65178eee8/go.mod h1:WoMrjiy4zvdS+Bg6z9jZH82QXwkcgCBX6nOfnmdaHks=
github.com/go-toolsmith/pkgload v1.0.0 h1:4DFWWMXVfbcN5So1sBNW9+yeiMqLFGl1wFLTL5R0Tgg=
github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc=
github.com/go-toolsmith/strparse v1.0.0 h1:Vcw78DnpCAKlM20kSbAyO4mPfJn/lyYA4BJUDxe2Jb4=
github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8=
github.com/go-toolsmith/typep v1.0.0 h1:zKymWyA1TRYvqYrYDrfEMZULyrhcnGY3x7LDKU2XQaA=
github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU=
github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI=
github.com/gobuffalo/envy v1.8.1/go.mod h1:FurDp9+EDPE4aIUS3ZLyD+7/9fpx7YRt/ukY6jIHf0w=
github.com/gobuffalo/logger v1.0.0/go.mod h1:2zbswyIUa45I+c+FLXuWl9zSWEiVuthsk8ze5s8JvPs=
github.com/gobuffalo/packd v0.3.0/go.mod h1:zC7QkmNkYVGKPw4tHpBQ+ml7W/3tIebgeo1b36chA3Q=
github.com/gobuffalo/packr v1.30.1/go.mod h1:ljMyFO2EcrnzsHsN99cvbq055Y9OhRrIaviy289eRuk=
github.com/gobuffalo/packr/v2 v2.5.1/go.mod h1:8f9c96ITobJlPzI44jj+4tHnEKNt0xXWSVlXRN9X1Iw=
github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4=
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls=
github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef h1:veQD95Isof8w9/WXiA+pa3tz3fJXkt5B7QaRBrM62gk=
github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/mock v1.0.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/mock v1.3.1 h1:qGJ6qTW+x6xX/my+8YUVl4WNpX9B7+/l2tRsHGZ7f2s=
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 h1:23T5iq8rbUYlhpt5DB4XJkc6BU31uODLD1o1gKvZmD0=
github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4=
github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a h1:w8hkcTqaFpzKqonE9uMCefW1WDie15eSP/4MssdenaM=
github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk=
github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6 h1:YYWNAGTKWhKpcLLt7aSj/odlKrSrelQwlovBpDuf19w=
github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6/go.mod h1:DbHgvLiFKX1Sh2T1w8Q/h4NAI8MHIpzCdnBUDTXU3I0=
github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613 h1:9kfjN3AdxcbsZBf8NjltjWihK2QfBBBZuv91cMFfDHw=
github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8=
github.com/golangci/go-tools v0.0.0-20190318055746-e32c54105b7c h1:/7detzz5stiXWPzkTlPTzkBEIIE4WGpppBJYjKqBiPI=
github.com/golangci/go-tools v0.0.0-20190318055746-e32c54105b7c/go.mod h1:unzUULGw35sjyOYjUt0jMTXqHlZPpPc6e+xfO4cd6mM=
github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3 h1:pe9JHs3cHHDQgOFXJJdYkK6fLz2PWyYtP4hthoCMvs8=
github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3/go.mod h1:JXrF4TWy4tXYn62/9x8Wm/K/dm06p8tCKwFRDPZG/1o=
github.com/golangci/gocyclo v0.0.0-20180528134321-2becd97e67ee h1:J2XAy40+7yz70uaOiMbNnluTg7gyQhtGqLQncQh+4J8=
github.com/golangci/gocyclo v0.0.0-20180528134321-2becd97e67ee/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU=
github.com/golangci/gofmt v0.0.0-20181222123516-0b8337e80d98 h1:0OkFarm1Zy2CjCiDKfK9XHgmc2wbDlRMD2hD8anAJHU=
github.com/golangci/gofmt v0.0.0-20181222123516-0b8337e80d98/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU=
github.com/golangci/golangci-lint v1.17.2-0.20190910081718-bad04bb7378f h1:Ocb3mZ76SbwTM6VKfiMPEppkwzitinZFRW9E6zAD5qc=
github.com/golangci/golangci-lint v1.17.2-0.20190910081718-bad04bb7378f/go.mod h1:kaqo8l0OZKYPtjNmG4z4HrWLgcYNIJ9B9q3LWri9uLg=
github.com/golangci/gosec v0.0.0-20190211064107-66fb7fc33547 h1:fUdgm/BdKvwOHxg5AhNbkNRp2mSy8sxTXyBVs/laQHo=
github.com/golangci/gosec v0.0.0-20190211064107-66fb7fc33547/go.mod h1:0qUabqiIQgfmlAmulqxyiGkkyF6/tOGSnY2cnPVwrzU=
github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc h1:gLLhTLMk2/SutryVJ6D4VZCU3CUqr8YloG7FPIBWFpI=
github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc/go.mod h1:e5tpTHCfVze+7EpLEozzMB3eafxo2KT5veNg1k6byQU=
github.com/golangci/lint-1 v0.0.0-20190420132249-ee948d087217 h1:En/tZdwhAn0JNwLuXzP3k2RVtMqMmOEK7Yu/g3tmtJE=
github.com/golangci/lint-1 v0.0.0-20190420132249-ee948d087217/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg=
github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca h1:kNY3/svz5T29MYHubXix4aDDuE3RWHkPvopM/EDv/MA=
github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o=
github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770 h1:EL/O5HGrF7Jaq0yNhBLucz9hTuRzj2LdwGBOaENgxIk=
github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA=
github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21 h1:leSNB7iYzLYSSx3J/s5sVf4Drkc68W2wm4Ixh/mr0us=
github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21/go.mod h1:tf5+bzsHdTM0bsB7+8mt0GUMvjCgwLpTapNZHU8AajI=
github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0 h1:HVfrLniijszjS1aiNg8JbBMO2+E1WIQ+j/gL4SQqGPg=
github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4=
github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 h1:zwtduBRr5SSWhqsYNgcuWO2kFlpdOZbP0+yRjmvPGys=
github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ=
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo=
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/certificate-transparency-go v1.1.0 h1:10MlrYzh5wfkToxWI4yJzffsxLfxcEDlOATMx/V9Kzw=
github.com/google/certificate-transparency-go v1.1.0/go.mod h1:i+Q7XY+ArBveOUT36jiHGfuSK1fHICIg6sUkRxPAbCs=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4=
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
github.com/google/monologue v0.0.0-20190606152607-4b11a32b5934 h1:0+3qDY6030dpAiEdmBqIsz3lg2SgXAvPEEq2sjm5UBk=
github.com/google/monologue v0.0.0-20190606152607-4b11a32b5934/go.mod h1:6NTfaQoUpg5QmPsCUWLR3ig33FHrKXhTtWzF0DVdmuk=
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/trillian v1.2.2-0.20190612132142-05461f4df60a/go.mod h1:YPmUVn5NGwgnDUgqlVyFGMTgaWlnSvH7W5p+NdOG8UA=
github.com/google/trillian-examples v0.0.0-20190603134952-4e75ba15216c/go.mod h1:WgL3XZ3pA8/9cm7yxqWrZE6iZkESB2ItGxy5Fo6k2lk=
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q=
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3 h1:JVnpOZS+qxli+rgVl98ILOXVNbW+kb5wcxeGx8ShUIw=
github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE=
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0 h1:Iju5GlWwrvL6UBg4zJJt3btmonfrMlCDdsejg4CZE7c=
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho=
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
github.com/grpc-ecosystem/grpc-gateway v1.13.0 h1:sBDQoHXrOlfPobnKw69FIKa1wg9qsLLvvQ/Y19WtFgI=
github.com/grpc-ecosystem/grpc-gateway v1.13.0/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c=
github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I=
github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE=
github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
github.com/hashicorp/go-version v1.2.0 h1:3vNe/fWF5CBgRIguda1meWhsZHy3m8gCJ5wx+dIzX/E=
github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/hcl v0.0.0-20180404174102-ef8a98b0bbce/go.mod h1:oZtUIOe8dh44I2q6ScRibXws4Ajl+d+nod3AaR9vL5w=
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
github.com/hyperledger/fabric v1.4.6 h1:XnTMm3o6NM3BVCN85ZeO6PgaFwmcKH+dKsahaPFfZUY=
github.com/hyperledger/fabric v1.4.6/go.mod h1:tGFAOCT696D3rG0Vofd2dyWYLySHlh0aQjf7Q1HAju0=
github.com/hyperledger/fabric-amcl v0.0.0-20200128223036-d1aa2665426a h1:HgdNn3UYz8PdcZrLEk0IsSU4LRHp7yY2rgjIKcSiJaA=
github.com/hyperledger/fabric-amcl v0.0.0-20200128223036-d1aa2665426a/go.mod h1:X+DIyUsaTmalOpmpQfIvFZjKHQedrURQ5t4YqquX7lE=
github.com/hyperledger/fabric-lib-go v1.0.0 h1:UL1w7c9LvHZUSkIvHTDGklxFv2kTeva1QI2emOVc324=
github.com/hyperledger/fabric-lib-go v1.0.0/go.mod h1:H362nMlunurmHwkYqR5uHL2UDWbQdbfz74n8kbCFsqc=
github.com/hyperledger/fabric-sdk-go v1.0.0-alpha5 h1:gc6CVOAM6Br4HMfs3N6ZSK9bJdZo4zhiEbrYS8fqVwA=
github.com/hyperledger/fabric-sdk-go v1.0.0-alpha5/go.mod h1:kqYuM7jCDf1BbXWgbWaevpnlhDii5i4TkGXhfib2epU=
github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
github.com/jcmturner/gofork v1.0.0 h1:J7uCkflzTEhUZ64xqKnkDxq3kzc96ajM1Gli5ktUem8=
github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o=
github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869 h1:IPJ3dvxmJ4uczJe5YQdrYB16oTJlGSC/OyZDqUk9xX4=
github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869/go.mod h1:cJ6Cj7dQo+O6GJNiMx+Pa94qKj+TG8ONdKHgMNIyyag=
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo=
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
github.com/json-iterator/go v1.1.6 h1:MrUvLMLTMxbqFJ9kzlvat/rYZqZnW3u4wkLzWTaFwKs=
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
github.com/juju/ratelimit v1.0.1/go.mod h1:qapgC/Gy+xNh9UxzV13HGGl/6UXNN+ct+vwSgWNm/qk=
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
github.com/karrick/godirwalk v1.10.12/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA=
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
github.com/kisielk/gotool v0.0.0-20161130080628-0de1eaf82fa3/go.mod h1:jxZFDH7ILpTPQTk+E2s+z4CUas9lVNjIuKR4c5/zKgM=
github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
github.com/klauspost/compress v1.9.8 h1:VMAMUUOh+gaxKTMk+zqbjsSjsIcUcL/LF4o63i82QyA=
github.com/klauspost/compress v1.9.8/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
github.com/klauspost/cpuid v0.0.0-20180405133222-e7e905edc00e/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s=
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 h1:T+h1c/A9Gawja4Y9mFVWj2vyii2bbUNDw3kt9VxK2EY=
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs=
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc h1:RKf14vYWi2ttpEmkA4aQ3j4u9dStX2t4M8UM6qqNsG8=
github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc/go.mod h1:kopuH9ugFRkIXf3YoqHKyrJ9YfUFsckUU9S7B+XP+is=
github.com/lestrrat-go/file-rotatelogs v2.2.0+incompatible h1:eXEwY0f2h6mcobdAxm4VRSWds4tqmlLdUqxu8ybiEEA=
github.com/lestrrat-go/file-rotatelogs v2.2.0+incompatible/go.mod h1:ZQnN8lSECaebrkQytbHj4xNgtg8CR7RYXnPok8e0EHA=
github.com/lestrrat-go/strftime v1.0.0 h1:wZIfTHGdu7TeGu318uLJwuQvTMt9UpRyS+XV2Rc4wo4=
github.com/lestrrat-go/strftime v1.0.0/go.mod h1:E1nN3pCbtMSu1yjSVeyuRFVm/U0xoR76fd03sz+Qz4g=
github.com/letsencrypt/pkcs11key v2.0.1-0.20170608213348-396559074696+incompatible/go.mod h1:iGYXKqDXt0cpBthCHdr9ZdsQwyGlYFh/+8xa4WzIQ34=
github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4=
github.com/magiconair/properties v1.7.6/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY=
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA=
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/mattn/go-isatty v0.0.11 h1:FxPOTFNqGkuDUGi3H/qkUbQO4ZiBa2brKq5r0l8TGeM=
github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=
github.com/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y=
github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw=
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/meshplus/bitxhub-kit v0.0.0-20200329124935-585edb85ca63 h1:WDsTW19L/BEaMukcTV2VQXinXhP2n3Y5nyTKeNPC5BI=
github.com/meshplus/bitxhub-kit v0.0.0-20200329124935-585edb85ca63/go.mod h1:ra/AhOkPvpElI+wXrB9G6DjdcrdxFU3vMwA5MYKr9D0=
github.com/meshplus/bitxhub-model v0.0.0-20200329125320-a37501c7a13e h1:066IcST8gbjy4mlAYbxAi0QZ26rMZ0Wl67g3Q04+7Os=
github.com/meshplus/bitxhub-model v0.0.0-20200329125320-a37501c7a13e/go.mod h1:mJ6ucVyePaAojmQ8Y1NAS4PoZzCNxC/Q6EHC18HyMvw=
github.com/meshplus/go-bitxhub-client v0.0.0-20200329130007-318d6f4c1087/go.mod h1:u/rFcS6BbMDpgDlC0C8b8oLPKWdBDoOlt6OuACqJVc0=
github.com/miekg/pkcs11 v1.0.2/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs=
github.com/miekg/pkcs11 v1.0.3 h1:iMwmD7I5225wv84WxIG/bmxz9AXjWvTWIbM/TYHvWtw=
github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs=
github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/mitchellh/go-ps v0.0.0-20170309133038-4fdf99ab2936/go.mod h1:r1VsdOzOPt1ZSrGZWFoNhsAedKnEd6r9Np1+5blZCWk=
github.com/mitchellh/mapstructure v0.0.0-20180220230111-00c29f56e238/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8=
github.com/morikuni/aec v0.0.0-20170113033406-39771216ff4c h1:nXxl5PrvVm2L/wCy8dQu6DMTwH4oIuGN8GJDAlqDdVE=
github.com/morikuni/aec v0.0.0-20170113033406-39771216ff4c/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
github.com/mozilla/tls-observatory v0.0.0-20180409132520-8791a200eb40/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk=
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
github.com/nbutton23/zxcvbn-go v0.0.0-20160627004424-a22cb81b2ecd/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU=
github.com/nbutton23/zxcvbn-go v0.0.0-20171102151520-eafdab6b0663 h1:Ri1EhipkbhWsffPJ3IPlrb4SkTOPa2PfRXp3jchBczw=
github.com/nbutton23/zxcvbn-go v0.0.0-20171102151520-eafdab6b0663/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU=
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
github.com/olekukonko/tablewriter v0.0.1 h1:b3iUnf1v+ppJiOfNX4yxxqfWKMQPZR5yoh8urCTFX88=
github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.10.1 h1:q/mM8GF/n0shIN8SaAZ0V+jnLPzen6WIVZdiwrRlMlo=
github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/onsi/gomega v1.7.0 h1:XPnZz8VVBHjVsy1vzJmRwIcSwiUO+JFfrv/xGiigmME=
github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 h1:lDH9UUVJtmYCjyT0CI4q8xvlXPxeZ0gYCVvWbmPlp88=
github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=
github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
github.com/opencontainers/go-digest v1.0.0-rc1 h1:WzifXhOVOEOuFYOJAW6aQqW0TooG2iki3E3Ii+WN7gQ=
github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
github.com/opencontainers/image-spec v1.0.1 h1:JMemWkRwHx4Zj+fVxWoMCFm/8sYGGrUVojFA6h/TRcI=
github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
github.com/opencontainers/runc v0.1.1 h1:GlxAyO6x8rfZYN9Tt0Kti5a/cP41iuiO2yYT0IJGY8Y=
github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs=
github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc=
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
github.com/pierrec/lz4 v2.4.1+incompatible h1:mFe7ttWaflA46Mhqh+jUfjp2qTbPYxLB2/OyBppH9dg=
github.com/pierrec/lz4 v2.4.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
github.com/prometheus/client_golang v0.9.3 h1:9iH4JKXLzFbOAdtqv/a+j8aewx2Y8lAjAydhbaScPF8=
github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
github.com/prometheus/client_golang v0.9.4 h1:Y8E/JaaPbmFSW2V81Ab/d8yZFYQQGbni1b1jPcG9Y6A=
github.com/prometheus/client_golang v0.9.4/go.mod h1:oCXIBxdI62A4cR6aTRJCgetEjecSIYzOEaeAn4iYEpM=
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4 h1:gQz4mCbXsO+nc9n1hCxHcGA3Zx3Eo+UHZoInFGUIXNM=
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
github.com/prometheus/common v0.4.0 h1:7etb9YClo3a6HjLzfl6rIQaU+FDfi0VSX39io3aQ+DM=
github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
github.com/prometheus/common v0.4.1 h1:K0MGApIoQvMw27RTdJkPbr3JZ7DNbtxQNyi5STVM6Kw=
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
github.com/prometheus/procfs v0.0.5 h1:3+auTFlqw+ZaQYJARz6ArODtkaIwtvBTx3N2NehQlL8=
github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ=
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI=
github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563 h1:dY6ETXrvDG7Sa4vE8ZQG4yqWg6UnOcbqTAahkV813vQ=
github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5 h1:mZHayPoR0lNmnHyvtYjDeq0zlVHn9K/ZXoy17ylucdo=
github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5/go.mod h1:GEXHk5HgEKCvEIIrSpFI3ozzG5xOKA2DVlEX/gGnewM=
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rogpeppe/go-internal v1.3.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
github.com/rogpeppe/go-internal v1.5.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo=
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q=
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/ryanuber/go-glob v0.0.0-20170128012129-256dc444b735/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc=
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
github.com/shirou/gopsutil v0.0.0-20180427012116-c95755e4bcd7/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc=
github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e h1:MZM7FHLqUHYI0Y/mQAt3d2aYa0SiNms/hFqC9qJYolM=
github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk=
github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041 h1:llrF3Fs4018ePo4+G/HV/uQUqEI1HMDjCeOf2V6puPc=
github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ=
github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo=
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
github.com/sirupsen/logrus v1.0.5/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc=
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E=
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
github.com/sourcegraph/go-diff v0.5.1 h1:gO6i5zugwzo1RVTvgvfwCOSVegNuvnNi6bAD1QCmkHs=
github.com/sourcegraph/go-diff v0.5.1/go.mod h1:j2dHj3m8aZgQO8lMTcTnBcXkRRRqi34cd2MNlA9u1mE=
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI=
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
github.com/spf13/cast v1.2.0/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg=
github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8=
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
github.com/spf13/cobra v0.0.2/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s=
github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk=
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg=
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
github.com/spf13/viper v1.0.2/go.mod h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7SrnBM=
github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
github.com/spf13/viper v1.4.0 h1:yXHLWeravcrgGyFSyCgdYpXQ9dR9c/WED3pg1RhxqEU=
github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/sykesm/zap-logfmt v0.0.3 h1:3Wrhf7+I9JEUD8B6KPtDAr9j2jrS0/EPLy7GCE1t/+U=
github.com/sykesm/zap-logfmt v0.0.3/go.mod h1:AuBd9xQjAe3URrWT1BBDk2v2onAZHkZkWRMiYZXiZWA=
github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
github.com/syndtr/goleveldb v1.0.1-0.20190923125748-758128399b1d/go.mod h1:9OrXJhf154huy1nPWmuSrkgjPUtUNhA+Zmy+6AESzuA=
github.com/tebeka/strftime v0.1.3 h1:5HQXOqWKYRFfNyBMNVc9z5+QzuBtIXy03psIhtdJYto=
github.com/tebeka/strftime v0.1.3/go.mod h1:7wJm3dZlpr4l/oVK0t1HYIc4rMzQ2XJlOMIUJUJH6XQ=
github.com/tidwall/gjson v1.6.0/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls=
github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E=
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
github.com/timakin/bodyclose v0.0.0-20190721030226-87058b9bfcec h1:AmoEvWAO3nDx1MEcMzPh+GzOOIA5Znpv6++c7bePPY0=
github.com/timakin/bodyclose v0.0.0-20190721030226-87058b9bfcec/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk=
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 h1:LnC5Kc/wtumK+WB441p7ynQJzVuNRJiqddSIE3IlSEQ=
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce/go.mod h1:o8v6yHRoik09Xen7gje4m9ERNah1d1PPsVq1VEx9vE4=
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
github.com/ultraware/funlen v0.0.1 h1:UeC9tpM4wNWzUJfan8z9sFE4QCzjjzlCZmuJN+aOkH0=
github.com/ultraware/funlen v0.0.1/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA=
github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
github.com/urfave/cli v1.22.1 h1:+mkCCcOFKPnCmVYVcURKps1Xe+3zP90gSYGNfRkjoIY=
github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
github.com/valyala/fasthttp v1.2.0/go.mod h1:4vX61m6KN+xDduDNwXrhIAVZaZaZiQ1luJk8LWSxF3s=
github.com/valyala/quicktemplate v1.1.1/go.mod h1:EH+4AkTd43SvgIbQHYu59/cJyxDoOVRUAfrukLPuGJ4=
github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio=
github.com/wonderivan/logger v1.0.0/go.mod h1:NObMfQ3WOLKfYEZuGeZQfuQfSPE5+QNgRddVMzsAT/k=
github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I=
github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y=
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=
github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs=
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8=
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
go.etcd.io/bbolt v1.3.2 h1:Z/90sZLPOeCy2PwprqkFa25PdkusRzaj9P8zm/KNyvk=
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
go.etcd.io/etcd v3.3.13+incompatible h1:jCejD5EMnlGxFvcGRyEV4VGlENZc7oPQX6o0t7n3xbw=
go.etcd.io/etcd v3.3.13+incompatible/go.mod h1:yaeTdrJi5lOmYerz05bd8+V7KubZs8YSFZfzsF9A6aI=
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/atomic v1.5.0 h1:OI5t8sDa1Or+q8AeE+yKeB/SDYioSHAgcVljj9JIETY=
go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
go.uber.org/multierr v1.3.0 h1:sFPn2GLc3poCkfrpIXGhBD2X0CMIo4Q/zSULXrj/+uc=
go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4=
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
go.uber.org/zap v1.12.0 h1:dySoUQPFBGj6xwjmBzageVL8jGi8uxc6bEmJQjA06bw=
go.uber.org/zap v1.12.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200204104054-c9f3fb736b72/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975 h1:/Tl7pH94bvbAAHBdZJT947M/+gp0+CqQXDtMRC0fseo=
golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs=
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
golang.org/x/net v0.0.0-20200202094626-16171245cfb2 h1:CCH4IOTTfewWjGOlSp+zGcjutRKlBEZQ6wTn8ozI/nI=
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20171026204733-164713f0dfce/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8 h1:JA8d3MPx/IToSyXZG/RhwYEtfrKO1Fxrqe8KrkiLXKM=
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20170915040203-e531a2a1c15f/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20181117154741-2ddaf7f79a09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190121143147-24cd39ecf745/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190521203540-521d6ed310dd/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190624180213-70d37148ca0c/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190909030654-5b82db07426d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5 h1:hKsoRgsbwY1NafxrwTs+k64bikrLBkAgPir1TNCj3Zs=
golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
google.golang.org/api v0.5.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
google.golang.org/api v0.6.0/go.mod h1:btoxGiFvQNVUZQ8W08zLtrVS08CNpINPEfxXxgJL1Q4=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190605220351-eb0b1bdb6ae6/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s=
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c h1:hrpEMCZ2O7DR5gC1n2AJGVhrwiEjOi35+jxtIuZpTMo=
google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
google.golang.org/grpc v1.22.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA=
google.golang.org/grpc v1.25.0 h1:ItERT+UbGdX+s4u+nQNlVM/Q7cbmf7icKfvzbWqVtq0=
google.golang.org/grpc v1.25.0/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/cheggaaa/pb.v1 v1.0.28 h1:n1tBJnnK2r7g9OW2btFH91V92STTUevLXYFb8gy9EMk=
gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo=
gopkg.in/jcmturner/aescts.v1 v1.0.1 h1:cVVZBK2b1zY26haWB4vbBiZrfFQnfbTVrE3xZq6hrEw=
gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo=
gopkg.in/jcmturner/dnsutils.v1 v1.0.1 h1:cIuC1OLRGZrld+16ZJvvZxVJeKPsvd5eUIvxfoN5hSM=
gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q=
gopkg.in/jcmturner/goidentity.v3 v3.0.0 h1:1duIyWiTaYvVx3YX2CYtpJbUFd7/UuPYCfgXtQ3VTbI=
gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4=
gopkg.in/jcmturner/gokrb5.v7 v7.5.0 h1:a9tsXlIDD9SKxotJMK3niV7rPZAJeX2aD/0yg3qlIrg=
gopkg.in/jcmturner/gokrb5.v7 v7.5.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM=
gopkg.in/jcmturner/rpc.v1 v1.1.0 h1:QHIUxTX1ISuAv9dD2wJ9HWQVuWDX/Zc0PfeC2tjc4rU=
gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8=
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
gopkg.in/yaml.v2 v2.2.7 h1:VUgggvou5XRW9mHwD/yXxIYSMtY0zoKQf/v226p2nyo=
gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo=
gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM=
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk=
mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed h1:WX1yoOaKQfddO/mLzdV4wptyWgoH/6hwLs7QHTixo0I=
mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc=
mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b h1:DxJ5nJdkhDlLok9K6qO+5290kphDJbHOQO1DFFFTeBo=
mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4=
mvdan.cc/unparam v0.0.0-20190209190245-fbb59629db34 h1:duVSyluuJA+u0BnkcLR01smoLrGgDTfWt5c8ODYG8fU=
mvdan.cc/unparam v0.0.0-20190209190245-fbb59629db34/go.mod h1:H6SUd1XjIs+qQCyskXg5OFSrilMRUkD8ePJpHKDPaeY=
sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4 h1:JPJh2pk3+X4lXAkZIk2RuE/7/FoK9maXw+TNPJhVS/c=
sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0=
package main
import (
"fmt"
"time"
"github.com/hyperledger/fabric-sdk-go/pkg/client/channel"
"github.com/hyperledger/fabric/core/chaincode/shim"
"github.com/meshplus/bitxhub-model/pb"
)
func (c *Client) generateCallback(toExecute *pb.IBTP, args [][]byte, proof []byte) (result *pb.IBTP, err error) {
if toExecute == nil {
return nil, fmt.Errorf("got nil ibtp to generate receipt: %w", err)
}
pd := &pb.Payload{}
if err := pd.Unmarshal(toExecute.Payload); err != nil {
return nil, fmt.Errorf("ibtp payload unmarshal: %w", err)
}
pdb := &pb.Payload{
SrcContractId: pd.DstContractId,
DstContractId: pd.SrcContractId,
Func: pd.Callback,
Args: args,
}
b, err := pdb.Marshal()
if err != nil {
return nil, err
}
return &pb.IBTP{
From: toExecute.From,
To: toExecute.To,
Index: toExecute.Index,
Type: pb.IBTP_RECEIPT,
Timestamp: time.Now().UnixNano(),
Proof: proof,
Payload: b,
Version: toExecute.Version,
}, nil
}
func (c *Client) interchainCharge(toExecute *pb.IBTP, response channel.Response) (*pb.IBTP, error) {
pd := &pb.Payload{}
if err := pd.Unmarshal(toExecute.Payload); err != nil {
return nil, fmt.Errorf("toExecute payload unmarshal: %w", err)
}
newArgs := [][]byte{[]byte("false"), pd.Args[0]}
if response.ChaincodeStatus == shim.OK {
newArgs[0] = []byte("true")
}
newArgs = append(newArgs, pd.Args[2:]...)
newPayload := &pb.Payload{
SrcContractId: pd.DstContractId,
DstContractId: pd.SrcContractId,
Func: "interchainConfirm",
Args: newArgs,
}
logger.Info("ack ibtp is:", newPayload)
pdb, err := newPayload.Marshal()
if err != nil {
return nil, err
}
proof, err := c.getProof(response)
if err != nil {
return nil, err
}
return &pb.IBTP{
From: toExecute.From,
To: toExecute.To,
Index: toExecute.Index,
Type: pb.IBTP_RECEIPT,
Timestamp: time.Now().UnixNano(),
Proof: proof,
Payload: pdb,
Version: toExecute.Version,
}, nil
}
#!/usr/bin/env bash
set -e
source x.sh
# $1 is arch, $2 is source code path
case $1 in
linux-amd64)
print_blue "Compile for linux/amd64"
# docker pull golang:1.13
docker run -t \
-v $2/../pier:/code/pier \
-v $2:/code/pier-client-fabric \
-v ~/.ssh:/root/.ssh \
-v ~/.gitconfig:/root/.gitconfig \
-v $GOPATH/pkg/mod:$GOPATH/pkg/mod \
pier-ubuntu/compile \
/bin/bash -c "go env -w GO111MODULE=on &&
go env -w GOPROXY=https://goproxy.cn,direct &&
cd /code/pier-client-fabric &&
make fabric1.4 &&
mv /code/pier-client-fabric/build/fabric-client-1.4.so /code/pier-client-fabric/build/fabric-client-1.4-linux.so"
;;
*)
print_red "Other architectures are not supported yet"
;;
esac
RED='\033[0;31m'
GREEN='\033[0;32m'
BLUE='\033[0;34m'
NC='\033[0m'
function print_blue() {
printf "${BLUE}%s${NC}\n" "$1"
}
function print_red() {
printf "${RED}%s${NC}\n" "$1"
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment