Add configtxlator example

pull/108/head
Baohua Yang 2017-10-06 14:47:32 +08:00
parent 825a0c69d3
commit e1513fad0c
698 changed files with 2434 additions and 16834 deletions

View File

@ -45,7 +45,7 @@ ready: restart
@echo "run 'make stop' when done."
start: # bootup the fabric network
@echo "Start a fabric network with 2-org-4-peer"
@echo "Start a fabric network with ${COMPOSE_FILE}"
make clean
docker-compose -f ${COMPOSE_FILE} up -d # Start a fabric network
@ -124,6 +124,9 @@ gen_e2e: # generate e2e_cli artifacts
gen_kafka: # generate kafka artifacts
cd kafka && bash gen_artifacts.sh
configtxlator: # run configtxlator
cd kafka && bash run_configtxlator.sh
download: # download required images
@echo "Download Docker images"
docker pull yeasy/hyperledger-fabric:latest

View File

@ -1,13 +0,0 @@
#!/bin/bash
echo "Start configtxlator service and listen on port 7059"
docker run \
--rm -it \
--name configtxlator \
-p 7059:7059 \
yeasy/hyperledger-fabric \
configtxlator start
docker rm -f configtxlator

View File

@ -12,16 +12,26 @@ services:
extends:
file: docker-compose-base-dev.yaml
service: orderer.example.com
depends_on:
- kafka0
- kafka1
- kafka2
- kafka3
peer0.org1.example.com:
extends:
file: docker-compose-base-dev.yaml
service: peer0.org1.example.com
depends_on:
- orderer.example.com
cli:
extends:
file: docker-compose-base-dev.yaml
service: cli
depends_on:
- peer0.org1.example.com
- orderer.example.com
# ZooKeeper services, at least 3 nodes
zookeeper0:

View File

@ -1,276 +0,0 @@
## Usage of cryptogen and configtxgen
To bootup a fabric network, we need:
* crypto_config: crypto keys/certs for all organizations, see `e2e_cli/crypto-config`
* orderer_genesis.block: genesis block to bootup orderer, see `e2e_cli/channel-artifacts`
* channel.tx: transaction to create an application channel, see `e2e_cli/channel-artifacts`
* Org1MSPanchors.tx, Org2MSPanchors.tx: Transaction to update anchor config in Org1 and Org2, see `e2e_cli/channel-artifacts`
### Generate crypto-config using cryptogen
```bash
$ cryptogen generate --config=/etc/hyperledger/fabric/crypto-config.yaml --output ./crypto-config
```
cryptogen will read configuration from `crypto-config.yaml`, by default it was put under `/etc/hyperledger/fabric/`.
Then put the generated `crypto-config` under `/etc/hyperledger/fabric/`.
### Generate blocks/txs using [configtxgen](http://hyperledger-fabric.readthedocs.io/en/latest/configtxgen.html?highlight=crypto#)
By default, configtxgen will read configuration from `/etc/hyperledger/fabric/configtx.yaml`, Please customize the configtx.yaml file before running.
#### Create orderer genesis block
```bash
$ configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/orderer.genesis.block
```
#### Create channel transaction artifact
```bash
$ CHANNEL_NAME=businesschannel
$ configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID ${CHANNEL_NAME}
```
`channel.tx` is used for creating a new application channel `businesschannel`
#### Update anchor peer for Organizations on the channel
Choose peer peer0.org1.example.com as org1's anchor peer, and peer0.org2.example.com as org2's anchor peer.
```bash
$ configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID ${CHANNEL_NAME} -asOrg Org1MSP
```
```bash
$ configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID ${CHANNEL_NAME} -asOrg Org2MSP
```
> more details refer to Example2
### Examples
#### Example1: how to add and re-join a new channel
This example will explain how to add a new channel without change basic topology that desigend in configtx.yaml and crypto-config.yaml.
start a fabric network with `docker-compose-1peer.yaml`, and into container fabric-cli
* 1 Regenerate `channel.tx` using with new channel name
Create channel configuration for the to-be-created `testchannel`.
```bash
$ root@cli: CHANNEL_NAME=testchannel
$ root@cli: configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID ${CHANNEL_NAME}
```
* 2 regenerate anchor peer configuratoin for Organizations
```bash
$ root@cli: configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID ${CHANNEL_NAME} -asOrg Org1MSP
$ root@cli: configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID ${CHANNEL_NAME} -asOrg Org2MSP
```
* (optional)execute auto-test script
You can skip this step, this will quickly check whether the network works, and also you can verify manually.
```bash
$ root@cli: bash ./peer/scripts/test_1peer.sh testchannel
```
* 3 Create new channel
```bash
$ root@cli: peer channel create -o orderer.example.com:7050 -c ${CHANNEL_NAME} -f ./channel-artifacts/channel.tx
```
check whether genrated new block `testchannel.block`
```bash
root@cli: ls testchannel.block
testchannel.block
```
* 4 Join new channel
Join peer0.org1.example.com to the new channel
```bash
$ root@cli: peer channel join -b ${CHANNEL_NAME}.block -o orderer.example.com:7050
Peer joined the channel!
```
check whether success
```bash
$ root@cli: peer channel list
Channels peers has joined to:
testchannel
```
* 5 Update anchor peer
```bash
$ root@cli: peer channel create -o orderer.example.com:7050 -c ${CHANNEL_NAME} -f ./channel-artifacts/Org1MSPanchors.tx
```
* 6 Install
```bash
peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
```
* 7 Instantiate
```bash
root@cli: peer chaincode instantiate -o orderer.example.com:7050 -C ${CHANNEL_NAME} -n mycc -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "OR ('Org1MSP.member')"
```
* 8 Query
```bash
root@cli: peer chaincode query -C ${CHANNEL_NAME} -n mycc -c '{"Args":["query","a"]}'
```
The output should be:
```bash
Query Result: 100
UTC [main] main -> INFO 008 Exiting.....
```
#### Example2: how to add an organization or peer
This example will explain how to add a new org or peer with changed the basic topology that desigend in configtx.yaml and crypto-config.yaml.
##### all-in-one
We privide some instance in current directory, in this case we add a new organization `Org3` and new peer `peer0.org3.example.com`.
* 1 Generate necessary config and certs
```bash
$ sudo docker-compose -f docker-compose-2orgs-4peers-event.yaml up
$ docker exec -it fabric-cli bash
$ root@cli: ./scripts/add-org.sh
```
> ** notice: For docker-compose-file clean, we did not mount these in the container, you need to mount yourself.
* 2 Re-setup network
```bash
echo "clean containers...."
docker rm -f `docker ps -aq`
echo "clean images ..."
docker rmi -f `docker images|grep mycc-1.0|awk '{print $3}'`
```
```bash
$ sudo docker-compose -f docker-compose-2orgs-4peers-event.yaml up
```
* 3 execute auto-test
Throuth this script to test whether the network works.
```bash
$ root@cli: bash ./scripts/test-5-peers.sh newchannel
```
The final output may look like following
```bash
===================== Query on PEER4 on channel 'newchannel' is successful =====================
===================== All GOOD, End-2-End execution completed =====================
```
##### manually
* 1 Modify config
modify configtx.yaml, crypto-cnfig.yaml and docker-compose files to adapt new change. and replace old file.
* 2 Bootstrap network with `docker-compose-2orgs-4peers-event.yaml`
```bash
$ docker-compose -f docker-compose-2orgs-4peers-event.yaml up
```
> notes:You may encounter some errors at startup and some peers can't start up, It's innocuous, ignore it,
because we will restart later, and now we just use tools in cli container.
* 3 Generate new certificates
```bash
$ cryptogen generate --config=/etc/hyperledger/fabric/crypto-config.yaml --output ./crypto
```
* 4 Create the genesis block
```bash
root@cli: configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/orderer_genesis.block
```
* 5 Create the configuration tx
```bash
root@cli: CHANNEL_NAME=newchannel
root@cli: configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID ${CHANNEL_NAME}
```
`channel.tx` is used for generating new channel `newchannel`
* 6 Define the anchor peer for Orgs on the channel
```bash
root@cli: configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID ${CHANNEL_NAME} -asOrg Org1MSP
root@cli: configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID ${CHANNEL_NAME} -asOrg Org2MSP
root@cli: configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org3MSPanchors.tx -channelID ${CHANNEL_NAME} -asOrg Org3MSP
```
* 7 Restart network
As we have changed the configtx.yaml and regenerate `orderer_genesis.block`,
we'd better restart orderering service or all the service.
now we clean all the old service and boot a new network.
```bash
echo "clean containers...."
docker rm -f `docker ps -aq`
echo "clean images ..."
docker rmi -f `docker images|grep mycc-1.0|awk '{print $3}'`
```
```bash
$ sudo docker-compose -f docker-compose-2orgs.yml up
```
* 8 Execute auto-test script
Until this step, we complete the network re-setup, and then we will test whether it works.
```bash
$ root@cli: bash ./scripts/test-5-peers.sh
```
If the network works well. the output may looklike:
```bash
===================== All GOOD, End-2-End execution completed =====================
```

View File

@ -1,35 +0,0 @@
## Chaincode Tests
All the test command needs to be executed inside the `fabric-cli` container.
Use the following command to login into the container fabric-cli
```bash
$ docker exec -it fabric-cli bash
```
After finish the chaincode tests, you can log-out by `exit`.
### Chaincode Operations
You can execute some chaincode operations, such as `query` or `invoke`,
and you can modify the parameters and execute this script repeatedly.
```bash
$ bash ./scripts/test_4peers.sh #execute in container fabric-cli
```
You should see the following output:
```bash
UTC [msp] GetLocalMSP -> DEBU 004 Returning existing local MSP
UTC [msp] GetDefaultSigningIdentity -> DEBU 005 Obtaining default signing identity
UTC [msp/identity] Sign -> DEBU 006 Sign: plaintext: 0AB7070A6D08031A0C08C3EAE9C90510...6D7963631A0A0A0571756572790A0161
UTC [msp/identity] Sign -> DEBU 007 Sign: digest: FA308EF50C4812BADB60D58CE15C1CF41089EFB93B27D46885D92C92F55E98A0
Query Result: 80
UTC [main] main -> INFO 008 Exiting.....
===================== Query on PEER3 on channel 'businesschannel' is successful =====================
===================== All GOOD, End-2-End execution completed =====================
```

View File

@ -1,195 +0,0 @@
## Start the configtxlator
First start a fabric network with docker-compose-2orgs-4peers.yaml, and make sure the network can work,
then we will use `configtxlator` to start an http server listening on the designated port and process request.
```bash
$ docker exec -it fab-cli bash
$ configtxlator start
UTC [configtxlator] startServer -> INFO 001 Serving HTTP requests on 0.0.0.0:7059
```
This logs appears, indicating startup successful.
## Function
### translation
#### /protolator/decode/{msgName}
Any of the configuration related protos, including `common.Block`, `common.Envelope`, `common.ConfigEnvelope`,
`common.ConfigUpdateEnvelope`, `common.Configuration`, and `common.ConfigUpdate` are valid targets for these URLs.
this will produces human readable version of config, such as translate to json
Execute following command in new terminal,
```bash
$ docker exec -it fabric-cli bash
$ cd channel-artifacts
$ curl -X POST --data-binary @businesschannel_0.block http://127.0.0.1:7059/protolator/decode/common.Block > businesschannel_0.json
```
for channel.tx, use following msgType.
```bash
curl -X POST --data-binary @channel.tx http://127.0.0.1:7059/protolator/decode/common.Envelope > channel.json
```
#### /protolator/encode/{msgName}
And we can transform json to proto.
```bash
$ curl -X POST --data-binary @businesschannel_0.json http://127.0.0.1:7059/protolator/encode/common.Block > businesschannel_0.block
```
### Re-Configuration example
1. here we will introduce how to re-configuration config.block, first fetch the block and translate it to json.
```bash
$ ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
$ peer channel fetch config -o orderer.example.com:7050 -c businesschannel --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA|xargs mv true config_block.pb
$ peer channel fetch config config_block.pb -o orderer.example.com:7050 -c businesschannel # with no-tls
$ curl -X POST --data-binary @config_block.pb http://127.0.0.1:7059/protolator/decode/common.Block > config_block.json
```
2. Extract the config section from the block:
```bash
$ apt-get install jq
$ jq .data.data[0].payload.data.config config_block.json > config.json
```
3. edit the config.json, set the batch size to 11, and saving it as update_config.json
```bash
4. $ jq ".channel_group.groups.Orderer.values.BatchSize.value.max_message_count = 11" config.json > updated_config.json
```
5. Re-encode both the original config, and the updated config into proto:
```bash
$ curl -X POST --data-binary @config.json http://127.0.0.1:7059/protolator/encode/common.Config > config.pb
$ curl -X POST --data-binary @updated_config.json http://127.0.0.1:7059/protolator/encode/common.Config > updated_config.pb
```
6. send them to the configtxlator service to compute the config update which transitions between the two.
```bash
$ curl -X POST -F original=@config.pb -F updated=@updated_config.pb http://127.0.0.1:7059/configtxlator/compute/update-from-configs -F channel=businesschannel > config_update.pb
```
7. we decode the ConfigUpdate so that we may work with it as text:
```bash
$ curl -X POST --data-binary @config_update.pb http://127.0.0.1:7059/protolator/decode/common.ConfigUpdate > config_update.json
```
8. Then, we wrap it in an envelope message:
```bash
$ echo '{"payload":{"header":{"channel_header":{"channel_id":"businesschannel", "type":2}},"data":{"config_update":'$(cat config_update.json)'}}}' > config_update_as_envelope.json
```
9. Next, convert it back into the proto form of a full fledged config transaction:
```bash
$ curl -X POST --data-binary @config_update_as_envelope.json http://127.0.0.1:7059/protolator/encode/common.Envelope > config_update_as_envelope.pb
````
10. Finally, submit the config update transaction to ordering to perform a config update.
```bash
$ CORE_PEER_LOCALMSPID=OrdererMSP
$ CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/users/Admin@example.com/msp
$ peer channel update -o orderer.example.com:7050 -c businesschannel -f config_update_as_envelope.pb --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA
$ peer channel update -f config_update_as_envelope.pb -o orderer.example.com:7050 -c businesschannel # with no-tls
```
### [WIP]Add an organization
1. Execute `configtxgen` to generate `channel.tx`
```bash
$ ORDERER_GENERAL_GENESISPROFILE=SampleDevModSolo #Change this env before start ordering service.
```
```bash
$ docker exec -it fabric-cli bash
$ configtxgen -profile SampleDevModSolo -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID businesschannel
```
2. create channel use channel.tx, then we will get block businesschannel.block
```bash
$ peer channel create -o orderer.example.com:7050 -c businesschannel -f ./channel-artifacts/channel.tx
```
3. Start configtxlator
```bash
$ docker exec -it fabric-cli bash
$ configtxlator start
```
4. In a new window, decoding current genesis block
```bash
$ curl -X POST --data-binary @businesschannel.block http://127.0.0.1:7059/protolator/decode/common.Block > businesschannel.json
```
5. Extract current config
```bash
jq .data.data[0].payload.data.config businesschannel.json > config.json
```
6. generating new config
```bash
jq '. * {"channel_group":{"groups":{"Application":{"groups":{"ExampleOrg": .channel_group.groups.Application.groups.SampleOrg}}}}}' config.json |
jq '.channel_group.groups.Application.groups.ExampleOrg.values.MSP.value.config.name = "ExampleOrg"' > update_config.json
```
7. Translate config.json and update_config.json to proto
```bash
curl -X POST --data-binary @config.json http://127.0.0.1:7059/protolator/encode/common.Config > config.pb
curl -X POST --data-binary @update_config.json http://127.0.0.1:7059/protolator/encode/common.Config > update_config.pb
```
8. Computing config update
```bash
curl -X POST -F original=@config.pb -F updated=@update_config.pb http://127.0.0.1:7059/configtxlator/compute/update-from-configs -F channel=businesschannel > config_update.pb
```
9. Decoding config update
```bash
curl -X POST --data-binary @config_update.pb http://127.0.0.1:7059/protolator/decode/common.ConfigUpdate > config_update.json
```
10. Generating config update envelope
```bash
echo '{"payload":{"header":{"channel_header":{"channel_id":"businesschannel", "type":2}},"data":{"config_update":'$(cat config_update.json)'}}}' > config_update_in_envelope.json
```
11. Next, convert it back into the proto form of a full fledged config transaction:
```bash
curl -X POST --data-binary @config_update_in_envelope.json http://127.0.0.1:7059/protolator/encode/common.Envelope > config_update_in_envelope.pb
```
12. Sending config update to channel
```bash
$ CORE_PEER_LOCALMSPID=OrdererMSP
$ CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/users/Admin@example.com/msp
$ peer channel update -o orderer.example.com:7050 -c businesschannel -f config_update_in_envelope.pb --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA
$ (optional)peer channel update -f config_update_as_envelope.pb -o orderer.example.com:7050 -c businesschannel # with no-tls
```

View File

@ -1,32 +0,0 @@
### Start network with CouchDB
```bash
docker-compose -f docker-compose-2orgs-4peers.yaml -f docker-compose-2orgs-4peers-couchdb.yaml up
```
To use CouchDB instead of the default database leveldb, The same chaincode functions are available with CouchDB, however, there is the
added ability to perform rich and complex queries against the state database
data content contingent upon the chaincode data being modeled as JSON
### Test chaincode_example02
```bash
docker exec -it fabric-cli bash
bash ./scripts/initialize.sh
bash ./scripts/test_4peers.sh
```
You can use chaincode_example02 chaincode against the CouchDB state database
using the steps outlined above, however in order to exercise the CouchDB query
capabilities you will need to use a chaincode that has data modeled as JSON.
(e.g. marbles02)
### [WIP] [Test example marbles02](https://github.com/hyperledger/fabric/blob/master/examples/chaincode/go/marbles02/marbles_chaincode.go)
### Interact with CouchDb by WEB-UI
The browser is `http://localhost:5984/_utils`, then you will find a database named `businesschannel`

View File

@ -1,122 +0,0 @@
## Use default channel
By default, all the peer will join the default chain of `testchainid`.
```bash
$ docker exec -it fabric-cli bash
$ peer channel list
Channels peers has joined to:
testchainid
UTC [main] main -> INFO 001 Exiting.....
```
After the cluster is synced successfully, you can validate by install/instantiate, invoking or querying chaincode from the container or from the host.
### install&instantiate
Use `docker exec -it fabric-cli bash` to open a bash inside container `fabric-cli`, which will accept our chaincode testing commands of `install&instantiate`, `invoke` and `query`.
Inside the container, run the following command to install a new chaincode of the example02. The chaincode will initialize two accounts: `a` and `b`, with value of `100` and `200`.
```bash
$ peer chaincode install -v 1.0 -n test_cc -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
```
This will take a while, and the result may look like following.
```bash
[golang-platform] writeGopathSrc -> INFO 001 rootDirectory = /go/src
container] WriteFolderToTarPackage -> INFO 002 rootDirectory = /go/src
[main] main -> INFO 003 Exiting.....
```
Then instantiate the chaincode test_cc on defaule channel testchainid.
```bash
$ peer chaincode instantiate -v 1.0 -n test_cc -c '{"Args":["init","a","100","b","200"]}' -o orderer0:7050
```
This will take a while, and the result may look like following:
```bash
UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 001 Using default escc
UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 002 Using default vscc
UTC [main] main -> INFO 003 Exiting.....
```
There should be no error in the return log, and in the peer nodes's output.
Wait several seconds till the deploy is finished.
If the `peer chaincode install` and `peer chaincode instantiate` commands are executed successfully, there will generate a new chaincode container, besides the 4 existing one, name like `dev-peer0-test_cc-1.0`.
```bash
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cf7bf529f214 dev-peer0-test_cc-1.0 "chaincode -peer.a..." 58 seconds ago Up 58 seconds dev-peer0-test_cc-1.0
44b6870b0802 hyperledger/fabric-peer "bash -c 'while tr..." 14 minutes ago Up 14 minutes 7050-7059/tcp fabric-cli
ed2c4927c0ed hyperledger/fabric-peer "peer node start -..." 14 minutes ago Up 14 minutes 7050/tcp, 7052-7059/tcp, 0.0.0.0:7051->7051/tcp fabric-peer0
af5ba8f213bb hyperledger/fabric-orderer "orderer" 14 minutes ago Up 14 minutes 0.0.0.0:7050->7050/tcp fabric-orderer0
bbe31b98445f hyperledger/fabric-ca "fabric-ca-server ..." 14 minutes ago Up 14 minutes 7054/tcp, 0.0.0.0:7054->7054/tcp fabric-ca
```
And will also generate a new chaincode image, name like `dev-peer0-test_cc-1.0`.
```bash
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
dev-peer0-test_cc-1.0 latest 84e5422eead5 About a minute ago 176 MB
...
```
### Query
Inside the container, query the existing value of `a` and `b`.
*Notice that the query method can be called by invoke a transaction.*
```bash
$ peer chaincode query -n test_cc -c '{"Args":["query","a"]}'
```
The final output may look like the following, with a payload value of `100`.
```bash
Query Result: 100
[main] main -> INFO 001 Exiting.....
```
Query the value of `b`
```bash
$ peer chaincode query -n test_cc -c '{"Args":["query","b"]}' -o orderer0:7050
```
The final output may look like the following, with a payload value of `200`.
```bash
Query Result: 200
[main] main -> INFO 001 Exiting.....
```
### Invoke
Inside the container, invoke a transaction to transfer `10` from `a` to `b`.
```bash
$ peer chaincode invoke -n test_cc -c '{"Args":["invoke","a","b","10"]}' -o orderer0:7050
```
The final result may look like the following, the response should be `OK`.
```bash
[chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Invoke result: version:1 response:<status:200 message:"OK" > payload:"\n \215\263\337\322u\323?\242t$s\035l\270Ta\270\270+l6\322X\346\365k\020\215Phy\260\022C\n<\002\004lccc\001\007test_cc\004\001\001\001\001\000\000\007test_cc\002\001a\004\001\001\001\001\001b\004\001\001\001\001\002\001a\000\00290\001b\000\003210\000\032\003\010\310\001" endorsement:<endorser:"\n\007DEFAULT\022\232\007-----BEGIN -----\nMIICjDCCAjKgAwIBAgIUBEVwsSx0TmqdbzNwleNBBzoIT0wwCgYIKoZIzj0EAwIw\nfzELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNh\nbiBGcmFuY2lzY28xHzAdBgNVBAoTFkludGVybmV0IFdpZGdldHMsIEluYy4xDDAK\nBgNVBAsTA1dXVzEUMBIGA1UEAxMLZXhhbXBsZS5jb20wHhcNMTYxMTExMTcwNzAw\nWhcNMTcxMTExMTcwNzAwWjBjMQswCQYDVQQGEwJVUzEXMBUGA1UECBMOTm9ydGgg\nQ2Fyb2xpbmExEDAOBgNVBAcTB1JhbGVpZ2gxGzAZBgNVBAoTEkh5cGVybGVkZ2Vy\nIEZhYnJpYzEMMAoGA1UECxMDQ09QMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\nHBuKsAO43hs4JGpFfiGMkB/xsILTsOvmN2WmwpsPHZNL6w8HWe3xCPQtdG/XJJvZ\n+C756KEsUBM3yw5PTfku8qOBpzCBpDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYw\nFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFOFC\ndcUZ4es3ltiCgAVDoyLfVpPIMB8GA1UdIwQYMBaAFBdnQj2qnoI/xMUdn1vDmdG1\nnEgQMCUGA1UdEQQeMByCCm15aG9zdC5jb22CDnd3dy5teWhvc3QuY29tMAoGCCqG\nSM49BAMCA0gAMEUCIDf9Hbl4xn3z4EwNKmilM9lX2Fq4jWpAaRVB97OmVEeyAiEA\n25aDPQHGGq2AvhKT0wvt08cX1GTGCIbfmuLpMwKQj38=\n-----END -----\n" signature:"0E\002!\000\271\232\230\261\336\352ow\021V3\224\252\217\362vzM'\213\376@2\306/\201=\213\023\244\310%\002 \014\277\362|\223\342\277Pk5(\004\331\014\021\307\273\351/]:\020\232\013d\261\035+\266\265\305<" >
[main] main -> INFO 002 Exiting.....
```
### Query
Query again the existing value of `a` and `b`.
```bash
$ peer chaincode query -n test_cc -c '{"Args":["query","a"]}'
```
The new value of `a` should be 90.
```bash
$ peer chaincode query -n test_cc -c '{"Args":["query","b"]}'
```
The new value of `b` should be 210.

View File

@ -1,221 +0,0 @@
### Explain 1-peer usage step by step
This section will show you how to operate the chaincode in detail.
first start fabric network with `docker-compose-1peer.yaml`, and we will obtain the basic environmet that can be operated.
```bash
$ docker-compose -f docker-compose-1peer.yaml up
```
There will be 4 containers running successfully.
```bash
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6688f290a9b9 hyperledger/fabric-peer "bash -c 'while tr..." About a minute ago Up About a minute 7050-7059/tcp fabric-cli
6ddbbd972ac3 hyperledger/fabric-peer "peer node start -..." About a minute ago Up About a minute 7050/tcp, 0.0.0.0:7051->7051/tcp, 7052/tcp, 7054-7059/tcp, 0.0.0.0:7053->7053/tcp peer0.org1.example.com
4afc759e0dc9 hyperledger/fabric-orderer "orderer" About a minute ago Up About a minute 0.0.0.0:7050->7050/tcp orderer.example.com
bea1154c7162 hyperledger/fabric-ca "fabric-ca-server ..." About a minute ago Up About a minute 7054/tcp, 0.0.0.0:7054->7054/tcp fabric-ca
```
#### Create artifacts
**This step can be safely skipped.**.
As we already put the needed artifacts `orderer.genesis.block` and `channel.tx` under `e2e_cli/channel-artifacts/`.
Detailed steps in [GenerateArtifacts](artifacts_generation.md) explains the creation of `orderer.genesis.block` (needed by orderering service) and `channel.tx` (needed by cli to create new channel) and crypto related configuration files.
#### Create new channel
Create a new channel named `mychannel` with the existing `channel.tx` file.
```bash
$ docker exec -it fabric-cli bash
```
Into the container and execute following commands:
```bash
$ CHANNEL_NAME="businesschannel"
$ peer channel create -o orderer.example.com:7050 -c ${CHANNEL_NAME} -f ./channel-artifacts/channel.tx
```
The cmd will return lots of info, which is the content of the configuration block.
And a block with the same name of the channel will be created locally.
```bash
$ ls businesschannel.block
businesschannel.block
```
Check the log output of `orderer.example.com`, should find some message like
```bash
orderer.example.com | UTC [orderer/multichain] newChain -> INFO 004 Created and starting new chain newchannel
```
#### Join the channel
Use the following command to join `peer0.org1.example.com` the channel
```bash
$ peer channel join -b ${CHANNEL_NAME}.block
Peer joined the channel!
```
Will receive the `Peer joined the channel!` response if succeed.
Then use the following command, we will find the channels that peers joined.
```bash
$ peer channel list
Channels peers has joined to:
mychannel
2017-04-11 03:44:40.313 UTC [main] main -> INFO 001 Exiting.....
```
#### Update anchor peers
The `configtx.yaml` file contains the definitions for our sample network and presents the topology of the network components - three members (OrdererOrg, Org1 & Org2), But in this MVE, we just use OrdererOrg and Org1, org1 has only peer(pee0.org1), and chose it as anchor peers for Org1.
```bash
$ peer channel create -o orderer.example.com:7050 -c ${CHANNEL_NAME} -f ./channel-artifacts/Org1MSPanchors.tx
```
#### Install&Instantiate
First `install` a chaincode named `mycc` to `peer0`.
```bash
$ peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
```
This will take a while, and the result may look like following.
```bash
UTC [golang-platform] writeGopathSrc -> INFO 004 rootDirectory = /go/src
UTC [container] WriteFolderToTarPackage -> INFO 005 rootDirectory = /go/src
UTC [main] main -> INFO 006 Exiting.....
```
Then `instantiate` the chaincode mycc on channel `mychannel`, with initial args and the endorsement policy.
```bash
$ peer chaincode instantiate -o orderer.example.com:7050 -C ${CHANNEL_NAME} -n mycc -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "OR ('Org1MSP.member')"
```
This will take a while, and the result may look like following:
```bash
UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 004 Using default escc
UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 005 Using default vscc
UTC [main] main -> INFO 006 Exiting.....
```
Now in the system, there will be a new `dev-peer0.org1.example.com-mycc-1.0` image and a `dev-peer0.org1.example.com-mycc-1.0` chaincode container.
```bash
crluser@baas-test2:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7aa088c76597 dev-peer0.org1.example.com-mycc-1.0 "chaincode -peer.a..." 10 seconds ago Up 9 seconds dev-peer0.org1.example.com-mycc-1.0
eb1d9c73b26b hyperledger/fabric-peer "bash -c 'while tr..." About a minute ago Up About a minute 7050-7059/tcp fabric-cli
2d6fd4f61e2b hyperledger/fabric-peer "peer node start -..." About a minute ago Up About a minute 7050/tcp, 0.0.0.0:7051->7051/tcp, 7052/tcp, 7054-7059/tcp, 0.0.0.0:7053->7053/tcp peer0.org1.example.com
832dcc64cc1b hyperledger/fabric-orderer "orderer" About a minute ago Up About a minute 0.0.0.0:7050->7050/tcp orderer.example.com
c87095528f76 hyperledger/fabric-ca "fabric-ca-server ..." About a minute ago Up About a minute 7054/tcp, 0.0.0.0:7054->7054/tcp fabric-ca
```
#### Query
Query the existing value of `a` and `b`.
```bash
$ peer chaincode query -C ${CHANNEL_NAME} -n mycc -c '{"Args":["query","a"]}'
```
The result may look like following, with a payload value of `100`.
```bash
Query Result: 100
[main] main -> INFO 001 Exiting.....
```
```bash
$ peer chaincode query -C ${CHANNEL_NAME} -n mycc -c '{"Args":["query","a"]}'
```
The result may look like following, with a payload value of `200`.
```bash
Query Result: 200
[main] main -> INFO 001 Exiting.....
```
#### Invoke
Inside the container, invoke a transaction to transfer `10` from `a` to `b`.
```bash
$ peer chaincode invoke -o orderer.example.com:7050 -C ${CHANNEL_NAME} -n mycc -c '{"Args":["invoke","a","b","10"]}'
```
The result may look like following:
```bash
UTC [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Invoke result: version:1 response:<status:200 message:"OK" > payload:"\n qm\251\207\312\277\256\261b\317:\300\000\014\203`\005\304\254\304,$a\360\327\010\342\342/y]\323\022X\nQ\022\031\n\004lccc\022\021\n\017\n\007test_cc\022\004\010\001\020\001\0224\n\007test_cc\022)\n\t\n\001a\022\004\010\001\020\001\n\t\n\001b\022\004\010\001\020\001\032\007\n\001a\032\00290\032\010\n\001b\032\003210\032\003\010\310\001" endorsement:<endorser:"\n\007Org0MSP\022\210\004-----BEGIN -----\nMIIBYzCCAQmgAwIBAwICA+gwCgYIKoZIzj0EAwIwEzERMA8GA1UEAwwIcGVlck9y\nZzAwHhcNMTcwMjIwMTkwNjExWhcNMTgwMjIwMTkwNjExWjAQMQ4wDAYDVQQDDAVw\nZWVyMDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABEF6dfqjqfbIgZuOR+dgoJMl\n/FaUlGI70A/ixmVUY83Yp4YtV3FDBSOPiO5O+s8pHnpbwB1LqhrxAx1Plr0M/UWj\nUDBOMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFBY2bc84vLEwkX1fSAER2p48jJXw\nMB8GA1UdIwQYMBaAFFQzuQR1RZP/Qn/BNDtGSa8n4eN/MAoGCCqGSM49BAMCA0gA\nMEUCIQDeDZ71L+OTYcbbqiDNRf0L8OExO59mH1O3xpdwMAM0MgIgXySG4sv9yV31\nWcWRFfRFyu7o3T72kqiLZ1nkDuJ8jWI=\n-----END -----\n" signature:"0E\002!\000\220M'\245\230do\310>\277\251j\021$\250\237H\353\377\331:\230\362n\216\224~\033\240\006\367%\002 \014\240|h\346\250\356\372\353\301;#\372\027\276!\252F\334/\221\210\254\215\363\235\341v\217\236\274<" >
2017-04-06 09:47:15.993 UTC [main] main -> INFO 002 Exiting.....
```
#### Query
And then query the value of `a` and `b`.
```bash
$ peer chaincode query -C ${CHANNEL_NAME} -n mycc -c '{"Args":["query","a"]}'
```
```bash
Query Result: 90
[main] main -> INFO 001 Exiting.....
```
The value of `a` should be `90`.
```bash
$ peer chaincode query -C ${CHANNEL_NAME} -n mycc -c '{"Args":["query","b"]}'
```
The value of `b` should be `210`
```bash
Query Result: 210
[main] main -> INFO 001 Exiting.....
```
Finally, the output of the chaincode containers may look like following.
```bash
$ docker logs -f dev-peer0.org1.example.com-mycc-1.0
ex02 Init
Aval = 100, Bval = 200
ex02 Invoke
Query Response:{"Name":"a","Amount":"100"}
ex02 Invoke
Aval = 90, Bval = 210
ex02 Invoke
Query Response:{"Name":"b","Amount":"210"}
ex02 Invoke
Query Response:{"Name":"a","Amount":"90"}
```
#### (optional) All-in-one testing operation
Run this script will check whether the MVE bootstrap success.
```bash
$ docker exec -it fabric-cli bash
$ bash ./scripts/test_1peer.sh
```

View File

@ -1,33 +0,0 @@
## Events
Events didn't support TLS, so make sure TLS has been disabled by setting *_TLS_ENABLED=false in peer-base.yaml and orderer-base.yaml
Next, start the network with following command:
```bash
$ bash scripts/start_fabric.sh docker-compose-2orgs-4peers-event.yaml
```
when the network starts successfully, we started a block-listener in container `fabric-event-listener`.
so observe the output of the service fabric-event-listener.
Listening logs at a new terminal,
```bash
$ docker logs -f fabric-event-listener
```
So when we do chaincode operations in container `fabric-cli`,
```bash
$ docker exec -it fabric-cli bash
$ bash ./scripts/initialize.sh
```
then we will get some events at listening terminal looks like following:
```bash
Received block
--------------
Received transaction from channel businesschannel:
[header:<channel_header:"\010\003\032\014\010\305\326\216\312\005\020\371\326\244\314\003\"\017businesschannel*@
633caf1cd9796d49a58898c873bd10055867113f4eeb051a057acbce7df0ed59:\010\022\006\022\004lscc"
signature_header:"\n\250\006\n\007Org2MSP\022\234\006-----BEGIN...
```

View File

@ -1,37 +0,0 @@
## peer channel fetch
### Under no-tls
When you set *TLS_ENABLED=false, then you can fetch blocks using following command:
```bash
$ NUM= the block's num you want to fetch
$ peer channel fetch $NUM -o orderer.example.com:7050 -c businesschannel
```
or you can use self-defined file, such as:
```bash
$ peer channel fetch $NUM self-define-file.block -o orderer.example.com:7050 -c businesschannel
```
For example, we `install` 4 times, and `invoke` 2 times, so we have 6 blocks in total, and we put it into `/e2e_cli/channel-artifacts`.
you can also use following command to fetch blocks:
```bash
$ peer channel fetch oldest -o orderer.example.com:7050 -c businesschannel
$ peer channel fetch newest -o orderer.example.com:7050 -c businesschannel
```
### Under tls
When you set *TLS_ENABLED=true, then you can fetch blocks using following command:
```bash
$ ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
$ NUM= the block's num you want to fetch
$ peer channel fetch $NUM -o orderer.example.com:7050 -c businesschannel --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA |xargs mv true businesschannel_$NUM.block
$ peer channel fetch oldest -o orderer.example.com:7050 -c businesschannel --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA |xargs mv true businesschannel_oldest.block
$ peer channel fetch newest -o orderer.example.com:7050 -c businesschannel --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA |xargs mv true businesschannel_newest.block
```
temporarily cannot support specify self-defined-file.

View File

@ -1,21 +0,0 @@
## Manually Setup
### Install Docker/Docker-Compose
```sh
$ bash scripts/setup_Docker.sh # Install Docker, Docker-Compose
```
### Download Images
Pull necessary images of peer, orderer, ca, and base image. You may optionally run the clean_env.sh script to remove all existing container and images.
```sh
$ bash scripts/cleanup_env.sh
$ bash scripts/download_images.sh
```
There are also some community [images](https://hub.docker.com/r/hyperledger/) at Dockerhub, use at your own choice.
Now you can try [chaincode test](chaincode_test.md) operations with the bootup fabric network.

View File

@ -1,10 +0,0 @@
## Instantiate chaincode in two channel using same chaincode
## The usage of `peer upgrade` and the diffrence between `peer instantiate`
## Check the results when a new peer joins a channel that has completed some chaincode opreations
## What happens if the organization joins a channel that does not belong to it

View File

@ -1,135 +0,0 @@
# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
version: '2'
services:
zookeeper:
image: hyperledger/fabric-zookeeper
restart: always
ports:
- '2181'
- '2888'
- '3888'
kafka:
image: hyperledger/fabric-kafka
restart: always
environment:
- KAFKA_MESSAGE_MAX_BYTES=103809024 # 99 * 1024 * 1024 B
- KAFKA_REPLICA_FETCH_MAX_BYTES=103809024 # 99 * 1024 * 1024 B
- KAFKA_UNCLEAN_LEADER_ELECTION_ENABLE=false
ports:
- '9092'
orderer.example.com:
container_name: orderer.example.com
image: hyperledger/fabric-orderer
environment:
- ORDERER_GENERAL_LOGLEVEL=debug
- ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
- ORDERER_GENERAL_GENESISMETHOD=file
- ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/orderer.genesis.block
- ORDERER_GENERAL_LOCALMSPID=OrdererMSP
- ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp
# enabled TLS
- ORDERER_GENERAL_TLS_ENABLED=true
- ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key
- ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/orderer/tls/server.crt
- ORDERER_GENERAL_TLS_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]
- ORDERER_KAFKA_RETRY_SHORTINTERVAL=1s
- ORDERER_KAFKA_RETRY_SHORTTOTAL=30s
- ORDERER_KAFKA_VERBOSE=true
working_dir: /opt/gopath/src/github.com/hyperledger/fabric
command: orderer
volumes:
- ../channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block
- ../crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp:/var/hyperledger/orderer/msp
- ../crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/:/var/hyperledger/orderer/tls
ports:
- 7050:7050
peer0.org1.example.com:
container_name: peer0.org1.example.com
extends:
file: peer-base.yaml
service: peer-base
environment:
- CORE_PEER_ID=peer0.org1.example.com
- CORE_PEER_ADDRESS=peer0.org1.example.com:7051
- CORE_PEER_CHAINCODELISTENADDRESS=peer0.org1.example.com:7052
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org1.example.com:7051
- CORE_PEER_LOCALMSPID=Org1MSP
volumes:
- /var/run/:/host/var/run/
- ../crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp:/etc/hyperledger/fabric/msp
- ../crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls:/etc/hyperledger/fabric/tls
ports:
- 7051:7051
- 7052:7052
- 7053:7053
peer1.org1.example.com:
container_name: peer1.org1.example.com
extends:
file: peer-base.yaml
service: peer-base
environment:
- CORE_PEER_ID=peer1.org1.example.com
- CORE_PEER_ADDRESS=peer1.org1.example.com:7051
- CORE_PEER_CHAINCODELISTENADDRESS=peer1.org1.example.com:7052
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.org1.example.com:7051
- CORE_PEER_GOSSIP_BOOTSTRAP=peer0.org1.example.com:7051
- CORE_PEER_LOCALMSPID=Org1MSP
volumes:
- /var/run/:/host/var/run/
- ../crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/msp:/etc/hyperledger/fabric/msp
- ../crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls:/etc/hyperledger/fabric/tls
ports:
- 8051:7051
- 8052:7052
- 8053:7053
peer0.org2.example.com:
container_name: peer0.org2.example.com
extends:
file: peer-base.yaml
service: peer-base
environment:
- CORE_PEER_ID=peer0.org2.example.com
- CORE_PEER_ADDRESS=peer0.org2.example.com:7051
- CORE_PEER_CHAINCODELISTENADDRESS=peer0.org2.example.com:7052
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org2.example.com:7051
- CORE_PEER_LOCALMSPID=Org2MSP
volumes:
- /var/run/:/host/var/run/
- ../crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/msp:/etc/hyperledger/fabric/msp
- ../crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls:/etc/hyperledger/fabric/tls
ports:
- 9051:7051
- 9052:7052
- 9053:7053
peer1.org2.example.com:
container_name: peer1.org2.example.com
extends:
file: peer-base.yaml
service: peer-base
environment:
- CORE_PEER_ID=peer1.org2.example.com
- CORE_PEER_ADDRESS=peer1.org2.example.com:7051
- CORE_PEER_CHAINCODELISTENADDRESS=peer1.org2.example.com:7052
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.org2.example.com:7051
- CORE_PEER_GOSSIP_BOOTSTRAP=peer0.org2.example.com:7051
- CORE_PEER_LOCALMSPID=Org2MSP
volumes:
- /var/run/:/host/var/run/
- ../crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/msp:/etc/hyperledger/fabric/msp
- ../crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls:/etc/hyperledger/fabric/tls
ports:
- 10051:7051
- 10052:7052
- 10053:7053

View File

@ -1,26 +0,0 @@
# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
version: '2'
services:
peer-base:
image: hyperledger/fabric-peer
environment:
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
# the following setting starts chaincode containers on the same
# bridge network as the peers
# https://docs.docker.com/compose/networking/
- CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=e2ecli_default
#- CORE_LOGGING_LEVEL=ERROR
- CORE_LOGGING_LEVEL=DEBUG
- CORE_PEER_TLS_ENABLED=true
- CORE_PEER_GOSSIP_USELEADERELECTION=true
- CORE_PEER_GOSSIP_ORGLEADER=false
- CORE_PEER_PROFILE_ENABLED=true
- CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/fabric/tls/server.crt
- CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/fabric/tls/server.key
- CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/tls/ca.crt
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
command: peer node start

View File

@ -1,163 +0,0 @@
# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
version: '2'
services:
zookeeper0:
container_name: zookeeper0
extends:
file: base/docker-compose-base-e2e.yaml
service: zookeeper
environment:
- ZOO_MY_ID=1
- ZOO_SERVERS=server.1=zookeeper0:2888:3888 server.2=zookeeper1:2888:3888 server.3=zookeeper2:2888:3888
zookeeper1:
container_name: zookeeper1
extends:
file: base/docker-compose-base-e2e.yaml
service: zookeeper
environment:
- ZOO_MY_ID=2
- ZOO_SERVERS=server.1=zookeeper0:2888:3888 server.2=zookeeper1:2888:3888 server.3=zookeeper2:2888:3888
zookeeper2:
container_name: zookeeper2
extends:
file: base/docker-compose-base-e2e.yaml
service: zookeeper
environment:
- ZOO_MY_ID=3
- ZOO_SERVERS=server.1=zookeeper0:2888:3888 server.2=zookeeper1:2888:3888 server.3=zookeeper2:2888:3888
kafka0:
container_name: kafka0
extends:
file: base/docker-compose-base-e2e.yaml
service: kafka
environment:
- KAFKA_BROKER_ID=0
- KAFKA_MIN_INSYNC_REPLICAS=2
- KAFKA_DEFAULT_REPLICATION_FACTOR=3
- KAFKA_ZOOKEEPER_CONNECT=zookeeper0:2181,zookeeper1:2181,zookeeper2:2181
depends_on:
- zookeeper0
- zookeeper1
- zookeeper2
kafka1:
container_name: kafka1
extends:
file: base/docker-compose-base-e2e.yaml
service: kafka
environment:
- KAFKA_BROKER_ID=1
- KAFKA_MIN_INSYNC_REPLICAS=2
- KAFKA_DEFAULT_REPLICATION_FACTOR=3
- KAFKA_ZOOKEEPER_CONNECT=zookeeper0:2181,zookeeper1:2181,zookeeper2:2181
depends_on:
- zookeeper0
- zookeeper1
- zookeeper2
kafka2:
container_name: kafka2
extends:
file: base/docker-compose-base-e2e.yaml
service: kafka
environment:
- KAFKA_BROKER_ID=2
- KAFKA_MIN_INSYNC_REPLICAS=2
- KAFKA_DEFAULT_REPLICATION_FACTOR=3
- KAFKA_ZOOKEEPER_CONNECT=zookeeper0:2181,zookeeper1:2181,zookeeper2:2181
depends_on:
- zookeeper0
- zookeeper1
- zookeeper2
kafka3:
container_name: kafka3
extends:
file: base/docker-compose-base-e2e.yaml
service: kafka
environment:
- KAFKA_BROKER_ID=3
- KAFKA_MIN_INSYNC_REPLICAS=2
- KAFKA_DEFAULT_REPLICATION_FACTOR=3
- KAFKA_ZOOKEEPER_CONNECT=zookeeper0:2181,zookeeper1:2181,zookeeper2:2181
depends_on:
- zookeeper0
- zookeeper1
- zookeeper2
orderer.example.com:
extends:
file: base/docker-compose-base-e2e.yaml
service: orderer.example.com
container_name: orderer.example.com
depends_on:
- zookeeper0
- zookeeper1
- zookeeper2
- kafka0
- kafka1
- kafka2
- kafka3
peer0.org1.example.com:
container_name: peer0.org1.example.com
extends:
file: base/docker-compose-base-e2e.yaml
service: peer0.org1.example.com
peer1.org1.example.com:
container_name: peer1.org1.example.com
extends:
file: base/docker-compose-base-e2e.yaml
service: peer1.org1.example.com
peer0.org2.example.com:
container_name: peer0.org2.example.com
extends:
file: base/docker-compose-base-e2e.yaml
service: peer0.org2.example.com
peer1.org2.example.com:
container_name: peer1.org2.example.com
extends:
file: base/docker-compose-base-e2e.yaml
service: peer1.org2.example.com
cli:
container_name: cli
image: hyperledger/fabric-tools
tty: true
environment:
- GOPATH=/opt/gopath
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
- CORE_LOGGING_LEVEL=DEBUG
- CORE_PEER_ID=cli
- CORE_PEER_ADDRESS=peer0.org1.example.com:7051
- CORE_PEER_LOCALMSPID=Org1MSP
- CORE_PEER_TLS_ENABLED=true
- CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.crt
- CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.key
- CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
- CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
command: /bin/bash -c './scripts/script.sh ${CHANNEL_NAME}; sleep $TIMEOUT'
volumes:
- /var/run/:/host/var/run/
- ../chaincode/go/:/opt/gopath/src/github.com/hyperledger/fabric/examples/chaincode/go
- ./crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/
- ./scripts:/opt/gopath/src/github.com/hyperledger/fabric/peer/scripts/
- ./channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts
depends_on:
- orderer.example.com
- peer0.org1.example.com
- peer1.org1.example.com
- peer0.org2.example.com
- peer1.org2.example.com

View File

@ -1,67 +0,0 @@
# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
version: '2'
services:
couchdb0:
container_name: couchdb0
image: hyperledger/fabric-couchdb
# Comment/Uncomment the port mapping if you want to hide/expose the CouchDB service,
# for example map it to utilize Fauxton User Interface in dev environments.
ports:
- "5984:5984"
peer0.org1.example.com:
environment:
- CORE_LEDGER_STATE_STATEDATABASE=CouchDB
- CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb0:5984
depends_on:
- couchdb0
couchdb1:
container_name: couchdb1
image: hyperledger/fabric-couchdb
# Comment/Uncomment the port mapping if you want to hide/expose the CouchDB service,
# for example map it to utilize Fauxton User Interface in dev environments.
ports:
- "6984:5984"
peer1.org1.example.com:
environment:
- CORE_LEDGER_STATE_STATEDATABASE=CouchDB
- CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb1:5984
depends_on:
- couchdb1
couchdb2:
container_name: couchdb2
image: hyperledger/fabric-couchdb
# Comment/Uncomment the port mapping if you want to hide/expose the CouchDB service,
# for example map it to utilize Fauxton User Interface in dev environments.
ports:
- "7984:5984"
peer0.org2.example.com:
environment:
- CORE_LEDGER_STATE_STATEDATABASE=CouchDB
- CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb2:5984
depends_on:
- couchdb2
couchdb3:
container_name: couchdb3
image: hyperledger/fabric-couchdb
# Comment/Uncomment the port mapping if you want to hide/expose the CouchDB service,
# for example map it to utilize Fauxton User Interface in dev environments.
ports:
- "8984:5984"
peer1.org2.example.com:
environment:
- CORE_LEDGER_STATE_STATEDATABASE=CouchDB
- CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb3:5984
depends_on:
- couchdb3

View File

@ -1,159 +0,0 @@
# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
version: '2'
services:
ca0:
image: hyperledger/fabric-ca
environment:
- FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
- FABRIC_CA_SERVER_CA_NAME=ca-org1
- FABRIC_CA_SERVER_TLS_ENABLED=true
- FABRIC_CA_SERVER_TLS_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.org1.example.com-cert.pem
- FABRIC_CA_SERVER_TLS_KEYFILE=/etc/hyperledger/fabric-ca-server-config/CA1_PRIVATE_KEY
ports:
- "7054:7054"
command: sh -c 'fabric-ca-server start --ca.certfile /etc/hyperledger/fabric-ca-server-config/ca.org1.example.com-cert.pem --ca.keyfile /etc/hyperledger/fabric-ca-server-config/CA1_PRIVATE_KEY -b admin:adminpw -d'
volumes:
- ./crypto-config/peerOrganizations/org1.example.com/ca/:/etc/hyperledger/fabric-ca-server-config
container_name: ca_peerOrg1
ca1:
image: hyperledger/fabric-ca
environment:
- FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
- FABRIC_CA_SERVER_CA_NAME=ca-org2
- FABRIC_CA_SERVER_TLS_ENABLED=true
- FABRIC_CA_SERVER_TLS_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.org2.example.com-cert.pem
- FABRIC_CA_SERVER_TLS_KEYFILE=/etc/hyperledger/fabric-ca-server-config/CA2_PRIVATE_KEY
ports:
- "8054:7054"
command: sh -c 'fabric-ca-server start --ca.certfile /etc/hyperledger/fabric-ca-server-config/ca.org2.example.com-cert.pem --ca.keyfile /etc/hyperledger/fabric-ca-server-config/CA2_PRIVATE_KEY -b admin:adminpw -d'
volumes:
- ./crypto-config/peerOrganizations/org2.example.com/ca/:/etc/hyperledger/fabric-ca-server-config
container_name: ca_peerOrg2
zookeeper0:
container_name: zookeeper0
extends:
file: base/docker-compose-base-e2e.yaml
service: zookeeper
environment:
- ZOO_MY_ID=1
- ZOO_SERVERS=server.1=zookeeper0:2888:3888 server.2=zookeeper1:2888:3888 server.3=zookeeper2:2888:3888
zookeeper1:
container_name: zookeeper1
extends:
file: base/docker-compose-base-e2e.yaml
service: zookeeper
environment:
- ZOO_MY_ID=2
- ZOO_SERVERS=server.1=zookeeper0:2888:3888 server.2=zookeeper1:2888:3888 server.3=zookeeper2:2888:3888
zookeeper2:
container_name: zookeeper2
extends:
file: base/docker-compose-base-e2e.yaml
service: zookeeper
environment:
- ZOO_MY_ID=3
- ZOO_SERVERS=server.1=zookeeper0:2888:3888 server.2=zookeeper1:2888:3888 server.3=zookeeper2:2888:3888
kafka0:
container_name: kafka0
extends:
file: base/docker-compose-base-e2e.yaml
service: kafka
environment:
- KAFKA_BROKER_ID=0
- KAFKA_MIN_INSYNC_REPLICAS=2
- KAFKA_DEFAULT_REPLICATION_FACTOR=3
- KAFKA_ZOOKEEPER_CONNECT=zookeeper0:2181,zookeeper1:2181,zookeeper2:2181
depends_on:
- zookeeper0
- zookeeper1
- zookeeper2
kafka1:
container_name: kafka1
extends:
file: base/docker-compose-base-e2e.yaml
service: kafka
environment:
- KAFKA_BROKER_ID=1
- KAFKA_MIN_INSYNC_REPLICAS=2
- KAFKA_DEFAULT_REPLICATION_FACTOR=3
- KAFKA_ZOOKEEPER_CONNECT=zookeeper0:2181,zookeeper1:2181,zookeeper2:2181
depends_on:
- zookeeper0
- zookeeper1
- zookeeper2
kafka2:
container_name: kafka2
extends:
file: base/docker-compose-base-e2e.yaml
service: kafka
environment:
- KAFKA_BROKER_ID=2
- KAFKA_MIN_INSYNC_REPLICAS=2
- KAFKA_DEFAULT_REPLICATION_FACTOR=3
- KAFKA_ZOOKEEPER_CONNECT=zookeeper0:2181,zookeeper1:2181,zookeeper2:2181
depends_on:
- zookeeper0
- zookeeper1
- zookeeper2
kafka3:
container_name: kafka3
extends:
file: base/docker-compose-base-e2e.yaml
service: kafka
environment:
- KAFKA_BROKER_ID=3
- KAFKA_MIN_INSYNC_REPLICAS=2
- KAFKA_DEFAULT_REPLICATION_FACTOR=3
- KAFKA_ZOOKEEPER_CONNECT=zookeeper0:2181,zookeeper1:2181,zookeeper2:2181
depends_on:
- zookeeper0
- zookeeper1
- zookeeper2
orderer.example.com:
extends:
file: base/docker-compose-base-e2e.yaml
service: orderer.example.com
container_name: orderer.example.com
depends_on:
- kafka0
- kafka1
- kafka2
- kafka3
peer0.org1.example.com:
container_name: peer0.org1.example.com
extends:
file: base/docker-compose-base-e2e.yaml
service: peer0.org1.example.com
peer1.org1.example.com:
container_name: peer1.org1.example.com
extends:
file: base/docker-compose-base-e2e.yaml
service: peer1.org1.example.com
peer0.org2.example.com:
container_name: peer0.org2.example.com
extends:
file: base/docker-compose-base-e2e.yaml
service: peer0.org2.example.com
peer1.org2.example.com:
container_name: peer1.org2.example.com
extends:
file: base/docker-compose-base-e2e.yaml
service: peer1.org2.example.com

View File

@ -1,159 +0,0 @@
# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
version: '2'
services:
ca0:
image: hyperledger/fabric-ca
environment:
- FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
- FABRIC_CA_SERVER_CA_NAME=ca-org1
- FABRIC_CA_SERVER_TLS_ENABLED=true
- FABRIC_CA_SERVER_TLS_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.org1.example.com-cert.pem
- FABRIC_CA_SERVER_TLS_KEYFILE=/etc/hyperledger/fabric-ca-server-config/2628c774d6def25e2bf6147c30f25fe76469d63d257965ac867544acd090148c_sk
ports:
- "7054:7054"
command: sh -c 'fabric-ca-server start --ca.certfile /etc/hyperledger/fabric-ca-server-config/ca.org1.example.com-cert.pem --ca.keyfile /etc/hyperledger/fabric-ca-server-config/2628c774d6def25e2bf6147c30f25fe76469d63d257965ac867544acd090148c_sk -b admin:adminpw -d'
volumes:
- ./crypto-config/peerOrganizations/org1.example.com/ca/:/etc/hyperledger/fabric-ca-server-config
container_name: ca_peerOrg1
ca1:
image: hyperledger/fabric-ca
environment:
- FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
- FABRIC_CA_SERVER_CA_NAME=ca-org2
- FABRIC_CA_SERVER_TLS_ENABLED=true
- FABRIC_CA_SERVER_TLS_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.org2.example.com-cert.pem
- FABRIC_CA_SERVER_TLS_KEYFILE=/etc/hyperledger/fabric-ca-server-config/3f39c678fc9b1f79cddb94f1e896cc3c487aa25c2ebf8b7f3e0205c2d21a37ec_sk
ports:
- "8054:7054"
command: sh -c 'fabric-ca-server start --ca.certfile /etc/hyperledger/fabric-ca-server-config/ca.org2.example.com-cert.pem --ca.keyfile /etc/hyperledger/fabric-ca-server-config/3f39c678fc9b1f79cddb94f1e896cc3c487aa25c2ebf8b7f3e0205c2d21a37ec_sk -b admin:adminpw -d'
volumes:
- ./crypto-config/peerOrganizations/org2.example.com/ca/:/etc/hyperledger/fabric-ca-server-config
container_name: ca_peerOrg2
zookeeper0:
container_name: zookeeper0
extends:
file: base/docker-compose-base-e2e.yaml
service: zookeeper
environment:
- ZOO_MY_ID=1
- ZOO_SERVERS=server.1=zookeeper0:2888:3888 server.2=zookeeper1:2888:3888 server.3=zookeeper2:2888:3888
zookeeper1:
container_name: zookeeper1
extends:
file: base/docker-compose-base-e2e.yaml
service: zookeeper
environment:
- ZOO_MY_ID=2
- ZOO_SERVERS=server.1=zookeeper0:2888:3888 server.2=zookeeper1:2888:3888 server.3=zookeeper2:2888:3888
zookeeper2:
container_name: zookeeper2
extends:
file: base/docker-compose-base-e2e.yaml
service: zookeeper
environment:
- ZOO_MY_ID=3
- ZOO_SERVERS=server.1=zookeeper0:2888:3888 server.2=zookeeper1:2888:3888 server.3=zookeeper2:2888:3888
kafka0:
container_name: kafka0
extends:
file: base/docker-compose-base-e2e.yaml
service: kafka
environment:
- KAFKA_BROKER_ID=0
- KAFKA_MIN_INSYNC_REPLICAS=2
- KAFKA_DEFAULT_REPLICATION_FACTOR=3
- KAFKA_ZOOKEEPER_CONNECT=zookeeper0:2181,zookeeper1:2181,zookeeper2:2181
depends_on:
- zookeeper0
- zookeeper1
- zookeeper2
kafka1:
container_name: kafka1
extends:
file: base/docker-compose-base-e2e.yaml
service: kafka
environment:
- KAFKA_BROKER_ID=1
- KAFKA_MIN_INSYNC_REPLICAS=2
- KAFKA_DEFAULT_REPLICATION_FACTOR=3
- KAFKA_ZOOKEEPER_CONNECT=zookeeper0:2181,zookeeper1:2181,zookeeper2:2181
depends_on:
- zookeeper0
- zookeeper1
- zookeeper2
kafka2:
container_name: kafka2
extends:
file: base/docker-compose-base-e2e.yaml
service: kafka
environment:
- KAFKA_BROKER_ID=2
- KAFKA_MIN_INSYNC_REPLICAS=2
- KAFKA_DEFAULT_REPLICATION_FACTOR=3
- KAFKA_ZOOKEEPER_CONNECT=zookeeper0:2181,zookeeper1:2181,zookeeper2:2181
depends_on:
- zookeeper0
- zookeeper1
- zookeeper2
kafka3:
container_name: kafka3
extends:
file: base/docker-compose-base-e2e.yaml
service: kafka
environment:
- KAFKA_BROKER_ID=3
- KAFKA_MIN_INSYNC_REPLICAS=2
- KAFKA_DEFAULT_REPLICATION_FACTOR=3
- KAFKA_ZOOKEEPER_CONNECT=zookeeper0:2181,zookeeper1:2181,zookeeper2:2181
depends_on:
- zookeeper0
- zookeeper1
- zookeeper2
orderer.example.com:
extends:
file: base/docker-compose-base-e2e.yaml
service: orderer.example.com
container_name: orderer.example.com
depends_on:
- kafka0
- kafka1
- kafka2
- kafka3
peer0.org1.example.com:
container_name: peer0.org1.example.com
extends:
file: base/docker-compose-base-e2e.yaml
service: peer0.org1.example.com
peer1.org1.example.com:
container_name: peer1.org1.example.com
extends:
file: base/docker-compose-base-e2e.yaml
service: peer1.org1.example.com
peer0.org2.example.com:
container_name: peer0.org2.example.com
extends:
file: base/docker-compose-base-e2e.yaml
service: peer0.org2.example.com
peer1.org2.example.com:
container_name: peer1.org2.example.com
extends:
file: base/docker-compose-base-e2e.yaml
service: peer1.org2.example.com

View File

@ -1,81 +0,0 @@
#!/bin/bash -eu
#
# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
##################################################
# This script pulls docker images from hyperledger
# docker hub repository and Tag it as
# hyperledger/fabric-<image> latest tag
##################################################
#Set ARCH variable i.e ppc64le,s390x,x86_64,i386
ARCH=`uname -m`
dockerFabricPull() {
local FABRIC_TAG=$1
for IMAGES in peer orderer couchdb ccenv javaenv kafka tools zookeeper; do
echo "==> FABRIC IMAGE: $IMAGES"
echo
docker pull hyperledger/fabric-$IMAGES:$FABRIC_TAG
docker tag hyperledger/fabric-$IMAGES:$FABRIC_TAG hyperledger/fabric-$IMAGES
done
}
dockerCaPull() {
local CA_TAG=$1
echo "==> FABRIC CA IMAGE"
echo
docker pull hyperledger/fabric-ca:$CA_TAG
docker tag hyperledger/fabric-ca:$CA_TAG hyperledger/fabric-ca
}
usage() {
echo "Description "
echo
echo "Pulls docker images from hyperledger dockerhub repository"
echo "tag as hyperledger/fabric-<image>:latest"
echo
echo "USAGE: "
echo
echo "./download-dockerimages.sh [-c <fabric-ca tag>] [-f <fabric tag>]"
echo " -c fabric-ca docker image tag"
echo " -f fabric docker image tag"
echo
echo
echo "EXAMPLE:"
echo "./download-dockerimages.sh -c x86_64-1.0.0-beta -f x86_64-1.0.0-beta"
echo
echo "By default, pulls fabric-ca and fabric 1.0.0-beta docker images"
echo "from hyperledger dockerhub"
exit 0
}
while getopts "\?hc:f:" opt; do
case "$opt" in
c) CA_TAG="$OPTARG"
echo "Pull CA IMAGES"
;;
f) FABRIC_TAG="$OPTARG"
echo "Pull FABRIC TAG"
;;
\?|h) usage
echo "Print Usage"
;;
esac
done
: ${CA_TAG:="$ARCH-1.0.0-beta"}
: ${FABRIC_TAG:="$ARCH-1.0.0-beta"}
echo "===> Pulling fabric Images"
dockerFabricPull ${FABRIC_TAG}
echo "===> Pulling fabric ca Image"
dockerCaPull ${CA_TAG}
echo
echo "===> List out hyperledger docker images"
docker images | grep hyperledger*

View File

@ -1,912 +0,0 @@
End-to-End Flow
===============
The end-to-end verification provisions a sample Fabric network consisting of
two organizations, each maintaining two peers, and a Kafka-based ordering service.
This verification makes use of two fundamental tools, which are necessary to
create a functioning transactional network with digital signature validation
and access control:
* cryptogen - generates the x509 certificates used to identify and authenticate the various components in the network.
* configtxgen - generates the requisite configuration artifacts for orderer bootstrap and channel creation.
Each tool consumes a configuration yaml file, within which we specify the topology
of our network (cryptogen) and the location of our certificates for various
configuration operations (configtxgen). Once the tools have been successfully run,
we are able to launch our network. More detail on the tools and the structure of
the network will be provided later in this document. For now, let's get going...
Prerequisites
-------------
- `Git client <https://git-scm.com/downloads>`__
- `Docker <https://www.docker.com/products/overview>`__ - v1.12 or higher
- `Docker Compose <https://docs.docker.com/compose/overview/>`__ - v1.8 or higher
- `Homebrew <https://brew.sh/>`__ - OSX only
- `Xcode <https://itunes.apple.com/us/app/xcode/id497799835?mt=12>`__ - OSX only (this can take upwards of an hour)
- `Docker Toolbox <https://docs.docker.com/toolbox/toolbox_install_windows/>`__ - Windows users only
- `Go <https://golang.org/>`__ - 1.7 or higher
On Windows machines you will also need the following which provides a better alternative to the Windows command prompt:
- `Git Bash <https://git-scm.com/downloads>`__
.. note:: On older versions of Windows, such as Windows 7, you
typically get this as part of installing Docker
Toolbox. However experience has shown this to be a poor
development environment with limited functionality. It is
suitable to run docker based scenarios, such as
:doc:`getting_started`, but you may not be able to find a
suitable ``make`` command to successfuly go through the
scenario described here.
Setting the $GOPATH
^^^^^^^^^^^^^^^^^^^
Make sure you have properly setup your Host's `GOPATH environment
variable <https://github.com/golang/go/wiki/GOPATH>`__. This is necessary for the
code to compile properly.
Now create the following directory structure and ``cd`` into it:
.. code:: bash
mkdir -p $GOPATH/src/github.com/hyperledger
cd $GOPATH/src/github.com/hyperledger
- Clone the Fabric code base into this path.
.. code:: bash
git clone http://gerrit.hyperledger.org/r/fabric
or though a mirrored repository in github:
.. code:: bash
git clone https://github.com/hyperledger/fabric.git
- If you are running OSX, perform the following:
.. code:: bash
brew install gnu-tar --with-default-names
brew install libtool
Build the binaries
^^^^^^^^^^^^^^^^^^
- Now make the platform-specific binaries for ``cryptogen`` and ``configtxgen``.
.. code:: bash
cd $GOPATH/src/github.com/hyperledger/fabric
# ensure sure you are in the /fabric directory where the Makefile resides
make release
This will output platform-specific binaries into the ``fabric/release`` folder.
- Next, make the Fabric images. This typically takes between five to ten minutes, so
be patient:
.. code:: bash
# make sure you are in the /fabric directory
make docker
Execute a ``docker images`` command in your terminal. If the images compiled
successfully, you should see an output similar to the following:
.. code:: bash
REPOSITORY TAG IMAGE ID CREATED SIZE
hyperledger/fabric-couchdb latest e2df4dd39ca9 38 minutes ago 1.51 GB
hyperledger/fabric-couchdb x86_64-1.0.0-beta e2df4dd39ca9 38 minutes ago 1.51 GB
hyperledger/fabric-kafka latest 08af4d797266 40 minutes ago 1.3 GB
hyperledger/fabric-kafka x86_64-1.0.0-beta 08af4d797266 40 minutes ago 1.3 GB
hyperledger/fabric-zookeeper latest 444e9e695367 40 minutes ago 1.31 GB
hyperledger/fabric-zookeeper x86_64-1.0.0-beta 444e9e695367 40 minutes ago 1.31 GB
hyperledger/fabric-testenv latest 8678d3101930 41 minutes ago 1.41 GB
hyperledger/fabric-testenv x86_64-1.0.0-beta 8678d3101930 41 minutes ago 1.41 GB
hyperledger/fabric-buildenv latest 60911392c82e 41 minutes ago 1.33 GB
hyperledger/fabric-buildenv x86_64-1.0.0-beta 60911392c82e 41 minutes ago 1.33 GB
hyperledger/fabric-orderer latest 2afab937b9cc 41 minutes ago 182 MB
hyperledger/fabric-orderer x86_64-1.0.0-beta 2afab937b9cc 41 minutes ago 182 MB
hyperledger/fabric-peer latest 9560e58e8089 41 minutes ago 185 MB
hyperledger/fabric-peer x86_64-1.0.0-beta 9560e58e8089 41 minutes ago 185 MB
hyperledger/fabric-javaenv latest 881ca5219fad 42 minutes ago 1.43 GB
hyperledger/fabric-javaenv x86_64-1.0.0-beta 881ca5219fad 42 minutes ago 1.43 GB
hyperledger/fabric-ccenv latest 28af77ffe9e9 43 minutes ago 1.29 GB
hyperledger/fabric-ccenv x86_64-1.0.0-beta 28af77ffe9e9 43 minutes ago 1.29 GB
hyperledger/fabric-baseimage x86_64-0.3.0 f4751a503f02 3 months ago 1.27 GB
hyperledger/fabric-baseos x86_64-0.3.0 c3a4cf3b3350 3 months ago 161 MB
If you failed to compile the ``fabric-testenv`` image, then you can
perform a ``make clean`` followed by another ``make docker``.
Cryptogen Tool
--------------
We will use the cryptogen tool to generate the cryptographic material (x509 certs)
for our various network entities. The certificates are based on a standard PKI
implementation where validation is achieved by reaching a common trust anchor.
How does it work?
^^^^^^^^^^^^^^^^^
Cryptogen consumes a file - ``crypto-config.yaml`` - that contains the network
topology and allows us to generate a library of certificates for both the
Organizations and the components that belong to those Organizations. Each
Organization is provisioned a unique root certificate (``ca-cert``), that binds
specific components (peers and orderers) to that Org. Transactions and communications
within Fabric are signed by an entity's private key (``keystore``), and then verified
by means of a public key (``signcerts``). You will notice a "count" variable within
this file. We use this to specify the number of peers per Organization; in our
case it's two peers per Org. The rest of this template is extremely
self-explanatory.
After we run the tool, the certs will be parked in a folder titled ``crypto-config``.
Configuration Transaction Generator
-----------------------------------
The `configtxgen
tool <https://github.com/hyperledger/fabric/blob/master/docs/source/configtxgen.rst>`__
is used to create four artifacts: orderer **bootstrap block**, fabric
**channel configuration transaction**, and two **anchor peer transactions** - one
for each Peer Org.
The orderer block is the genesis block for the ordering service, and the
channel transaction file is broadcast to the orderer at channel creation
time. The anchor peer transactions, as the name might suggest, specify each
Org's anchor peer on this channel.
How does it work?
^^^^^^^^^^^^^^^^^
Configtxgen consumes a file - ``configtx.yaml`` - that contains the definitions
for the sample network. There are three members - one Orderer Org (``OrdererOrg``)
and two Peer Orgs (``Org1`` & ``Org2``) each managing and maintaining two peer nodes.
This file also specifies a consortium - ``SampleConsortium`` - consisting of our
two Peer Orgs. Pay specific attention to the "Profiles" section at the top of
this file. You will notice that we have two unique headers. One for the orderer genesis
block - ``TwoOrgsOrdererGenesis`` - and one for our channel - ``TwoOrgsChannel``.
These headers are important, as we will pass them in as arguments when we create
our artifacts. This file also contains two additional specifications that are worth
noting. Firstly, we specify the anchor peers for each Peer Org
(``peer0.org1.example.com`` & ``peer0.org2.example.com``). Secondly, we point to
the location of the MSP directory for each member, in turn allowing us to store the
root certificates for each Org in the orderer genesis block. This is a critical
concept. Now any network entity communicating with the ordering service can have
its digital signature verified.
For ease of use, a script - ``generateArtifacts.sh`` - is provided. The
script will generate the crypto material and our four configuration artifacts, and
subsequently output these files into the ``channel-artifacts`` folder.
Run the shell script
^^^^^^^^^^^^^^^^^^^^
Make sure you are in the ``examples/e2e_cli`` directory where the script resides.
Decide upon a unique name for your channel and replace the <channel-ID> parm
with a name of your choice. The script will fail if you do not supply a name.
.. code:: bash
cd examples/e2e_cli
./generateArtifacts.sh <channel-ID>
The output of the script is somewhat verbose, as it generates the crypto
libraries and multiple artifacts. However, you will notice five distinct
and self-explanatory messages in your terminal. They are as follows:
.. code:: bash
##########################################################
##### Generate certificates using cryptogen tool #########
##########################################################
##########################################################
######### Generating Orderer Genesis block ##############
##########################################################
#################################################################
### Generating channel configuration transaction 'channel.tx' ###
#################################################################
#################################################################
####### Generating anchor peer update for Org0MSP ##########
#################################################################
#################################################################
####### Generating anchor peer update for Org1MSP ##########
#################################################################
These configuration transactions will bundle the crypto material for the
participating members and their network components and output an orderer
genesis block and three channel transaction artifacts. These artifacts are
required to successfully bootstrap a Fabric network and create a channel to
transact upon.
Manually generate the artifacts (optional)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
You can refer to the ``generateArtifacts.sh`` script for the commands, however
for the sake of convenience we will also provide them here.
First, let's set the environment variable for our platform architecture.
This command will detect your OS and use the appropriate binaries for the subsequent steps:
.. code:: bash
# for power or z
os_arch=$(echo "$(uname -s)-$(uname -m)" | awk '{print tolower($0)}')
# for linux, osx or windows
os_arch=$(echo "$(uname -s)-amd64" | awk '{print tolower($0)}')
Check to make sure it is set properly:
.. code:: bash
echo $os_arch
Now let's run the tool. Our platform specific binary is in the ``release``
directory, so we need to provide the relative path to where the tool resides.
Make sure you are in ``examples/e2e_cli``:
.. code:: bash
./../../release/$os_arch/bin/cryptogen generate --config=./crypto-config.yaml
You will likely see the following warning. It's innocuous, ignore it:
.. code:: bash
[bccsp] GetDefault -> WARN 001 Before using BCCSP, please call InitFactories(). Falling back to bootBCCSP.
Next, we need to tell the ``configtxgen`` tool where to look for the
``configtx.yaml`` file that it needs to ingest. We will tell it look in our
present working directory:
.. code:: bash
FABRIC_CFG_PATH=$PWD
Create the orderer genesis block:
.. code:: bash
./../../release/$os_arch/bin/configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block
You can ignore the logs regarding intermediate certs, we are not using them in
this crypto implementation.
Create the channel transaction artifact:
.. code:: bash
# make sure to set the <channel-ID> parm
./../../release/$os_arch/bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID <channel-ID>
Define the anchor peer for Org1 on the channel:
.. code:: bash
# make sure to set the <channel-ID> parm
./../../release/$os_arch/bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID <channel-ID> -asOrg Org1MSP
Define the anchor peer for Org2 on the channel:
.. code:: bash
# make sure to set the <channel-ID> parm
./../../release/$os_arch/bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID <channel-ID> -asOrg Org2MSP
Run the end-to-end test with Docker
-----------------------------------
Make sure you are in the ``/e2e_cli`` directory. Then use docker-compose
to spawn the network entities and drive the tests. Notice that you can set a
``TIMEOUT`` variable (specified in seconds) so that your cli container does not
exit after the script completes. You can choose any value:
.. code:: bash
# the TIMEOUT variable is optional
CHANNEL_NAME=<channel-id> TIMEOUT=<pick_a_value> docker-compose -f docker-compose-cli.yaml up -d
If you created a unique channel name, be sure to pass in that parameter.
For example,
.. code:: bash
CHANNEL_NAME=abc TIMEOUT=1000 docker-compose -f docker-compose-cli.yaml up -d
Wait, 60 seconds or so. Behind the scenes, there are transactions being sent
to the peers. Execute a ``docker ps`` to view your active containers.
You should see an output identical to the following:
.. code:: bash
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b568de3fe931 dev-peer1.org2.example.com-mycc-1.0 "chaincode -peer.a..." 4 minutes ago Up 4 minutes dev-peer1.org2.example.com-mycc-1.0
17c1c82087e7 dev-peer0.org1.example.com-mycc-1.0 "chaincode -peer.a..." 4 minutes ago Up 4 minutes dev-peer0.org1.example.com-mycc-1.0
0e1c5034c47b dev-peer0.org2.example.com-mycc-1.0 "chaincode -peer.a..." 4 minutes ago Up 4 minutes dev-peer0.org2.example.com-mycc-1.0
71339e7e1d38 hyperledger/fabric-peer "peer node start -..." 5 minutes ago Up 5 minutes 0.0.0.0:8051->7051/tcp, 0.0.0.0:8053->7053/tcp peer1.org1.example.com
add6113ffdcf hyperledger/fabric-peer "peer node start -..." 5 minutes ago Up 5 minutes 0.0.0.0:10051->7051/tcp, 0.0.0.0:10053->7053/tcp peer1.org2.example.com
689396c0e520 hyperledger/fabric-peer "peer node start -..." 5 minutes ago Up 5 minutes 0.0.0.0:7051->7051/tcp, 0.0.0.0:7053->7053/tcp peer0.org1.example.com
65424407a653 hyperledger/fabric-orderer "orderer" 5 minutes ago Up 5 minutes 0.0.0.0:7050->7050/tcp orderer.example.com
ce14853db660 hyperledger/fabric-peer "peer node start -..." 5 minutes ago Up 5 minutes 0.0.0.0:9051->7051/tcp, 0.0.0.0:9053->7053/tcp peer0.org2.example.com
If you set a moderately high ``TIMEOUT`` value, then you will see your cli
container as well.
What's happening behind the scenes?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- A script - ``script.sh`` - is baked inside the CLI container. The
script drives the ``createChannel`` command against the supplied channel name
and uses the channel.tx file for channel configuration.
- The output of ``createChannel`` is a genesis block -
``<your_channel_name>.block`` - which gets stored on the peers' file systems and contains
the channel configuration specified from channel.tx.
- The ``joinChannel`` command is exercised for all four peers, which takes as
input the previously generated genesis block. This command instructs the
peers to join ``<your_channel_name>`` and create a chain starting with ``<your_channel_name>.block``.
- Now we have a channel consisting of four peers, and two
organizations. This is our ``TwoOrgsChannel`` profile.
- ``peer0.org1.example.com`` and ``peer1.org1.example.com`` belong to Org1;
``peer0.org2.example.com`` and ``peer1.org2.example.com`` belong to Org2
- These relationships are defined through the ``crypto-config.yaml`` and
the MSP path is specified in our docker compose.
- The anchor peers for Org1MSP (``peer0.org1.example.com``) and
Org2MSP (``peer0.org2.example.com``) are then updated. We do this by passing
the ``Org1MSPanchors.tx`` and ``Org2MSPanchors.tx`` artifacts to the ordering
service along with the name of our channel.
- A chaincode - **chaincode_example02** - is installed on ``peer0.org1.example.com`` and
``peer0.org2.example.com``
- The chaincode is then "instantiated" on ``peer0.org2.example.com``. Instantiation
adds the chaincode to the channel, starts the container for the target peer,
and initializes the key value pairs associated with the chaincode. The initial
values for this example are ["a","100" "b","200"]. This "instantiation" results
in a container by the name of ``dev-peer0.org2.example.com-mycc-1.0`` starting.
- The instantiation also passes in an argument for the endorsement
policy. The policy is defined as
``-P "OR ('Org1MSP.member','Org2MSP.member')"``, meaning that any
transaction must be endorsed by a peer tied to Org1 or Org2.
- A query against the value of "a" is issued to ``peer0.org1.example.com``. The
chaincode was previously installed on ``peer0.org1.example.com``, so this will start
a container for Org1 peer0 by the name of ``dev-peer0.org1.example.com-mycc-1.0``. The result
of the query is also returned. No write operations have occurred, so
a query against "a" will still return a value of "100".
- An invoke is sent to ``peer0.org1.example.com`` to move "10" from "a" to "b"
- The chaincode is then installed on ``peer1.org2.example.com``
- A query is sent to ``peer1.org2.example.com`` for the value of "a". This starts a
third chaincode container by the name of ``dev-peer1.org2.example.com-mycc-1.0``. A
value of 90 is returned, correctly reflecting the previous
transaction during which the value for key "a" was modified by 10.
What does this demonstrate?
^^^^^^^^^^^^^^^^^^^^^^^^^^^
Chaincode **MUST** be installed on a peer in order for it to
successfully perform read/write operations against the ledger.
Furthermore, a chaincode container is not started for a peer until an ``init`` or
traditional transaction - read/write - is performed against that chaincode (e.g. query for
the value of "a"). The transaction causes the container to start. Also,
all peers in a channel maintain an exact copy of the ledger which
comprises the blockchain to store the immutable, sequenced record in
blocks, as well as a state database to maintain current fabric state.
This includes those peers that do not have chaincode installed on them
(like ``peer1.org1.example.com`` in the above example) . Finally, the chaincode is accessible
after it is installed (like ``peer1.org2.example.com`` in the above example) because it
has already been instantiated.
How do I see these transactions?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Check the logs for the CLI docker container.
.. code:: bash
docker logs -f cli
You should see the following output:
.. code:: bash
2017-05-16 17:08:01.366 UTC [msp] GetLocalMSP -> DEBU 004 Returning existing local MSP
2017-05-16 17:08:01.366 UTC [msp] GetDefaultSigningIdentity -> DEBU 005 Obtaining default signing identity
2017-05-16 17:08:01.366 UTC [msp/identity] Sign -> DEBU 006 Sign: plaintext: 0AB1070A6708031A0C08F1E3ECC80510...6D7963631A0A0A0571756572790A0161
2017-05-16 17:08:01.367 UTC [msp/identity] Sign -> DEBU 007 Sign: digest: E61DB37F4E8B0D32C9FE10E3936BA9B8CD278FAA1F3320B08712164248285C54
Query Result: 90
2017-05-16 17:08:15.158 UTC [main] main -> INFO 008 Exiting.....
===================== Query on PEER3 on channel 'mychannel' is successful =====================
===================== All GOOD, End-2-End execution completed =====================
_____ _ _ ____ _____ ____ _____
| ____| | \ | | | _ \ | ____| |___ \ | ____|
| _| | \| | | | | | _____ | _| __) | | _|
| |___ | |\ | | |_| | |_____| | |___ / __/ | |___
|_____| |_| \_| |____/ |_____| |_____| |_____|
How can I see the chaincode logs?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Inspect the individual chaincode containers to see the separate
transactions executed against each container. Here is the combined
output from each container:
.. code:: bash
$ docker logs dev-peer0.org2.example.com-mycc-1.0
04:30:45.947 [BCCSP_FACTORY] DEBU : Initialize BCCSP [SW]
ex02 Init
Aval = 100, Bval = 200
$ docker logs dev-peer0.org1.example.com-mycc-1.0
04:31:10.569 [BCCSP_FACTORY] DEBU : Initialize BCCSP [SW]
ex02 Invoke
Query Response:{"Name":"a","Amount":"100"}
ex02 Invoke
Aval = 90, Bval = 210
$ docker logs dev-peer1.org2.example.com-mycc-1.0
04:31:30.420 [BCCSP_FACTORY] DEBU : Initialize BCCSP [SW]
ex02 Invoke
Query Response:{"Name":"a","Amount":"90"}
All in one
^^^^^^^^^^
You can also generate the artifacts and crypto, and drive the tests using a single
shell script. The ``cryptogen``, ``configtxgen`` and ``docker-compose`` commands are
embedded in the script. If you choose not to supply a channel ID, then the
script will use a default name of ``mychannel``. The cli timeout parameter
is an optional value; if you choose not to set it, then your cli container
will exit upon conclusion of the script.
.. code:: bash
./network_setup.sh up
OR
.. code:: bash
./network_setup.sh up <channel-ID> <timeout-value>
Understanding the docker-compose topology
-----------------------------------------
The ``e2e_cli`` folder offers us two flavors of docker-compose files, both of which
are extended from the ``docker-compose-base.yaml``. Our first flavor,
``docker-compose-cli.yaml``, provides us with a CLI container, along with an orderer,
four peers, and the optional couchDB containers. We use this docker-compose for
the entirety of the instructions on this page.
The second flavor, ``docker-compose-e2e.yaml``, is constructed to run end-to-end tests
using the Node.js SDK. Aside from functioning with the SDK, its primary differentiation
is that there are containers for the fabric-ca servers. As a result, we are able
to send REST calls to the organizational CAs for user registration and enrollment.
If you want to use the ``docker-compose-e2e.yaml`` without first running the
**All in one** script, then we will need to make four slight modifications.
We need to point to the private keys for our Organization's CA's. You can locate
these values in your crypto-config folder. For example, to locate the private
key for Org1 we would follow this path - ``crypto-config/peerOrganizations/org1.example.com/ca/``.
The private key is a long hash value followed by ``_sk``. The path for Org2
would be - ``crypto-config/peerOrganizations/org2.example.com/ca/``.
In the ``docker-compose-e2e.yaml`` update the FABRIC_CA_SERVER_TLS_KEYFILE variable
for ca0 and ca1. You also need to edit the path that is provided in the command
to start the ca server. You are providing the same private key twice for each
CA container.
Manually exercise the commands
------------------------------
Exit the currently-running containers:
.. code:: bash
docker rm -f $(docker ps -aq)
Execute a ``docker images`` command in your terminal to view the
chaincode images. They will look similar to the following:
.. code:: bash
REPOSITORY TAG IMAGE ID CREATED SIZE
dev-peer1.org2.example.com-mycc-1.0 latest 4bc5e9b5dd97 5 seconds ago 176 MB
dev-peer0.org1.example.com-mycc-1.0 latest 6f2aeb032076 22 seconds ago 176 MB
dev-peer0.org2.example.com-mycc-1.0 latest 509b8e393cc6 39 seconds ago 176 MB
Remove these images:
.. code:: bash
docker rmi <IMAGE ID> <IMAGE ID> <IMAGE ID>
For example:
.. code:: bash
docker rmi -f 4bc 6f2 509
Ensure you have the configuration artifacts. If you deleted them, run
the shell script again:
.. code:: bash
# remember to supply a channel ID
./generateArtifacts.sh <channel-ID>
Modify the docker-compose file
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Open the ``docker-compose-cli.yaml`` file and comment out the command to run
``script.sh``. Navigate down to the cli container and place a ``#`` to the
left of the command. For example:
.. code:: bash
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
# command: /bin/bash -c './scripts/script.sh ${CHANNEL_NAME}; sleep $TIMEOUT'
Save the file and return to the ``/e2e_cli`` directory.
Now restart your network:
.. code:: bash
# make sure you are in the /e2e_cli directory where your docker-compose script resides
CHANNEL_NAME=<channel-id> TIMEOUT=<pick_a_value> docker-compose -f docker-compose-cli.yaml up -d
If you want to see the realtime logs for your network, then do not supply the ``-d`` flag.
If you let the logs stream, then you will need to open a second terminal to execute the CLI calls.
Command syntax
^^^^^^^^^^^^^^
Refer to the create and join commands in the ``script.sh`` for the exact syntax.
For the following CLI commands against `peer0.org1.example.com` to work, we need
to preface our commands with the four environment variables given below. These
variables for ``peer0.org1.example.com`` are baked into the CLI container,
therefore we can operate without passing them. **HOWEVER**, if you want to send
calls to other peers or the orderer, then you will need to provide these
values accordingly. Inspect the ``docker-compose-base.yaml`` for the specific
paths:
.. code:: bash
# Environment variables for PEER0
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
CORE_PEER_ADDRESS=peer0.org1.example.com:7051
CORE_PEER_LOCALMSPID="Org1MSP"
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
Create channel
^^^^^^^^^^^^^^
Exec into the cli container:
.. code:: bash
docker exec -it cli bash
If successful you should see the following:
.. code:: bash
root@0d78bb69300d:/opt/gopath/src/github.com/hyperledger/fabric/peer#
Specify your channel name with the ``-c`` flag. Specify your channel
configuration transaction with the ``-f`` flag. In this case it is
``channel.tx``, however you can mount your own configuration transaction
with a different name.
.. code:: bash
# the channel.tx file is mounted in the channel-artifacts directory within your cli container
# as a result, we pass the full path for the file
# we also pass the path for the orderer ca-cert in order to verify the TLS handshake
# be sure to replace the $CHANNEL_NAME variable appropriately
peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/cacerts/ca.example.com-cert.pem
.. note:: You will remain in the CLI container for the remainder of
these manual commands. You must also remember to preface all commands
with the corresponding environment variables when targeting a peer other than
``peer0.org1.example.com``.
Join channel
^^^^^^^^^^^^
Join specific peers to the channel
.. code:: bash
# By default, this joins ``peer0.org1.example.com`` only
# the channel.block was returned by the previous command
peer channel join -b <YOUR_CHANNEL.block>
You can make other peers join the channel as necessary by making appropriate
changes in the four environment variables.
Install chaincode onto a remote peer
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Install the sample go code onto one of the four peer nodes
.. code:: bash
peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
Instantiate chaincode and define the endorsement policy
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Instantiate the chaincode on a peer. This will launch a chaincode
container for the targeted peer and set the endorsement policy for the
chaincode. In this snippet, we define the policy as requiring an
endorsement from one peer node that is a part of either ``Org1`` or ``Org2``.
The command is:
.. code:: bash
# be sure to replace the $CHANNEL_NAME environment variable
# if you did not install your chaincode with a name of mycc, then modify that argument as well
peer chaincode instantiate -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/cacerts/ca.example.com-cert.pem -C $CHANNEL_NAME -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 -c '{"Args":["init","a", "100", "b","200"]}' -P "OR ('Org1MSP.member','Org2MSP.member')"
See the `endorsement
policies <http://hyperledger-fabric.readthedocs.io/en/latest/endorsement-policies.html>`__
documentation for more details on policy implementation.
Invoke chaincode
^^^^^^^^^^^^^^^^
.. code:: bash
# be sure to set the -C and -n flags appropriately
peer chaincode invoke -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/cacerts/ca.example.com-cert.pem -C $CHANNEL_NAME -n mycc -c '{"Args":["invoke","a","b","10"]}'
Make sure to wait a few seconds for the operation to complete.
Query chaincode
^^^^^^^^^^^^^^^
.. code:: bash
# be sure to set the -C and -n flags appropriately
peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'
The result of the above command should be the following:
.. code:: bash
Query Result: 90
Feel free to start over and manipulate the key value pairs and subsequent
invocations.
Using CouchDB
-------------
The state database can be switched from the default (goleveldb) to CouchDB.
The same chaincode functions are available with CouchDB, however, there is the
added ability to perform rich and complex queries against the state database
data content contingent upon the chaincode data being modeled as JSON.
To use CouchDB instead of the default database (goleveldb), follow the same
procedure in the **Manually exercise the commands** section, except when starting
the network pass the couchdb docker-compose as well:
.. code:: bash
# make sure you are in the /e2e_cli directory where your docker-compose script resides
CHANNEL_NAME=<channel-id> TIMEOUT=<pick_a_value> docker-compose -f docker-compose-cli.yaml -f docker-compose-couch.yaml up -d
**chaincode_example02** should now work using CouchDB underneath.
.. note:: If you choose to implement mapping of the fabric-couchdb container
port to a host port, please make sure you are aware of the security
implications. Mapping of the port in a development environment makes the
CouchDB REST API available, and allows the
visualization of the database via the CouchDB web interface (Fauxton).
Production environments would likely refrain from implementing port mapping in
order to restrict outside access to the CouchDB containers.
You can use **chaincode_example02** chaincode against the CouchDB state database
using the steps outlined above, however in order to exercise the CouchDB query
capabilities you will need to use a chaincode that has data modeled as JSON,
(e.g. **marbles02**). You can locate the **marbles02** chaincode in the
``fabric/examples/chaincode/go`` directory.
We will follow the same process to create and join the channel as outlined in the
**Manually exercise the commands** section above. Once you have joined your
peer(s) to the channel, use the following steps to interact with the **marbles02**
chaincode:
- Install and instantiate the chaincode on ``peer0.org1.example.com``:
.. code:: bash
# be sure to modify the $CHANNEL_NAME variable accordingly for the instantiate command
peer chaincode install -o orderer.example.com:7050 -n marbles -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/marbles02
peer chaincode instantiate -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/cacerts/ca.example.com-cert.pem -C $CHANNEL_NAME -n marbles -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/marbles02 -c '{"Args":["init"]}' -P "OR ('Org0MSP.member','Org1MSP.member')"
- Create some marbles and move them around:
.. code:: bash
# be sure to modify the $CHANNEL_NAME variable accordingly
peer chaincode invoke -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/cacerts/ca.example.com-cert.pem -C $CHANNEL_NAME -n marbles -c '{"Args":["initMarble","marble1","blue","35","tom"]}'
peer chaincode invoke -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/cacerts/ca.example.com-cert.pem -C $CHANNEL_NAME -n marbles -c '{"Args":["initMarble","marble2","red","50","tom"]}'
peer chaincode invoke -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/cacerts/ca.example.com-cert.pem -C $CHANNEL_NAME -n marbles -c '{"Args":["initMarble","marble3","blue","70","tom"]}'
peer chaincode invoke -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/cacerts/ca.example.com-cert.pem -C $CHANNEL_NAME -n marbles -c '{"Args":["transferMarble","marble2","jerry"]}'
peer chaincode invoke -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/cacerts/ca.example.com-cert.pem -C $CHANNEL_NAME -n marbles -c '{"Args":["transferMarblesBasedOnColor","blue","jerry"]}'
peer chaincode invoke -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/cacerts/ca.example.com-cert.pem -C $CHANNEL_NAME -n marbles -c '{"Args":["delete","marble1"]}'
- If you chose to map the CouchDB ports in docker-compose, you can now view
the state database through the CouchDB web interface (Fauxton) by opening
a browser and navigating to the following URL:
``http://localhost:5984/_utils``
You should see a database named ``mychannel`` (or your unique channel name) and
the documents inside it.
.. note:: For the below commands, be sure to update the $CHANNEL_NAME variable appropriately.
You can run regular queries from the CLI (e.g. reading ``marble2``):
.. code:: bash
peer chaincode query -C $CHANNEL_NAME -n marbles -c '{"Args":["readMarble","marble2"]}'
The output should display the details of ``marble2``:
.. code:: bash
Query Result: {"color":"red","docType":"marble","name":"marble2","owner":"jerry","size":50}
You can retrieve the history of a specific marble - e.g. ``marble1``:
.. code:: bash
peer chaincode query -C $CHANNEL_NAME -n marbles -c '{"Args":["getHistoryForMarble","marble1"]}'
The output should display the transactions on ``marble1``:
.. code:: bash
Query Result: [{"TxId":"1c3d3caf124c89f91a4c0f353723ac736c58155325f02890adebaa15e16e6464", "Value":{"docType":"marble","name":"marble1","color":"blue","size":35,"owner":"tom"}},{"TxId":"755d55c281889eaeebf405586f9e25d71d36eb3d35420af833a20a2f53a3eefd", "Value":{"docType":"marble","name":"marble1","color":"blue","size":35,"owner":"jerry"}},{"TxId":"819451032d813dde6247f85e56a89262555e04f14788ee33e28b232eef36d98f", "Value":}]
You can also perform rich queries on the data content, such as querying marble fields by owner ``jerry``:
.. code:: bash
peer chaincode query -C $CHANNEL_NAME -n marbles -c '{"Args":["queryMarblesByOwner","jerry"]}'
The output should display the two marbles owned by ``jerry``:
.. code:: bash
Query Result: [{"Key":"marble2", "Record":{"color":"red","docType":"marble","name":"marble2","owner":"jerry","size":50}},{"Key":"marble3", "Record":{"color":"blue","docType":"marble","name":"marble3","owner":"jerry","size":70}}]
A Note on Data Persistence
--------------------------
If data persistence is desired on the peer container or the CouchDB container,
one option is to mount a directory in the docker-host into a relevant directory
in the container. For example, you may add the following two lines in
the peer container specification in the ``docker-compose-base.yaml`` file:
.. code:: bash
volumes:
- /var/hyperledger/peer0:/var/hyperledger/production
For the CouchDB container, you may add the following two lines in the CouchDB
container specification:
.. code:: bash
volumes:
- /var/hyperledger/couchdb0:/opt/couchdb/data
Troubleshooting
---------------
- It's recommended to start your network fresh. Use the following command
to remove artifacts, crypto, containers and chaincode images:
.. code:: bash
./network_setup.sh down
- If you see docker errors, first check your version (should be 1.12 or above),
and then try restarting your docker process. Problems with Docker are
oftentimes not immediately recognizable. For example, you may see errors
resulting from an inability to access crypto material mounted within a
container.
- If they persist remove your images and start from scratch:
.. code:: bash
make clean
make docker
- If you see the below error:
.. code:: bash
Error: Error endorsing chaincode: rpc error: code = 2 desc = Error installing chaincode code mycc:1.0(chaincode /var/hyperledger/production/chaincodes/mycc.1.0 exits)
You likely have chaincode images (e.g. ``dev-peer1.org2.example.com-mycc-1.0`` or
``dev-peer0.org1.example.com-mycc-1.0``) from prior runs. Remove them and try
again.
.. code:: bash
docker rmi -f $(docker images | grep peer[0-9]-peer[0-9] | awk '{print $3}')
- If you see something similar to the following:
.. code:: bash
Error connecting: rpc error: code = 14 desc = grpc: RPC failed fast due to transport failure
Error: rpc error: code = 14 desc = grpc: RPC failed fast due to transport failure
Make sure you pointed to the correct binaries in the release folder when
generating the artifacts, and that your backend is running against "beta" images
or compiled images from the current master branch.
If you see the below error:
.. code:: bash
[configtx/tool/localconfig] Load -> CRIT 002 Error reading configuration: Unsupported Config Type ""
panic: Error reading configuration: Unsupported Config Type ""
Then you did not set the ``FABRIC_CFG_PATH`` environment variable properly. The
configtxgen tool needs this variable in order to locate the configtx.yaml. Go
back and recreate your channel artifacts.
- To cleanup the network, use the ``down`` option:
.. code:: bash
./network_setup.sh down
- If you continue to see errors, share your logs on the **# fabric-questions**
channel on `Hyperledger Rocket Chat <https://chat.hyperledger.org/home>`__.
.. Licensed under Creative Commons Attribution 4.0 International License
https://creativecommons.org/licenses/by/4.0/

View File

@ -1,101 +0,0 @@
#!/bin/bash
#
# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
UP_DOWN="$1"
CH_NAME="$2"
CLI_TIMEOUT="$3"
IF_COUCHDB="$4"
: ${CLI_TIMEOUT:="10000"}
COMPOSE_FILE=docker-compose-cli.yaml
COMPOSE_FILE_COUCH=docker-compose-couch.yaml
#COMPOSE_FILE=docker-compose-e2e.yaml
function printHelp () {
echo "Usage: ./network_setup <up|down> <\$channel-name> <\$cli_timeout> <couchdb>.\nThe arguments must be in order."
}
function validateArgs () {
if [ -z "${UP_DOWN}" ]; then
echo "Option up / down / restart not mentioned"
printHelp
exit 1
fi
if [ -z "${CH_NAME}" ]; then
echo "setting to default channel 'mychannel'"
CH_NAME=mychannel
fi
}
function clearContainers () {
CONTAINER_IDS=$(docker ps -aq)
if [ -z "$CONTAINER_IDS" -o "$CONTAINER_IDS" = " " ]; then
echo "---- No containers available for deletion ----"
else
docker rm -f $CONTAINER_IDS
fi
}
function removeUnwantedImages() {
DOCKER_IMAGE_IDS=$(docker images | grep "dev\|none\|test-vp\|peer[0-9]-" | awk '{print $3}')
if [ -z "$DOCKER_IMAGE_IDS" -o "$DOCKER_IMAGE_IDS" = " " ]; then
echo "---- No images available for deletion ----"
else
docker rmi -f $DOCKER_IMAGE_IDS
fi
}
function networkUp () {
if [ -f "./crypto-config" ]; then
echo "crypto-config directory already exists."
else
#Generate all the artifacts that includes org certs, orderer genesis block,
# channel configuration transaction
source generateArtifacts.sh $CH_NAME
fi
if [ "${IF_COUCHDB}" == "couchdb" ]; then
CHANNEL_NAME=$CH_NAME TIMEOUT=$CLI_TIMEOUT docker-compose -f $COMPOSE_FILE -f $COMPOSE_FILE_COUCH up -d 2>&1
else
CHANNEL_NAME=$CH_NAME TIMEOUT=$CLI_TIMEOUT docker-compose -f $COMPOSE_FILE up -d 2>&1
fi
if [ $? -ne 0 ]; then
echo "ERROR !!!! Unable to pull the images "
exit 1
fi
docker logs -f cli
}
function networkDown () {
docker-compose -f $COMPOSE_FILE down
#Cleanup the chaincode containers
clearContainers
#Cleanup images
removeUnwantedImages
# remove orderer block and other channel configuration transactions and certs
rm -rf channel-artifacts/*.block channel-artifacts/*.tx crypto-config
}
validateArgs
#Create the network using docker compose
if [ "${UP_DOWN}" == "up" ]; then
networkUp
elif [ "${UP_DOWN}" == "down" ]; then ## Clear the network
networkDown
elif [ "${UP_DOWN}" == "restart" ]; then ## Restart the network
networkDown
networkUp
else
printHelp
exit 1
fi

View File

@ -1,273 +0,0 @@
#!/bin/bash
# Copyright London Stock Exchange Group All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
echo
echo " ____ _____ _ ____ _____ _____ ____ _____ "
echo "/ ___| |_ _| / \ | _ \ |_ _| | ____| |___ \ | ____|"
echo "\___ \ | | / _ \ | |_) | | | _____ | _| __) | | _| "
echo " ___) | | | / ___ \ | _ < | | |_____| | |___ / __/ | |___ "
echo "|____/ |_| /_/ \_\ |_| \_\ |_| |_____| |_____| |_____|"
echo
CHANNEL_NAME="$1"
: ${CHANNEL_NAME:="mychannel"}
: ${TIMEOUT:="60"}
COUNTER=1
MAX_RETRY=5
ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
echo "Channel name : "$CHANNEL_NAME
verifyResult () {
if [ $1 -ne 0 ] ; then
echo "!!!!!!!!!!!!!!! "$2" !!!!!!!!!!!!!!!!"
echo "================== ERROR !!! FAILED to execute End-2-End Scenario =================="
echo
exit 1
fi
}
setGlobals () {
if [ $1 -eq 0 -o $1 -eq 1 ] ; then
CORE_PEER_LOCALMSPID="Org1MSP"
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
if [ $1 -eq 0 ]; then
CORE_PEER_ADDRESS=peer0.org1.example.com:7051
else
CORE_PEER_ADDRESS=peer1.org1.example.com:7051
fi
else
CORE_PEER_LOCALMSPID="Org2MSP"
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
if [ $1 -eq 2 ]; then
CORE_PEER_ADDRESS=peer0.org2.example.com:7051
else
CORE_PEER_ADDRESS=peer1.org2.example.com:7051
fi
fi
env |grep CORE
}
checkOSNAvailability() {
#Use orderer's MSP for fetching system channel config block
CORE_PEER_LOCALMSPID="OrdererMSP"
CORE_PEER_TLS_ROOTCERT_FILE=$ORDERER_CA
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp
local rc=1
local starttime=$(date +%s)
# continue to poll
# we either get a successful response, or reach TIMEOUT
while test "$(($(date +%s)-starttime))" -lt "$TIMEOUT" -a $rc -ne 0
do
sleep 3
echo "Attempting to fetch system channel 'testchainid' ...$(($(date +%s)-starttime)) secs"
if [ -z "$CORE_PEER_TLS_ENABLED" -o "$CORE_PEER_TLS_ENABLED" = "false" ]; then
peer channel fetch 0 -o orderer.example.com:7050 -c "testchainid" >&log.txt
else
peer channel fetch 0 -o orderer.example.com:7050 -c "testchainid" --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA >&log.txt
fi
test $? -eq 0 && VALUE=$(cat log.txt | awk '/Received block/ {print $NF}')
test "$VALUE" = "0" && let rc=0
done
cat log.txt
verifyResult $rc "Ordering Service is not available, Please try again ..."
echo "===================== Ordering Service is up and running ===================== "
echo
}
createChannel() {
setGlobals 0
if [ -z "$CORE_PEER_TLS_ENABLED" -o "$CORE_PEER_TLS_ENABLED" = "false" ]; then
peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx >&log.txt
else
peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA >&log.txt
fi
res=$?
cat log.txt
verifyResult $res "Channel creation failed"
echo "===================== Channel \"$CHANNEL_NAME\" is created successfully ===================== "
echo
}
updateAnchorPeers() {
PEER=$1
setGlobals $PEER
if [ -z "$CORE_PEER_TLS_ENABLED" -o "$CORE_PEER_TLS_ENABLED" = "false" ]; then
peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/${CORE_PEER_LOCALMSPID}anchors.tx >&log.txt
else
peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/${CORE_PEER_LOCALMSPID}anchors.tx --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA >&log.txt
fi
res=$?
cat log.txt
verifyResult $res "Anchor peer update failed"
echo "===================== Anchor peers for org \"$CORE_PEER_LOCALMSPID\" on \"$CHANNEL_NAME\" is updated successfully ===================== "
sleep 5
echo
}
## Sometimes Join takes time hence RETRY atleast for 5 times
joinWithRetry () {
peer channel join -b $CHANNEL_NAME.block >&log.txt
res=$?
cat log.txt
if [ $res -ne 0 -a $COUNTER -lt $MAX_RETRY ]; then
COUNTER=` expr $COUNTER + 1`
echo "PEER$1 failed to join the channel, Retry after 2 seconds"
sleep 2
joinWithRetry $1
else
COUNTER=1
fi
verifyResult $res "After $MAX_RETRY attempts, PEER$ch has failed to Join the Channel"
}
joinChannel () {
for ch in 0 1 2 3; do
setGlobals $ch
joinWithRetry $ch
echo "===================== PEER$ch joined on the channel \"$CHANNEL_NAME\" ===================== "
sleep 2
echo
done
}
installChaincode () {
PEER=$1
setGlobals $PEER
peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 >&log.txt
res=$?
cat log.txt
verifyResult $res "Chaincode installation on remote peer PEER$PEER has Failed"
echo "===================== Chaincode is installed on remote peer PEER$PEER ===================== "
echo
}
instantiateChaincode () {
PEER=$1
setGlobals $PEER
# while 'peer chaincode' command can get the orderer endpoint from the peer (if join was successful),
# lets supply it directly as we know it using the "-o" option
if [ -z "$CORE_PEER_TLS_ENABLED" -o "$CORE_PEER_TLS_ENABLED" = "false" ]; then
peer chaincode instantiate -o orderer.example.com:7050 -C $CHANNEL_NAME -n mycc -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "OR ('Org1MSP.member','Org2MSP.member')" >&log.txt
else
peer chaincode instantiate -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA -C $CHANNEL_NAME -n mycc -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "OR ('Org1MSP.member','Org2MSP.member')" >&log.txt
fi
res=$?
cat log.txt
verifyResult $res "Chaincode instantiation on PEER$PEER on channel '$CHANNEL_NAME' failed"
echo "===================== Chaincode Instantiation on PEER$PEER on channel '$CHANNEL_NAME' is successful ===================== "
echo
}
chaincodeQuery () {
PEER=$1
echo "===================== Querying on PEER$PEER on channel '$CHANNEL_NAME'... ===================== "
setGlobals $PEER
local rc=1
local starttime=$(date +%s)
# continue to poll
# we either get a successful response, or reach TIMEOUT
while test "$(($(date +%s)-starttime))" -lt "$TIMEOUT" -a $rc -ne 0
do
sleep 3
echo "Attempting to Query PEER$PEER ...$(($(date +%s)-starttime)) secs"
peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}' >&log.txt
test $? -eq 0 && VALUE=$(cat log.txt | awk '/Query Result/ {print $NF}')
test "$VALUE" = "$2" && let rc=0
done
echo
cat log.txt
if test $rc -eq 0 ; then
echo "===================== Query on PEER$PEER on channel '$CHANNEL_NAME' is successful ===================== "
else
echo "!!!!!!!!!!!!!!! Query result on PEER$PEER is INVALID !!!!!!!!!!!!!!!!"
echo "================== ERROR !!! FAILED to execute End-2-End Scenario =================="
echo
exit 1
fi
}
chaincodeInvoke () {
PEER=$1
setGlobals $PEER
# while 'peer chaincode' command can get the orderer endpoint from the peer (if join was successful),
# lets supply it directly as we know it using the "-o" option
if [ -z "$CORE_PEER_TLS_ENABLED" -o "$CORE_PEER_TLS_ENABLED" = "false" ]; then
peer chaincode invoke -o orderer.example.com:7050 -C $CHANNEL_NAME -n mycc -c '{"Args":["invoke","a","b","10"]}' >&log.txt
else
peer chaincode invoke -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA -C $CHANNEL_NAME -n mycc -c '{"Args":["invoke","a","b","10"]}' >&log.txt
fi
res=$?
cat log.txt
verifyResult $res "Invoke execution on PEER$PEER failed "
echo "===================== Invoke transaction on PEER$PEER on channel '$CHANNEL_NAME' is successful ===================== "
echo
}
## Check for orderering service availablility
echo "Check orderering service availability..."
checkOSNAvailability
## Create channel
echo "Creating channel..."
createChannel
## Join all the peers to the channel
echo "Having all peers join the channel..."
joinChannel
## Set the anchor peers for each org in the channel
echo "Updating anchor peers for org1..."
updateAnchorPeers 0
echo "Updating anchor peers for org2..."
updateAnchorPeers 2
## Install chaincode on Peer0/Org1 and Peer2/Org2
echo "Installing chaincode on org1/peer0..."
installChaincode 0
echo "Install chaincode on org2/peer2..."
installChaincode 2
#Instantiate chaincode on Peer2/Org2
echo "Instantiating chaincode on org2/peer2..."
instantiateChaincode 2
#Query on chaincode on Peer0/Org1
echo "Querying chaincode on org1/peer0..."
chaincodeQuery 0 100
#Invoke on chaincode on Peer0/Org1
echo "Sending invoke transaction on org1/peer0..."
chaincodeInvoke 0
## Install chaincode on Peer3/Org2
echo "Installing chaincode on org2/peer3..."
installChaincode 3
#Query on chaincode on Peer3/Org2, check if the result is 90
echo "Querying chaincode on org2/peer3..."
chaincodeQuery 3 90
echo
echo "===================== All GOOD, End-2-End execution completed ===================== "
echo
echo
echo " _____ _ _ ____ _____ ____ _____ "
echo "| ____| | \ | | | _ \ | ____| |___ \ | ____|"
echo "| _| | \| | | | | | _____ | _| __) | | _| "
echo "| |___ | |\ | | |_| | |_____| | |___ / __/ | |___ "
echo "|_____| |_| \_| |____/ |_____| |_____| |_____|"
echo
exit 0

View File

@ -12,6 +12,10 @@ OrdererOrgs:
# ---------------------------------------------------------------------------
- Name: Orderer
Domain: example.com
CA:
Country: US
Province: California
Locality: San Francisco
# ---------------------------------------------------------------------------
# "Specs" - See PeerOrgs below for complete description
# ---------------------------------------------------------------------------
@ -26,6 +30,10 @@ PeerOrgs:
# ---------------------------------------------------------------------------
- Name: Org1
Domain: org1.example.com
CA:
Country: US
Province: California
Locality: San Francisco
# ---------------------------------------------------------------------------
# "Specs"
# ---------------------------------------------------------------------------
@ -75,6 +83,10 @@ PeerOrgs:
# ---------------------------------------------------------------------------
- Name: Org2
Domain: org2.example.com
CA:
Country: US
Province: California
Locality: San Francisco
Template:
Count: 2
Users:

View File

@ -17,10 +17,13 @@ fi
echo_b "Clean up all containers..."
docker rm -f `docker ps -qa`
echo_b "Clean up all chaincode-images..."
docker rmi -f $(docker images |grep 'dev-peer*'|awk '{print $3}')
echo_b "Clean up all chaincode images..."
docker rmi -f $(docker images |grep 'dev-peer'|awk '{print $3}')
echo_b "Clean up all hyperledger related images..."
docker rmi $(docker images |grep 'hyperledger')
docker rmi -f $(docker images |grep 'hyperledger'|awk '{print $3}')
echo_b "Clean up dangling images..."
docker rmi $(docker images -q -f dangling=true)
echo_g "Env cleanup done!"

View File

@ -1,19 +0,0 @@
2017-09-15 06:32:05.922 UTC [msp] GetLocalMSP -> DEBU 001 Returning existing local MSP
2017-09-15 06:32:05.922 UTC [msp] GetDefaultSigningIdentity -> DEBU 002 Obtaining default signing identity
2017-09-15 06:32:05.928 UTC [channelCmd] InitCmdFactory -> INFO 003 Endorser and orderer connections initialized
Error: genesis block file not found open businesschannel.block: no such file or directory
Usage:
peer channel join [flags]
Flags:
-b, --blockpath string Path to file containing genesis block
Global Flags:
--cafile string Path to file containing PEM-encoded trusted certificate(s) for the ordering endpoint
--logging-level string Default logging level and overrides, see core.yaml for full syntax
-o, --orderer string Ordering service endpoint
--ordererTLSHostnameOverride string The hostname override to use when validating the TLS connection to the orderer.
--test.coverprofile string Done (default "coverage.cov")
--tls Use TLS when communicating with the orderer endpoint
-v, --version Display current version of fabric peer server

View File

@ -1,276 +0,0 @@
## Usage of cryptogen and configtxgen
To bootup a fabric network, we need:
* crypto_config: crypto keys/certs for all organizations, see `e2e_cli/crypto-config`
* orderer_genesis.block: genesis block to bootup orderer, see `e2e_cli/channel-artifacts`
* channel.tx: transaction to create an application channel, see `e2e_cli/channel-artifacts`
* Org1MSPanchors.tx, Org2MSPanchors.tx: Transaction to update anchor config in Org1 and Org2, see `e2e_cli/channel-artifacts`
### Generate crypto-config using cryptogen
```bash
$ cryptogen generate --config=/etc/hyperledger/fabric/crypto-config.yaml --output ./crypto-config
```
cryptogen will read configuration from `crypto-config.yaml`, by default it was put under `/etc/hyperledger/fabric/`.
Then put the generated `crypto-config` under `/etc/hyperledger/fabric/`.
### Generate blocks/txs using [configtxgen](http://hyperledger-fabric.readthedocs.io/en/latest/configtxgen.html?highlight=crypto#)
By default, configtxgen will read configuration from `/etc/hyperledger/fabric/configtx.yaml`, Please customize the configtx.yaml file before running.
#### Create orderer genesis block
```bash
$ configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/orderer.genesis.block
```
#### Create channel transaction artifact
```bash
$ CHANNEL_NAME=businesschannel
$ configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID ${CHANNEL_NAME}
```
`channel.tx` is used for creating a new application channel `businesschannel`
#### Update anchor peer for Organizations on the channel
Choose peer peer0.org1.example.com as org1's anchor peer, and peer0.org2.example.com as org2's anchor peer.
```bash
$ configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID ${CHANNEL_NAME} -asOrg Org1MSP
```
```bash
$ configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID ${CHANNEL_NAME} -asOrg Org2MSP
```
> more details refer to Example2
### Examples
#### Example1: how to add and re-join a new channel
This example will explain how to add a new channel without change basic topology that desigend in configtx.yaml and crypto-config.yaml.
start a fabric network with `docker-compose-1peer.yaml`, and into container fabric-cli
* 1 Regenerate `channel.tx` using with new channel name
Create channel configuration for the to-be-created `testchannel`.
```bash
$ root@cli: CHANNEL_NAME=testchannel
$ root@cli: configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID ${CHANNEL_NAME}
```
* 2 regenerate anchor peer configuratoin for Organizations
```bash
$ root@cli: configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID ${CHANNEL_NAME} -asOrg Org1MSP
$ root@cli: configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID ${CHANNEL_NAME} -asOrg Org2MSP
```
* (optional)execute auto-test script
You can skip this step, this will quickly check whether the network works, and also you can verify manually.
```bash
$ root@cli: bash ./peer/scripts/test_1peer.sh testchannel
```
* 3 Create new channel
```bash
$ root@cli: peer channel create -o orderer.example.com:7050 -c ${CHANNEL_NAME} -f ./channel-artifacts/channel.tx
```
check whether genrated new block `testchannel.block`
```bash
root@cli: ls testchannel.block
testchannel.block
```
* 4 Join new channel
Join peer0.org1.example.com to the new channel
```bash
$ root@cli: peer channel join -b ${CHANNEL_NAME}.block -o orderer.example.com:7050
Peer joined the channel!
```
check whether success
```bash
$ root@cli: peer channel list
Channels peers has joined to:
testchannel
```
* 5 Update anchor peer
```bash
$ root@cli: peer channel create -o orderer.example.com:7050 -c ${CHANNEL_NAME} -f ./channel-artifacts/Org1MSPanchors.tx
```
* 6 Install
```bash
peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
```
* 7 Instantiate
```bash
root@cli: peer chaincode instantiate -o orderer.example.com:7050 -C ${CHANNEL_NAME} -n mycc -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "OR ('Org1MSP.member')"
```
* 8 Query
```bash
root@cli: peer chaincode query -C ${CHANNEL_NAME} -n mycc -c '{"Args":["query","a"]}'
```
The output should be:
```bash
Query Result: 100
UTC [main] main -> INFO 008 Exiting.....
```
#### Example2: how to add an organization or peer
This example will explain how to add a new org or peer with changed the basic topology that desigend in configtx.yaml and crypto-config.yaml.
##### all-in-one
We privide some instance in current directory, in this case we add a new organization `Org3` and new peer `peer0.org3.example.com`.
* 1 Generate necessary config and certs
```bash
$ sudo docker-compose -f docker-compose-2orgs-4peers-event.yaml up
$ docker exec -it fabric-cli bash
$ root@cli: ./scripts/add-org.sh
```
> ** notice: For docker-compose-file clean, we did not mount these in the container, you need to mount yourself.
* 2 Re-setup network
```bash
echo "clean containers...."
docker rm -f `docker ps -aq`
echo "clean images ..."
docker rmi -f `docker images|grep mycc-1.0|awk '{print $3}'`
```
```bash
$ sudo docker-compose -f docker-compose-2orgs-4peers-event.yaml up
```
* 3 execute auto-test
Throuth this script to test whether the network works.
```bash
$ root@cli: bash ./scripts/test-5-peers.sh newchannel
```
The final output may look like following
```bash
===================== Query on PEER4 on channel 'newchannel' is successful =====================
===================== All GOOD, End-2-End execution completed =====================
```
##### manually
* 1 Modify config
modify configtx.yaml, crypto-cnfig.yaml and docker-compose files to adapt new change. and replace old file.
* 2 Bootstrap network with `docker-compose-2orgs-4peers-event.yaml`
```bash
$ docker-compose -f docker-compose-2orgs-4peers-event.yaml up
```
> notes:You may encounter some errors at startup and some peers can't start up, It's innocuous, ignore it,
because we will restart later, and now we just use tools in cli container.
* 3 Generate new certificates
```bash
$ cryptogen generate --config=/etc/hyperledger/fabric/crypto-config.yaml --output ./crypto
```
* 4 Create the genesis block
```bash
root@cli: configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/orderer_genesis.block
```
* 5 Create the configuration tx
```bash
root@cli: CHANNEL_NAME=newchannel
root@cli: configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID ${CHANNEL_NAME}
```
`channel.tx` is used for generating new channel `newchannel`
* 6 Define the anchor peer for Orgs on the channel
```bash
root@cli: configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID ${CHANNEL_NAME} -asOrg Org1MSP
root@cli: configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID ${CHANNEL_NAME} -asOrg Org2MSP
root@cli: configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org3MSPanchors.tx -channelID ${CHANNEL_NAME} -asOrg Org3MSP
```
* 7 Restart network
As we have changed the configtx.yaml and regenerate `orderer_genesis.block`,
we'd better restart orderering service or all the service.
now we clean all the old service and boot a new network.
```bash
echo "clean containers...."
docker rm -f `docker ps -aq`
echo "clean images ..."
docker rmi -f `docker images|grep mycc-1.0|awk '{print $3}'`
```
```bash
$ sudo docker-compose -f docker-compose-2orgs.yml up
```
* 8 Execute auto-test script
Until this step, we complete the network re-setup, and then we will test whether it works.
```bash
$ root@cli: bash ./scripts/test-5-peers.sh
```
If the network works well. the output may looklike:
```bash
===================== All GOOD, End-2-End execution completed =====================
```

View File

@ -1,35 +0,0 @@
## Chaincode Tests
All the test command needs to be executed inside the `fabric-cli` container.
Use the following command to login into the container fabric-cli
```bash
$ docker exec -it fabric-cli bash
```
After finish the chaincode tests, you can log-out by `exit`.
### Chaincode Operations
You can execute some chaincode operations, such as `query` or `invoke`,
and you can modify the parameters and execute this script repeatedly.
```bash
$ bash ./scripts/test_4peers.sh #execute in container fabric-cli
```
You should see the following output:
```bash
UTC [msp] GetLocalMSP -> DEBU 004 Returning existing local MSP
UTC [msp] GetDefaultSigningIdentity -> DEBU 005 Obtaining default signing identity
UTC [msp/identity] Sign -> DEBU 006 Sign: plaintext: 0AB7070A6D08031A0C08C3EAE9C90510...6D7963631A0A0A0571756572790A0161
UTC [msp/identity] Sign -> DEBU 007 Sign: digest: FA308EF50C4812BADB60D58CE15C1CF41089EFB93B27D46885D92C92F55E98A0
Query Result: 80
UTC [main] main -> INFO 008 Exiting.....
===================== Query on PEER3 on channel 'businesschannel' is successful =====================
===================== All GOOD, End-2-End execution completed =====================
```

View File

@ -1,195 +0,0 @@
## Start the configtxlator
First start a fabric network with docker-compose-2orgs-4peers.yaml, and make sure the network can work,
then we will use `configtxlator` to start an http server listening on the designated port and process request.
```bash
$ docker exec -it fab-cli bash
$ configtxlator start
UTC [configtxlator] startServer -> INFO 001 Serving HTTP requests on 0.0.0.0:7059
```
This logs appears, indicating startup successful.
## Function
### translation
#### /protolator/decode/{msgName}
Any of the configuration related protos, including `common.Block`, `common.Envelope`, `common.ConfigEnvelope`,
`common.ConfigUpdateEnvelope`, `common.Configuration`, and `common.ConfigUpdate` are valid targets for these URLs.
this will produces human readable version of config, such as translate to json
Execute following command in new terminal,
```bash
$ docker exec -it fabric-cli bash
$ cd channel-artifacts
$ curl -X POST --data-binary @businesschannel_0.block http://127.0.0.1:7059/protolator/decode/common.Block > businesschannel_0.json
```
for channel.tx, use following msgType.
```bash
curl -X POST --data-binary @channel.tx http://127.0.0.1:7059/protolator/decode/common.Envelope > channel.json
```
#### /protolator/encode/{msgName}
And we can transform json to proto.
```bash
$ curl -X POST --data-binary @businesschannel_0.json http://127.0.0.1:7059/protolator/encode/common.Block > businesschannel_0.block
```
### Re-Configuration example
1. here we will introduce how to re-configuration config.block, first fetch the block and translate it to json.
```bash
$ ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
$ peer channel fetch config -o orderer.example.com:7050 -c businesschannel --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA|xargs mv true config_block.pb
$ peer channel fetch config config_block.pb -o orderer.example.com:7050 -c businesschannel # with no-tls
$ curl -X POST --data-binary @config_block.pb http://127.0.0.1:7059/protolator/decode/common.Block > config_block.json
```
2. Extract the config section from the block:
```bash
$ apt-get install jq
$ jq .data.data[0].payload.data.config config_block.json > config.json
```
3. edit the config.json, set the batch size to 11, and saving it as update_config.json
```bash
4. $ jq ".channel_group.groups.Orderer.values.BatchSize.value.max_message_count = 11" config.json > updated_config.json
```
5. Re-encode both the original config, and the updated config into proto:
```bash
$ curl -X POST --data-binary @config.json http://127.0.0.1:7059/protolator/encode/common.Config > config.pb
$ curl -X POST --data-binary @updated_config.json http://127.0.0.1:7059/protolator/encode/common.Config > updated_config.pb
```
6. send them to the configtxlator service to compute the config update which transitions between the two.
```bash
$ curl -X POST -F original=@config.pb -F updated=@updated_config.pb http://127.0.0.1:7059/configtxlator/compute/update-from-configs -F channel=businesschannel > config_update.pb
```
7. we decode the ConfigUpdate so that we may work with it as text:
```bash
$ curl -X POST --data-binary @config_update.pb http://127.0.0.1:7059/protolator/decode/common.ConfigUpdate > config_update.json
```
8. Then, we wrap it in an envelope message:
```bash
$ echo '{"payload":{"header":{"channel_header":{"channel_id":"businesschannel", "type":2}},"data":{"config_update":'$(cat config_update.json)'}}}' > config_update_as_envelope.json
```
9. Next, convert it back into the proto form of a full fledged config transaction:
```bash
$ curl -X POST --data-binary @config_update_as_envelope.json http://127.0.0.1:7059/protolator/encode/common.Envelope > config_update_as_envelope.pb
````
10. Finally, submit the config update transaction to ordering to perform a config update.
```bash
$ CORE_PEER_LOCALMSPID=OrdererMSP
$ CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/users/Admin@example.com/msp
$ peer channel update -o orderer.example.com:7050 -c businesschannel -f config_update_as_envelope.pb --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA
$ peer channel update -f config_update_as_envelope.pb -o orderer.example.com:7050 -c businesschannel # with no-tls
```
### [WIP]Add an organization
1. Execute `configtxgen` to generate `channel.tx`
```bash
$ ORDERER_GENERAL_GENESISPROFILE=SampleDevModSolo #Change this env before start ordering service.
```
```bash
$ docker exec -it fabric-cli bash
$ configtxgen -profile SampleDevModSolo -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID businesschannel
```
2. create channel use channel.tx, then we will get block businesschannel.block
```bash
$ peer channel create -o orderer.example.com:7050 -c businesschannel -f ./channel-artifacts/channel.tx
```
3. Start configtxlator
```bash
$ docker exec -it fabric-cli bash
$ configtxlator start
```
4. In a new window, decoding current genesis block
```bash
$ curl -X POST --data-binary @businesschannel.block http://127.0.0.1:7059/protolator/decode/common.Block > businesschannel.json
```
5. Extract current config
```bash
jq .data.data[0].payload.data.config businesschannel.json > config.json
```
6. generating new config
```bash
jq '. * {"channel_group":{"groups":{"Application":{"groups":{"ExampleOrg": .channel_group.groups.Application.groups.SampleOrg}}}}}' config.json |
jq '.channel_group.groups.Application.groups.ExampleOrg.values.MSP.value.config.name = "ExampleOrg"' > update_config.json
```
7. Translate config.json and update_config.json to proto
```bash
curl -X POST --data-binary @config.json http://127.0.0.1:7059/protolator/encode/common.Config > config.pb
curl -X POST --data-binary @update_config.json http://127.0.0.1:7059/protolator/encode/common.Config > update_config.pb
```
8. Computing config update
```bash
curl -X POST -F original=@config.pb -F updated=@update_config.pb http://127.0.0.1:7059/configtxlator/compute/update-from-configs -F channel=businesschannel > config_update.pb
```
9. Decoding config update
```bash
curl -X POST --data-binary @config_update.pb http://127.0.0.1:7059/protolator/decode/common.ConfigUpdate > config_update.json
```
10. Generating config update envelope
```bash
echo '{"payload":{"header":{"channel_header":{"channel_id":"businesschannel", "type":2}},"data":{"config_update":'$(cat config_update.json)'}}}' > config_update_in_envelope.json
```
11. Next, convert it back into the proto form of a full fledged config transaction:
```bash
curl -X POST --data-binary @config_update_in_envelope.json http://127.0.0.1:7059/protolator/encode/common.Envelope > config_update_in_envelope.pb
```
12. Sending config update to channel
```bash
$ CORE_PEER_LOCALMSPID=OrdererMSP
$ CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/users/Admin@example.com/msp
$ peer channel update -o orderer.example.com:7050 -c businesschannel -f config_update_in_envelope.pb --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA
$ (optional)peer channel update -f config_update_as_envelope.pb -o orderer.example.com:7050 -c businesschannel # with no-tls
```

View File

@ -1,32 +0,0 @@
### Start network with CouchDB
```bash
docker-compose -f docker-compose-2orgs-4peers.yaml -f docker-compose-2orgs-4peers-couchdb.yaml up
```
To use CouchDB instead of the default database leveldb, The same chaincode functions are available with CouchDB, however, there is the
added ability to perform rich and complex queries against the state database
data content contingent upon the chaincode data being modeled as JSON
### Test chaincode_example02
```bash
docker exec -it fabric-cli bash
bash ./scripts/initialize.sh
bash ./scripts/test_4peers.sh
```
You can use chaincode_example02 chaincode against the CouchDB state database
using the steps outlined above, however in order to exercise the CouchDB query
capabilities you will need to use a chaincode that has data modeled as JSON.
(e.g. marbles02)
### [WIP] [Test example marbles02](https://github.com/hyperledger/fabric/blob/master/examples/chaincode/go/marbles02/marbles_chaincode.go)
### Interact with CouchDb by WEB-UI
The browser is `http://localhost:5984/_utils`, then you will find a database named `businesschannel`

View File

@ -1,122 +0,0 @@
## Use default channel
By default, all the peer will join the default chain of `testchainid`.
```bash
$ docker exec -it fabric-cli bash
$ peer channel list
Channels peers has joined to:
testchainid
UTC [main] main -> INFO 001 Exiting.....
```
After the cluster is synced successfully, you can validate by install/instantiate, invoking or querying chaincode from the container or from the host.
### install&instantiate
Use `docker exec -it fabric-cli bash` to open a bash inside container `fabric-cli`, which will accept our chaincode testing commands of `install&instantiate`, `invoke` and `query`.
Inside the container, run the following command to install a new chaincode of the example02. The chaincode will initialize two accounts: `a` and `b`, with value of `100` and `200`.
```bash
$ peer chaincode install -v 1.0 -n test_cc -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
```
This will take a while, and the result may look like following.
```bash
[golang-platform] writeGopathSrc -> INFO 001 rootDirectory = /go/src
container] WriteFolderToTarPackage -> INFO 002 rootDirectory = /go/src
[main] main -> INFO 003 Exiting.....
```
Then instantiate the chaincode test_cc on defaule channel testchainid.
```bash
$ peer chaincode instantiate -v 1.0 -n test_cc -c '{"Args":["init","a","100","b","200"]}' -o orderer0:7050
```
This will take a while, and the result may look like following:
```bash
UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 001 Using default escc
UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 002 Using default vscc
UTC [main] main -> INFO 003 Exiting.....
```
There should be no error in the return log, and in the peer nodes's output.
Wait several seconds till the deploy is finished.
If the `peer chaincode install` and `peer chaincode instantiate` commands are executed successfully, there will generate a new chaincode container, besides the 4 existing one, name like `dev-peer0-test_cc-1.0`.
```bash
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cf7bf529f214 dev-peer0-test_cc-1.0 "chaincode -peer.a..." 58 seconds ago Up 58 seconds dev-peer0-test_cc-1.0
44b6870b0802 hyperledger/fabric-peer "bash -c 'while tr..." 14 minutes ago Up 14 minutes 7050-7059/tcp fabric-cli
ed2c4927c0ed hyperledger/fabric-peer "peer node start -..." 14 minutes ago Up 14 minutes 7050/tcp, 7052-7059/tcp, 0.0.0.0:7051->7051/tcp fabric-peer0
af5ba8f213bb hyperledger/fabric-orderer "orderer" 14 minutes ago Up 14 minutes 0.0.0.0:7050->7050/tcp fabric-orderer0
bbe31b98445f hyperledger/fabric-ca "fabric-ca-server ..." 14 minutes ago Up 14 minutes 7054/tcp, 0.0.0.0:7054->7054/tcp fabric-ca
```
And will also generate a new chaincode image, name like `dev-peer0-test_cc-1.0`.
```bash
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
dev-peer0-test_cc-1.0 latest 84e5422eead5 About a minute ago 176 MB
...
```
### Query
Inside the container, query the existing value of `a` and `b`.
*Notice that the query method can be called by invoke a transaction.*
```bash
$ peer chaincode query -n test_cc -c '{"Args":["query","a"]}'
```
The final output may look like the following, with a payload value of `100`.
```bash
Query Result: 100
[main] main -> INFO 001 Exiting.....
```
Query the value of `b`
```bash
$ peer chaincode query -n test_cc -c '{"Args":["query","b"]}' -o orderer0:7050
```
The final output may look like the following, with a payload value of `200`.
```bash
Query Result: 200
[main] main -> INFO 001 Exiting.....
```
### Invoke
Inside the container, invoke a transaction to transfer `10` from `a` to `b`.
```bash
$ peer chaincode invoke -n test_cc -c '{"Args":["invoke","a","b","10"]}' -o orderer0:7050
```
The final result may look like the following, the response should be `OK`.
```bash
[chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Invoke result: version:1 response:<status:200 message:"OK" > payload:"\n \215\263\337\322u\323?\242t$s\035l\270Ta\270\270+l6\322X\346\365k\020\215Phy\260\022C\n<\002\004lccc\001\007test_cc\004\001\001\001\001\000\000\007test_cc\002\001a\004\001\001\001\001\001b\004\001\001\001\001\002\001a\000\00290\001b\000\003210\000\032\003\010\310\001" endorsement:<endorser:"\n\007DEFAULT\022\232\007-----BEGIN -----\nMIICjDCCAjKgAwIBAgIUBEVwsSx0TmqdbzNwleNBBzoIT0wwCgYIKoZIzj0EAwIw\nfzELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNh\nbiBGcmFuY2lzY28xHzAdBgNVBAoTFkludGVybmV0IFdpZGdldHMsIEluYy4xDDAK\nBgNVBAsTA1dXVzEUMBIGA1UEAxMLZXhhbXBsZS5jb20wHhcNMTYxMTExMTcwNzAw\nWhcNMTcxMTExMTcwNzAwWjBjMQswCQYDVQQGEwJVUzEXMBUGA1UECBMOTm9ydGgg\nQ2Fyb2xpbmExEDAOBgNVBAcTB1JhbGVpZ2gxGzAZBgNVBAoTEkh5cGVybGVkZ2Vy\nIEZhYnJpYzEMMAoGA1UECxMDQ09QMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\nHBuKsAO43hs4JGpFfiGMkB/xsILTsOvmN2WmwpsPHZNL6w8HWe3xCPQtdG/XJJvZ\n+C756KEsUBM3yw5PTfku8qOBpzCBpDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYw\nFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFOFC\ndcUZ4es3ltiCgAVDoyLfVpPIMB8GA1UdIwQYMBaAFBdnQj2qnoI/xMUdn1vDmdG1\nnEgQMCUGA1UdEQQeMByCCm15aG9zdC5jb22CDnd3dy5teWhvc3QuY29tMAoGCCqG\nSM49BAMCA0gAMEUCIDf9Hbl4xn3z4EwNKmilM9lX2Fq4jWpAaRVB97OmVEeyAiEA\n25aDPQHGGq2AvhKT0wvt08cX1GTGCIbfmuLpMwKQj38=\n-----END -----\n" signature:"0E\002!\000\271\232\230\261\336\352ow\021V3\224\252\217\362vzM'\213\376@2\306/\201=\213\023\244\310%\002 \014\277\362|\223\342\277Pk5(\004\331\014\021\307\273\351/]:\020\232\013d\261\035+\266\265\305<" >
[main] main -> INFO 002 Exiting.....
```
### Query
Query again the existing value of `a` and `b`.
```bash
$ peer chaincode query -n test_cc -c '{"Args":["query","a"]}'
```
The new value of `a` should be 90.
```bash
$ peer chaincode query -n test_cc -c '{"Args":["query","b"]}'
```
The new value of `b` should be 210.

View File

@ -1,221 +0,0 @@
### Explain 1-peer usage step by step
This section will show you how to operate the chaincode in detail.
first start fabric network with `docker-compose-1peer.yaml`, and we will obtain the basic environmet that can be operated.
```bash
$ docker-compose -f docker-compose-1peer.yaml up
```
There will be 4 containers running successfully.
```bash
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6688f290a9b9 hyperledger/fabric-peer "bash -c 'while tr..." About a minute ago Up About a minute 7050-7059/tcp fabric-cli
6ddbbd972ac3 hyperledger/fabric-peer "peer node start -..." About a minute ago Up About a minute 7050/tcp, 0.0.0.0:7051->7051/tcp, 7052/tcp, 7054-7059/tcp, 0.0.0.0:7053->7053/tcp peer0.org1.example.com
4afc759e0dc9 hyperledger/fabric-orderer "orderer" About a minute ago Up About a minute 0.0.0.0:7050->7050/tcp orderer.example.com
bea1154c7162 hyperledger/fabric-ca "fabric-ca-server ..." About a minute ago Up About a minute 7054/tcp, 0.0.0.0:7054->7054/tcp fabric-ca
```
#### Create artifacts
**This step can be safely skipped.**.
As we already put the needed artifacts `orderer.genesis.block` and `channel.tx` under `e2e_cli/channel-artifacts/`.
Detailed steps in [GenerateArtifacts](artifacts_generation.md) explains the creation of `orderer.genesis.block` (needed by orderering service) and `channel.tx` (needed by cli to create new channel) and crypto related configuration files.
#### Create new channel
Create a new channel named `mychannel` with the existing `channel.tx` file.
```bash
$ docker exec -it fabric-cli bash
```
Into the container and execute following commands:
```bash
$ CHANNEL_NAME="businesschannel"
$ peer channel create -o orderer.example.com:7050 -c ${CHANNEL_NAME} -f ./channel-artifacts/channel.tx
```
The cmd will return lots of info, which is the content of the configuration block.
And a block with the same name of the channel will be created locally.
```bash
$ ls businesschannel.block
businesschannel.block
```
Check the log output of `orderer.example.com`, should find some message like
```bash
orderer.example.com | UTC [orderer/multichain] newChain -> INFO 004 Created and starting new chain newchannel
```
#### Join the channel
Use the following command to join `peer0.org1.example.com` the channel
```bash
$ peer channel join -b ${CHANNEL_NAME}.block
Peer joined the channel!
```
Will receive the `Peer joined the channel!` response if succeed.
Then use the following command, we will find the channels that peers joined.
```bash
$ peer channel list
Channels peers has joined to:
mychannel
2017-04-11 03:44:40.313 UTC [main] main -> INFO 001 Exiting.....
```
#### Update anchor peers
The `configtx.yaml` file contains the definitions for our sample network and presents the topology of the network components - three members (OrdererOrg, Org1 & Org2), But in this MVE, we just use OrdererOrg and Org1, org1 has only peer(pee0.org1), and chose it as anchor peers for Org1.
```bash
$ peer channel create -o orderer.example.com:7050 -c ${CHANNEL_NAME} -f ./channel-artifacts/Org1MSPanchors.tx
```
#### Install&Instantiate
First `install` a chaincode named `mycc` to `peer0`.
```bash
$ peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
```
This will take a while, and the result may look like following.
```bash
UTC [golang-platform] writeGopathSrc -> INFO 004 rootDirectory = /go/src
UTC [container] WriteFolderToTarPackage -> INFO 005 rootDirectory = /go/src
UTC [main] main -> INFO 006 Exiting.....
```
Then `instantiate` the chaincode mycc on channel `mychannel`, with initial args and the endorsement policy.
```bash
$ peer chaincode instantiate -o orderer.example.com:7050 -C ${CHANNEL_NAME} -n mycc -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "OR ('Org1MSP.member')"
```
This will take a while, and the result may look like following:
```bash
UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 004 Using default escc
UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 005 Using default vscc
UTC [main] main -> INFO 006 Exiting.....
```
Now in the system, there will be a new `dev-peer0.org1.example.com-mycc-1.0` image and a `dev-peer0.org1.example.com-mycc-1.0` chaincode container.
```bash
crluser@baas-test2:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7aa088c76597 dev-peer0.org1.example.com-mycc-1.0 "chaincode -peer.a..." 10 seconds ago Up 9 seconds dev-peer0.org1.example.com-mycc-1.0
eb1d9c73b26b hyperledger/fabric-peer "bash -c 'while tr..." About a minute ago Up About a minute 7050-7059/tcp fabric-cli
2d6fd4f61e2b hyperledger/fabric-peer "peer node start -..." About a minute ago Up About a minute 7050/tcp, 0.0.0.0:7051->7051/tcp, 7052/tcp, 7054-7059/tcp, 0.0.0.0:7053->7053/tcp peer0.org1.example.com
832dcc64cc1b hyperledger/fabric-orderer "orderer" About a minute ago Up About a minute 0.0.0.0:7050->7050/tcp orderer.example.com
c87095528f76 hyperledger/fabric-ca "fabric-ca-server ..." About a minute ago Up About a minute 7054/tcp, 0.0.0.0:7054->7054/tcp fabric-ca
```
#### Query
Query the existing value of `a` and `b`.
```bash
$ peer chaincode query -C ${CHANNEL_NAME} -n mycc -c '{"Args":["query","a"]}'
```
The result may look like following, with a payload value of `100`.
```bash
Query Result: 100
[main] main -> INFO 001 Exiting.....
```
```bash
$ peer chaincode query -C ${CHANNEL_NAME} -n mycc -c '{"Args":["query","a"]}'
```
The result may look like following, with a payload value of `200`.
```bash
Query Result: 200
[main] main -> INFO 001 Exiting.....
```
#### Invoke
Inside the container, invoke a transaction to transfer `10` from `a` to `b`.
```bash
$ peer chaincode invoke -o orderer.example.com:7050 -C ${CHANNEL_NAME} -n mycc -c '{"Args":["invoke","a","b","10"]}'
```
The result may look like following:
```bash
UTC [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Invoke result: version:1 response:<status:200 message:"OK" > payload:"\n qm\251\207\312\277\256\261b\317:\300\000\014\203`\005\304\254\304,$a\360\327\010\342\342/y]\323\022X\nQ\022\031\n\004lccc\022\021\n\017\n\007test_cc\022\004\010\001\020\001\0224\n\007test_cc\022)\n\t\n\001a\022\004\010\001\020\001\n\t\n\001b\022\004\010\001\020\001\032\007\n\001a\032\00290\032\010\n\001b\032\003210\032\003\010\310\001" endorsement:<endorser:"\n\007Org0MSP\022\210\004-----BEGIN -----\nMIIBYzCCAQmgAwIBAwICA+gwCgYIKoZIzj0EAwIwEzERMA8GA1UEAwwIcGVlck9y\nZzAwHhcNMTcwMjIwMTkwNjExWhcNMTgwMjIwMTkwNjExWjAQMQ4wDAYDVQQDDAVw\nZWVyMDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABEF6dfqjqfbIgZuOR+dgoJMl\n/FaUlGI70A/ixmVUY83Yp4YtV3FDBSOPiO5O+s8pHnpbwB1LqhrxAx1Plr0M/UWj\nUDBOMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFBY2bc84vLEwkX1fSAER2p48jJXw\nMB8GA1UdIwQYMBaAFFQzuQR1RZP/Qn/BNDtGSa8n4eN/MAoGCCqGSM49BAMCA0gA\nMEUCIQDeDZ71L+OTYcbbqiDNRf0L8OExO59mH1O3xpdwMAM0MgIgXySG4sv9yV31\nWcWRFfRFyu7o3T72kqiLZ1nkDuJ8jWI=\n-----END -----\n" signature:"0E\002!\000\220M'\245\230do\310>\277\251j\021$\250\237H\353\377\331:\230\362n\216\224~\033\240\006\367%\002 \014\240|h\346\250\356\372\353\301;#\372\027\276!\252F\334/\221\210\254\215\363\235\341v\217\236\274<" >
2017-04-06 09:47:15.993 UTC [main] main -> INFO 002 Exiting.....
```
#### Query
And then query the value of `a` and `b`.
```bash
$ peer chaincode query -C ${CHANNEL_NAME} -n mycc -c '{"Args":["query","a"]}'
```
```bash
Query Result: 90
[main] main -> INFO 001 Exiting.....
```
The value of `a` should be `90`.
```bash
$ peer chaincode query -C ${CHANNEL_NAME} -n mycc -c '{"Args":["query","b"]}'
```
The value of `b` should be `210`
```bash
Query Result: 210
[main] main -> INFO 001 Exiting.....
```
Finally, the output of the chaincode containers may look like following.
```bash
$ docker logs -f dev-peer0.org1.example.com-mycc-1.0
ex02 Init
Aval = 100, Bval = 200
ex02 Invoke
Query Response:{"Name":"a","Amount":"100"}
ex02 Invoke
Aval = 90, Bval = 210
ex02 Invoke
Query Response:{"Name":"b","Amount":"210"}
ex02 Invoke
Query Response:{"Name":"a","Amount":"90"}
```
#### (optional) All-in-one testing operation
Run this script will check whether the MVE bootstrap success.
```bash
$ docker exec -it fabric-cli bash
$ bash ./scripts/test_1peer.sh
```

View File

@ -1,33 +0,0 @@
## Events
Events didn't support TLS, so make sure TLS has been disabled by setting *_TLS_ENABLED=false in peer-base.yaml and orderer-base.yaml
Next, start the network with following command:
```bash
$ bash scripts/start_fabric.sh docker-compose-2orgs-4peers-event.yaml
```
when the network starts successfully, we started a block-listener in container `fabric-event-listener`.
so observe the output of the service fabric-event-listener.
Listening logs at a new terminal,
```bash
$ docker logs -f fabric-event-listener
```
So when we do chaincode operations in container `fabric-cli`,
```bash
$ docker exec -it fabric-cli bash
$ bash ./scripts/initialize.sh
```
then we will get some events at listening terminal looks like following:
```bash
Received block
--------------
Received transaction from channel businesschannel:
[header:<channel_header:"\010\003\032\014\010\305\326\216\312\005\020\371\326\244\314\003\"\017businesschannel*@
633caf1cd9796d49a58898c873bd10055867113f4eeb051a057acbce7df0ed59:\010\022\006\022\004lscc"
signature_header:"\n\250\006\n\007Org2MSP\022\234\006-----BEGIN...
```

View File

@ -1,37 +0,0 @@
## peer channel fetch
### Under no-tls
When you set *TLS_ENABLED=false, then you can fetch blocks using following command:
```bash
$ NUM= the block's num you want to fetch
$ peer channel fetch $NUM -o orderer.example.com:7050 -c businesschannel
```
or you can use self-defined file, such as:
```bash
$ peer channel fetch $NUM self-define-file.block -o orderer.example.com:7050 -c businesschannel
```
For example, we `install` 4 times, and `invoke` 2 times, so we have 6 blocks in total, and we put it into `/e2e_cli/channel-artifacts`.
you can also use following command to fetch blocks:
```bash
$ peer channel fetch oldest -o orderer.example.com:7050 -c businesschannel
$ peer channel fetch newest -o orderer.example.com:7050 -c businesschannel
```
### Under tls
When you set *TLS_ENABLED=true, then you can fetch blocks using following command:
```bash
$ ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
$ NUM= the block's num you want to fetch
$ peer channel fetch $NUM -o orderer.example.com:7050 -c businesschannel --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA |xargs mv true businesschannel_$NUM.block
$ peer channel fetch oldest -o orderer.example.com:7050 -c businesschannel --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA |xargs mv true businesschannel_oldest.block
$ peer channel fetch newest -o orderer.example.com:7050 -c businesschannel --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA |xargs mv true businesschannel_newest.block
```
temporarily cannot support specify self-defined-file.

View File

@ -1,21 +0,0 @@
## Manually Setup
### Install Docker/Docker-Compose
```sh
$ bash scripts/setup_Docker.sh # Install Docker, Docker-Compose
```
### Download Images
Pull necessary images of peer, orderer, ca, and base image. You may optionally run the clean_env.sh script to remove all existing container and images.
```sh
$ bash scripts/cleanup_env.sh
$ bash scripts/download_images.sh
```
There are also some community [images](https://hub.docker.com/r/hyperledger/) at Dockerhub, use at your own choice.
Now you can try [chaincode test](chaincode_test.md) operations with the bootup fabric network.

View File

@ -1,10 +0,0 @@
## Instantiate chaincode in two channel using same chaincode
## The usage of `peer upgrade` and the diffrence between `peer instantiate`
## Check the results when a new peer joins a channel that has completed some chaincode opreations
## What happens if the organization joins a channel that does not belong to it

View File

@ -1,135 +0,0 @@
# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
version: '2'
services:
zookeeper:
image: hyperledger/fabric-zookeeper
restart: always
ports:
- '2181'
- '2888'
- '3888'
kafka:
image: hyperledger/fabric-kafka
restart: always
environment:
- KAFKA_MESSAGE_MAX_BYTES=103809024 # 99 * 1024 * 1024 B
- KAFKA_REPLICA_FETCH_MAX_BYTES=103809024 # 99 * 1024 * 1024 B
- KAFKA_UNCLEAN_LEADER_ELECTION_ENABLE=false
ports:
- '9092'
orderer.example.com:
container_name: orderer.example.com
image: hyperledger/fabric-orderer
environment:
- ORDERER_GENERAL_LOGLEVEL=debug
- ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
- ORDERER_GENERAL_GENESISMETHOD=file
- ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/orderer.genesis.block
- ORDERER_GENERAL_LOCALMSPID=OrdererMSP
- ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp
# enabled TLS
- ORDERER_GENERAL_TLS_ENABLED=true
- ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key
- ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/orderer/tls/server.crt
- ORDERER_GENERAL_TLS_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]
- ORDERER_KAFKA_RETRY_SHORTINTERVAL=1s
- ORDERER_KAFKA_RETRY_SHORTTOTAL=30s
- ORDERER_KAFKA_VERBOSE=true
working_dir: /opt/gopath/src/github.com/hyperledger/fabric
command: orderer
volumes:
- ../channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block
- ../crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp:/var/hyperledger/orderer/msp
- ../crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/:/var/hyperledger/orderer/tls
ports:
- 7050:7050
peer0.org1.example.com:
container_name: peer0.org1.example.com
extends:
file: peer-base.yaml
service: peer-base
environment:
- CORE_PEER_ID=peer0.org1.example.com
- CORE_PEER_ADDRESS=peer0.org1.example.com:7051
- CORE_PEER_CHAINCODELISTENADDRESS=peer0.org1.example.com:7052
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org1.example.com:7051
- CORE_PEER_LOCALMSPID=Org1MSP
volumes:
- /var/run/:/host/var/run/
- ../crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp:/etc/hyperledger/fabric/msp
- ../crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls:/etc/hyperledger/fabric/tls
ports:
- 7051:7051
- 7052:7052
- 7053:7053
peer1.org1.example.com:
container_name: peer1.org1.example.com
extends:
file: peer-base.yaml
service: peer-base
environment:
- CORE_PEER_ID=peer1.org1.example.com
- CORE_PEER_ADDRESS=peer1.org1.example.com:7051
- CORE_PEER_CHAINCODELISTENADDRESS=peer1.org1.example.com:7052
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.org1.example.com:7051
- CORE_PEER_GOSSIP_BOOTSTRAP=peer0.org1.example.com:7051
- CORE_PEER_LOCALMSPID=Org1MSP
volumes:
- /var/run/:/host/var/run/
- ../crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/msp:/etc/hyperledger/fabric/msp
- ../crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls:/etc/hyperledger/fabric/tls
ports:
- 8051:7051
- 8052:7052
- 8053:7053
peer0.org2.example.com:
container_name: peer0.org2.example.com
extends:
file: peer-base.yaml
service: peer-base
environment:
- CORE_PEER_ID=peer0.org2.example.com
- CORE_PEER_ADDRESS=peer0.org2.example.com:7051
- CORE_PEER_CHAINCODELISTENADDRESS=peer0.org2.example.com:7052
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org2.example.com:7051
- CORE_PEER_LOCALMSPID=Org2MSP
volumes:
- /var/run/:/host/var/run/
- ../crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/msp:/etc/hyperledger/fabric/msp
- ../crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls:/etc/hyperledger/fabric/tls
ports:
- 9051:7051
- 9052:7052
- 9053:7053
peer1.org2.example.com:
container_name: peer1.org2.example.com
extends:
file: peer-base.yaml
service: peer-base
environment:
- CORE_PEER_ID=peer1.org2.example.com
- CORE_PEER_ADDRESS=peer1.org2.example.com:7051
- CORE_PEER_CHAINCODELISTENADDRESS=peer1.org2.example.com:7052
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.org2.example.com:7051
- CORE_PEER_GOSSIP_BOOTSTRAP=peer0.org2.example.com:7051
- CORE_PEER_LOCALMSPID=Org2MSP
volumes:
- /var/run/:/host/var/run/
- ../crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/msp:/etc/hyperledger/fabric/msp
- ../crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls:/etc/hyperledger/fabric/tls
ports:
- 10051:7051
- 10052:7052
- 10053:7053

View File

@ -1,26 +0,0 @@
# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
version: '2'
services:
peer-base:
image: hyperledger/fabric-peer
environment:
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
# the following setting starts chaincode containers on the same
# bridge network as the peers
# https://docs.docker.com/compose/networking/
- CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=e2ecli_default
#- CORE_LOGGING_LEVEL=ERROR
- CORE_LOGGING_LEVEL=DEBUG
- CORE_PEER_TLS_ENABLED=true
- CORE_PEER_GOSSIP_USELEADERELECTION=true
- CORE_PEER_GOSSIP_ORGLEADER=false
- CORE_PEER_PROFILE_ENABLED=true
- CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/fabric/tls/server.crt
- CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/fabric/tls/server.key
- CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/tls/ca.crt
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
command: peer node start

View File

@ -1,64 +0,0 @@
{
"payload": {
"data": {
"config_update": {
"channel_id": "businesschannel",
"read_set": {
"groups": {
"Application": {
"groups": {
"Org1MSP": {
"policies": {
"Admins": {},
"Readers": {},
"Writers": {}
},
"values": {
"MSP": {}
}
}
},
"version": "1"
}
}
},
"write_set": {
"groups": {
"Application": {
"groups": {
"Org1MSP": {
"policies": {
"Admins": {},
"Readers": {},
"Writers": {}
},
"values": {
"AnchorPeers": {
"value": {
"anchor_peers": [
{
"host": "peer0.org1.example.com",
"port": 7051
}
]
}
},
"MSP": {}
},
"version": "1"
}
},
"version": "1"
}
}
}
}
},
"header": {
"channel_header": {
"channel_id": "businesschannel",
"type": 2
}
}
}
}

View File

@ -1,64 +0,0 @@
{
"payload": {
"data": {
"config_update": {
"channel_id": "businesschannel",
"read_set": {
"groups": {
"Application": {
"groups": {
"Org2MSP": {
"policies": {
"Admins": {},
"Readers": {},
"Writers": {}
},
"values": {
"MSP": {}
}
}
},
"version": "1"
}
}
},
"write_set": {
"groups": {
"Application": {
"groups": {
"Org2MSP": {
"policies": {
"Admins": {},
"Readers": {},
"Writers": {}
},
"values": {
"AnchorPeers": {
"value": {
"anchor_peers": [
{
"host": "peer0.org2.example.com",
"port": 7051
}
]
}
},
"MSP": {}
},
"version": "1"
}
},
"version": "1"
}
}
}
}
},
"header": {
"channel_header": {
"channel_id": "businesschannel",
"type": 2
}
}
}
}

View File

@ -1,604 +0,0 @@
{
"data": {
"data": [
{
"payload": {
"data": {
"config": {
"channel_group": {
"groups": {
"Application": {
"groups": {
"Org1MSP": {
"mod_policy": "Admins",
"policies": {
"Admins": {
"mod_policy": "Admins",
"policy": {
"type": 1,
"value": {
"identities": [
{
"principal": {
"msp_identifier": "Org1MSP",
"role": "ADMIN"
}
}
],
"rule": {
"n_out_of": {
"n": 1,
"rules": [
{
"signed_by": 0
}
]
}
}
}
}
},
"Readers": {
"mod_policy": "Admins",
"policy": {
"type": 1,
"value": {
"identities": [
{
"principal": {
"msp_identifier": "Org1MSP"
}
}
],
"rule": {
"n_out_of": {
"n": 1,
"rules": [
{
"signed_by": 0
}
]
}
}
}
}
},
"Writers": {
"mod_policy": "Admins",
"policy": {
"type": 1,
"value": {
"identities": [
{
"principal": {
"msp_identifier": "Org1MSP"
}
}
],
"rule": {
"n_out_of": {
"n": 1,
"rules": [
{
"signed_by": 0
}
]
}
}
}
}
}
},
"values": {
"MSP": {
"mod_policy": "Admins",
"value": {
"config": {
"admins": [
"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNMekNDQWRXZ0F3SUJBZ0lSQUl5UWRWdDBlQnVRYjZxVkE2WTJ3NWN3Q2dZSUtvWkl6ajBFQXdJd2N6RUwKTUFrR0ExVUVCaE1DVlZNeEV6QVJCZ05WQkFnVENrTmhiR2xtYjNKdWFXRXhGakFVQmdOVkJBY1REVk5oYmlCRwpjbUZ1WTJselkyOHhHVEFYQmdOVkJBb1RFRzl5WnpFdVpYaGhiWEJzWlM1amIyMHhIREFhQmdOVkJBTVRFMk5oCkxtOXlaekV1WlhoaGJYQnNaUzVqYjIwd0hoY05NVGN3TlRBMU1EZzFOak01V2hjTk1qY3dOVEF6TURnMU5qTTUKV2pCYk1Rc3dDUVlEVlFRR0V3SlZVekVUTUJFR0ExVUVDQk1LUTJGc2FXWnZjbTVwWVRFV01CUUdBMVVFQnhNTgpVMkZ1SUVaeVlXNWphWE5qYnpFZk1CMEdBMVVFQXd3V1FXUnRhVzVBYjNKbk1TNWxlR0Z0Y0d4bExtTnZiVEJaCk1CTUdCeXFHU000OUFnRUdDQ3FHU000OUF3RUhBMElBQkkvSytpaFJkbmRJTWZNRkJVQ3lNMFhiWUE1cVVRR1YKWGJIV1krQnp6YUViQUlRU0tzcEZYdzUrT0FtRkZObmphbWkxaE0rRnF6dEJGeFFuSDZNOHcwbWpZakJnTUE0RwpBMVVkRHdFQi93UUVBd0lGb0RBVEJnTlZIU1VFRERBS0JnZ3JCZ0VGQlFjREFUQU1CZ05WSFJNQkFmOEVBakFBCk1Dc0dBMVVkSXdRa01DS0FJTmdodWlGcTJWRVJHcGFtU3N0VHVtUFcwell0cVBBelhPOXllREgvT25PeE1Bb0cKQ0NxR1NNNDlCQU1DQTBnQU1FVUNJUUQrc2NBekNabzN3QjFFVWxmL0JJNzZWNytLN2NCUG5aR0pXdFQxcUJxRgowUUlnUDVUeE9meDY2RHl5SE1jcFMvM1lmQTJqN2FrdHBoSk5vT1pYb01HTTBPOD0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo="
],
"crypto_config": {
"identity_identifier_hash_function": "SHA256",
"signature_hash_family": "SHA2"
},
"name": "Org1MSP",
"root_certs": [
"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNlekNDQWlLZ0F3SUJBZ0lRQmJCbVNhSlVZS05HZ2grQVBlNmkwVEFLQmdncWhrak9QUVFEQWpCek1Rc3cKQ1FZRFZRUUdFd0pWVXpFVE1CRUdBMVVFQ0JNS1EyRnNhV1p2Y201cFlURVdNQlFHQTFVRUJ4TU5VMkZ1SUVaeQpZVzVqYVhOamJ6RVpNQmNHQTFVRUNoTVFiM0puTVM1bGVHRnRjR3hsTG1OdmJURWNNQm9HQTFVRUF4TVRZMkV1CmIzSm5NUzVsZUdGdGNHeGxMbU52YlRBZUZ3MHhOekExTURVd09EVTJNemxhRncweU56QTFNRE13T0RVMk16bGEKTUhNeEN6QUpCZ05WQkFZVEFsVlRNUk13RVFZRFZRUUlFd3BEWVd4cFptOXlibWxoTVJZd0ZBWURWUVFIRXcxVApZVzRnUm5KaGJtTnBjMk52TVJrd0Z3WURWUVFLRXhCdmNtY3hMbVY0WVcxd2JHVXVZMjl0TVJ3d0dnWURWUVFECkV4TmpZUzV2Y21jeExtVjRZVzF3YkdVdVkyOXRNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUUKbU1WTzFKTmRkaHYyNXBpaDY3b2ZteGU2TGFiYS90U0RZbXpxVEw3bG5oMWlZT3ZJekVOK1BNRnJ4WUx3d25HTQphQXlzay9CRkx4Zys0QWpGSTY0UnZhT0JsekNCbERBT0JnTlZIUThCQWY4RUJBTUNBYVl3R1FZRFZSMGxCQkl3CkVBWUVWUjBsQUFZSUt3WUJCUVVIQXdFd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBcEJnTlZIUTRFSWdRZzJDRzYKSVdyWlVSRWFscVpLeTFPNlk5YlROaTJvOEROYzczSjRNZjg2YzdFd0t3WURWUjBqQkNRd0lvQWcyQ0c2SVdyWgpVUkVhbHFaS3kxTzZZOWJUTmkybzhETmM3M0o0TWY4NmM3RXdDZ1lJS29aSXpqMEVBd0lEUndBd1JBSWdLVk5XCitiWmpraEFHYVlzRmh2WHdqMFB0LzN6cDE5ZzhHYkxudW1jMHBUNENJRlVQaUVieDl3WkFNSjZvZkNGeGZkL3MKRk01TEptTDMxSUtJeThBS0JTR3gKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo="
]
}
}
}
}
},
"Org2MSP": {
"mod_policy": "Admins",
"policies": {
"Admins": {
"mod_policy": "Admins",
"policy": {
"type": 1,
"value": {
"identities": [
{
"principal": {
"msp_identifier": "Org2MSP",
"role": "ADMIN"
}
}
],
"rule": {
"n_out_of": {
"n": 1,
"rules": [
{
"signed_by": 0
}
]
}
}
}
}
},
"Readers": {
"mod_policy": "Admins",
"policy": {
"type": 1,
"value": {
"identities": [
{
"principal": {
"msp_identifier": "Org2MSP"
}
}
],
"rule": {
"n_out_of": {
"n": 1,
"rules": [
{
"signed_by": 0
}
]
}
}
}
}
},
"Writers": {
"mod_policy": "Admins",
"policy": {
"type": 1,
"value": {
"identities": [
{
"principal": {
"msp_identifier": "Org2MSP"
}
}
],
"rule": {
"n_out_of": {
"n": 1,
"rules": [
{
"signed_by": 0
}
]
}
}
}
}
}
},
"values": {
"MSP": {
"mod_policy": "Admins",
"value": {
"config": {
"admins": [
"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNMekNDQWRXZ0F3SUJBZ0lSQVBFK2JRT1Naa3ZFZEhKNmpGSloyamd3Q2dZSUtvWkl6ajBFQXdJd2N6RUwKTUFrR0ExVUVCaE1DVlZNeEV6QVJCZ05WQkFnVENrTmhiR2xtYjNKdWFXRXhGakFVQmdOVkJBY1REVk5oYmlCRwpjbUZ1WTJselkyOHhHVEFYQmdOVkJBb1RFRzl5WnpJdVpYaGhiWEJzWlM1amIyMHhIREFhQmdOVkJBTVRFMk5oCkxtOXlaekl1WlhoaGJYQnNaUzVqYjIwd0hoY05NVGN3TlRBMU1EZzFOak01V2hjTk1qY3dOVEF6TURnMU5qTTUKV2pCYk1Rc3dDUVlEVlFRR0V3SlZVekVUTUJFR0ExVUVDQk1LUTJGc2FXWnZjbTVwWVRFV01CUUdBMVVFQnhNTgpVMkZ1SUVaeVlXNWphWE5qYnpFZk1CMEdBMVVFQXd3V1FXUnRhVzVBYjNKbk1pNWxlR0Z0Y0d4bExtTnZiVEJaCk1CTUdCeXFHU000OUFnRUdDQ3FHU000OUF3RUhBMElBQkMwYjRuT21meFZ6NFJRN2dRL01XcWtpV2UrRG91RlMKdVVEU0szQzZPZ1o3RS9ZdDJpQVBvVUZybVdJbmNVWXEwakNTcTZWMUdiTUcrMndlb2lQOWVEMmpZakJnTUE0RwpBMVVkRHdFQi93UUVBd0lGb0RBVEJnTlZIU1VFRERBS0JnZ3JCZ0VGQlFjREFUQU1CZ05WSFJNQkFmOEVBakFBCk1Dc0dBMVVkSXdRa01DS0FJTW9aRmVjMzlGaVo2RlB5TDIzYlFsYWhFSmVUNk5xNEdvZ3ZYOGVib0ZTNU1Bb0cKQ0NxR1NNNDlCQU1DQTBnQU1FVUNJUUNpaVl3cnFVRWpXaklGK1k0WTB0c2RMK3hUbjZoWUQwZUtvakI4N0s2OApld0lnVk9Xb0h6S0hDSFRQektxUVVTbUR3eDFvUzJFSU5YdWFJZ2RibUJoTmZSUT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo="
],
"crypto_config": {
"identity_identifier_hash_function": "SHA256",
"signature_hash_family": "SHA2"
},
"name": "Org2MSP",
"root_certs": [
"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNmVENDQWlPZ0F3SUJBZ0lSQU5GUllhaGpsVkpXQ3VuTkQybDROazR3Q2dZSUtvWkl6ajBFQXdJd2N6RUwKTUFrR0ExVUVCaE1DVlZNeEV6QVJCZ05WQkFnVENrTmhiR2xtYjNKdWFXRXhGakFVQmdOVkJBY1REVk5oYmlCRwpjbUZ1WTJselkyOHhHVEFYQmdOVkJBb1RFRzl5WnpJdVpYaGhiWEJzWlM1amIyMHhIREFhQmdOVkJBTVRFMk5oCkxtOXlaekl1WlhoaGJYQnNaUzVqYjIwd0hoY05NVGN3TlRBMU1EZzFOak01V2hjTk1qY3dOVEF6TURnMU5qTTUKV2pCek1Rc3dDUVlEVlFRR0V3SlZVekVUTUJFR0ExVUVDQk1LUTJGc2FXWnZjbTVwWVRFV01CUUdBMVVFQnhNTgpVMkZ1SUVaeVlXNWphWE5qYnpFWk1CY0dBMVVFQ2hNUWIzSm5NaTVsZUdGdGNHeGxMbU52YlRFY01Cb0dBMVVFCkF4TVRZMkV1YjNKbk1pNWxlR0Z0Y0d4bExtTnZiVEJaTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEEwSUEKQkd0L0ZESUpjMWFzQW9MaDl3K281dndLaDRQRTZ3eWZ5NVptZmlzTFlUMDB6R0Q1SnZkU3dkU29sOUhZaVd4RwpCWk9FWENSM2NYbm5kMGUrWXcvckYzNmpnWmN3Z1pRd0RnWURWUjBQQVFIL0JBUURBZ0dtTUJrR0ExVWRKUVFTCk1CQUdCRlVkSlFBR0NDc0dBUVVGQndNQk1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0tRWURWUjBPQkNJRUlNb1oKRmVjMzlGaVo2RlB5TDIzYlFsYWhFSmVUNk5xNEdvZ3ZYOGVib0ZTNU1Dc0dBMVVkSXdRa01DS0FJTW9aRmVjMwo5RmlaNkZQeUwyM2JRbGFoRUplVDZOcTRHb2d2WDhlYm9GUzVNQW9HQ0NxR1NNNDlCQU1DQTBnQU1FVUNJUUNUCjg4bTR6dTdxZ1lFV1VkdGVhQUhucWoyUm9oTm80YzA5TDVFNjUxQVZvQUlnYmZzVDVjWDA0WlQ4ckYrb2V0VmkKcWdaTFRJdzlEcjJSWDBKUktwbVYxRXM9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K"
]
}
}
}
}
}
},
"mod_policy": "Admins",
"policies": {
"Admins": {
"policy": {
"type": 3,
"value": {
"rule": "MAJORITY",
"sub_policy": "Admins"
}
}
},
"Readers": {
"policy": {
"type": 3,
"value": {
"sub_policy": "Readers"
}
}
},
"Writers": {
"policy": {
"type": 3,
"value": {
"sub_policy": "Writers"
}
}
}
},
"version": "1"
},
"Orderer": {
"groups": {
"OrdererOrg": {
"mod_policy": "Admins",
"policies": {
"Admins": {
"mod_policy": "Admins",
"policy": {
"type": 1,
"value": {
"identities": [
{
"principal": {
"msp_identifier": "OrdererMSP",
"role": "ADMIN"
}
}
],
"rule": {
"n_out_of": {
"n": 1,
"rules": [
{
"signed_by": 0
}
]
}
}
}
}
},
"Readers": {
"mod_policy": "Admins",
"policy": {
"type": 1,
"value": {
"identities": [
{
"principal": {
"msp_identifier": "OrdererMSP"
}
}
],
"rule": {
"n_out_of": {
"n": 1,
"rules": [
{
"signed_by": 0
}
]
}
}
}
}
},
"Writers": {
"mod_policy": "Admins",
"policy": {
"type": 1,
"value": {
"identities": [
{
"principal": {
"msp_identifier": "OrdererMSP"
}
}
],
"rule": {
"n_out_of": {
"n": 1,
"rules": [
{
"signed_by": 0
}
]
}
}
}
}
}
},
"values": {
"MSP": {
"mod_policy": "Admins",
"value": {
"config": {
"admins": [
"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNJRENDQWNhZ0F3SUJBZ0lSQUlVRmNEYW1WOHI5dDFzY0Z2b3RnRnd3Q2dZSUtvWkl6ajBFQXdJd2FURUwKTUFrR0ExVUVCaE1DVlZNeEV6QVJCZ05WQkFnVENrTmhiR2xtYjNKdWFXRXhGakFVQmdOVkJBY1REVk5oYmlCRwpjbUZ1WTJselkyOHhGREFTQmdOVkJBb1RDMlY0WVcxd2JHVXVZMjl0TVJjd0ZRWURWUVFERXc1allTNWxlR0Z0CmNHeGxMbU52YlRBZUZ3MHhOekExTURVd09EVTJNemxhRncweU56QTFNRE13T0RVMk16bGFNRll4Q3pBSkJnTlYKQkFZVEFsVlRNUk13RVFZRFZRUUlFd3BEWVd4cFptOXlibWxoTVJZd0ZBWURWUVFIRXcxVFlXNGdSbkpoYm1OcApjMk52TVJvd0dBWURWUVFEREJGQlpHMXBia0JsZUdGdGNHeGxMbU52YlRCWk1CTUdCeXFHU000OUFnRUdDQ3FHClNNNDlBd0VIQTBJQUJJbmY3eUZLWVlaZXliSDhURXo3bHYvSFJVbGF1SGM3cmptNUdCT3JTNnRRd3VCcTc0UFQKaUFXN2c2YVFLYk1sVm1qVmRJUnJNak0vWlc1SThOZFRUU0dqWWpCZ01BNEdBMVVkRHdFQi93UUVBd0lGb0RBVApCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBVEFNQmdOVkhSTUJBZjhFQWpBQU1Dc0dBMVVkSXdRa01DS0FJTTc3CkFmV1VtM1JwbkF1eFJGRHRMckw5N2M0c0ZKMkcvcjhxeS9iS0pEcU9NQW9HQ0NxR1NNNDlCQU1DQTBnQU1FVUMKSVFEUHpEWFZuaWJVdGVrZjJQclZoeUp5Y1R4OElkZnJUZTBQV1U4UnlzNFRVUUlnR2hjREljdWs1d0ZqclB4VgpWYk9DUS9OVUljRG5mb3RBSmpMZlIrTytaQ0U9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K"
],
"crypto_config": {
"identity_identifier_hash_function": "SHA256",
"signature_hash_family": "SHA2"
},
"name": "OrdererMSP",
"root_certs": [
"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNaekNDQWc2Z0F3SUJBZ0lRRUJlUUVxWXFnZmJTUlRDSUdlODBoVEFLQmdncWhrak9QUVFEQWpCcE1Rc3cKQ1FZRFZRUUdFd0pWVXpFVE1CRUdBMVVFQ0JNS1EyRnNhV1p2Y201cFlURVdNQlFHQTFVRUJ4TU5VMkZ1SUVaeQpZVzVqYVhOamJ6RVVNQklHQTFVRUNoTUxaWGhoYlhCc1pTNWpiMjB4RnpBVkJnTlZCQU1URG1OaExtVjRZVzF3CmJHVXVZMjl0TUI0WERURTNNRFV3TlRBNE5UWXpPVm9YRFRJM01EVXdNekE0TlRZek9Wb3dhVEVMTUFrR0ExVUUKQmhNQ1ZWTXhFekFSQmdOVkJBZ1RDa05oYkdsbWIzSnVhV0V4RmpBVUJnTlZCQWNURFZOaGJpQkdjbUZ1WTJsegpZMjh4RkRBU0JnTlZCQW9UQzJWNFlXMXdiR1V1WTI5dE1SY3dGUVlEVlFRREV3NWpZUzVsZUdGdGNHeGxMbU52CmJUQlpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDlBd0VIQTBJQUJGTmN6MVBJQnovaUhPd1lleGlGZTU2dUdydmoKSlhXeWk5VTQ0anlSdGVtU3hRdHllcTJHeFdUV0FhV2xOa01PeEpZOVRORXY1a3EzRXI4TC9iVmtVSjJqZ1pjdwpnWlF3RGdZRFZSMFBBUUgvQkFRREFnR21NQmtHQTFVZEpRUVNNQkFHQkZVZEpRQUdDQ3NHQVFVRkJ3TUJNQThHCkExVWRFd0VCL3dRRk1BTUJBZjh3S1FZRFZSME9CQ0lFSU03N0FmV1VtM1JwbkF1eFJGRHRMckw5N2M0c0ZKMkcKL3I4cXkvYktKRHFPTUNzR0ExVWRJd1FrTUNLQUlNNzdBZldVbTNScG5BdXhSRkR0THJMOTdjNHNGSjJHL3I4cQp5L2JLSkRxT01Bb0dDQ3FHU000OUJBTUNBMGNBTUVRQ0lHN3ZyMHltLzhKVmFyRjlNWUtPenIxbVZlcC9XSDF5CjhCRGh3NldQOGt2eEFpQmx1dkNqbi9HNDVrYkNJazAycjkyUXREZEZaRGNaVU5Gais1K0cwZ2NJdHc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg=="
]
}
}
}
}
}
},
"mod_policy": "Admins",
"policies": {
"Admins": {
"mod_policy": "Admins",
"policy": {
"type": 3,
"value": {
"rule": "MAJORITY",
"sub_policy": "Admins"
}
}
},
"BlockValidation": {
"mod_policy": "Admins",
"policy": {
"type": 3,
"value": {
"sub_policy": "Writers"
}
}
},
"Readers": {
"mod_policy": "Admins",
"policy": {
"type": 3,
"value": {
"sub_policy": "Readers"
}
}
},
"Writers": {
"mod_policy": "Admins",
"policy": {
"type": 3,
"value": {
"sub_policy": "Writers"
}
}
}
},
"values": {
"BatchSize": {
"mod_policy": "Admins",
"value": {
"absolute_max_bytes": 103809024,
"max_message_count": 10,
"preferred_max_bytes": 524288
}
},
"BatchTimeout": {
"mod_policy": "Admins",
"value": {
"timeout": "2s"
}
},
"ChannelRestrictions": {
"mod_policy": "Admins"
},
"ConsensusType": {
"mod_policy": "Admins",
"value": {
"type": "solo"
}
}
}
}
},
"policies": {
"Admins": {
"mod_policy": "Admins",
"policy": {
"type": 3,
"value": {
"rule": "MAJORITY",
"sub_policy": "Admins"
}
}
},
"Readers": {
"mod_policy": "Admins",
"policy": {
"type": 3,
"value": {
"sub_policy": "Readers"
}
}
},
"Writers": {
"mod_policy": "Admins",
"policy": {
"type": 3,
"value": {
"sub_policy": "Writers"
}
}
}
},
"values": {
"BlockDataHashingStructure": {
"mod_policy": "Admins",
"value": {
"width": 4294967295
}
},
"Consortium": {
"value": {
"name": "SampleConsortium"
}
},
"HashingAlgorithm": {
"mod_policy": "Admins",
"value": {
"name": "SHA256"
}
},
"OrdererAddresses": {
"mod_policy": "/Channel/Orderer/Admins",
"value": {
"addresses": [
"orderer.example.com:7050"
]
}
}
}
},
"sequence": "1"
},
"last_update": {
"payload": {
"data": {
"config_update": {
"channel_id": "businesschannel",
"read_set": {
"groups": {
"Application": {
"groups": {
"Org1MSP": {},
"Org2MSP": {}
}
}
},
"values": {
"Consortium": {
"value": {
"name": "SampleConsortium"
}
}
}
},
"write_set": {
"groups": {
"Application": {
"groups": {
"Org1MSP": {},
"Org2MSP": {}
},
"mod_policy": "Admins",
"policies": {
"Admins": {
"policy": {
"type": 3,
"value": {
"rule": "MAJORITY",
"sub_policy": "Admins"
}
}
},
"Readers": {
"policy": {
"type": 3,
"value": {
"sub_policy": "Readers"
}
}
},
"Writers": {
"policy": {
"type": 3,
"value": {
"sub_policy": "Writers"
}
}
}
},
"version": "1"
}
},
"values": {
"Consortium": {
"value": {
"name": "SampleConsortium"
}
}
}
}
},
"signatures": [
{
"signature": "c2lnbmF0dXJl",
"signature_header": {
"creator": "Y2VydA==",
"nonce": "1oc+L6xljIBetYydlntxaHVhqhILYoYS"
}
},
{
"signature": "MEUCIQC9MXAoU6506l5xFqY3aROD5RkR/GjkG50c5HNILValmAIgQN+XqmJ2vaLFosav0Y07YJhASu9JDoT/Wk/1R5MvbNg=",
"signature_header": {
"creator": "CgdPcmcxTVNQEpwGLS0tLS1CRUdJTiAtLS0tLQpNSUlDTHpDQ0FkV2dBd0lCQWdJUkFJeVFkVnQwZUJ1UWI2cVZBNlkydzVjd0NnWUlLb1pJemowRUF3SXdjekVMCk1Ba0dBMVVFQmhNQ1ZWTXhFekFSQmdOVkJBZ1RDa05oYkdsbWIzSnVhV0V4RmpBVUJnTlZCQWNURFZOaGJpQkcKY21GdVkybHpZMjh4R1RBWEJnTlZCQW9URUc5eVp6RXVaWGhoYlhCc1pTNWpiMjB4SERBYUJnTlZCQU1URTJOaApMbTl5WnpFdVpYaGhiWEJzWlM1amIyMHdIaGNOTVRjd05UQTFNRGcxTmpNNVdoY05NamN3TlRBek1EZzFOak01CldqQmJNUXN3Q1FZRFZRUUdFd0pWVXpFVE1CRUdBMVVFQ0JNS1EyRnNhV1p2Y201cFlURVdNQlFHQTFVRUJ4TU4KVTJGdUlFWnlZVzVqYVhOamJ6RWZNQjBHQTFVRUF3d1dRV1J0YVc1QWIzSm5NUzVsZUdGdGNHeGxMbU52YlRCWgpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDlBd0VIQTBJQUJJL0sraWhSZG5kSU1mTUZCVUN5TTBYYllBNXFVUUdWClhiSFdZK0J6emFFYkFJUVNLc3BGWHc1K09BbUZGTm5qYW1pMWhNK0ZxenRCRnhRbkg2TTh3MG1qWWpCZ01BNEcKQTFVZER3RUIvd1FFQXdJRm9EQVRCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBVEFNQmdOVkhSTUJBZjhFQWpBQQpNQ3NHQTFVZEl3UWtNQ0tBSU5naHVpRnEyVkVSR3BhbVNzdFR1bVBXMHpZdHFQQXpYTzl5ZURIL09uT3hNQW9HCkNDcUdTTTQ5QkFNQ0EwZ0FNRVVDSVFEK3NjQXpDWm8zd0IxRVVsZi9CSTc2VjcrSzdjQlBuWkdKV3RUMXFCcUYKMFFJZ1A1VHhPZng2NkR5eUhNY3BTLzNZZkEyajdha3RwaEpOb09aWG9NR00wTzg9Ci0tLS0tRU5EIC0tLS0tCg==",
"nonce": "BpgI6Y5xubx4w8UPH7Mi4qxD7foBsqoi"
}
}
]
},
"header": {
"channel_header": {
"channel_id": "businesschannel",
"timestamp": "2017-06-09T10:12:40.000Z",
"type": 2
},
"signature_header": {
"creator": "CgdPcmcxTVNQEpwGLS0tLS1CRUdJTiAtLS0tLQpNSUlDTHpDQ0FkV2dBd0lCQWdJUkFJeVFkVnQwZUJ1UWI2cVZBNlkydzVjd0NnWUlLb1pJemowRUF3SXdjekVMCk1Ba0dBMVVFQmhNQ1ZWTXhFekFSQmdOVkJBZ1RDa05oYkdsbWIzSnVhV0V4RmpBVUJnTlZCQWNURFZOaGJpQkcKY21GdVkybHpZMjh4R1RBWEJnTlZCQW9URUc5eVp6RXVaWGhoYlhCc1pTNWpiMjB4SERBYUJnTlZCQU1URTJOaApMbTl5WnpFdVpYaGhiWEJzWlM1amIyMHdIaGNOTVRjd05UQTFNRGcxTmpNNVdoY05NamN3TlRBek1EZzFOak01CldqQmJNUXN3Q1FZRFZRUUdFd0pWVXpFVE1CRUdBMVVFQ0JNS1EyRnNhV1p2Y201cFlURVdNQlFHQTFVRUJ4TU4KVTJGdUlFWnlZVzVqYVhOamJ6RWZNQjBHQTFVRUF3d1dRV1J0YVc1QWIzSm5NUzVsZUdGdGNHeGxMbU52YlRCWgpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDlBd0VIQTBJQUJJL0sraWhSZG5kSU1mTUZCVUN5TTBYYllBNXFVUUdWClhiSFdZK0J6emFFYkFJUVNLc3BGWHc1K09BbUZGTm5qYW1pMWhNK0ZxenRCRnhRbkg2TTh3MG1qWWpCZ01BNEcKQTFVZER3RUIvd1FFQXdJRm9EQVRCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBVEFNQmdOVkhSTUJBZjhFQWpBQQpNQ3NHQTFVZEl3UWtNQ0tBSU5naHVpRnEyVkVSR3BhbVNzdFR1bVBXMHpZdHFQQXpYTzl5ZURIL09uT3hNQW9HCkNDcUdTTTQ5QkFNQ0EwZ0FNRVVDSVFEK3NjQXpDWm8zd0IxRVVsZi9CSTc2VjcrSzdjQlBuWkdKV3RUMXFCcUYKMFFJZ1A1VHhPZng2NkR5eUhNY3BTLzNZZkEyajdha3RwaEpOb09aWG9NR00wTzg9Ci0tLS0tRU5EIC0tLS0tCg==",
"nonce": "UkwVPIQUafVIRdtaIIe1H1IeWy45lo33"
}
}
},
"signature": "MEUCIQDVbz3jB3i4IeREvjjLQi+OWAtYhadAMVXj9Xd8rBlMQQIgCtG093+9imdRqzTbtEqEsKnyiYybW2/onNceUQpyifU="
}
},
"header": {
"channel_header": {
"channel_id": "businesschannel",
"timestamp": "2017-06-09T10:12:40.000Z",
"type": 1
},
"signature_header": {
"creator": "CgpPcmRlcmVyTVNQEsEGLS0tLS1CRUdJTiAtLS0tLQpNSUlDU3pDQ0FmS2dBd0lCQWdJUWFhY1lTQTN1VVZadit1V2QwNzZUdFRBS0JnZ3Foa2pPUFFRREFqQnBNUXN3CkNRWURWUVFHRXdKVlV6RVRNQkVHQTFVRUNCTUtRMkZzYVdadmNtNXBZVEVXTUJRR0ExVUVCeE1OVTJGdUlFWnkKWVc1amFYTmpiekVVTUJJR0ExVUVDaE1MWlhoaGJYQnNaUzVqYjIweEZ6QVZCZ05WQkFNVERtTmhMbVY0WVcxdwpiR1V1WTI5dE1CNFhEVEUzTURVd05UQTROVFl6T1ZvWERUSTNNRFV3TXpBNE5UWXpPVm93V0RFTE1Ba0dBMVVFCkJoTUNWVk14RXpBUkJnTlZCQWdUQ2tOaGJHbG1iM0p1YVdFeEZqQVVCZ05WQkFjVERWTmhiaUJHY21GdVkybHoKWTI4eEhEQWFCZ05WQkFNVEUyOXlaR1Z5WlhJdVpYaGhiWEJzWlM1amIyMHdXVEFUQmdjcWhrak9QUUlCQmdncQpoa2pPUFFNQkJ3TkNBQVNUZEw1S2cyYXBwdDZkd3VxTFZxSVBIeG9sNTcyRUZ4RWcvd1hmR0RMc3Nyd2t0L0QyCkpxN1hkUDZNeTFETlFSNkFhWW1tbEJUZFJENEdyMUQxOS96R280R01NSUdKTUE0R0ExVWREd0VCL3dRRUF3SUYKb0RBVEJnTlZIU1VFRERBS0JnZ3JCZ0VGQlFjREFUQU1CZ05WSFJNQkFmOEVBakFBTUNzR0ExVWRJd1FrTUNLQQpJTTc3QWZXVW0zUnBuQXV4UkZEdExyTDk3YzRzRkoyRy9yOHF5L2JLSkRxT01DY0dBMVVkRVFRZ01CNkNFMjl5ClpHVnlaWEl1WlhoaGJYQnNaUzVqYjIyQ0IyOXlaR1Z5WlhJd0NnWUlLb1pJemowRUF3SURSd0F3UkFJZ0dvU3gKSHdCbGdOT3QzSisyaWF2V2JHSFlQdUM0Q3NNYmRxSThhTzZnSWY0Q0lFZEpkWURobkJNblZ3UWtkRlpNTW1xdwoyUnNXa2FvWk95LzVSdTNtVXJBMAotLS0tLUVORCAtLS0tLQo=",
"nonce": "Jr63PnIv7IZKDQbv5sDX2uk0bueSgiUi"
}
}
},
"signature": "MEUCIQCyX1TWy6UGvnFo4uXHxt+lT2+xPyHCLmhGF/56JvupywIgfUrb4ZJw19Dw7w2MdjCR8PQ9LW0MW4tTggMsyKB3z2k="
}
]
},
"header": {
"data_hash": "EWYo+LWVDBrhhQGnfnTuEQyrLAVS2/MeESYHhg22hMY="
},
"metadata": {
"metadata": [
"",
"",
"",
""
]
}
}

View File

@ -1,595 +0,0 @@
{
"data": {
"data": [
{
"payload": {
"data": {
"config": {
"channel_group": {
"groups": {
"Application": {
"groups": {
"Org1MSP": {
"policies": {
"Admins": {
"mod_policy": "Admins",
"policy": {
"type": 1,
"value": {
"identities": [
{
"principal": {
"msp_identifier": "Org1MSP",
"role": "ADMIN"
}
}
],
"rule": {
"n_out_of": {
"n": 1,
"rules": [
{
"signed_by": 0
}
]
}
}
}
}
},
"Readers": {
"mod_policy": "Admins",
"policy": {
"type": 1,
"value": {
"identities": [
{
"principal": {
"msp_identifier": "Org1MSP"
}
}
],
"rule": {
"n_out_of": {
"n": 1,
"rules": [
{
"signed_by": 0
}
]
}
}
}
}
},
"Writers": {
"mod_policy": "Admins",
"policy": {
"type": 1,
"value": {
"identities": [
{
"principal": {
"msp_identifier": "Org1MSP"
}
}
],
"rule": {
"n_out_of": {
"n": 1,
"rules": [
{
"signed_by": 0
}
]
}
}
}
}
}
},
"values": {
"AnchorPeers": {
"value": {
"anchor_peers": [
{
"host": "peer0.org1.example.com",
"port": 7051
}
]
}
},
"MSP": {
"mod_policy": "Admins",
"value": {
"config": {
"admins": [
"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNMekNDQWRXZ0F3SUJBZ0lSQUl5UWRWdDBlQnVRYjZxVkE2WTJ3NWN3Q2dZSUtvWkl6ajBFQXdJd2N6RUwKTUFrR0ExVUVCaE1DVlZNeEV6QVJCZ05WQkFnVENrTmhiR2xtYjNKdWFXRXhGakFVQmdOVkJBY1REVk5oYmlCRwpjbUZ1WTJselkyOHhHVEFYQmdOVkJBb1RFRzl5WnpFdVpYaGhiWEJzWlM1amIyMHhIREFhQmdOVkJBTVRFMk5oCkxtOXlaekV1WlhoaGJYQnNaUzVqYjIwd0hoY05NVGN3TlRBMU1EZzFOak01V2hjTk1qY3dOVEF6TURnMU5qTTUKV2pCYk1Rc3dDUVlEVlFRR0V3SlZVekVUTUJFR0ExVUVDQk1LUTJGc2FXWnZjbTVwWVRFV01CUUdBMVVFQnhNTgpVMkZ1SUVaeVlXNWphWE5qYnpFZk1CMEdBMVVFQXd3V1FXUnRhVzVBYjNKbk1TNWxlR0Z0Y0d4bExtTnZiVEJaCk1CTUdCeXFHU000OUFnRUdDQ3FHU000OUF3RUhBMElBQkkvSytpaFJkbmRJTWZNRkJVQ3lNMFhiWUE1cVVRR1YKWGJIV1krQnp6YUViQUlRU0tzcEZYdzUrT0FtRkZObmphbWkxaE0rRnF6dEJGeFFuSDZNOHcwbWpZakJnTUE0RwpBMVVkRHdFQi93UUVBd0lGb0RBVEJnTlZIU1VFRERBS0JnZ3JCZ0VGQlFjREFUQU1CZ05WSFJNQkFmOEVBakFBCk1Dc0dBMVVkSXdRa01DS0FJTmdodWlGcTJWRVJHcGFtU3N0VHVtUFcwell0cVBBelhPOXllREgvT25PeE1Bb0cKQ0NxR1NNNDlCQU1DQTBnQU1FVUNJUUQrc2NBekNabzN3QjFFVWxmL0JJNzZWNytLN2NCUG5aR0pXdFQxcUJxRgowUUlnUDVUeE9meDY2RHl5SE1jcFMvM1lmQTJqN2FrdHBoSk5vT1pYb01HTTBPOD0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo="
],
"crypto_config": {
"identity_identifier_hash_function": "SHA256",
"signature_hash_family": "SHA2"
},
"name": "Org1MSP",
"root_certs": [
"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNlekNDQWlLZ0F3SUJBZ0lRQmJCbVNhSlVZS05HZ2grQVBlNmkwVEFLQmdncWhrak9QUVFEQWpCek1Rc3cKQ1FZRFZRUUdFd0pWVXpFVE1CRUdBMVVFQ0JNS1EyRnNhV1p2Y201cFlURVdNQlFHQTFVRUJ4TU5VMkZ1SUVaeQpZVzVqYVhOamJ6RVpNQmNHQTFVRUNoTVFiM0puTVM1bGVHRnRjR3hsTG1OdmJURWNNQm9HQTFVRUF4TVRZMkV1CmIzSm5NUzVsZUdGdGNHeGxMbU52YlRBZUZ3MHhOekExTURVd09EVTJNemxhRncweU56QTFNRE13T0RVMk16bGEKTUhNeEN6QUpCZ05WQkFZVEFsVlRNUk13RVFZRFZRUUlFd3BEWVd4cFptOXlibWxoTVJZd0ZBWURWUVFIRXcxVApZVzRnUm5KaGJtTnBjMk52TVJrd0Z3WURWUVFLRXhCdmNtY3hMbVY0WVcxd2JHVXVZMjl0TVJ3d0dnWURWUVFECkV4TmpZUzV2Y21jeExtVjRZVzF3YkdVdVkyOXRNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUUKbU1WTzFKTmRkaHYyNXBpaDY3b2ZteGU2TGFiYS90U0RZbXpxVEw3bG5oMWlZT3ZJekVOK1BNRnJ4WUx3d25HTQphQXlzay9CRkx4Zys0QWpGSTY0UnZhT0JsekNCbERBT0JnTlZIUThCQWY4RUJBTUNBYVl3R1FZRFZSMGxCQkl3CkVBWUVWUjBsQUFZSUt3WUJCUVVIQXdFd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBcEJnTlZIUTRFSWdRZzJDRzYKSVdyWlVSRWFscVpLeTFPNlk5YlROaTJvOEROYzczSjRNZjg2YzdFd0t3WURWUjBqQkNRd0lvQWcyQ0c2SVdyWgpVUkVhbHFaS3kxTzZZOWJUTmkybzhETmM3M0o0TWY4NmM3RXdDZ1lJS29aSXpqMEVBd0lEUndBd1JBSWdLVk5XCitiWmpraEFHYVlzRmh2WHdqMFB0LzN6cDE5ZzhHYkxudW1jMHBUNENJRlVQaUVieDl3WkFNSjZvZkNGeGZkL3MKRk01TEptTDMxSUtJeThBS0JTR3gKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo="
]
}
}
}
},
"version": "1"
},
"Org2MSP": {
"mod_policy": "Admins",
"policies": {
"Admins": {
"mod_policy": "Admins",
"policy": {
"type": 1,
"value": {
"identities": [
{
"principal": {
"msp_identifier": "Org2MSP",
"role": "ADMIN"
}
}
],
"rule": {
"n_out_of": {
"n": 1,
"rules": [
{
"signed_by": 0
}
]
}
}
}
}
},
"Readers": {
"mod_policy": "Admins",
"policy": {
"type": 1,
"value": {
"identities": [
{
"principal": {
"msp_identifier": "Org2MSP"
}
}
],
"rule": {
"n_out_of": {
"n": 1,
"rules": [
{
"signed_by": 0
}
]
}
}
}
}
},
"Writers": {
"mod_policy": "Admins",
"policy": {
"type": 1,
"value": {
"identities": [
{
"principal": {
"msp_identifier": "Org2MSP"
}
}
],
"rule": {
"n_out_of": {
"n": 1,
"rules": [
{
"signed_by": 0
}
]
}
}
}
}
}
},
"values": {
"MSP": {
"mod_policy": "Admins",
"value": {
"config": {
"admins": [
"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNMekNDQWRXZ0F3SUJBZ0lSQVBFK2JRT1Naa3ZFZEhKNmpGSloyamd3Q2dZSUtvWkl6ajBFQXdJd2N6RUwKTUFrR0ExVUVCaE1DVlZNeEV6QVJCZ05WQkFnVENrTmhiR2xtYjNKdWFXRXhGakFVQmdOVkJBY1REVk5oYmlCRwpjbUZ1WTJselkyOHhHVEFYQmdOVkJBb1RFRzl5WnpJdVpYaGhiWEJzWlM1amIyMHhIREFhQmdOVkJBTVRFMk5oCkxtOXlaekl1WlhoaGJYQnNaUzVqYjIwd0hoY05NVGN3TlRBMU1EZzFOak01V2hjTk1qY3dOVEF6TURnMU5qTTUKV2pCYk1Rc3dDUVlEVlFRR0V3SlZVekVUTUJFR0ExVUVDQk1LUTJGc2FXWnZjbTVwWVRFV01CUUdBMVVFQnhNTgpVMkZ1SUVaeVlXNWphWE5qYnpFZk1CMEdBMVVFQXd3V1FXUnRhVzVBYjNKbk1pNWxlR0Z0Y0d4bExtTnZiVEJaCk1CTUdCeXFHU000OUFnRUdDQ3FHU000OUF3RUhBMElBQkMwYjRuT21meFZ6NFJRN2dRL01XcWtpV2UrRG91RlMKdVVEU0szQzZPZ1o3RS9ZdDJpQVBvVUZybVdJbmNVWXEwakNTcTZWMUdiTUcrMndlb2lQOWVEMmpZakJnTUE0RwpBMVVkRHdFQi93UUVBd0lGb0RBVEJnTlZIU1VFRERBS0JnZ3JCZ0VGQlFjREFUQU1CZ05WSFJNQkFmOEVBakFBCk1Dc0dBMVVkSXdRa01DS0FJTW9aRmVjMzlGaVo2RlB5TDIzYlFsYWhFSmVUNk5xNEdvZ3ZYOGVib0ZTNU1Bb0cKQ0NxR1NNNDlCQU1DQTBnQU1FVUNJUUNpaVl3cnFVRWpXaklGK1k0WTB0c2RMK3hUbjZoWUQwZUtvakI4N0s2OApld0lnVk9Xb0h6S0hDSFRQektxUVVTbUR3eDFvUzJFSU5YdWFJZ2RibUJoTmZSUT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo="
],
"crypto_config": {
"identity_identifier_hash_function": "SHA256",
"signature_hash_family": "SHA2"
},
"name": "Org2MSP",
"root_certs": [
"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNmVENDQWlPZ0F3SUJBZ0lSQU5GUllhaGpsVkpXQ3VuTkQybDROazR3Q2dZSUtvWkl6ajBFQXdJd2N6RUwKTUFrR0ExVUVCaE1DVlZNeEV6QVJCZ05WQkFnVENrTmhiR2xtYjNKdWFXRXhGakFVQmdOVkJBY1REVk5oYmlCRwpjbUZ1WTJselkyOHhHVEFYQmdOVkJBb1RFRzl5WnpJdVpYaGhiWEJzWlM1amIyMHhIREFhQmdOVkJBTVRFMk5oCkxtOXlaekl1WlhoaGJYQnNaUzVqYjIwd0hoY05NVGN3TlRBMU1EZzFOak01V2hjTk1qY3dOVEF6TURnMU5qTTUKV2pCek1Rc3dDUVlEVlFRR0V3SlZVekVUTUJFR0ExVUVDQk1LUTJGc2FXWnZjbTVwWVRFV01CUUdBMVVFQnhNTgpVMkZ1SUVaeVlXNWphWE5qYnpFWk1CY0dBMVVFQ2hNUWIzSm5NaTVsZUdGdGNHeGxMbU52YlRFY01Cb0dBMVVFCkF4TVRZMkV1YjNKbk1pNWxlR0Z0Y0d4bExtTnZiVEJaTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEEwSUEKQkd0L0ZESUpjMWFzQW9MaDl3K281dndLaDRQRTZ3eWZ5NVptZmlzTFlUMDB6R0Q1SnZkU3dkU29sOUhZaVd4RwpCWk9FWENSM2NYbm5kMGUrWXcvckYzNmpnWmN3Z1pRd0RnWURWUjBQQVFIL0JBUURBZ0dtTUJrR0ExVWRKUVFTCk1CQUdCRlVkSlFBR0NDc0dBUVVGQndNQk1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0tRWURWUjBPQkNJRUlNb1oKRmVjMzlGaVo2RlB5TDIzYlFsYWhFSmVUNk5xNEdvZ3ZYOGVib0ZTNU1Dc0dBMVVkSXdRa01DS0FJTW9aRmVjMwo5RmlaNkZQeUwyM2JRbGFoRUplVDZOcTRHb2d2WDhlYm9GUzVNQW9HQ0NxR1NNNDlCQU1DQTBnQU1FVUNJUUNUCjg4bTR6dTdxZ1lFV1VkdGVhQUhucWoyUm9oTm80YzA5TDVFNjUxQVZvQUlnYmZzVDVjWDA0WlQ4ckYrb2V0VmkKcWdaTFRJdzlEcjJSWDBKUktwbVYxRXM9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K"
]
}
}
}
}
}
},
"mod_policy": "Admins",
"policies": {
"Admins": {
"policy": {
"type": 3,
"value": {
"rule": "MAJORITY",
"sub_policy": "Admins"
}
}
},
"Readers": {
"policy": {
"type": 3,
"value": {
"sub_policy": "Readers"
}
}
},
"Writers": {
"policy": {
"type": 3,
"value": {
"sub_policy": "Writers"
}
}
}
},
"version": "1"
},
"Orderer": {
"groups": {
"OrdererOrg": {
"mod_policy": "Admins",
"policies": {
"Admins": {
"mod_policy": "Admins",
"policy": {
"type": 1,
"value": {
"identities": [
{
"principal": {
"msp_identifier": "OrdererMSP",
"role": "ADMIN"
}
}
],
"rule": {
"n_out_of": {
"n": 1,
"rules": [
{
"signed_by": 0
}
]
}
}
}
}
},
"Readers": {
"mod_policy": "Admins",
"policy": {
"type": 1,
"value": {
"identities": [
{
"principal": {
"msp_identifier": "OrdererMSP"
}
}
],
"rule": {
"n_out_of": {
"n": 1,
"rules": [
{
"signed_by": 0
}
]
}
}
}
}
},
"Writers": {
"mod_policy": "Admins",
"policy": {
"type": 1,
"value": {
"identities": [
{
"principal": {
"msp_identifier": "OrdererMSP"
}
}
],
"rule": {
"n_out_of": {
"n": 1,
"rules": [
{
"signed_by": 0
}
]
}
}
}
}
}
},
"values": {
"MSP": {
"mod_policy": "Admins",
"value": {
"config": {
"admins": [
"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNJRENDQWNhZ0F3SUJBZ0lSQUlVRmNEYW1WOHI5dDFzY0Z2b3RnRnd3Q2dZSUtvWkl6ajBFQXdJd2FURUwKTUFrR0ExVUVCaE1DVlZNeEV6QVJCZ05WQkFnVENrTmhiR2xtYjNKdWFXRXhGakFVQmdOVkJBY1REVk5oYmlCRwpjbUZ1WTJselkyOHhGREFTQmdOVkJBb1RDMlY0WVcxd2JHVXVZMjl0TVJjd0ZRWURWUVFERXc1allTNWxlR0Z0CmNHeGxMbU52YlRBZUZ3MHhOekExTURVd09EVTJNemxhRncweU56QTFNRE13T0RVMk16bGFNRll4Q3pBSkJnTlYKQkFZVEFsVlRNUk13RVFZRFZRUUlFd3BEWVd4cFptOXlibWxoTVJZd0ZBWURWUVFIRXcxVFlXNGdSbkpoYm1OcApjMk52TVJvd0dBWURWUVFEREJGQlpHMXBia0JsZUdGdGNHeGxMbU52YlRCWk1CTUdCeXFHU000OUFnRUdDQ3FHClNNNDlBd0VIQTBJQUJJbmY3eUZLWVlaZXliSDhURXo3bHYvSFJVbGF1SGM3cmptNUdCT3JTNnRRd3VCcTc0UFQKaUFXN2c2YVFLYk1sVm1qVmRJUnJNak0vWlc1SThOZFRUU0dqWWpCZ01BNEdBMVVkRHdFQi93UUVBd0lGb0RBVApCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBVEFNQmdOVkhSTUJBZjhFQWpBQU1Dc0dBMVVkSXdRa01DS0FJTTc3CkFmV1VtM1JwbkF1eFJGRHRMckw5N2M0c0ZKMkcvcjhxeS9iS0pEcU9NQW9HQ0NxR1NNNDlCQU1DQTBnQU1FVUMKSVFEUHpEWFZuaWJVdGVrZjJQclZoeUp5Y1R4OElkZnJUZTBQV1U4UnlzNFRVUUlnR2hjREljdWs1d0ZqclB4VgpWYk9DUS9OVUljRG5mb3RBSmpMZlIrTytaQ0U9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K"
],
"crypto_config": {
"identity_identifier_hash_function": "SHA256",
"signature_hash_family": "SHA2"
},
"name": "OrdererMSP",
"root_certs": [
"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNaekNDQWc2Z0F3SUJBZ0lRRUJlUUVxWXFnZmJTUlRDSUdlODBoVEFLQmdncWhrak9QUVFEQWpCcE1Rc3cKQ1FZRFZRUUdFd0pWVXpFVE1CRUdBMVVFQ0JNS1EyRnNhV1p2Y201cFlURVdNQlFHQTFVRUJ4TU5VMkZ1SUVaeQpZVzVqYVhOamJ6RVVNQklHQTFVRUNoTUxaWGhoYlhCc1pTNWpiMjB4RnpBVkJnTlZCQU1URG1OaExtVjRZVzF3CmJHVXVZMjl0TUI0WERURTNNRFV3TlRBNE5UWXpPVm9YRFRJM01EVXdNekE0TlRZek9Wb3dhVEVMTUFrR0ExVUUKQmhNQ1ZWTXhFekFSQmdOVkJBZ1RDa05oYkdsbWIzSnVhV0V4RmpBVUJnTlZCQWNURFZOaGJpQkdjbUZ1WTJsegpZMjh4RkRBU0JnTlZCQW9UQzJWNFlXMXdiR1V1WTI5dE1SY3dGUVlEVlFRREV3NWpZUzVsZUdGdGNHeGxMbU52CmJUQlpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDlBd0VIQTBJQUJGTmN6MVBJQnovaUhPd1lleGlGZTU2dUdydmoKSlhXeWk5VTQ0anlSdGVtU3hRdHllcTJHeFdUV0FhV2xOa01PeEpZOVRORXY1a3EzRXI4TC9iVmtVSjJqZ1pjdwpnWlF3RGdZRFZSMFBBUUgvQkFRREFnR21NQmtHQTFVZEpRUVNNQkFHQkZVZEpRQUdDQ3NHQVFVRkJ3TUJNQThHCkExVWRFd0VCL3dRRk1BTUJBZjh3S1FZRFZSME9CQ0lFSU03N0FmV1VtM1JwbkF1eFJGRHRMckw5N2M0c0ZKMkcKL3I4cXkvYktKRHFPTUNzR0ExVWRJd1FrTUNLQUlNNzdBZldVbTNScG5BdXhSRkR0THJMOTdjNHNGSjJHL3I4cQp5L2JLSkRxT01Bb0dDQ3FHU000OUJBTUNBMGNBTUVRQ0lHN3ZyMHltLzhKVmFyRjlNWUtPenIxbVZlcC9XSDF5CjhCRGh3NldQOGt2eEFpQmx1dkNqbi9HNDVrYkNJazAycjkyUXREZEZaRGNaVU5Gais1K0cwZ2NJdHc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg=="
]
}
}
}
}
}
},
"mod_policy": "Admins",
"policies": {
"Admins": {
"mod_policy": "Admins",
"policy": {
"type": 3,
"value": {
"rule": "MAJORITY",
"sub_policy": "Admins"
}
}
},
"BlockValidation": {
"mod_policy": "Admins",
"policy": {
"type": 3,
"value": {
"sub_policy": "Writers"
}
}
},
"Readers": {
"mod_policy": "Admins",
"policy": {
"type": 3,
"value": {
"sub_policy": "Readers"
}
}
},
"Writers": {
"mod_policy": "Admins",
"policy": {
"type": 3,
"value": {
"sub_policy": "Writers"
}
}
}
},
"values": {
"BatchSize": {
"mod_policy": "Admins",
"value": {
"absolute_max_bytes": 103809024,
"max_message_count": 10,
"preferred_max_bytes": 524288
}
},
"BatchTimeout": {
"mod_policy": "Admins",
"value": {
"timeout": "2s"
}
},
"ChannelRestrictions": {
"mod_policy": "Admins"
},
"ConsensusType": {
"mod_policy": "Admins",
"value": {
"type": "solo"
}
}
}
}
},
"policies": {
"Admins": {
"mod_policy": "Admins",
"policy": {
"type": 3,
"value": {
"rule": "MAJORITY",
"sub_policy": "Admins"
}
}
},
"Readers": {
"mod_policy": "Admins",
"policy": {
"type": 3,
"value": {
"sub_policy": "Readers"
}
}
},
"Writers": {
"mod_policy": "Admins",
"policy": {
"type": 3,
"value": {
"sub_policy": "Writers"
}
}
}
},
"values": {
"BlockDataHashingStructure": {
"mod_policy": "Admins",
"value": {
"width": 4294967295
}
},
"Consortium": {
"value": {
"name": "SampleConsortium"
}
},
"HashingAlgorithm": {
"mod_policy": "Admins",
"value": {
"name": "SHA256"
}
},
"OrdererAddresses": {
"mod_policy": "/Channel/Orderer/Admins",
"value": {
"addresses": [
"orderer.example.com:7050"
]
}
}
}
},
"sequence": "2"
},
"last_update": {
"payload": {
"data": {
"config_update": {
"channel_id": "businesschannel",
"read_set": {
"groups": {
"Application": {
"groups": {
"Org1MSP": {
"policies": {
"Admins": {},
"Readers": {},
"Writers": {}
},
"values": {
"MSP": {}
}
}
},
"version": "1"
}
}
},
"write_set": {
"groups": {
"Application": {
"groups": {
"Org1MSP": {
"policies": {
"Admins": {},
"Readers": {},
"Writers": {}
},
"values": {
"AnchorPeers": {
"value": {
"anchor_peers": [
{
"host": "peer0.org1.example.com",
"port": 7051
}
]
}
},
"MSP": {}
},
"version": "1"
}
},
"version": "1"
}
}
}
},
"signatures": [
{
"signature": "MEUCIQDfba5iTJkX0MRRscsAS0nLmyMgVRDarqcUc2NTvowXKQIgMLfd1B3MwiQel7BQcEQPTrlzSaVarU84LcUu7acKlGQ=",
"signature_header": {
"creator": "CgdPcmcxTVNQEpwGLS0tLS1CRUdJTiAtLS0tLQpNSUlDTHpDQ0FkV2dBd0lCQWdJUkFJeVFkVnQwZUJ1UWI2cVZBNlkydzVjd0NnWUlLb1pJemowRUF3SXdjekVMCk1Ba0dBMVVFQmhNQ1ZWTXhFekFSQmdOVkJBZ1RDa05oYkdsbWIzSnVhV0V4RmpBVUJnTlZCQWNURFZOaGJpQkcKY21GdVkybHpZMjh4R1RBWEJnTlZCQW9URUc5eVp6RXVaWGhoYlhCc1pTNWpiMjB4SERBYUJnTlZCQU1URTJOaApMbTl5WnpFdVpYaGhiWEJzWlM1amIyMHdIaGNOTVRjd05UQTFNRGcxTmpNNVdoY05NamN3TlRBek1EZzFOak01CldqQmJNUXN3Q1FZRFZRUUdFd0pWVXpFVE1CRUdBMVVFQ0JNS1EyRnNhV1p2Y201cFlURVdNQlFHQTFVRUJ4TU4KVTJGdUlFWnlZVzVqYVhOamJ6RWZNQjBHQTFVRUF3d1dRV1J0YVc1QWIzSm5NUzVsZUdGdGNHeGxMbU52YlRCWgpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDlBd0VIQTBJQUJJL0sraWhSZG5kSU1mTUZCVUN5TTBYYllBNXFVUUdWClhiSFdZK0J6emFFYkFJUVNLc3BGWHc1K09BbUZGTm5qYW1pMWhNK0ZxenRCRnhRbkg2TTh3MG1qWWpCZ01BNEcKQTFVZER3RUIvd1FFQXdJRm9EQVRCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBVEFNQmdOVkhSTUJBZjhFQWpBQQpNQ3NHQTFVZEl3UWtNQ0tBSU5naHVpRnEyVkVSR3BhbVNzdFR1bVBXMHpZdHFQQXpYTzl5ZURIL09uT3hNQW9HCkNDcUdTTTQ5QkFNQ0EwZ0FNRVVDSVFEK3NjQXpDWm8zd0IxRVVsZi9CSTc2VjcrSzdjQlBuWkdKV3RUMXFCcUYKMFFJZ1A1VHhPZng2NkR5eUhNY3BTLzNZZkEyajdha3RwaEpOb09aWG9NR00wTzg9Ci0tLS0tRU5EIC0tLS0tCg==",
"nonce": "tzt0XL+46Qx5yolX5Q8h7Nomx+p3CIqe"
}
}
]
},
"header": {
"channel_header": {
"channel_id": "businesschannel",
"timestamp": "2017-06-09T10:12:49.000Z",
"type": 2
},
"signature_header": {
"creator": "CgdPcmcxTVNQEpwGLS0tLS1CRUdJTiAtLS0tLQpNSUlDTHpDQ0FkV2dBd0lCQWdJUkFJeVFkVnQwZUJ1UWI2cVZBNlkydzVjd0NnWUlLb1pJemowRUF3SXdjekVMCk1Ba0dBMVVFQmhNQ1ZWTXhFekFSQmdOVkJBZ1RDa05oYkdsbWIzSnVhV0V4RmpBVUJnTlZCQWNURFZOaGJpQkcKY21GdVkybHpZMjh4R1RBWEJnTlZCQW9URUc5eVp6RXVaWGhoYlhCc1pTNWpiMjB4SERBYUJnTlZCQU1URTJOaApMbTl5WnpFdVpYaGhiWEJzWlM1amIyMHdIaGNOTVRjd05UQTFNRGcxTmpNNVdoY05NamN3TlRBek1EZzFOak01CldqQmJNUXN3Q1FZRFZRUUdFd0pWVXpFVE1CRUdBMVVFQ0JNS1EyRnNhV1p2Y201cFlURVdNQlFHQTFVRUJ4TU4KVTJGdUlFWnlZVzVqYVhOamJ6RWZNQjBHQTFVRUF3d1dRV1J0YVc1QWIzSm5NUzVsZUdGdGNHeGxMbU52YlRCWgpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDlBd0VIQTBJQUJJL0sraWhSZG5kSU1mTUZCVUN5TTBYYllBNXFVUUdWClhiSFdZK0J6emFFYkFJUVNLc3BGWHc1K09BbUZGTm5qYW1pMWhNK0ZxenRCRnhRbkg2TTh3MG1qWWpCZ01BNEcKQTFVZER3RUIvd1FFQXdJRm9EQVRCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBVEFNQmdOVkhSTUJBZjhFQWpBQQpNQ3NHQTFVZEl3UWtNQ0tBSU5naHVpRnEyVkVSR3BhbVNzdFR1bVBXMHpZdHFQQXpYTzl5ZURIL09uT3hNQW9HCkNDcUdTTTQ5QkFNQ0EwZ0FNRVVDSVFEK3NjQXpDWm8zd0IxRVVsZi9CSTc2VjcrSzdjQlBuWkdKV3RUMXFCcUYKMFFJZ1A1VHhPZng2NkR5eUhNY3BTLzNZZkEyajdha3RwaEpOb09aWG9NR00wTzg9Ci0tLS0tRU5EIC0tLS0tCg==",
"nonce": "qI334xzcODt1MX3XmrhMmJye1/3yIebs"
}
}
},
"signature": "MEQCIEJ+Uj00bJsNXHY402U+ztZNkYGiNjhoNg3HZXDV+P82AiB99Ape/UfNmHmKPwbkAaqugTjYv3z1FGZJw//NxbRjuQ=="
}
},
"header": {
"channel_header": {
"channel_id": "businesschannel",
"timestamp": "2017-06-09T10:12:49.000Z",
"type": 1
},
"signature_header": {
"creator": "CgpPcmRlcmVyTVNQEsEGLS0tLS1CRUdJTiAtLS0tLQpNSUlDU3pDQ0FmS2dBd0lCQWdJUWFhY1lTQTN1VVZadit1V2QwNzZUdFRBS0JnZ3Foa2pPUFFRREFqQnBNUXN3CkNRWURWUVFHRXdKVlV6RVRNQkVHQTFVRUNCTUtRMkZzYVdadmNtNXBZVEVXTUJRR0ExVUVCeE1OVTJGdUlFWnkKWVc1amFYTmpiekVVTUJJR0ExVUVDaE1MWlhoaGJYQnNaUzVqYjIweEZ6QVZCZ05WQkFNVERtTmhMbVY0WVcxdwpiR1V1WTI5dE1CNFhEVEUzTURVd05UQTROVFl6T1ZvWERUSTNNRFV3TXpBNE5UWXpPVm93V0RFTE1Ba0dBMVVFCkJoTUNWVk14RXpBUkJnTlZCQWdUQ2tOaGJHbG1iM0p1YVdFeEZqQVVCZ05WQkFjVERWTmhiaUJHY21GdVkybHoKWTI4eEhEQWFCZ05WQkFNVEUyOXlaR1Z5WlhJdVpYaGhiWEJzWlM1amIyMHdXVEFUQmdjcWhrak9QUUlCQmdncQpoa2pPUFFNQkJ3TkNBQVNUZEw1S2cyYXBwdDZkd3VxTFZxSVBIeG9sNTcyRUZ4RWcvd1hmR0RMc3Nyd2t0L0QyCkpxN1hkUDZNeTFETlFSNkFhWW1tbEJUZFJENEdyMUQxOS96R280R01NSUdKTUE0R0ExVWREd0VCL3dRRUF3SUYKb0RBVEJnTlZIU1VFRERBS0JnZ3JCZ0VGQlFjREFUQU1CZ05WSFJNQkFmOEVBakFBTUNzR0ExVWRJd1FrTUNLQQpJTTc3QWZXVW0zUnBuQXV4UkZEdExyTDk3YzRzRkoyRy9yOHF5L2JLSkRxT01DY0dBMVVkRVFRZ01CNkNFMjl5ClpHVnlaWEl1WlhoaGJYQnNaUzVqYjIyQ0IyOXlaR1Z5WlhJd0NnWUlLb1pJemowRUF3SURSd0F3UkFJZ0dvU3gKSHdCbGdOT3QzSisyaWF2V2JHSFlQdUM0Q3NNYmRxSThhTzZnSWY0Q0lFZEpkWURobkJNblZ3UWtkRlpNTW1xdwoyUnNXa2FvWk95LzVSdTNtVXJBMAotLS0tLUVORCAtLS0tLQo=",
"nonce": "00uT4GLT6m3owoZ9Zxlako0nNZ6mb3F2"
}
}
},
"signature": "MEQCIGeajXBbWPWigs7+S7q/So7/UvWLjvFU3qUPAaeoXgQBAiA+vaD8VsQMMhStIFHRyEnBVnxDWpvyun/pyEI9sOa14w=="
}
]
},
"header": {
"data_hash": "ip8Xe0HxGz4DjeXF9ttrk3tNcnHlYxwIynrIRJL9vG0=",
"number": "1",
"previous_hash": "/fj+3ZbcOpiwzqlJEDy9e88Gwe/bpa0jOWUyreHUBmU="
},
"metadata": {
"metadata": [
"ErkHCu0GCtAGCgpPcmRlcmVyTVNQEsEGLS0tLS1CRUdJTiAtLS0tLQpNSUlDU3pDQ0FmS2dBd0lCQWdJUWFhY1lTQTN1VVZadit1V2QwNzZUdFRBS0JnZ3Foa2pPUFFRREFqQnBNUXN3CkNRWURWUVFHRXdKVlV6RVRNQkVHQTFVRUNCTUtRMkZzYVdadmNtNXBZVEVXTUJRR0ExVUVCeE1OVTJGdUlFWnkKWVc1amFYTmpiekVVTUJJR0ExVUVDaE1MWlhoaGJYQnNaUzVqYjIweEZ6QVZCZ05WQkFNVERtTmhMbVY0WVcxdwpiR1V1WTI5dE1CNFhEVEUzTURVd05UQTROVFl6T1ZvWERUSTNNRFV3TXpBNE5UWXpPVm93V0RFTE1Ba0dBMVVFCkJoTUNWVk14RXpBUkJnTlZCQWdUQ2tOaGJHbG1iM0p1YVdFeEZqQVVCZ05WQkFjVERWTmhiaUJHY21GdVkybHoKWTI4eEhEQWFCZ05WQkFNVEUyOXlaR1Z5WlhJdVpYaGhiWEJzWlM1amIyMHdXVEFUQmdjcWhrak9QUUlCQmdncQpoa2pPUFFNQkJ3TkNBQVNUZEw1S2cyYXBwdDZkd3VxTFZxSVBIeG9sNTcyRUZ4RWcvd1hmR0RMc3Nyd2t0L0QyCkpxN1hkUDZNeTFETlFSNkFhWW1tbEJUZFJENEdyMUQxOS96R280R01NSUdKTUE0R0ExVWREd0VCL3dRRUF3SUYKb0RBVEJnTlZIU1VFRERBS0JnZ3JCZ0VGQlFjREFUQU1CZ05WSFJNQkFmOEVBakFBTUNzR0ExVWRJd1FrTUNLQQpJTTc3QWZXVW0zUnBuQXV4UkZEdExyTDk3YzRzRkoyRy9yOHF5L2JLSkRxT01DY0dBMVVkRVFRZ01CNkNFMjl5ClpHVnlaWEl1WlhoaGJYQnNaUzVqYjIyQ0IyOXlaR1Z5WlhJd0NnWUlLb1pJemowRUF3SURSd0F3UkFJZ0dvU3gKSHdCbGdOT3QzSisyaWF2V2JHSFlQdUM0Q3NNYmRxSThhTzZnSWY0Q0lFZEpkWURobkJNblZ3UWtkRlpNTW1xdwoyUnNXa2FvWk95LzVSdTNtVXJBMAotLS0tLUVORCAtLS0tLQoSGHME10mWylzp4cRXrLGEmanMNlxCpKAdhhJHMEUCIQCovuYAjZqyfJt3uyASnV2vR7SPOO18W7oNBe3ik8e8RwIgFi7jpAnf2d+UXlBIMxWs7y+l9S9JaQL7zG4BLqIPSsc=",
"CgIIARK5BwrtBgrQBgoKT3JkZXJlck1TUBLBBi0tLS0tQkVHSU4gLS0tLS0KTUlJQ1N6Q0NBZktnQXdJQkFnSVFhYWNZU0EzdVVWWnYrdVdkMDc2VHRUQUtCZ2dxaGtqT1BRUURBakJwTVFzdwpDUVlEVlFRR0V3SlZVekVUTUJFR0ExVUVDQk1LUTJGc2FXWnZjbTVwWVRFV01CUUdBMVVFQnhNTlUyRnVJRVp5CllXNWphWE5qYnpFVU1CSUdBMVVFQ2hNTFpYaGhiWEJzWlM1amIyMHhGekFWQmdOVkJBTVREbU5oTG1WNFlXMXcKYkdVdVkyOXRNQjRYRFRFM01EVXdOVEE0TlRZek9Wb1hEVEkzTURVd016QTROVFl6T1Zvd1dERUxNQWtHQTFVRQpCaE1DVlZNeEV6QVJCZ05WQkFnVENrTmhiR2xtYjNKdWFXRXhGakFVQmdOVkJBY1REVk5oYmlCR2NtRnVZMmx6ClkyOHhIREFhQmdOVkJBTVRFMjl5WkdWeVpYSXVaWGhoYlhCc1pTNWpiMjB3V1RBVEJnY3Foa2pPUFFJQkJnZ3EKaGtqT1BRTUJCd05DQUFTVGRMNUtnMmFwcHQ2ZHd1cUxWcUlQSHhvbDU3MkVGeEVnL3dYZkdETHNzcndrdC9EMgpKcTdYZFA2TXkxRE5RUjZBYVltbWxCVGRSRDRHcjFEMTkvekdvNEdNTUlHSk1BNEdBMVVkRHdFQi93UUVBd0lGCm9EQVRCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBVEFNQmdOVkhSTUJBZjhFQWpBQU1Dc0dBMVVkSXdRa01DS0EKSU03N0FmV1VtM1JwbkF1eFJGRHRMckw5N2M0c0ZKMkcvcjhxeS9iS0pEcU9NQ2NHQTFVZEVRUWdNQjZDRTI5eQpaR1Z5WlhJdVpYaGhiWEJzWlM1amIyMkNCMjl5WkdWeVpYSXdDZ1lJS29aSXpqMEVBd0lEUndBd1JBSWdHb1N4Ckh3QmxnTk90M0orMmlhdldiR0hZUHVDNENzTWJkcUk4YU82Z0lmNENJRWRKZFlEaG5CTW5Wd1FrZEZaTU1tcXcKMlJzV2thb1pPeS81UnUzbVVyQTAKLS0tLS1FTkQgLS0tLS0KEhiLMooOyBjev72HGp5JZEzCLP3WS5rJJk8SRzBFAiEAzfwhC6jzGEfAKkHkxXnddoGq3bBB8Sw9bK9G7GPvGAACIDKLJ/hu1a8eX1jDAkNwqj8flBTmZUct0nDRzQnkardj",
"",
""
]
}
}

View File

@ -1,605 +0,0 @@
{
"data": {
"data": [
{
"payload": {
"data": {
"config": {
"channel_group": {
"groups": {
"Application": {
"groups": {
"Org1MSP": {
"policies": {
"Admins": {
"mod_policy": "Admins",
"policy": {
"type": 1,
"value": {
"identities": [
{
"principal": {
"msp_identifier": "Org1MSP",
"role": "ADMIN"
}
}
],
"rule": {
"n_out_of": {
"n": 1,
"rules": [
{
"signed_by": 0
}
]
}
}
}
}
},
"Readers": {
"mod_policy": "Admins",
"policy": {
"type": 1,
"value": {
"identities": [
{
"principal": {
"msp_identifier": "Org1MSP"
}
}
],
"rule": {
"n_out_of": {
"n": 1,
"rules": [
{
"signed_by": 0
}
]
}
}
}
}
},
"Writers": {
"mod_policy": "Admins",
"policy": {
"type": 1,
"value": {
"identities": [
{
"principal": {
"msp_identifier": "Org1MSP"
}
}
],
"rule": {
"n_out_of": {
"n": 1,
"rules": [
{
"signed_by": 0
}
]
}
}
}
}
}
},
"values": {
"AnchorPeers": {
"value": {
"anchor_peers": [
{
"host": "peer0.org1.example.com",
"port": 7051
}
]
}
},
"MSP": {
"mod_policy": "Admins",
"value": {
"config": {
"admins": [
"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNMekNDQWRXZ0F3SUJBZ0lSQUl5UWRWdDBlQnVRYjZxVkE2WTJ3NWN3Q2dZSUtvWkl6ajBFQXdJd2N6RUwKTUFrR0ExVUVCaE1DVlZNeEV6QVJCZ05WQkFnVENrTmhiR2xtYjNKdWFXRXhGakFVQmdOVkJBY1REVk5oYmlCRwpjbUZ1WTJselkyOHhHVEFYQmdOVkJBb1RFRzl5WnpFdVpYaGhiWEJzWlM1amIyMHhIREFhQmdOVkJBTVRFMk5oCkxtOXlaekV1WlhoaGJYQnNaUzVqYjIwd0hoY05NVGN3TlRBMU1EZzFOak01V2hjTk1qY3dOVEF6TURnMU5qTTUKV2pCYk1Rc3dDUVlEVlFRR0V3SlZVekVUTUJFR0ExVUVDQk1LUTJGc2FXWnZjbTVwWVRFV01CUUdBMVVFQnhNTgpVMkZ1SUVaeVlXNWphWE5qYnpFZk1CMEdBMVVFQXd3V1FXUnRhVzVBYjNKbk1TNWxlR0Z0Y0d4bExtTnZiVEJaCk1CTUdCeXFHU000OUFnRUdDQ3FHU000OUF3RUhBMElBQkkvSytpaFJkbmRJTWZNRkJVQ3lNMFhiWUE1cVVRR1YKWGJIV1krQnp6YUViQUlRU0tzcEZYdzUrT0FtRkZObmphbWkxaE0rRnF6dEJGeFFuSDZNOHcwbWpZakJnTUE0RwpBMVVkRHdFQi93UUVBd0lGb0RBVEJnTlZIU1VFRERBS0JnZ3JCZ0VGQlFjREFUQU1CZ05WSFJNQkFmOEVBakFBCk1Dc0dBMVVkSXdRa01DS0FJTmdodWlGcTJWRVJHcGFtU3N0VHVtUFcwell0cVBBelhPOXllREgvT25PeE1Bb0cKQ0NxR1NNNDlCQU1DQTBnQU1FVUNJUUQrc2NBekNabzN3QjFFVWxmL0JJNzZWNytLN2NCUG5aR0pXdFQxcUJxRgowUUlnUDVUeE9meDY2RHl5SE1jcFMvM1lmQTJqN2FrdHBoSk5vT1pYb01HTTBPOD0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo="
],
"crypto_config": {
"identity_identifier_hash_function": "SHA256",
"signature_hash_family": "SHA2"
},
"name": "Org1MSP",
"root_certs": [
"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNlekNDQWlLZ0F3SUJBZ0lRQmJCbVNhSlVZS05HZ2grQVBlNmkwVEFLQmdncWhrak9QUVFEQWpCek1Rc3cKQ1FZRFZRUUdFd0pWVXpFVE1CRUdBMVVFQ0JNS1EyRnNhV1p2Y201cFlURVdNQlFHQTFVRUJ4TU5VMkZ1SUVaeQpZVzVqYVhOamJ6RVpNQmNHQTFVRUNoTVFiM0puTVM1bGVHRnRjR3hsTG1OdmJURWNNQm9HQTFVRUF4TVRZMkV1CmIzSm5NUzVsZUdGdGNHeGxMbU52YlRBZUZ3MHhOekExTURVd09EVTJNemxhRncweU56QTFNRE13T0RVMk16bGEKTUhNeEN6QUpCZ05WQkFZVEFsVlRNUk13RVFZRFZRUUlFd3BEWVd4cFptOXlibWxoTVJZd0ZBWURWUVFIRXcxVApZVzRnUm5KaGJtTnBjMk52TVJrd0Z3WURWUVFLRXhCdmNtY3hMbVY0WVcxd2JHVXVZMjl0TVJ3d0dnWURWUVFECkV4TmpZUzV2Y21jeExtVjRZVzF3YkdVdVkyOXRNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUUKbU1WTzFKTmRkaHYyNXBpaDY3b2ZteGU2TGFiYS90U0RZbXpxVEw3bG5oMWlZT3ZJekVOK1BNRnJ4WUx3d25HTQphQXlzay9CRkx4Zys0QWpGSTY0UnZhT0JsekNCbERBT0JnTlZIUThCQWY4RUJBTUNBYVl3R1FZRFZSMGxCQkl3CkVBWUVWUjBsQUFZSUt3WUJCUVVIQXdFd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBcEJnTlZIUTRFSWdRZzJDRzYKSVdyWlVSRWFscVpLeTFPNlk5YlROaTJvOEROYzczSjRNZjg2YzdFd0t3WURWUjBqQkNRd0lvQWcyQ0c2SVdyWgpVUkVhbHFaS3kxTzZZOWJUTmkybzhETmM3M0o0TWY4NmM3RXdDZ1lJS29aSXpqMEVBd0lEUndBd1JBSWdLVk5XCitiWmpraEFHYVlzRmh2WHdqMFB0LzN6cDE5ZzhHYkxudW1jMHBUNENJRlVQaUVieDl3WkFNSjZvZkNGeGZkL3MKRk01TEptTDMxSUtJeThBS0JTR3gKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo="
]
}
}
}
},
"version": "1"
},
"Org2MSP": {
"policies": {
"Admins": {
"mod_policy": "Admins",
"policy": {
"type": 1,
"value": {
"identities": [
{
"principal": {
"msp_identifier": "Org2MSP",
"role": "ADMIN"
}
}
],
"rule": {
"n_out_of": {
"n": 1,
"rules": [
{
"signed_by": 0
}
]
}
}
}
}
},
"Readers": {
"mod_policy": "Admins",
"policy": {
"type": 1,
"value": {
"identities": [
{
"principal": {
"msp_identifier": "Org2MSP"
}
}
],
"rule": {
"n_out_of": {
"n": 1,
"rules": [
{
"signed_by": 0
}
]
}
}
}
}
},
"Writers": {
"mod_policy": "Admins",
"policy": {
"type": 1,
"value": {
"identities": [
{
"principal": {
"msp_identifier": "Org2MSP"
}
}
],
"rule": {
"n_out_of": {
"n": 1,
"rules": [
{
"signed_by": 0
}
]
}
}
}
}
}
},
"values": {
"AnchorPeers": {
"value": {
"anchor_peers": [
{
"host": "peer0.org2.example.com",
"port": 7051
}
]
}
},
"MSP": {
"mod_policy": "Admins",
"value": {
"config": {
"admins": [
"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNMekNDQWRXZ0F3SUJBZ0lSQVBFK2JRT1Naa3ZFZEhKNmpGSloyamd3Q2dZSUtvWkl6ajBFQXdJd2N6RUwKTUFrR0ExVUVCaE1DVlZNeEV6QVJCZ05WQkFnVENrTmhiR2xtYjNKdWFXRXhGakFVQmdOVkJBY1REVk5oYmlCRwpjbUZ1WTJselkyOHhHVEFYQmdOVkJBb1RFRzl5WnpJdVpYaGhiWEJzWlM1amIyMHhIREFhQmdOVkJBTVRFMk5oCkxtOXlaekl1WlhoaGJYQnNaUzVqYjIwd0hoY05NVGN3TlRBMU1EZzFOak01V2hjTk1qY3dOVEF6TURnMU5qTTUKV2pCYk1Rc3dDUVlEVlFRR0V3SlZVekVUTUJFR0ExVUVDQk1LUTJGc2FXWnZjbTVwWVRFV01CUUdBMVVFQnhNTgpVMkZ1SUVaeVlXNWphWE5qYnpFZk1CMEdBMVVFQXd3V1FXUnRhVzVBYjNKbk1pNWxlR0Z0Y0d4bExtTnZiVEJaCk1CTUdCeXFHU000OUFnRUdDQ3FHU000OUF3RUhBMElBQkMwYjRuT21meFZ6NFJRN2dRL01XcWtpV2UrRG91RlMKdVVEU0szQzZPZ1o3RS9ZdDJpQVBvVUZybVdJbmNVWXEwakNTcTZWMUdiTUcrMndlb2lQOWVEMmpZakJnTUE0RwpBMVVkRHdFQi93UUVBd0lGb0RBVEJnTlZIU1VFRERBS0JnZ3JCZ0VGQlFjREFUQU1CZ05WSFJNQkFmOEVBakFBCk1Dc0dBMVVkSXdRa01DS0FJTW9aRmVjMzlGaVo2RlB5TDIzYlFsYWhFSmVUNk5xNEdvZ3ZYOGVib0ZTNU1Bb0cKQ0NxR1NNNDlCQU1DQTBnQU1FVUNJUUNpaVl3cnFVRWpXaklGK1k0WTB0c2RMK3hUbjZoWUQwZUtvakI4N0s2OApld0lnVk9Xb0h6S0hDSFRQektxUVVTbUR3eDFvUzJFSU5YdWFJZ2RibUJoTmZSUT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo="
],
"crypto_config": {
"identity_identifier_hash_function": "SHA256",
"signature_hash_family": "SHA2"
},
"name": "Org2MSP",
"root_certs": [
"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNmVENDQWlPZ0F3SUJBZ0lSQU5GUllhaGpsVkpXQ3VuTkQybDROazR3Q2dZSUtvWkl6ajBFQXdJd2N6RUwKTUFrR0ExVUVCaE1DVlZNeEV6QVJCZ05WQkFnVENrTmhiR2xtYjNKdWFXRXhGakFVQmdOVkJBY1REVk5oYmlCRwpjbUZ1WTJselkyOHhHVEFYQmdOVkJBb1RFRzl5WnpJdVpYaGhiWEJzWlM1amIyMHhIREFhQmdOVkJBTVRFMk5oCkxtOXlaekl1WlhoaGJYQnNaUzVqYjIwd0hoY05NVGN3TlRBMU1EZzFOak01V2hjTk1qY3dOVEF6TURnMU5qTTUKV2pCek1Rc3dDUVlEVlFRR0V3SlZVekVUTUJFR0ExVUVDQk1LUTJGc2FXWnZjbTVwWVRFV01CUUdBMVVFQnhNTgpVMkZ1SUVaeVlXNWphWE5qYnpFWk1CY0dBMVVFQ2hNUWIzSm5NaTVsZUdGdGNHeGxMbU52YlRFY01Cb0dBMVVFCkF4TVRZMkV1YjNKbk1pNWxlR0Z0Y0d4bExtTnZiVEJaTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEEwSUEKQkd0L0ZESUpjMWFzQW9MaDl3K281dndLaDRQRTZ3eWZ5NVptZmlzTFlUMDB6R0Q1SnZkU3dkU29sOUhZaVd4RwpCWk9FWENSM2NYbm5kMGUrWXcvckYzNmpnWmN3Z1pRd0RnWURWUjBQQVFIL0JBUURBZ0dtTUJrR0ExVWRKUVFTCk1CQUdCRlVkSlFBR0NDc0dBUVVGQndNQk1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0tRWURWUjBPQkNJRUlNb1oKRmVjMzlGaVo2RlB5TDIzYlFsYWhFSmVUNk5xNEdvZ3ZYOGVib0ZTNU1Dc0dBMVVkSXdRa01DS0FJTW9aRmVjMwo5RmlaNkZQeUwyM2JRbGFoRUplVDZOcTRHb2d2WDhlYm9GUzVNQW9HQ0NxR1NNNDlCQU1DQTBnQU1FVUNJUUNUCjg4bTR6dTdxZ1lFV1VkdGVhQUhucWoyUm9oTm80YzA5TDVFNjUxQVZvQUlnYmZzVDVjWDA0WlQ4ckYrb2V0VmkKcWdaTFRJdzlEcjJSWDBKUktwbVYxRXM9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K"
]
}
}
}
},
"version": "1"
}
},
"mod_policy": "Admins",
"policies": {
"Admins": {
"policy": {
"type": 3,
"value": {
"rule": "MAJORITY",
"sub_policy": "Admins"
}
}
},
"Readers": {
"policy": {
"type": 3,
"value": {
"sub_policy": "Readers"
}
}
},
"Writers": {
"policy": {
"type": 3,
"value": {
"sub_policy": "Writers"
}
}
}
},
"version": "1"
},
"Orderer": {
"groups": {
"OrdererOrg": {
"mod_policy": "Admins",
"policies": {
"Admins": {
"mod_policy": "Admins",
"policy": {
"type": 1,
"value": {
"identities": [
{
"principal": {
"msp_identifier": "OrdererMSP",
"role": "ADMIN"
}
}
],
"rule": {
"n_out_of": {
"n": 1,
"rules": [
{
"signed_by": 0
}
]
}
}
}
}
},
"Readers": {
"mod_policy": "Admins",
"policy": {
"type": 1,
"value": {
"identities": [
{
"principal": {
"msp_identifier": "OrdererMSP"
}
}
],
"rule": {
"n_out_of": {
"n": 1,
"rules": [
{
"signed_by": 0
}
]
}
}
}
}
},
"Writers": {
"mod_policy": "Admins",
"policy": {
"type": 1,
"value": {
"identities": [
{
"principal": {
"msp_identifier": "OrdererMSP"
}
}
],
"rule": {
"n_out_of": {
"n": 1,
"rules": [
{
"signed_by": 0
}
]
}
}
}
}
}
},
"values": {
"MSP": {
"mod_policy": "Admins",
"value": {
"config": {
"admins": [
"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNJRENDQWNhZ0F3SUJBZ0lSQUlVRmNEYW1WOHI5dDFzY0Z2b3RnRnd3Q2dZSUtvWkl6ajBFQXdJd2FURUwKTUFrR0ExVUVCaE1DVlZNeEV6QVJCZ05WQkFnVENrTmhiR2xtYjNKdWFXRXhGakFVQmdOVkJBY1REVk5oYmlCRwpjbUZ1WTJselkyOHhGREFTQmdOVkJBb1RDMlY0WVcxd2JHVXVZMjl0TVJjd0ZRWURWUVFERXc1allTNWxlR0Z0CmNHeGxMbU52YlRBZUZ3MHhOekExTURVd09EVTJNemxhRncweU56QTFNRE13T0RVMk16bGFNRll4Q3pBSkJnTlYKQkFZVEFsVlRNUk13RVFZRFZRUUlFd3BEWVd4cFptOXlibWxoTVJZd0ZBWURWUVFIRXcxVFlXNGdSbkpoYm1OcApjMk52TVJvd0dBWURWUVFEREJGQlpHMXBia0JsZUdGdGNHeGxMbU52YlRCWk1CTUdCeXFHU000OUFnRUdDQ3FHClNNNDlBd0VIQTBJQUJJbmY3eUZLWVlaZXliSDhURXo3bHYvSFJVbGF1SGM3cmptNUdCT3JTNnRRd3VCcTc0UFQKaUFXN2c2YVFLYk1sVm1qVmRJUnJNak0vWlc1SThOZFRUU0dqWWpCZ01BNEdBMVVkRHdFQi93UUVBd0lGb0RBVApCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBVEFNQmdOVkhSTUJBZjhFQWpBQU1Dc0dBMVVkSXdRa01DS0FJTTc3CkFmV1VtM1JwbkF1eFJGRHRMckw5N2M0c0ZKMkcvcjhxeS9iS0pEcU9NQW9HQ0NxR1NNNDlCQU1DQTBnQU1FVUMKSVFEUHpEWFZuaWJVdGVrZjJQclZoeUp5Y1R4OElkZnJUZTBQV1U4UnlzNFRVUUlnR2hjREljdWs1d0ZqclB4VgpWYk9DUS9OVUljRG5mb3RBSmpMZlIrTytaQ0U9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K"
],
"crypto_config": {
"identity_identifier_hash_function": "SHA256",
"signature_hash_family": "SHA2"
},
"name": "OrdererMSP",
"root_certs": [
"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNaekNDQWc2Z0F3SUJBZ0lRRUJlUUVxWXFnZmJTUlRDSUdlODBoVEFLQmdncWhrak9QUVFEQWpCcE1Rc3cKQ1FZRFZRUUdFd0pWVXpFVE1CRUdBMVVFQ0JNS1EyRnNhV1p2Y201cFlURVdNQlFHQTFVRUJ4TU5VMkZ1SUVaeQpZVzVqYVhOamJ6RVVNQklHQTFVRUNoTUxaWGhoYlhCc1pTNWpiMjB4RnpBVkJnTlZCQU1URG1OaExtVjRZVzF3CmJHVXVZMjl0TUI0WERURTNNRFV3TlRBNE5UWXpPVm9YRFRJM01EVXdNekE0TlRZek9Wb3dhVEVMTUFrR0ExVUUKQmhNQ1ZWTXhFekFSQmdOVkJBZ1RDa05oYkdsbWIzSnVhV0V4RmpBVUJnTlZCQWNURFZOaGJpQkdjbUZ1WTJsegpZMjh4RkRBU0JnTlZCQW9UQzJWNFlXMXdiR1V1WTI5dE1SY3dGUVlEVlFRREV3NWpZUzVsZUdGdGNHeGxMbU52CmJUQlpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDlBd0VIQTBJQUJGTmN6MVBJQnovaUhPd1lleGlGZTU2dUdydmoKSlhXeWk5VTQ0anlSdGVtU3hRdHllcTJHeFdUV0FhV2xOa01PeEpZOVRORXY1a3EzRXI4TC9iVmtVSjJqZ1pjdwpnWlF3RGdZRFZSMFBBUUgvQkFRREFnR21NQmtHQTFVZEpRUVNNQkFHQkZVZEpRQUdDQ3NHQVFVRkJ3TUJNQThHCkExVWRFd0VCL3dRRk1BTUJBZjh3S1FZRFZSME9CQ0lFSU03N0FmV1VtM1JwbkF1eFJGRHRMckw5N2M0c0ZKMkcKL3I4cXkvYktKRHFPTUNzR0ExVWRJd1FrTUNLQUlNNzdBZldVbTNScG5BdXhSRkR0THJMOTdjNHNGSjJHL3I4cQp5L2JLSkRxT01Bb0dDQ3FHU000OUJBTUNBMGNBTUVRQ0lHN3ZyMHltLzhKVmFyRjlNWUtPenIxbVZlcC9XSDF5CjhCRGh3NldQOGt2eEFpQmx1dkNqbi9HNDVrYkNJazAycjkyUXREZEZaRGNaVU5Gais1K0cwZ2NJdHc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg=="
]
}
}
}
}
}
},
"mod_policy": "Admins",
"policies": {
"Admins": {
"mod_policy": "Admins",
"policy": {
"type": 3,
"value": {
"rule": "MAJORITY",
"sub_policy": "Admins"
}
}
},
"BlockValidation": {
"mod_policy": "Admins",
"policy": {
"type": 3,
"value": {
"sub_policy": "Writers"
}
}
},
"Readers": {
"mod_policy": "Admins",
"policy": {
"type": 3,
"value": {
"sub_policy": "Readers"
}
}
},
"Writers": {
"mod_policy": "Admins",
"policy": {
"type": 3,
"value": {
"sub_policy": "Writers"
}
}
}
},
"values": {
"BatchSize": {
"mod_policy": "Admins",
"value": {
"absolute_max_bytes": 103809024,
"max_message_count": 10,
"preferred_max_bytes": 524288
}
},
"BatchTimeout": {
"mod_policy": "Admins",
"value": {
"timeout": "2s"
}
},
"ChannelRestrictions": {
"mod_policy": "Admins"
},
"ConsensusType": {
"mod_policy": "Admins",
"value": {
"type": "solo"
}
}
}
}
},
"policies": {
"Admins": {
"mod_policy": "Admins",
"policy": {
"type": 3,
"value": {
"rule": "MAJORITY",
"sub_policy": "Admins"
}
}
},
"Readers": {
"mod_policy": "Admins",
"policy": {
"type": 3,
"value": {
"sub_policy": "Readers"
}
}
},
"Writers": {
"mod_policy": "Admins",
"policy": {
"type": 3,
"value": {
"sub_policy": "Writers"
}
}
}
},
"values": {
"BlockDataHashingStructure": {
"mod_policy": "Admins",
"value": {
"width": 4294967295
}
},
"Consortium": {
"value": {
"name": "SampleConsortium"
}
},
"HashingAlgorithm": {
"mod_policy": "Admins",
"value": {
"name": "SHA256"
}
},
"OrdererAddresses": {
"mod_policy": "/Channel/Orderer/Admins",
"value": {
"addresses": [
"orderer.example.com:7050"
]
}
}
}
},
"sequence": "3"
},
"last_update": {
"payload": {
"data": {
"config_update": {
"channel_id": "businesschannel",
"read_set": {
"groups": {
"Application": {
"groups": {
"Org2MSP": {
"policies": {
"Admins": {},
"Readers": {},
"Writers": {}
},
"values": {
"MSP": {}
}
}
},
"version": "1"
}
}
},
"write_set": {
"groups": {
"Application": {
"groups": {
"Org2MSP": {
"policies": {
"Admins": {},
"Readers": {},
"Writers": {}
},
"values": {
"AnchorPeers": {
"value": {
"anchor_peers": [
{
"host": "peer0.org2.example.com",
"port": 7051
}
]
}
},
"MSP": {}
},
"version": "1"
}
},
"version": "1"
}
}
}
},
"signatures": [
{
"signature": "MEUCIQDgOjwqACtPmBvEvqebLZxVNYPGhkSZiIqPMgV8tu42RQIgGfBq6qmAhDBVVRabqXkjfizYSx22mzfkg5b9VCJpqcs=",
"signature_header": {
"creator": "CgdPcmcyTVNQEpwGLS0tLS1CRUdJTiAtLS0tLQpNSUlDTHpDQ0FkV2dBd0lCQWdJUkFQRStiUU9TWmt2RWRISjZqRkpaMmpnd0NnWUlLb1pJemowRUF3SXdjekVMCk1Ba0dBMVVFQmhNQ1ZWTXhFekFSQmdOVkJBZ1RDa05oYkdsbWIzSnVhV0V4RmpBVUJnTlZCQWNURFZOaGJpQkcKY21GdVkybHpZMjh4R1RBWEJnTlZCQW9URUc5eVp6SXVaWGhoYlhCc1pTNWpiMjB4SERBYUJnTlZCQU1URTJOaApMbTl5WnpJdVpYaGhiWEJzWlM1amIyMHdIaGNOTVRjd05UQTFNRGcxTmpNNVdoY05NamN3TlRBek1EZzFOak01CldqQmJNUXN3Q1FZRFZRUUdFd0pWVXpFVE1CRUdBMVVFQ0JNS1EyRnNhV1p2Y201cFlURVdNQlFHQTFVRUJ4TU4KVTJGdUlFWnlZVzVqYVhOamJ6RWZNQjBHQTFVRUF3d1dRV1J0YVc1QWIzSm5NaTVsZUdGdGNHeGxMbU52YlRCWgpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDlBd0VIQTBJQUJDMGI0bk9tZnhWejRSUTdnUS9NV3FraVdlK0RvdUZTCnVVRFNLM0M2T2daN0UvWXQyaUFQb1VGcm1XSW5jVVlxMGpDU3E2VjFHYk1HKzJ3ZW9pUDllRDJqWWpCZ01BNEcKQTFVZER3RUIvd1FFQXdJRm9EQVRCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBVEFNQmdOVkhSTUJBZjhFQWpBQQpNQ3NHQTFVZEl3UWtNQ0tBSU1vWkZlYzM5RmlaNkZQeUwyM2JRbGFoRUplVDZOcTRHb2d2WDhlYm9GUzVNQW9HCkNDcUdTTTQ5QkFNQ0EwZ0FNRVVDSVFDaWlZd3JxVUVqV2pJRitZNFkwdHNkTCt4VG42aFlEMGVLb2pCODdLNjgKZXdJZ1ZPV29IektIQ0hUUHpLcVFVU21Ed3gxb1MyRUlOWHVhSWdkYm1CaE5mUlE9Ci0tLS0tRU5EIC0tLS0tCg==",
"nonce": "Lzg8qAx+DZB8PFQ8xqudXo8fft3ak+g2"
}
}
]
},
"header": {
"channel_header": {
"channel_id": "businesschannel",
"timestamp": "2017-06-09T10:12:49.000Z",
"type": 2
},
"signature_header": {
"creator": "CgdPcmcyTVNQEpwGLS0tLS1CRUdJTiAtLS0tLQpNSUlDTHpDQ0FkV2dBd0lCQWdJUkFQRStiUU9TWmt2RWRISjZqRkpaMmpnd0NnWUlLb1pJemowRUF3SXdjekVMCk1Ba0dBMVVFQmhNQ1ZWTXhFekFSQmdOVkJBZ1RDa05oYkdsbWIzSnVhV0V4RmpBVUJnTlZCQWNURFZOaGJpQkcKY21GdVkybHpZMjh4R1RBWEJnTlZCQW9URUc5eVp6SXVaWGhoYlhCc1pTNWpiMjB4SERBYUJnTlZCQU1URTJOaApMbTl5WnpJdVpYaGhiWEJzWlM1amIyMHdIaGNOTVRjd05UQTFNRGcxTmpNNVdoY05NamN3TlRBek1EZzFOak01CldqQmJNUXN3Q1FZRFZRUUdFd0pWVXpFVE1CRUdBMVVFQ0JNS1EyRnNhV1p2Y201cFlURVdNQlFHQTFVRUJ4TU4KVTJGdUlFWnlZVzVqYVhOamJ6RWZNQjBHQTFVRUF3d1dRV1J0YVc1QWIzSm5NaTVsZUdGdGNHeGxMbU52YlRCWgpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDlBd0VIQTBJQUJDMGI0bk9tZnhWejRSUTdnUS9NV3FraVdlK0RvdUZTCnVVRFNLM0M2T2daN0UvWXQyaUFQb1VGcm1XSW5jVVlxMGpDU3E2VjFHYk1HKzJ3ZW9pUDllRDJqWWpCZ01BNEcKQTFVZER3RUIvd1FFQXdJRm9EQVRCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBVEFNQmdOVkhSTUJBZjhFQWpBQQpNQ3NHQTFVZEl3UWtNQ0tBSU1vWkZlYzM5RmlaNkZQeUwyM2JRbGFoRUplVDZOcTRHb2d2WDhlYm9GUzVNQW9HCkNDcUdTTTQ5QkFNQ0EwZ0FNRVVDSVFDaWlZd3JxVUVqV2pJRitZNFkwdHNkTCt4VG42aFlEMGVLb2pCODdLNjgKZXdJZ1ZPV29IektIQ0hUUHpLcVFVU21Ed3gxb1MyRUlOWHVhSWdkYm1CaE5mUlE9Ci0tLS0tRU5EIC0tLS0tCg==",
"nonce": "HLGWPdfcU+Z2TlHOZos4i80hOxSmxfYN"
}
}
},
"signature": "MEMCH3mnHErEP7mzyYuCKRZHxwywf3HmPA3zgsF5CAeauWQCIHEPitCX8uSnb++X0MBCkNeEpjQx+Tr+FrX2l29P8YgU"
}
},
"header": {
"channel_header": {
"channel_id": "businesschannel",
"timestamp": "2017-06-09T10:12:49.000Z",
"type": 1
},
"signature_header": {
"creator": "CgpPcmRlcmVyTVNQEsEGLS0tLS1CRUdJTiAtLS0tLQpNSUlDU3pDQ0FmS2dBd0lCQWdJUWFhY1lTQTN1VVZadit1V2QwNzZUdFRBS0JnZ3Foa2pPUFFRREFqQnBNUXN3CkNRWURWUVFHRXdKVlV6RVRNQkVHQTFVRUNCTUtRMkZzYVdadmNtNXBZVEVXTUJRR0ExVUVCeE1OVTJGdUlFWnkKWVc1amFYTmpiekVVTUJJR0ExVUVDaE1MWlhoaGJYQnNaUzVqYjIweEZ6QVZCZ05WQkFNVERtTmhMbVY0WVcxdwpiR1V1WTI5dE1CNFhEVEUzTURVd05UQTROVFl6T1ZvWERUSTNNRFV3TXpBNE5UWXpPVm93V0RFTE1Ba0dBMVVFCkJoTUNWVk14RXpBUkJnTlZCQWdUQ2tOaGJHbG1iM0p1YVdFeEZqQVVCZ05WQkFjVERWTmhiaUJHY21GdVkybHoKWTI4eEhEQWFCZ05WQkFNVEUyOXlaR1Z5WlhJdVpYaGhiWEJzWlM1amIyMHdXVEFUQmdjcWhrak9QUUlCQmdncQpoa2pPUFFNQkJ3TkNBQVNUZEw1S2cyYXBwdDZkd3VxTFZxSVBIeG9sNTcyRUZ4RWcvd1hmR0RMc3Nyd2t0L0QyCkpxN1hkUDZNeTFETlFSNkFhWW1tbEJUZFJENEdyMUQxOS96R280R01NSUdKTUE0R0ExVWREd0VCL3dRRUF3SUYKb0RBVEJnTlZIU1VFRERBS0JnZ3JCZ0VGQlFjREFUQU1CZ05WSFJNQkFmOEVBakFBTUNzR0ExVWRJd1FrTUNLQQpJTTc3QWZXVW0zUnBuQXV4UkZEdExyTDk3YzRzRkoyRy9yOHF5L2JLSkRxT01DY0dBMVVkRVFRZ01CNkNFMjl5ClpHVnlaWEl1WlhoaGJYQnNaUzVqYjIyQ0IyOXlaR1Z5WlhJd0NnWUlLb1pJemowRUF3SURSd0F3UkFJZ0dvU3gKSHdCbGdOT3QzSisyaWF2V2JHSFlQdUM0Q3NNYmRxSThhTzZnSWY0Q0lFZEpkWURobkJNblZ3UWtkRlpNTW1xdwoyUnNXa2FvWk95LzVSdTNtVXJBMAotLS0tLUVORCAtLS0tLQo=",
"nonce": "Js9BRGi3J0BllHHU0DcHni6vrZzWtCrk"
}
}
},
"signature": "MEUCIQCLI4ezMV9DQYnU2oq/XBRVtNSOyXTEDwb+YpvBZkETAAIgZv2BibPaS9rffcxlPyVDPRIQqXFcfnqEqFruRBG0lCY="
}
]
},
"header": {
"data_hash": "wRm/Ujc4YzD89bQU/sxbsPf28lYPFOZtYwtCLuWVPMM=",
"number": "2",
"previous_hash": "0XJc9YfDyeyRufS/nb8o4U7hwykSCJ8L4FV4WmiYjW4="
},
"metadata": {
"metadata": [
"ErkHCu0GCtAGCgpPcmRlcmVyTVNQEsEGLS0tLS1CRUdJTiAtLS0tLQpNSUlDU3pDQ0FmS2dBd0lCQWdJUWFhY1lTQTN1VVZadit1V2QwNzZUdFRBS0JnZ3Foa2pPUFFRREFqQnBNUXN3CkNRWURWUVFHRXdKVlV6RVRNQkVHQTFVRUNCTUtRMkZzYVdadmNtNXBZVEVXTUJRR0ExVUVCeE1OVTJGdUlFWnkKWVc1amFYTmpiekVVTUJJR0ExVUVDaE1MWlhoaGJYQnNaUzVqYjIweEZ6QVZCZ05WQkFNVERtTmhMbVY0WVcxdwpiR1V1WTI5dE1CNFhEVEUzTURVd05UQTROVFl6T1ZvWERUSTNNRFV3TXpBNE5UWXpPVm93V0RFTE1Ba0dBMVVFCkJoTUNWVk14RXpBUkJnTlZCQWdUQ2tOaGJHbG1iM0p1YVdFeEZqQVVCZ05WQkFjVERWTmhiaUJHY21GdVkybHoKWTI4eEhEQWFCZ05WQkFNVEUyOXlaR1Z5WlhJdVpYaGhiWEJzWlM1amIyMHdXVEFUQmdjcWhrak9QUUlCQmdncQpoa2pPUFFNQkJ3TkNBQVNUZEw1S2cyYXBwdDZkd3VxTFZxSVBIeG9sNTcyRUZ4RWcvd1hmR0RMc3Nyd2t0L0QyCkpxN1hkUDZNeTFETlFSNkFhWW1tbEJUZFJENEdyMUQxOS96R280R01NSUdKTUE0R0ExVWREd0VCL3dRRUF3SUYKb0RBVEJnTlZIU1VFRERBS0JnZ3JCZ0VGQlFjREFUQU1CZ05WSFJNQkFmOEVBakFBTUNzR0ExVWRJd1FrTUNLQQpJTTc3QWZXVW0zUnBuQXV4UkZEdExyTDk3YzRzRkoyRy9yOHF5L2JLSkRxT01DY0dBMVVkRVFRZ01CNkNFMjl5ClpHVnlaWEl1WlhoaGJYQnNaUzVqYjIyQ0IyOXlaR1Z5WlhJd0NnWUlLb1pJemowRUF3SURSd0F3UkFJZ0dvU3gKSHdCbGdOT3QzSisyaWF2V2JHSFlQdUM0Q3NNYmRxSThhTzZnSWY0Q0lFZEpkWURobkJNblZ3UWtkRlpNTW1xdwoyUnNXa2FvWk95LzVSdTNtVXJBMAotLS0tLUVORCAtLS0tLQoSGHfzBtNTL9Hnt7ILipTLm+xVaqvM4EbW3BJHMEUCIQDmdvdhkMoS5VKrAHvLCrK+8RHtpNWKARWnG/tudmkgDwIgY7SnCXABq1lGoZXVW4wBcxV24HBjt6KAbElownhkK74=",
"CgIIAhK5BwrtBgrQBgoKT3JkZXJlck1TUBLBBi0tLS0tQkVHSU4gLS0tLS0KTUlJQ1N6Q0NBZktnQXdJQkFnSVFhYWNZU0EzdVVWWnYrdVdkMDc2VHRUQUtCZ2dxaGtqT1BRUURBakJwTVFzdwpDUVlEVlFRR0V3SlZVekVUTUJFR0ExVUVDQk1LUTJGc2FXWnZjbTVwWVRFV01CUUdBMVVFQnhNTlUyRnVJRVp5CllXNWphWE5qYnpFVU1CSUdBMVVFQ2hNTFpYaGhiWEJzWlM1amIyMHhGekFWQmdOVkJBTVREbU5oTG1WNFlXMXcKYkdVdVkyOXRNQjRYRFRFM01EVXdOVEE0TlRZek9Wb1hEVEkzTURVd016QTROVFl6T1Zvd1dERUxNQWtHQTFVRQpCaE1DVlZNeEV6QVJCZ05WQkFnVENrTmhiR2xtYjNKdWFXRXhGakFVQmdOVkJBY1REVk5oYmlCR2NtRnVZMmx6ClkyOHhIREFhQmdOVkJBTVRFMjl5WkdWeVpYSXVaWGhoYlhCc1pTNWpiMjB3V1RBVEJnY3Foa2pPUFFJQkJnZ3EKaGtqT1BRTUJCd05DQUFTVGRMNUtnMmFwcHQ2ZHd1cUxWcUlQSHhvbDU3MkVGeEVnL3dYZkdETHNzcndrdC9EMgpKcTdYZFA2TXkxRE5RUjZBYVltbWxCVGRSRDRHcjFEMTkvekdvNEdNTUlHSk1BNEdBMVVkRHdFQi93UUVBd0lGCm9EQVRCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBVEFNQmdOVkhSTUJBZjhFQWpBQU1Dc0dBMVVkSXdRa01DS0EKSU03N0FmV1VtM1JwbkF1eFJGRHRMckw5N2M0c0ZKMkcvcjhxeS9iS0pEcU9NQ2NHQTFVZEVRUWdNQjZDRTI5eQpaR1Z5WlhJdVpYaGhiWEJzWlM1amIyMkNCMjl5WkdWeVpYSXdDZ1lJS29aSXpqMEVBd0lEUndBd1JBSWdHb1N4Ckh3QmxnTk90M0orMmlhdldiR0hZUHVDNENzTWJkcUk4YU82Z0lmNENJRWRKZFlEaG5CTW5Wd1FrZEZaTU1tcXcKMlJzV2thb1pPeS81UnUzbVVyQTAKLS0tLS1FTkQgLS0tLS0KEhhaZlSdp5FamfMnYa+DhoGK7iqIALlOPIwSRzBFAiEA++CMHaOk8zQ46EuJHbtDvQG7UbtkquTtPAfX/5vgQ5ICIHR+au+VTjpXIzSwxndFn8+Kts/VQ3qknHpgm0YM/S9T",
"",
""
]
}
}

View File

@ -1,80 +0,0 @@
{
"payload": {
"data": {
"config_update": {
"channel_id": "businesschannel",
"read_set": {
"groups": {
"Application": {
"groups": {
"Org1MSP": {},
"Org2MSP": {}
}
}
},
"values": {
"Consortium": {
"value": {
"name": "SampleConsortium"
}
}
}
},
"write_set": {
"groups": {
"Application": {
"groups": {
"Org1MSP": {},
"Org2MSP": {}
},
"mod_policy": "Admins",
"policies": {
"Admins": {
"policy": {
"type": 3,
"value": {
"rule": "MAJORITY",
"sub_policy": "Admins"
}
}
},
"Readers": {
"policy": {
"type": 3,
"value": {
"sub_policy": "Readers"
}
}
},
"Writers": {
"policy": {
"type": 3,
"value": {
"sub_policy": "Writers"
}
}
}
},
"version": "1"
}
},
"values": {
"Consortium": {
"value": {
"name": "SampleConsortium"
}
}
}
}
}
},
"header": {
"channel_header": {
"channel_id": "businesschannel",
"timestamp": "2017-06-23T09:45:18.000Z",
"tx_id": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"type": 2
}
}
}
}

View File

@ -1,509 +0,0 @@
{
"data": {
"data": [
{
"payload": {
"data": {
"config": {
"channel_group": {
"groups": {
"Consortiums": {
"groups": {
"SampleConsortium": {
"groups": {
"Org1MSP": {
"mod_policy": "Admins",
"policies": {
"Admins": {
"mod_policy": "Admins",
"policy": {
"type": 1,
"value": {
"identities": [
{
"principal": {
"msp_identifier": "Org1MSP",
"role": "ADMIN"
}
}
],
"rule": {
"n_out_of": {
"n": 1,
"rules": [
{
"signed_by": 0
}
]
}
}
}
}
},
"Readers": {
"mod_policy": "Admins",
"policy": {
"type": 1,
"value": {
"identities": [
{
"principal": {
"msp_identifier": "Org1MSP"
}
}
],
"rule": {
"n_out_of": {
"n": 1,
"rules": [
{
"signed_by": 0
}
]
}
}
}
}
},
"Writers": {
"mod_policy": "Admins",
"policy": {
"type": 1,
"value": {
"identities": [
{
"principal": {
"msp_identifier": "Org1MSP"
}
}
],
"rule": {
"n_out_of": {
"n": 1,
"rules": [
{
"signed_by": 0
}
]
}
}
}
}
}
},
"values": {
"MSP": {
"mod_policy": "Admins",
"value": {
"config": {
"admins": [
"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNHVENDQWIrZ0F3SUJBZ0lRSmFIY0VRSXhHR2ZYV3FCeTdyZWN0ekFLQmdncWhrak9QUVFEQWpCek1Rc3cKQ1FZRFZRUUdFd0pWVXpFVE1CRUdBMVVFQ0JNS1EyRnNhV1p2Y201cFlURVdNQlFHQTFVRUJ4TU5VMkZ1SUVaeQpZVzVqYVhOamJ6RVpNQmNHQTFVRUNoTVFiM0puTVM1bGVHRnRjR3hsTG1OdmJURWNNQm9HQTFVRUF4TVRZMkV1CmIzSm5NUzVsZUdGdGNHeGxMbU52YlRBZUZ3MHhOekEyTWpNd09UUTFNVGhhRncweU56QTJNakV3T1RRMU1UaGEKTUZzeEN6QUpCZ05WQkFZVEFsVlRNUk13RVFZRFZRUUlFd3BEWVd4cFptOXlibWxoTVJZd0ZBWURWUVFIRXcxVApZVzRnUm5KaGJtTnBjMk52TVI4d0hRWURWUVFEREJaQlpHMXBia0J2Y21jeExtVjRZVzF3YkdVdVkyOXRNRmt3CkV3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFdTRxVlFOTWp6Zm9yd2szQk1SejlLcDdybzRoNWVvclQKVGJjVWtSb1p2clZvMlRMaXJNZ1V3ak50Slc5MkRndjU1UUQ4eUE4MitxSzFjWmtRMHJFVUU2Tk5NRXN3RGdZRApWUjBQQVFIL0JBUURBZ2VBTUF3R0ExVWRFd0VCL3dRQ01BQXdLd1lEVlIwakJDUXdJb0FnOHZXZ2pWbHB0S0lmCm1iVm1la0psWktQbVFLSm8wdmEvNTNvT0JtNzdRbTh3Q2dZSUtvWkl6ajBFQXdJRFNBQXdSUUloQUo0UkxJNlQKS05kYlp1UDJrVVk0UkF2R2pHaEtUSmFYcHQ3WDFBTlpFUzhVQWlCZzZxd0Nkb1MyTkJmajVyd0VwK1dYY2pTRQpwZ2xQNVlxTXp5RlJ4NmlPakE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg=="
],
"crypto_config": {
"identity_identifier_hash_function": "SHA256",
"signature_hash_family": "SHA2"
},
"name": "Org1MSP",
"root_certs": [
"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNjekNDQWhtZ0F3SUJBZ0lSQU1oRVp5ZUtoeHlkeEhVRWhnMm9hUjR3Q2dZSUtvWkl6ajBFQXdJd2N6RUwKTUFrR0ExVUVCaE1DVlZNeEV6QVJCZ05WQkFnVENrTmhiR2xtYjNKdWFXRXhGakFVQmdOVkJBY1REVk5oYmlCRwpjbUZ1WTJselkyOHhHVEFYQmdOVkJBb1RFRzl5WnpFdVpYaGhiWEJzWlM1amIyMHhIREFhQmdOVkJBTVRFMk5oCkxtOXlaekV1WlhoaGJYQnNaUzVqYjIwd0hoY05NVGN3TmpJek1EazBOVEU0V2hjTk1qY3dOakl4TURrME5URTQKV2pCek1Rc3dDUVlEVlFRR0V3SlZVekVUTUJFR0ExVUVDQk1LUTJGc2FXWnZjbTVwWVRFV01CUUdBMVVFQnhNTgpVMkZ1SUVaeVlXNWphWE5qYnpFWk1CY0dBMVVFQ2hNUWIzSm5NUzVsZUdGdGNHeGxMbU52YlRFY01Cb0dBMVVFCkF4TVRZMkV1YjNKbk1TNWxlR0Z0Y0d4bExtTnZiVEJaTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEEwSUEKQksvOXYxbFlMazExcmJNbjNOQzhRV1lwVVdmUjF6cDVaZ0VmVHkrdGpVbHRMT3Yza01Sd0VLUmg1ZzlWY2ZiWAo1SFpHWHZnTGU3ZXJnSVlFMUpPNHBOcWpnWTB3Z1lvd0RnWURWUjBQQVFIL0JBUURBZ0dtTUE4R0ExVWRKUVFJCk1BWUdCRlVkSlFBd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBcEJnTlZIUTRFSWdRZzh2V2dqVmxwdEtJZm1iVm0KZWtKbFpLUG1RS0pvMHZhLzUzb09CbTc3UW04d0t3WURWUjBqQkNRd0lvQWc4dldnalZscHRLSWZtYlZtZWtKbApaS1BtUUtKbzB2YS81M29PQm03N1FtOHdDZ1lJS29aSXpqMEVBd0lEU0FBd1JRSWhBTURWM3IvSTExeER5OVpiCmU5czFvZkwvTjdoMkZKbkIwRUYxYXMydnRFd0ZBaUE3cVpYR21LbWhpL1BTSTJRWVNKUWR5NERrTDBlMmxWSGIKTDllaE1YV3FmQT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K"
],
"tls_root_certs": [
"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNlVENDQWgrZ0F3SUJBZ0lSQU1WLzA5UzRMc2h6YVZzbUc0WkJPUHd3Q2dZSUtvWkl6ajBFQXdJd2RqRUwKTUFrR0ExVUVCaE1DVlZNeEV6QVJCZ05WQkFnVENrTmhiR2xtYjNKdWFXRXhGakFVQmdOVkJBY1REVk5oYmlCRwpjbUZ1WTJselkyOHhHVEFYQmdOVkJBb1RFRzl5WnpFdVpYaGhiWEJzWlM1amIyMHhIekFkQmdOVkJBTVRGblJzCmMyTmhMbTl5WnpFdVpYaGhiWEJzWlM1amIyMHdIaGNOTVRjd05qSXpNRGswTlRFNFdoY05NamN3TmpJeE1EazAKTlRFNFdqQjJNUXN3Q1FZRFZRUUdFd0pWVXpFVE1CRUdBMVVFQ0JNS1EyRnNhV1p2Y201cFlURVdNQlFHQTFVRQpCeE1OVTJGdUlFWnlZVzVqYVhOamJ6RVpNQmNHQTFVRUNoTVFiM0puTVM1bGVHRnRjR3hsTG1OdmJURWZNQjBHCkExVUVBeE1XZEd4elkyRXViM0puTVM1bGVHRnRjR3hsTG1OdmJUQlpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDkKQXdFSEEwSUFCRS8wMDBKZGhhN01EZ2VMSm5uWHp0TllIYzZwSEVKU1M2ZEZrVUhaTWZ2L25yei9qUjc0T1EvVQpxcGZ4MEx5T0ExdW9CZkVxQlM2NW9aR3VFTWZ4MHc2amdZMHdnWW93RGdZRFZSMFBBUUgvQkFRREFnR21NQThHCkExVWRKUVFJTUFZR0JGVWRKUUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFwQmdOVkhRNEVJZ1Fnb1RqcDJWaGcKbThEcytLdTZsdmo5SVI0ZnpsUFhxWFFpRS9DWW50aFA3UzR3S3dZRFZSMGpCQ1F3SW9BZ29UanAyVmhnbThEcworS3U2bHZqOUlSNGZ6bFBYcVhRaUUvQ1ludGhQN1M0d0NnWUlLb1pJemowRUF3SURTQUF3UlFJaEFQU2FlRGx0CmZkYUZYTENYZXdvRmxJWFZqcnJoTVpFSWNZbUZCc0RFRlorbEFpQlhuR1hRYkNSZ2RMS3BueXg4azdKT3ArN1MKODlTQTVybFMyakdxRlV4L1pBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo="
]
}
}
}
}
},
"Org2MSP": {
"mod_policy": "Admins",
"policies": {
"Admins": {
"mod_policy": "Admins",
"policy": {
"type": 1,
"value": {
"identities": [
{
"principal": {
"msp_identifier": "Org2MSP",
"role": "ADMIN"
}
}
],
"rule": {
"n_out_of": {
"n": 1,
"rules": [
{
"signed_by": 0
}
]
}
}
}
}
},
"Readers": {
"mod_policy": "Admins",
"policy": {
"type": 1,
"value": {
"identities": [
{
"principal": {
"msp_identifier": "Org2MSP"
}
}
],
"rule": {
"n_out_of": {
"n": 1,
"rules": [
{
"signed_by": 0
}
]
}
}
}
}
},
"Writers": {
"mod_policy": "Admins",
"policy": {
"type": 1,
"value": {
"identities": [
{
"principal": {
"msp_identifier": "Org2MSP"
}
}
],
"rule": {
"n_out_of": {
"n": 1,
"rules": [
{
"signed_by": 0
}
]
}
}
}
}
}
},
"values": {
"MSP": {
"mod_policy": "Admins",
"value": {
"config": {
"admins": [
"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNHRENDQWIrZ0F3SUJBZ0lRQXg3eGExc0VTSm94dWpLbTI1YjVhVEFLQmdncWhrak9QUVFEQWpCek1Rc3cKQ1FZRFZRUUdFd0pWVXpFVE1CRUdBMVVFQ0JNS1EyRnNhV1p2Y201cFlURVdNQlFHQTFVRUJ4TU5VMkZ1SUVaeQpZVzVqYVhOamJ6RVpNQmNHQTFVRUNoTVFiM0puTWk1bGVHRnRjR3hsTG1OdmJURWNNQm9HQTFVRUF4TVRZMkV1CmIzSm5NaTVsZUdGdGNHeGxMbU52YlRBZUZ3MHhOekEyTWpNd09UUTFNVGhhRncweU56QTJNakV3T1RRMU1UaGEKTUZzeEN6QUpCZ05WQkFZVEFsVlRNUk13RVFZRFZRUUlFd3BEWVd4cFptOXlibWxoTVJZd0ZBWURWUVFIRXcxVApZVzRnUm5KaGJtTnBjMk52TVI4d0hRWURWUVFEREJaQlpHMXBia0J2Y21jeUxtVjRZVzF3YkdVdVkyOXRNRmt3CkV3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFSU5wMElRQm1ETUY4cGdNNmhtWm9Ic2RJV29GTFpQRzkKTU0zd1cvWUlpNXRDaStHOC9XU2xmYzRTc0d6eWtqeUxva1ZjdEVUeGpOVXpDQkxiZHB0S1BxTk5NRXN3RGdZRApWUjBQQVFIL0JBUURBZ2VBTUF3R0ExVWRFd0VCL3dRQ01BQXdLd1lEVlIwakJDUXdJb0FnU2xhODlra1Q1SnBkCmFnWGVtbkh6K2h3NS94eERjZnV6MlNQTmpqNFBkYjB3Q2dZSUtvWkl6ajBFQXdJRFJ3QXdSQUlnRnRBQ1l2aFAKYTVwSVFFNU9aUVFtZDdVRWdobWd4U3FJTXRXRXowZkxzYWtDSUd4WTZiMmNzci9yL2xpU1lYQW9kQUNua05yVwpWLzQ4aTgweTdLVHZIK0Y4Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K"
],
"crypto_config": {
"identity_identifier_hash_function": "SHA256",
"signature_hash_family": "SHA2"
},
"name": "Org2MSP",
"root_certs": [
"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNjVENDQWhpZ0F3SUJBZ0lRVnloSUNOZEFkTlc1eDNUeXlmWnpOekFLQmdncWhrak9QUVFEQWpCek1Rc3cKQ1FZRFZRUUdFd0pWVXpFVE1CRUdBMVVFQ0JNS1EyRnNhV1p2Y201cFlURVdNQlFHQTFVRUJ4TU5VMkZ1SUVaeQpZVzVqYVhOamJ6RVpNQmNHQTFVRUNoTVFiM0puTWk1bGVHRnRjR3hsTG1OdmJURWNNQm9HQTFVRUF4TVRZMkV1CmIzSm5NaTVsZUdGdGNHeGxMbU52YlRBZUZ3MHhOekEyTWpNd09UUTFNVGhhRncweU56QTJNakV3T1RRMU1UaGEKTUhNeEN6QUpCZ05WQkFZVEFsVlRNUk13RVFZRFZRUUlFd3BEWVd4cFptOXlibWxoTVJZd0ZBWURWUVFIRXcxVApZVzRnUm5KaGJtTnBjMk52TVJrd0Z3WURWUVFLRXhCdmNtY3lMbVY0WVcxd2JHVXVZMjl0TVJ3d0dnWURWUVFECkV4TmpZUzV2Y21jeUxtVjRZVzF3YkdVdVkyOXRNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUUKV3pzODhHdVU3eU53eU5xWVBOOVdCYWhRT1FENnNrbzd3SjlVSHZvSDhUYVpyVHhIcFlOclVCMlE0RVE2MGdOVgpla0RlNVBqWUR6YUFsTUJ6V0RlTDNLT0JqVENCaWpBT0JnTlZIUThCQWY4RUJBTUNBYVl3RHdZRFZSMGxCQWd3CkJnWUVWUjBsQURBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUNrR0ExVWREZ1FpQkNCS1ZyejJTUlBrbWwxcUJkNmEKY2ZQNkhEbi9IRU54KzdQWkk4Mk9QZzkxdlRBckJnTlZIU01FSkRBaWdDQktWcnoyU1JQa21sMXFCZDZhY2ZQNgpIRG4vSEVOeCs3UFpJODJPUGc5MXZUQUtCZ2dxaGtqT1BRUURBZ05IQURCRUFpQTdEc21qcWtlZnlFc042bFVECk5kVXhiSTZWZllOdGk3VU1hZkZyZk1JYVBnSWdjSHVRSXpYMWkvc0M1TnluVmxXZWx6c0hEU2VVTVVILzlTU1EKU2gwWnNQQT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo="
],
"tls_root_certs": [
"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNlRENDQWgrZ0F3SUJBZ0lSQU5GOE1CV0xRcFFqb3JVMVRlOG1CTkF3Q2dZSUtvWkl6ajBFQXdJd2RqRUwKTUFrR0ExVUVCaE1DVlZNeEV6QVJCZ05WQkFnVENrTmhiR2xtYjNKdWFXRXhGakFVQmdOVkJBY1REVk5oYmlCRwpjbUZ1WTJselkyOHhHVEFYQmdOVkJBb1RFRzl5WnpJdVpYaGhiWEJzWlM1amIyMHhIekFkQmdOVkJBTVRGblJzCmMyTmhMbTl5WnpJdVpYaGhiWEJzWlM1amIyMHdIaGNOTVRjd05qSXpNRGswTlRFNFdoY05NamN3TmpJeE1EazAKTlRFNFdqQjJNUXN3Q1FZRFZRUUdFd0pWVXpFVE1CRUdBMVVFQ0JNS1EyRnNhV1p2Y201cFlURVdNQlFHQTFVRQpCeE1OVTJGdUlFWnlZVzVqYVhOamJ6RVpNQmNHQTFVRUNoTVFiM0puTWk1bGVHRnRjR3hsTG1OdmJURWZNQjBHCkExVUVBeE1XZEd4elkyRXViM0puTWk1bGVHRnRjR3hsTG1OdmJUQlpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDkKQXdFSEEwSUFCSWpDOXlWUlhZanA2bXpMMmI4bGRaUnc0bEpRaXJLVTVmeUNKN0NzQ3dnWTBMdVZ5Mm9Hb2JFZgpmVDQrWkxkV0VLaG00UUF4dnBxRXZIZFE5a1kweEZxamdZMHdnWW93RGdZRFZSMFBBUUgvQkFRREFnR21NQThHCkExVWRKUVFJTUFZR0JGVWRKUUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFwQmdOVkhRNEVJZ1FnellPZzEyZnAKUFNDTDN3Z2NTamdFZEtJdEljb3NYbE5JSGNGcEV3UHBlbmt3S3dZRFZSMGpCQ1F3SW9BZ3pZT2cxMmZwUFNDTAozd2djU2pnRWRLSXRJY29zWGxOSUhjRnBFd1BwZW5rd0NnWUlLb1pJemowRUF3SURSd0F3UkFJZ0pOZmRyNEtECmI5bU9ZTkc5RUYwVTZsUlEvbUxCbFN3ejAxdFhZTDZ5d1k0Q0lBdU44aUpac0t5TWJtZ08xTGdOWlNtNDlhS3UKNmNVWTZjZTRwempqejZRawotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg=="
]
}
}
}
}
}
},
"mod_policy": "/Channel/Orderer/Admins",
"values": {
"ChannelCreationPolicy": {
"mod_policy": "/Channel/Orderer/Admins",
"value": {
"type": 3,
"value": {
"sub_policy": "Admins"
}
}
}
}
}
},
"mod_policy": "/Channel/Orderer/Admins",
"policies": {
"Admins": {
"mod_policy": "Admins",
"policy": {
"type": 1,
"value": {
"rule": {
"n_out_of": {}
}
}
}
}
}
},
"Orderer": {
"groups": {
"OrdererOrg": {
"mod_policy": "Admins",
"policies": {
"Admins": {
"mod_policy": "Admins",
"policy": {
"type": 1,
"value": {
"identities": [
{
"principal": {
"msp_identifier": "OrdererMSP",
"role": "ADMIN"
}
}
],
"rule": {
"n_out_of": {
"n": 1,
"rules": [
{
"signed_by": 0
}
]
}
}
}
}
},
"Readers": {
"mod_policy": "Admins",
"policy": {
"type": 1,
"value": {
"identities": [
{
"principal": {
"msp_identifier": "OrdererMSP"
}
}
],
"rule": {
"n_out_of": {
"n": 1,
"rules": [
{
"signed_by": 0
}
]
}
}
}
}
},
"Writers": {
"mod_policy": "Admins",
"policy": {
"type": 1,
"value": {
"identities": [
{
"principal": {
"msp_identifier": "OrdererMSP"
}
}
],
"rule": {
"n_out_of": {
"n": 1,
"rules": [
{
"signed_by": 0
}
]
}
}
}
}
}
},
"values": {
"MSP": {
"mod_policy": "Admins",
"value": {
"config": {
"admins": [
"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNDakNDQWJHZ0F3SUJBZ0lSQUxJcmprdms5eGdaaGh5dGNjL291T2d3Q2dZSUtvWkl6ajBFQXdJd2FURUwKTUFrR0ExVUVCaE1DVlZNeEV6QVJCZ05WQkFnVENrTmhiR2xtYjNKdWFXRXhGakFVQmdOVkJBY1REVk5oYmlCRwpjbUZ1WTJselkyOHhGREFTQmdOVkJBb1RDMlY0WVcxd2JHVXVZMjl0TVJjd0ZRWURWUVFERXc1allTNWxlR0Z0CmNHeGxMbU52YlRBZUZ3MHhOekEyTWpNd09UUTFNVGhhRncweU56QTJNakV3T1RRMU1UaGFNRll4Q3pBSkJnTlYKQkFZVEFsVlRNUk13RVFZRFZRUUlFd3BEWVd4cFptOXlibWxoTVJZd0ZBWURWUVFIRXcxVFlXNGdSbkpoYm1OcApjMk52TVJvd0dBWURWUVFEREJGQlpHMXBia0JsZUdGdGNHeGxMbU52YlRCWk1CTUdCeXFHU000OUFnRUdDQ3FHClNNNDlBd0VIQTBJQUJFVWZsNXY0MURHZ0tmZFZ5TDNBMGZ6bEtVd3daRTJ2QURxbXZ6aXVndEFmTkFxL2FwNGIKOGRTRnhFcGdrMGJ2YWtvdG9rbmh2cXczellUUXFJL0FmbHVqVFRCTE1BNEdBMVVkRHdFQi93UUVBd0lIZ0RBTQpCZ05WSFJNQkFmOEVBakFBTUNzR0ExVWRJd1FrTUNLQUlJL0lDU1RsWG1DRVUvTE0vbHZNWTg3bzZhekN4Y3B2ClYvb3JxeEVhUk9xVU1Bb0dDQ3FHU000OUJBTUNBMGNBTUVRQ0lEalJVbGpydVNSM25CdGdJd05tWlNITDEyUWMKaGFXNXVRWncyNzZlRDZoU0FpQnVDYlRYcTNLY2hLL1Uvc0VMY3hwZ1JrZzhYOWN5TUgwcExzSTYrTWpKRUE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg=="
],
"crypto_config": {
"identity_identifier_hash_function": "SHA256",
"signature_hash_family": "SHA2"
},
"name": "OrdererMSP",
"root_certs": [
"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNYVENDQWdTZ0F3SUJBZ0lRTURzYStSWVZGamd1d2Q4by9UcEVvakFLQmdncWhrak9QUVFEQWpCcE1Rc3cKQ1FZRFZRUUdFd0pWVXpFVE1CRUdBMVVFQ0JNS1EyRnNhV1p2Y201cFlURVdNQlFHQTFVRUJ4TU5VMkZ1SUVaeQpZVzVqYVhOamJ6RVVNQklHQTFVRUNoTUxaWGhoYlhCc1pTNWpiMjB4RnpBVkJnTlZCQU1URG1OaExtVjRZVzF3CmJHVXVZMjl0TUI0WERURTNNRFl5TXpBNU5EVXhPRm9YRFRJM01EWXlNVEE1TkRVeE9Gb3dhVEVMTUFrR0ExVUUKQmhNQ1ZWTXhFekFSQmdOVkJBZ1RDa05oYkdsbWIzSnVhV0V4RmpBVUJnTlZCQWNURFZOaGJpQkdjbUZ1WTJsegpZMjh4RkRBU0JnTlZCQW9UQzJWNFlXMXdiR1V1WTI5dE1SY3dGUVlEVlFRREV3NWpZUzVsZUdGdGNHeGxMbU52CmJUQlpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDlBd0VIQTBJQUJBQ1pwTFo5Rk5yS2dkOVVzTXpJUmpJNkw2b0UKWkZqV0RBVlhHbXEyakFuMnhiM1RjMWRoeFcxNUZjVWQvbVVKeC9jdmhRTzZsWk9TQTdVVHUyanZaeDJqZ1kwdwpnWW93RGdZRFZSMFBBUUgvQkFRREFnR21NQThHQTFVZEpRUUlNQVlHQkZVZEpRQXdEd1lEVlIwVEFRSC9CQVV3CkF3RUIvekFwQmdOVkhRNEVJZ1FnajhnSkpPVmVZSVJUOHN6K1c4eGp6dWpwck1MRnltOVgraXVyRVJwRTZwUXcKS3dZRFZSMGpCQ1F3SW9BZ2o4Z0pKT1ZlWUlSVDhzeitXOHhqenVqcHJNTEZ5bTlYK2l1ckVScEU2cFF3Q2dZSQpLb1pJemowRUF3SURSd0F3UkFJZ1RvbmhwK3dFbERRbVlJSkxYMGlrdXBWajVGd0dwZG0yYVA3VUp2R0VpbzRDCklFemRkQmpjdUdDT2VUbFZkRzRoa3d6bUJxemhoZDlMODVyZ3pCQ1d4SjRWCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K"
],
"tls_root_certs": [
"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNaVENDQWd1Z0F3SUJBZ0lSQVB3SC9IcU01S3dWRUpvdlNrMXJWbGd3Q2dZSUtvWkl6ajBFQXdJd2JERUwKTUFrR0ExVUVCaE1DVlZNeEV6QVJCZ05WQkFnVENrTmhiR2xtYjNKdWFXRXhGakFVQmdOVkJBY1REVk5oYmlCRwpjbUZ1WTJselkyOHhGREFTQmdOVkJBb1RDMlY0WVcxd2JHVXVZMjl0TVJvd0dBWURWUVFERXhGMGJITmpZUzVsCmVHRnRjR3hsTG1OdmJUQWVGdzB4TnpBMk1qTXdPVFExTVRoYUZ3MHlOekEyTWpFd09UUTFNVGhhTUd3eEN6QUoKQmdOVkJBWVRBbFZUTVJNd0VRWURWUVFJRXdwRFlXeHBabTl5Ym1saE1SWXdGQVlEVlFRSEV3MVRZVzRnUm5KaApibU5wYzJOdk1SUXdFZ1lEVlFRS0V3dGxlR0Z0Y0d4bExtTnZiVEVhTUJnR0ExVUVBeE1SZEd4elkyRXVaWGhoCmJYQnNaUzVqYjIwd1dUQVRCZ2NxaGtqT1BRSUJCZ2dxaGtqT1BRTUJCd05DQUFUVVZqNzhRSDNvYllTaG0vb2IKdTgwMEpXUW41b2t2M3FLa1dvZUlxdUQ1M0JCaDBCdmJaTEFRVHR5OVNCN0FWTTl2eEMyTVN6WlRTR0o2RnlqawpsUXc4bzRHTk1JR0tNQTRHQTFVZER3RUIvd1FFQXdJQnBqQVBCZ05WSFNVRUNEQUdCZ1JWSFNVQU1BOEdBMVVkCkV3RUIvd1FGTUFNQkFmOHdLUVlEVlIwT0JDSUVJRVlOeklRZzZSZC9zb0RQRERvMjNEQ3hFWjdXankvTmJ2eWYKVm9MTmFpQjlNQ3NHQTFVZEl3UWtNQ0tBSUVZTnpJUWc2UmQvc29EUEREbzIzREN4RVo3V2p5L05idnlmVm9MTgphaUI5TUFvR0NDcUdTTTQ5QkFNQ0EwZ0FNRVVDSVFDangzQmlmbkpxaVh1VmpHT2crWkZHUUl5RkE1dWd1L0M2Cms1RnBtMWl6NndJZ2VKUnpNOERhTHpNSlNDb0N3U0hzWTlON1hsNTB6cTM0YWpYUVBOSkhRSFU9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K"
]
}
}
}
}
}
},
"mod_policy": "Admins",
"policies": {
"Admins": {
"mod_policy": "Admins",
"policy": {
"type": 3,
"value": {
"rule": "MAJORITY",
"sub_policy": "Admins"
}
}
},
"BlockValidation": {
"mod_policy": "Admins",
"policy": {
"type": 3,
"value": {
"sub_policy": "Writers"
}
}
},
"Readers": {
"mod_policy": "Admins",
"policy": {
"type": 3,
"value": {
"sub_policy": "Readers"
}
}
},
"Writers": {
"mod_policy": "Admins",
"policy": {
"type": 3,
"value": {
"sub_policy": "Writers"
}
}
}
},
"values": {
"BatchSize": {
"mod_policy": "Admins",
"value": {
"absolute_max_bytes": 102760448,
"max_message_count": 10,
"preferred_max_bytes": 524288
}
},
"BatchTimeout": {
"mod_policy": "Admins",
"value": {
"timeout": "2s"
}
},
"ChannelRestrictions": {
"mod_policy": "Admins"
},
"ConsensusType": {
"mod_policy": "Admins",
"value": {
"type": "solo"
}
}
}
}
},
"mod_policy": "Admins",
"policies": {
"Admins": {
"mod_policy": "Admins",
"policy": {
"type": 3,
"value": {
"rule": "MAJORITY",
"sub_policy": "Admins"
}
}
},
"Readers": {
"mod_policy": "Admins",
"policy": {
"type": 3,
"value": {
"sub_policy": "Readers"
}
}
},
"Writers": {
"mod_policy": "Admins",
"policy": {
"type": 3,
"value": {
"sub_policy": "Writers"
}
}
}
},
"values": {
"BlockDataHashingStructure": {
"mod_policy": "Admins",
"value": {
"width": 4294967295
}
},
"HashingAlgorithm": {
"mod_policy": "Admins",
"value": {
"name": "SHA256"
}
},
"OrdererAddresses": {
"mod_policy": "/Channel/Orderer/Admins",
"value": {
"addresses": [
"orderer.example.com:7050"
]
}
}
}
}
}
},
"header": {
"channel_header": {
"channel_id": "testchainid",
"timestamp": "2017-06-23T09:45:18.000Z",
"tx_id": "70add6a845ab8a90d97d402a6c0de665e717ed1bb74d37c6bf32232d8339194f",
"type": 1,
"version": 1
},
"signature_header": {
"nonce": "z6Bkvr4qhGuPiaT8gtovZSue22nqxlQm"
}
}
}
}
]
},
"header": {
"data_hash": "8tq65svFQcUZI0s6inzxe4hayD1aGIB6vdLOQxVz9Tw="
},
"metadata": {
"metadata": [
"",
"",
"",
""
]
}
}

View File

@ -1,464 +0,0 @@
{
"Channel": {
"Values": {
"HashingAlgorithm": {
"Version": "0",
"ModPolicy": "Admins",
"Value": {
"name": "SHA256"
}
},
"BlockDataHashingStructure": {
"Version": "0",
"ModPolicy": "Admins",
"Value": {
"width": 4294967295
}
},
"OrdererAddresses": {
"Version": "0",
"ModPolicy": "/Channel/Orderer/Admins",
"Value": {
"addresses": [
"orderer.example.com:7050"
]
}
}
},
"Policies": {
"Readers": {
"Version": "0",
"ModPolicy": "Admins",
"Policy": {
"PolicyType": "3",
"Policy": {
"subPolicy": "Readers",
"rule": "ANY"
}
}
},
"Writers": {
"Version": "0",
"ModPolicy": "Admins",
"Policy": {
"PolicyType": "3",
"Policy": {
"subPolicy": "Writers",
"rule": "ANY"
}
}
},
"Admins": {
"Version": "0",
"ModPolicy": "Admins",
"Policy": {
"PolicyType": "3",
"Policy": {
"subPolicy": "Admins",
"rule": "MAJORITY"
}
}
}
},
"Groups": {
"Orderer": {
"Values": {
"BatchTimeout": {
"Version": "0",
"ModPolicy": "Admins",
"Value": {
"timeout": "2s"
}
},
"ChannelRestrictions": {
"Version": "0",
"ModPolicy": "Admins",
"Value": {
"maxCount": "0"
}
},
"ConsensusType": {
"Version": "0",
"ModPolicy": "Admins",
"Value": {
"type": "solo"
}
},
"BatchSize": {
"Version": "0",
"ModPolicy": "Admins",
"Value": {
"maxMessageCount": 10,
"absoluteMaxBytes": 103809024,
"preferredMaxBytes": 524288
}
}
},
"Policies": {
"Admins": {
"Version": "0",
"ModPolicy": "Admins",
"Policy": {
"PolicyType": "3",
"Policy": {
"subPolicy": "Admins",
"rule": "MAJORITY"
}
}
},
"BlockValidation": {
"Version": "0",
"ModPolicy": "Admins",
"Policy": {
"PolicyType": "3",
"Policy": {
"subPolicy": "Writers",
"rule": "ANY"
}
}
},
"Readers": {
"Version": "0",
"ModPolicy": "Admins",
"Policy": {
"PolicyType": "3",
"Policy": {
"subPolicy": "Readers",
"rule": "ANY"
}
}
},
"Writers": {
"Version": "0",
"ModPolicy": "Admins",
"Policy": {
"PolicyType": "3",
"Policy": {
"subPolicy": "Writers",
"rule": "ANY"
}
}
}
},
"Groups": {
"OrdererOrg": {
"Values": {
"MSP": {
"Version": "0",
"ModPolicy": "Admins",
"Value": {
"type": 0,
"config": "CgpPcmRlcmVyTVNQEv8GLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNaekNDQWc2Z0F3SUJBZ0lRRUJlUUVxWXFnZmJTUlRDSUdlODBoVEFLQmdncWhrak9QUVFEQWpCcE1Rc3cKQ1FZRFZRUUdFd0pWVXpFVE1CRUdBMVVFQ0JNS1EyRnNhV1p2Y201cFlURVdNQlFHQTFVRUJ4TU5VMkZ1SUVaeQpZVzVqYVhOamJ6RVVNQklHQTFVRUNoTUxaWGhoYlhCc1pTNWpiMjB4RnpBVkJnTlZCQU1URG1OaExtVjRZVzF3CmJHVXVZMjl0TUI0WERURTNNRFV3TlRBNE5UWXpPVm9YRFRJM01EVXdNekE0TlRZek9Wb3dhVEVMTUFrR0ExVUUKQmhNQ1ZWTXhFekFSQmdOVkJBZ1RDa05oYkdsbWIzSnVhV0V4RmpBVUJnTlZCQWNURFZOaGJpQkdjbUZ1WTJsegpZMjh4RkRBU0JnTlZCQW9UQzJWNFlXMXdiR1V1WTI5dE1SY3dGUVlEVlFRREV3NWpZUzVsZUdGdGNHeGxMbU52CmJUQlpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDlBd0VIQTBJQUJGTmN6MVBJQnovaUhPd1lleGlGZTU2dUdydmoKSlhXeWk5VTQ0anlSdGVtU3hRdHllcTJHeFdUV0FhV2xOa01PeEpZOVRORXY1a3EzRXI4TC9iVmtVSjJqZ1pjdwpnWlF3RGdZRFZSMFBBUUgvQkFRREFnR21NQmtHQTFVZEpRUVNNQkFHQkZVZEpRQUdDQ3NHQVFVRkJ3TUJNQThHCkExVWRFd0VCL3dRRk1BTUJBZjh3S1FZRFZSME9CQ0lFSU03N0FmV1VtM1JwbkF1eFJGRHRMckw5N2M0c0ZKMkcKL3I4cXkvYktKRHFPTUNzR0ExVWRJd1FrTUNLQUlNNzdBZldVbTNScG5BdXhSRkR0THJMOTdjNHNGSjJHL3I4cQp5L2JLSkRxT01Bb0dDQ3FHU000OUJBTUNBMGNBTUVRQ0lHN3ZyMHltLzhKVmFyRjlNWUtPenIxbVZlcC9XSDF5CjhCRGh3NldQOGt2eEFpQmx1dkNqbi9HNDVrYkNJazAycjkyUXREZEZaRGNaVU5Gais1K0cwZ2NJdHc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCiKeBi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDSURDQ0FjYWdBd0lCQWdJUkFJVUZjRGFtVjhyOXQxc2NGdm90Z0Z3d0NnWUlLb1pJemowRUF3SXdhVEVMCk1Ba0dBMVVFQmhNQ1ZWTXhFekFSQmdOVkJBZ1RDa05oYkdsbWIzSnVhV0V4RmpBVUJnTlZCQWNURFZOaGJpQkcKY21GdVkybHpZMjh4RkRBU0JnTlZCQW9UQzJWNFlXMXdiR1V1WTI5dE1SY3dGUVlEVlFRREV3NWpZUzVsZUdGdApjR3hsTG1OdmJUQWVGdzB4TnpBMU1EVXdPRFUyTXpsYUZ3MHlOekExTURNd09EVTJNemxhTUZZeEN6QUpCZ05WCkJBWVRBbFZUTVJNd0VRWURWUVFJRXdwRFlXeHBabTl5Ym1saE1SWXdGQVlEVlFRSEV3MVRZVzRnUm5KaGJtTnAKYzJOdk1Sb3dHQVlEVlFRRERCRkJaRzFwYmtCbGVHRnRjR3hsTG1OdmJUQlpNQk1HQnlxR1NNNDlBZ0VHQ0NxRwpTTTQ5QXdFSEEwSUFCSW5mN3lGS1lZWmV5Ykg4VEV6N2x2L0hSVWxhdUhjN3JqbTVHQk9yUzZ0UXd1QnE3NFBUCmlBVzdnNmFRS2JNbFZtalZkSVJyTWpNL1pXNUk4TmRUVFNHallqQmdNQTRHQTFVZER3RUIvd1FFQXdJRm9EQVQKQmdOVkhTVUVEREFLQmdnckJnRUZCUWNEQVRBTUJnTlZIUk1CQWY4RUFqQUFNQ3NHQTFVZEl3UWtNQ0tBSU03NwpBZldVbTNScG5BdXhSRkR0THJMOTdjNHNGSjJHL3I4cXkvYktKRHFPTUFvR0NDcUdTTTQ5QkFNQ0EwZ0FNRVVDCklRRFB6RFhWbmliVXRla2YyUHJWaHlKeWNUeDhJZGZyVGUwUFdVOFJ5czRUVVFJZ0doY0RJY3VrNXdGanJQeFYKVmJPQ1EvTlVJY0RuZm90QUpqTGZSK08rWkNFPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCkIOCgRTSEEyEgZTSEEyNTY="
}
}
},
"Policies": {
"Admins": {
"Version": "0",
"ModPolicy": "Admins",
"Policy": {
"PolicyType": "1",
"Policy": {
"version": 0,
"rule": {
"nOutOf": {
"n": 1,
"rules": [
{
"signedBy": 0
}
]
}
},
"identities": [
{
"principalClassification": "ROLE",
"principal": "CgpPcmRlcmVyTVNQEAE="
}
]
}
}
},
"Readers": {
"Version": "0",
"ModPolicy": "Admins",
"Policy": {
"PolicyType": "1",
"Policy": {
"version": 0,
"rule": {
"nOutOf": {
"n": 1,
"rules": [
{
"signedBy": 0
}
]
}
},
"identities": [
{
"principalClassification": "ROLE",
"principal": "CgpPcmRlcmVyTVNQ"
}
]
}
}
},
"Writers": {
"Version": "0",
"ModPolicy": "Admins",
"Policy": {
"PolicyType": "1",
"Policy": {
"version": 0,
"rule": {
"nOutOf": {
"n": 1,
"rules": [
{
"signedBy": 0
}
]
}
},
"identities": [
{
"principalClassification": "ROLE",
"principal": "CgpPcmRlcmVyTVNQ"
}
]
}
}
}
},
"Groups": {}
}
}
},
"Consortiums": {
"Values": {},
"Policies": {
"Admins": {
"Version": "0",
"ModPolicy": "Admins",
"Policy": {
"PolicyType": "1",
"Policy": {
"version": 0,
"rule": {
"nOutOf": {
"n": 0
}
}
}
}
}
},
"Groups": {
"SampleConsortium": {
"Values": {
"ChannelCreationPolicy": {
"Version": "0",
"ModPolicy": "/Channel/Orderer/Admins",
"Value": {
"type": 3,
"value": "CgZBZG1pbnM="
}
}
},
"Policies": {},
"Groups": {
"Org2MSP": {
"Values": {
"MSP": {
"Version": "0",
"ModPolicy": "Admins",
"Value": {
"type": 0,
"config": "CgdPcmcyTVNQEpwHLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNmVENDQWlPZ0F3SUJBZ0lSQU5GUllhaGpsVkpXQ3VuTkQybDROazR3Q2dZSUtvWkl6ajBFQXdJd2N6RUwKTUFrR0ExVUVCaE1DVlZNeEV6QVJCZ05WQkFnVENrTmhiR2xtYjNKdWFXRXhGakFVQmdOVkJBY1REVk5oYmlCRwpjbUZ1WTJselkyOHhHVEFYQmdOVkJBb1RFRzl5WnpJdVpYaGhiWEJzWlM1amIyMHhIREFhQmdOVkJBTVRFMk5oCkxtOXlaekl1WlhoaGJYQnNaUzVqYjIwd0hoY05NVGN3TlRBMU1EZzFOak01V2hjTk1qY3dOVEF6TURnMU5qTTUKV2pCek1Rc3dDUVlEVlFRR0V3SlZVekVUTUJFR0ExVUVDQk1LUTJGc2FXWnZjbTVwWVRFV01CUUdBMVVFQnhNTgpVMkZ1SUVaeVlXNWphWE5qYnpFWk1CY0dBMVVFQ2hNUWIzSm5NaTVsZUdGdGNHeGxMbU52YlRFY01Cb0dBMVVFCkF4TVRZMkV1YjNKbk1pNWxlR0Z0Y0d4bExtTnZiVEJaTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEEwSUEKQkd0L0ZESUpjMWFzQW9MaDl3K281dndLaDRQRTZ3eWZ5NVptZmlzTFlUMDB6R0Q1SnZkU3dkU29sOUhZaVd4RwpCWk9FWENSM2NYbm5kMGUrWXcvckYzNmpnWmN3Z1pRd0RnWURWUjBQQVFIL0JBUURBZ0dtTUJrR0ExVWRKUVFTCk1CQUdCRlVkSlFBR0NDc0dBUVVGQndNQk1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0tRWURWUjBPQkNJRUlNb1oKRmVjMzlGaVo2RlB5TDIzYlFsYWhFSmVUNk5xNEdvZ3ZYOGVib0ZTNU1Dc0dBMVVkSXdRa01DS0FJTW9aRmVjMwo5RmlaNkZQeUwyM2JRbGFoRUplVDZOcTRHb2d2WDhlYm9GUzVNQW9HQ0NxR1NNNDlCQU1DQTBnQU1FVUNJUUNUCjg4bTR6dTdxZ1lFV1VkdGVhQUhucWoyUm9oTm80YzA5TDVFNjUxQVZvQUlnYmZzVDVjWDA0WlQ4ckYrb2V0VmkKcWdaTFRJdzlEcjJSWDBKUktwbVYxRXM9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KIrIGLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNMekNDQWRXZ0F3SUJBZ0lSQVBFK2JRT1Naa3ZFZEhKNmpGSloyamd3Q2dZSUtvWkl6ajBFQXdJd2N6RUwKTUFrR0ExVUVCaE1DVlZNeEV6QVJCZ05WQkFnVENrTmhiR2xtYjNKdWFXRXhGakFVQmdOVkJBY1REVk5oYmlCRwpjbUZ1WTJselkyOHhHVEFYQmdOVkJBb1RFRzl5WnpJdVpYaGhiWEJzWlM1amIyMHhIREFhQmdOVkJBTVRFMk5oCkxtOXlaekl1WlhoaGJYQnNaUzVqYjIwd0hoY05NVGN3TlRBMU1EZzFOak01V2hjTk1qY3dOVEF6TURnMU5qTTUKV2pCYk1Rc3dDUVlEVlFRR0V3SlZVekVUTUJFR0ExVUVDQk1LUTJGc2FXWnZjbTVwWVRFV01CUUdBMVVFQnhNTgpVMkZ1SUVaeVlXNWphWE5qYnpFZk1CMEdBMVVFQXd3V1FXUnRhVzVBYjNKbk1pNWxlR0Z0Y0d4bExtTnZiVEJaCk1CTUdCeXFHU000OUFnRUdDQ3FHU000OUF3RUhBMElBQkMwYjRuT21meFZ6NFJRN2dRL01XcWtpV2UrRG91RlMKdVVEU0szQzZPZ1o3RS9ZdDJpQVBvVUZybVdJbmNVWXEwakNTcTZWMUdiTUcrMndlb2lQOWVEMmpZakJnTUE0RwpBMVVkRHdFQi93UUVBd0lGb0RBVEJnTlZIU1VFRERBS0JnZ3JCZ0VGQlFjREFUQU1CZ05WSFJNQkFmOEVBakFBCk1Dc0dBMVVkSXdRa01DS0FJTW9aRmVjMzlGaVo2RlB5TDIzYlFsYWhFSmVUNk5xNEdvZ3ZYOGVib0ZTNU1Bb0cKQ0NxR1NNNDlCQU1DQTBnQU1FVUNJUUNpaVl3cnFVRWpXaklGK1k0WTB0c2RMK3hUbjZoWUQwZUtvakI4N0s2OApld0lnVk9Xb0h6S0hDSFRQektxUVVTbUR3eDFvUzJFSU5YdWFJZ2RibUJoTmZSUT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpCDgoEU0hBMhIGU0hBMjU2"
}
}
},
"Policies": {
"Readers": {
"Version": "0",
"ModPolicy": "Admins",
"Policy": {
"PolicyType": "1",
"Policy": {
"version": 0,
"rule": {
"nOutOf": {
"n": 1,
"rules": [
{
"signedBy": 0
}
]
}
},
"identities": [
{
"principalClassification": "ROLE",
"principal": "CgdPcmcyTVNQ"
}
]
}
}
},
"Writers": {
"Version": "0",
"ModPolicy": "Admins",
"Policy": {
"PolicyType": "1",
"Policy": {
"version": 0,
"rule": {
"nOutOf": {
"n": 1,
"rules": [
{
"signedBy": 0
}
]
}
},
"identities": [
{
"principalClassification": "ROLE",
"principal": "CgdPcmcyTVNQ"
}
]
}
}
},
"Admins": {
"Version": "0",
"ModPolicy": "Admins",
"Policy": {
"PolicyType": "1",
"Policy": {
"version": 0,
"rule": {
"nOutOf": {
"n": 1,
"rules": [
{
"signedBy": 0
}
]
}
},
"identities": [
{
"principalClassification": "ROLE",
"principal": "CgdPcmcyTVNQEAE="
}
]
}
}
}
},
"Groups": {}
},
"Org1MSP": {
"Values": {
"MSP": {
"Version": "0",
"ModPolicy": "Admins",
"Value": {
"type": 0,
"config": "CgdPcmcxTVNQEpgHLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNlekNDQWlLZ0F3SUJBZ0lRQmJCbVNhSlVZS05HZ2grQVBlNmkwVEFLQmdncWhrak9QUVFEQWpCek1Rc3cKQ1FZRFZRUUdFd0pWVXpFVE1CRUdBMVVFQ0JNS1EyRnNhV1p2Y201cFlURVdNQlFHQTFVRUJ4TU5VMkZ1SUVaeQpZVzVqYVhOamJ6RVpNQmNHQTFVRUNoTVFiM0puTVM1bGVHRnRjR3hsTG1OdmJURWNNQm9HQTFVRUF4TVRZMkV1CmIzSm5NUzVsZUdGdGNHeGxMbU52YlRBZUZ3MHhOekExTURVd09EVTJNemxhRncweU56QTFNRE13T0RVMk16bGEKTUhNeEN6QUpCZ05WQkFZVEFsVlRNUk13RVFZRFZRUUlFd3BEWVd4cFptOXlibWxoTVJZd0ZBWURWUVFIRXcxVApZVzRnUm5KaGJtTnBjMk52TVJrd0Z3WURWUVFLRXhCdmNtY3hMbVY0WVcxd2JHVXVZMjl0TVJ3d0dnWURWUVFECkV4TmpZUzV2Y21jeExtVjRZVzF3YkdVdVkyOXRNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUUKbU1WTzFKTmRkaHYyNXBpaDY3b2ZteGU2TGFiYS90U0RZbXpxVEw3bG5oMWlZT3ZJekVOK1BNRnJ4WUx3d25HTQphQXlzay9CRkx4Zys0QWpGSTY0UnZhT0JsekNCbERBT0JnTlZIUThCQWY4RUJBTUNBYVl3R1FZRFZSMGxCQkl3CkVBWUVWUjBsQUFZSUt3WUJCUVVIQXdFd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBcEJnTlZIUTRFSWdRZzJDRzYKSVdyWlVSRWFscVpLeTFPNlk5YlROaTJvOEROYzczSjRNZjg2YzdFd0t3WURWUjBqQkNRd0lvQWcyQ0c2SVdyWgpVUkVhbHFaS3kxTzZZOWJUTmkybzhETmM3M0o0TWY4NmM3RXdDZ1lJS29aSXpqMEVBd0lEUndBd1JBSWdLVk5XCitiWmpraEFHYVlzRmh2WHdqMFB0LzN6cDE5ZzhHYkxudW1jMHBUNENJRlVQaUVieDl3WkFNSjZvZkNGeGZkL3MKRk01TEptTDMxSUtJeThBS0JTR3gKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoisgYtLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ0x6Q0NBZFdnQXdJQkFnSVJBSXlRZFZ0MGVCdVFiNnFWQTZZMnc1Y3dDZ1lJS29aSXpqMEVBd0l3Y3pFTApNQWtHQTFVRUJoTUNWVk14RXpBUkJnTlZCQWdUQ2tOaGJHbG1iM0p1YVdFeEZqQVVCZ05WQkFjVERWTmhiaUJHCmNtRnVZMmx6WTI4eEdUQVhCZ05WQkFvVEVHOXlaekV1WlhoaGJYQnNaUzVqYjIweEhEQWFCZ05WQkFNVEUyTmgKTG05eVp6RXVaWGhoYlhCc1pTNWpiMjB3SGhjTk1UY3dOVEExTURnMU5qTTVXaGNOTWpjd05UQXpNRGcxTmpNNQpXakJiTVFzd0NRWURWUVFHRXdKVlV6RVRNQkVHQTFVRUNCTUtRMkZzYVdadmNtNXBZVEVXTUJRR0ExVUVCeE1OClUyRnVJRVp5WVc1amFYTmpiekVmTUIwR0ExVUVBd3dXUVdSdGFXNUFiM0puTVM1bGVHRnRjR3hsTG1OdmJUQloKTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEEwSUFCSS9LK2loUmRuZElNZk1GQlVDeU0wWGJZQTVxVVFHVgpYYkhXWStCenphRWJBSVFTS3NwRlh3NStPQW1GRk5uamFtaTFoTStGcXp0QkZ4UW5INk04dzBtallqQmdNQTRHCkExVWREd0VCL3dRRUF3SUZvREFUQmdOVkhTVUVEREFLQmdnckJnRUZCUWNEQVRBTUJnTlZIUk1CQWY4RUFqQUEKTUNzR0ExVWRJd1FrTUNLQUlOZ2h1aUZxMlZFUkdwYW1Tc3RUdW1QVzB6WXRxUEF6WE85eWVESC9Pbk94TUFvRwpDQ3FHU000OUJBTUNBMGdBTUVVQ0lRRCtzY0F6Q1pvM3dCMUVVbGYvQkk3NlY3K0s3Y0JQblpHSld0VDFxQnFGCjBRSWdQNVR4T2Z4NjZEeXlITWNwUy8zWWZBMmo3YWt0cGhKTm9PWlhvTUdNME84PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCkIOCgRTSEEyEgZTSEEyNTY="
}
}
},
"Policies": {
"Admins": {
"Version": "0",
"ModPolicy": "Admins",
"Policy": {
"PolicyType": "1",
"Policy": {
"version": 0,
"rule": {
"nOutOf": {
"n": 1,
"rules": [
{
"signedBy": 0
}
]
}
},
"identities": [
{
"principalClassification": "ROLE",
"principal": "CgdPcmcxTVNQEAE="
}
]
}
}
},
"Readers": {
"Version": "0",
"ModPolicy": "Admins",
"Policy": {
"PolicyType": "1",
"Policy": {
"version": 0,
"rule": {
"nOutOf": {
"n": 1,
"rules": [
{
"signedBy": 0
}
]
}
},
"identities": [
{
"principalClassification": "ROLE",
"principal": "CgdPcmcxTVNQ"
}
]
}
}
},
"Writers": {
"Version": "0",
"ModPolicy": "Admins",
"Policy": {
"PolicyType": "1",
"Policy": {
"version": 0,
"rule": {
"nOutOf": {
"n": 1,
"rules": [
{
"signedBy": 0
}
]
}
},
"identities": [
{
"principalClassification": "ROLE",
"principal": "CgdPcmcxTVNQ"
}
]
}
}
}
},
"Groups": {}
}
}
}
}
}
}
}
}

View File

@ -1,81 +0,0 @@
# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
# ---------------------------------------------------------------------------
# "OrdererOrgs" - Definition of organizations managing orderer nodes
# ---------------------------------------------------------------------------
OrdererOrgs:
# ---------------------------------------------------------------------------
# Orderer
# ---------------------------------------------------------------------------
- Name: Orderer
Domain: example.com
# ---------------------------------------------------------------------------
# "Specs" - See PeerOrgs below for complete description
# ---------------------------------------------------------------------------
Specs:
- Hostname: orderer
# ---------------------------------------------------------------------------
# "PeerOrgs" - Definition of organizations managing peer nodes
# ---------------------------------------------------------------------------
PeerOrgs:
# ---------------------------------------------------------------------------
# Org1
# ---------------------------------------------------------------------------
- Name: Org1
Domain: org1.example.com
# ---------------------------------------------------------------------------
# "Specs"
# ---------------------------------------------------------------------------
# Uncomment this section to enable the explicit definition of hosts in your
# configuration. Most users will want to use Template, below
#
# Specs is an array of Spec entries. Each Spec entry consists of two fields:
# - Hostname: (Required) The desired hostname, sans the domain.
# - CommonName: (Optional) Specifies the template or explicit override for
# the CN. By default, this is the template:
#
# "{{.Hostname}}.{{.Domain}}"
#
# which obtains its values from the Spec.Hostname and
# Org.Domain, respectively.
# ---------------------------------------------------------------------------
# Specs:
# - Hostname: foo # implicitly "foo.org1.example.com"
# CommonName: foo27.org5.example.com # overrides Hostname-based FQDN set above
# - Hostname: bar
# - Hostname: baz
# ---------------------------------------------------------------------------
# "Template"
# ---------------------------------------------------------------------------
# Allows for the definition of 1 or more hosts that are created sequentially
# from a template. By default, this looks like "peer%d" from 0 to Count-1.
# You may override the number of nodes (Count), the starting index (Start)
# or the template used to construct the name (Hostname).
#
# Note: Template and Specs are not mutually exclusive. You may define both
# sections and the aggregate nodes will be created for you. Take care with
# name collisions
# ---------------------------------------------------------------------------
Template:
Count: 2
# Start: 5
# Hostname: {{.Prefix}}{{.Index}} # default
# ---------------------------------------------------------------------------
# "Users"
# ---------------------------------------------------------------------------
# Count: The number of user accounts _in addition_ to Admin
# ---------------------------------------------------------------------------
Users:
Count: 1
# ---------------------------------------------------------------------------
# Org2: See "Org1" for full specification
# ---------------------------------------------------------------------------
- Name: Org2
Domain: org2.example.com
Template:
Count: 2
Users:
Count: 1

View File

@ -1,5 +0,0 @@
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgAqWUkCFWl50D57PU
uA6AKoJaWimubzNPQNeGYOq5Xq2hRANCAAT4aNfV+YLjQq4JijQ4NzKZfha5I1Kg
LjjZw1G0bEhDOntGLBILtEZNQOckEs0E2mBCpDx/UpdVLN6xNjThMPp9
-----END PRIVATE KEY-----

View File

@ -1,5 +0,0 @@
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgNmA6aPwJo+W1DKrZ
m2mpt6ZmE7uWma4hXLH2pfYBLYyhRANCAAQPtPXpwXAgZZZ2fFdVBONnjeCzS7yQ
speNbt76qsWy4KHXPGj1z5Euk5bU0b+KJ9AVVFcveMKELDyAZTnIoaQ5
-----END PRIVATE KEY-----

View File

@ -1,5 +0,0 @@
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgrQi/hCbWv6mqdhU7
zB5+dhewX6M3gN/cRv0FHFcQosehRANCAASXNzt2ovn0M8RcQlpBlEv4J8OL1RmZ
gzhPKs3FTdkZ14p0ly7oYFpT2WD9BPwsGotJXLz79bEwB07breDIvI2N
-----END PRIVATE KEY-----

View File

@ -1,5 +0,0 @@
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg2CCyrlE1dyOJAWd3
if6PVcKQMGOMCFgYho0kbOkAeCGhRANCAAQoUZ0xwOSOp9p2geCdu8tTNjsQrfrb
jlOHqgkEM8Bb3S+Xe2pHVXCQ3ey1YRlLEHL+VqMDQLyJ+fDtv+wgS7Tz
-----END PRIVATE KEY-----

View File

@ -1,5 +0,0 @@
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgTv6bVMDgA9uIkesr
lbsYC6bkcV9dC42D6YWbBY8HxyyhRANCAAR3Zu5rbvudW5v+dwvx2rnXJHFdWtV+
Z3Hx1eduw+xfiQW+hdK9Q8KVkGoS7sLhC5KQy+5ymIQLvKnYCqqfM35T
-----END PRIVATE KEY-----

View File

@ -1,5 +0,0 @@
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgEziP0toaZ8+dLJvo
W8ISj2hHRQvnVbUn4M1OY2FIi2OhRANCAAQAmaS2fRTayoHfVLDMyEYyOi+qBGRY
1gwFVxpqtowJ9sW903NXYcVteRXFHf5lCcf3L4UDupWTkgO1E7to72cd
-----END PRIVATE KEY-----

View File

@ -1,15 +0,0 @@
-----BEGIN CERTIFICATE-----
MIICXTCCAgSgAwIBAgIQMDsa+RYVFjguwd8o/TpEojAKBggqhkjOPQQDAjBpMQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xFzAVBgNVBAMTDmNhLmV4YW1w
bGUuY29tMB4XDTE3MDYyMzA5NDUxOFoXDTI3MDYyMTA5NDUxOFowaTELMAkGA1UE
BhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lz
Y28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRcwFQYDVQQDEw5jYS5leGFtcGxlLmNv
bTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABACZpLZ9FNrKgd9UsMzIRjI6L6oE
ZFjWDAVXGmq2jAn2xb3Tc1dhxW15FcUd/mUJx/cvhQO6lZOSA7UTu2jvZx2jgY0w
gYowDgYDVR0PAQH/BAQDAgGmMA8GA1UdJQQIMAYGBFUdJQAwDwYDVR0TAQH/BAUw
AwEB/zApBgNVHQ4EIgQgj8gJJOVeYIRT8sz+W8xjzujprMLFym9X+iurERpE6pQw
KwYDVR0jBCQwIoAgj8gJJOVeYIRT8sz+W8xjzujprMLFym9X+iurERpE6pQwCgYI
KoZIzj0EAwIDRwAwRAIgTonhp+wElDQmYIJLX0ikupVj5FwGpdm2aP7UJvGEio4C
IEzddBjcuGCOeTlVdG4hkwzmBqzhhd9L85rgzBCWxJ4V
-----END CERTIFICATE-----

View File

@ -1,13 +0,0 @@
-----BEGIN CERTIFICATE-----
MIICCjCCAbGgAwIBAgIRALIrjkvk9xgZhhytcc/ouOgwCgYIKoZIzj0EAwIwaTEL
MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
cmFuY2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRcwFQYDVQQDEw5jYS5leGFt
cGxlLmNvbTAeFw0xNzA2MjMwOTQ1MThaFw0yNzA2MjEwOTQ1MThaMFYxCzAJBgNV
BAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNp
c2NvMRowGAYDVQQDDBFBZG1pbkBleGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqG
SM49AwEHA0IABEUfl5v41DGgKfdVyL3A0fzlKUwwZE2vADqmvziugtAfNAq/ap4b
8dSFxEpgk0bvakotoknhvqw3zYTQqI/AflujTTBLMA4GA1UdDwEB/wQEAwIHgDAM
BgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAII/ICSTlXmCEU/LM/lvMY87o6azCxcpv
V/orqxEaROqUMAoGCCqGSM49BAMCA0cAMEQCIDjRUljruSR3nBtgIwNmZSHL12Qc
haW5uQZw276eD6hSAiBuCbTXq3KchK/U/sELcxpgRkg8X9cyMH0pLsI6+MjJEA==
-----END CERTIFICATE-----

View File

@ -1,15 +0,0 @@
-----BEGIN CERTIFICATE-----
MIICXTCCAgSgAwIBAgIQMDsa+RYVFjguwd8o/TpEojAKBggqhkjOPQQDAjBpMQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xFzAVBgNVBAMTDmNhLmV4YW1w
bGUuY29tMB4XDTE3MDYyMzA5NDUxOFoXDTI3MDYyMTA5NDUxOFowaTELMAkGA1UE
BhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lz
Y28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRcwFQYDVQQDEw5jYS5leGFtcGxlLmNv
bTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABACZpLZ9FNrKgd9UsMzIRjI6L6oE
ZFjWDAVXGmq2jAn2xb3Tc1dhxW15FcUd/mUJx/cvhQO6lZOSA7UTu2jvZx2jgY0w
gYowDgYDVR0PAQH/BAQDAgGmMA8GA1UdJQQIMAYGBFUdJQAwDwYDVR0TAQH/BAUw
AwEB/zApBgNVHQ4EIgQgj8gJJOVeYIRT8sz+W8xjzujprMLFym9X+iurERpE6pQw
KwYDVR0jBCQwIoAgj8gJJOVeYIRT8sz+W8xjzujprMLFym9X+iurERpE6pQwCgYI
KoZIzj0EAwIDRwAwRAIgTonhp+wElDQmYIJLX0ikupVj5FwGpdm2aP7UJvGEio4C
IEzddBjcuGCOeTlVdG4hkwzmBqzhhd9L85rgzBCWxJ4V
-----END CERTIFICATE-----

View File

@ -1,15 +0,0 @@
-----BEGIN CERTIFICATE-----
MIICZTCCAgugAwIBAgIRAPwH/HqM5KwVEJovSk1rVlgwCgYIKoZIzj0EAwIwbDEL
MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
cmFuY2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRowGAYDVQQDExF0bHNjYS5l
eGFtcGxlLmNvbTAeFw0xNzA2MjMwOTQ1MThaFw0yNzA2MjEwOTQ1MThaMGwxCzAJ
BgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJh
bmNpc2NvMRQwEgYDVQQKEwtleGFtcGxlLmNvbTEaMBgGA1UEAxMRdGxzY2EuZXhh
bXBsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATUVj78QH3obYShm/ob
u800JWQn5okv3qKkWoeIquD53BBh0BvbZLAQTty9SB7AVM9vxC2MSzZTSGJ6Fyjk
lQw8o4GNMIGKMA4GA1UdDwEB/wQEAwIBpjAPBgNVHSUECDAGBgRVHSUAMA8GA1Ud
EwEB/wQFMAMBAf8wKQYDVR0OBCIEIEYNzIQg6Rd/soDPDDo23DCxEZ7Wjy/Nbvyf
VoLNaiB9MCsGA1UdIwQkMCKAIEYNzIQg6Rd/soDPDDo23DCxEZ7Wjy/NbvyfVoLN
aiB9MAoGCCqGSM49BAMCA0gAMEUCIQCjx3BifnJqiXuVjGOg+ZFGQIyFA5ugu/C6
k5Fpm1iz6wIgeJRzM8DaLzMJSCoCwSHsY9N7Xl50zq34ajXQPNJHQHU=
-----END CERTIFICATE-----

View File

@ -1,13 +0,0 @@
-----BEGIN CERTIFICATE-----
MIICCjCCAbGgAwIBAgIRALIrjkvk9xgZhhytcc/ouOgwCgYIKoZIzj0EAwIwaTEL
MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
cmFuY2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRcwFQYDVQQDEw5jYS5leGFt
cGxlLmNvbTAeFw0xNzA2MjMwOTQ1MThaFw0yNzA2MjEwOTQ1MThaMFYxCzAJBgNV
BAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNp
c2NvMRowGAYDVQQDDBFBZG1pbkBleGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqG
SM49AwEHA0IABEUfl5v41DGgKfdVyL3A0fzlKUwwZE2vADqmvziugtAfNAq/ap4b
8dSFxEpgk0bvakotoknhvqw3zYTQqI/AflujTTBLMA4GA1UdDwEB/wQEAwIHgDAM
BgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAII/ICSTlXmCEU/LM/lvMY87o6azCxcpv
V/orqxEaROqUMAoGCCqGSM49BAMCA0cAMEQCIDjRUljruSR3nBtgIwNmZSHL12Qc
haW5uQZw276eD6hSAiBuCbTXq3KchK/U/sELcxpgRkg8X9cyMH0pLsI6+MjJEA==
-----END CERTIFICATE-----

View File

@ -1,15 +0,0 @@
-----BEGIN CERTIFICATE-----
MIICXTCCAgSgAwIBAgIQMDsa+RYVFjguwd8o/TpEojAKBggqhkjOPQQDAjBpMQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xFzAVBgNVBAMTDmNhLmV4YW1w
bGUuY29tMB4XDTE3MDYyMzA5NDUxOFoXDTI3MDYyMTA5NDUxOFowaTELMAkGA1UE
BhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lz
Y28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRcwFQYDVQQDEw5jYS5leGFtcGxlLmNv
bTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABACZpLZ9FNrKgd9UsMzIRjI6L6oE
ZFjWDAVXGmq2jAn2xb3Tc1dhxW15FcUd/mUJx/cvhQO6lZOSA7UTu2jvZx2jgY0w
gYowDgYDVR0PAQH/BAQDAgGmMA8GA1UdJQQIMAYGBFUdJQAwDwYDVR0TAQH/BAUw
AwEB/zApBgNVHQ4EIgQgj8gJJOVeYIRT8sz+W8xjzujprMLFym9X+iurERpE6pQw
KwYDVR0jBCQwIoAgj8gJJOVeYIRT8sz+W8xjzujprMLFym9X+iurERpE6pQwCgYI
KoZIzj0EAwIDRwAwRAIgTonhp+wElDQmYIJLX0ikupVj5FwGpdm2aP7UJvGEio4C
IEzddBjcuGCOeTlVdG4hkwzmBqzhhd9L85rgzBCWxJ4V
-----END CERTIFICATE-----

View File

@ -1,5 +0,0 @@
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgQWw6NN8O0l+v1+Fn
V3PKOf5cwAQ4vD9y1kW8POicfJOhRANCAATy/XhsxMI/qr5gzbNvfr/kVPSKSfVz
8W9AukVmiz2UKR+dglLUndP952wVALx6xtVd4fBnqUQHe73ZJ2LXO9I6
-----END PRIVATE KEY-----

View File

@ -1,5 +0,0 @@
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg1+0xQDf2JYFjBuIJ
1BOA7tZ88l3azHQUNOUtT3/zDsWhRANCAAQqqmRPyHmx/ZffKkqpcAQsf1MweHcx
UV3upg1CkyXVJo20T7AojuYxpPIWzYzpUtbdV1OUP46vG1cG4Ynsm0t3
-----END PRIVATE KEY-----

View File

@ -1,5 +0,0 @@
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg8P3T/yWHVGGDv3Fz
HzNw9c8RStFSOZ5H6UTLh7/rQrehRANCAAR60brbN1hwmV++txFQCmeRgiyOqVtS
qaJoLbg9slfxqEbOz0DDcmJz6rIoYx2BnDsjbz04Ttb/ZyEyPEpOTbeJ
-----END PRIVATE KEY-----

View File

@ -1,5 +0,0 @@
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgRKAxUGKP7CWlayEg
62Y+1QQC1oqPJ4KuL78SHT8MdryhRANCAAS1zSe6uP/G5k+5aBgUEKIRnEqaVJZ5
caSLIqM12Kww6eQ/H1b02EzVyFTynQosV73WWzWyBIvkNMLIjLaFaDeC
-----END PRIVATE KEY-----

View File

@ -1,5 +0,0 @@
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQguzJ57V/us6UWr29x
9WgHUKbCA8D7birWyR2RjmzAXzChRANCAASx7VddJHITlVhw0bBUDKQy1Hrut2hp
ri6F9KLvMo2qhDpy+o1+Kv/l7bz3VoFcwjNk/IGiO3locae20bMZKevI
-----END PRIVATE KEY-----

View File

@ -1,5 +0,0 @@
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgJC7LIsPZA5CweFuP
Qjxqjlqu1JYa9e2mf6pb5v/NxdWhRANCAAQAIJj7b/PJbaGbd4lz3rxIQ+MA2cgx
gbnYvmicFXLRffXjkNnICSqpf2W4KvtGUKkXEYpe9aY3qqbN1tHycmDB
-----END PRIVATE KEY-----

View File

@ -1,13 +0,0 @@
-----BEGIN CERTIFICATE-----
MIICCzCCAbKgAwIBAgIQAxuKWC5I9BHkcXlnlgFGdDAKBggqhkjOPQQDAjBpMQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xFzAVBgNVBAMTDmNhLmV4YW1w
bGUuY29tMB4XDTE3MDYyMzA5NDUxOFoXDTI3MDYyMTA5NDUxOFowWDELMAkGA1UE
BhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lz
Y28xHDAaBgNVBAMTE29yZGVyZXIuZXhhbXBsZS5jb20wWTATBgcqhkjOPQIBBggq
hkjOPQMBBwNCAAQAIJj7b/PJbaGbd4lz3rxIQ+MA2cgxgbnYvmicFXLRffXjkNnI
CSqpf2W4KvtGUKkXEYpe9aY3qqbN1tHycmDBo00wSzAOBgNVHQ8BAf8EBAMCB4Aw
DAYDVR0TAQH/BAIwADArBgNVHSMEJDAigCCPyAkk5V5ghFPyzP5bzGPO6OmswsXK
b1f6K6sRGkTqlDAKBggqhkjOPQQDAgNHADBEAiAI5eVt3H50U2l74alaGn8GOEHl
LedZaegdRoHNJNCKGwIgGUE39OhXw6loZsRzvyCnWn7mWPF7jnV21MRKj/Kack4=
-----END CERTIFICATE-----

View File

@ -1,15 +0,0 @@
-----BEGIN CERTIFICATE-----
MIICZTCCAgugAwIBAgIRAPwH/HqM5KwVEJovSk1rVlgwCgYIKoZIzj0EAwIwbDEL
MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
cmFuY2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRowGAYDVQQDExF0bHNjYS5l
eGFtcGxlLmNvbTAeFw0xNzA2MjMwOTQ1MThaFw0yNzA2MjEwOTQ1MThaMGwxCzAJ
BgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJh
bmNpc2NvMRQwEgYDVQQKEwtleGFtcGxlLmNvbTEaMBgGA1UEAxMRdGxzY2EuZXhh
bXBsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATUVj78QH3obYShm/ob
u800JWQn5okv3qKkWoeIquD53BBh0BvbZLAQTty9SB7AVM9vxC2MSzZTSGJ6Fyjk
lQw8o4GNMIGKMA4GA1UdDwEB/wQEAwIBpjAPBgNVHSUECDAGBgRVHSUAMA8GA1Ud
EwEB/wQFMAMBAf8wKQYDVR0OBCIEIEYNzIQg6Rd/soDPDDo23DCxEZ7Wjy/Nbvyf
VoLNaiB9MCsGA1UdIwQkMCKAIEYNzIQg6Rd/soDPDDo23DCxEZ7Wjy/NbvyfVoLN
aiB9MAoGCCqGSM49BAMCA0gAMEUCIQCjx3BifnJqiXuVjGOg+ZFGQIyFA5ugu/C6
k5Fpm1iz6wIgeJRzM8DaLzMJSCoCwSHsY9N7Xl50zq34ajXQPNJHQHU=
-----END CERTIFICATE-----

View File

@ -1,15 +0,0 @@
-----BEGIN CERTIFICATE-----
MIICZTCCAgugAwIBAgIRAPwH/HqM5KwVEJovSk1rVlgwCgYIKoZIzj0EAwIwbDEL
MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
cmFuY2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRowGAYDVQQDExF0bHNjYS5l
eGFtcGxlLmNvbTAeFw0xNzA2MjMwOTQ1MThaFw0yNzA2MjEwOTQ1MThaMGwxCzAJ
BgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJh
bmNpc2NvMRQwEgYDVQQKEwtleGFtcGxlLmNvbTEaMBgGA1UEAxMRdGxzY2EuZXhh
bXBsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATUVj78QH3obYShm/ob
u800JWQn5okv3qKkWoeIquD53BBh0BvbZLAQTty9SB7AVM9vxC2MSzZTSGJ6Fyjk
lQw8o4GNMIGKMA4GA1UdDwEB/wQEAwIBpjAPBgNVHSUECDAGBgRVHSUAMA8GA1Ud
EwEB/wQFMAMBAf8wKQYDVR0OBCIEIEYNzIQg6Rd/soDPDDo23DCxEZ7Wjy/Nbvyf
VoLNaiB9MCsGA1UdIwQkMCKAIEYNzIQg6Rd/soDPDDo23DCxEZ7Wjy/NbvyfVoLN
aiB9MAoGCCqGSM49BAMCA0gAMEUCIQCjx3BifnJqiXuVjGOg+ZFGQIyFA5ugu/C6
k5Fpm1iz6wIgeJRzM8DaLzMJSCoCwSHsY9N7Xl50zq34ajXQPNJHQHU=
-----END CERTIFICATE-----

View File

@ -1,5 +0,0 @@
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgp9y9SVTYiJedyWFA
yW4CA3wkltgsXzdfOJvVX1n5KI6hRANCAARfgf3qLwh4Lm9fX2ot1fiNiQ13Q4n5
kihIko7F2I5mXs+y+RZqrTOtvRLfYb90JmUl2+rU4WHQwVXm85FKVKiX
-----END PRIVATE KEY-----

View File

@ -1,5 +0,0 @@
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgJTXNFyRZS2FlYv3B
wr+Ja89zEgVvR1S2MTHxl0priRmhRANCAARO2VJj+yapmOPv9AlxFwXu/o6rQBms
Ur1cLKgIHGHlO4Tc6I7hJI9YgeQ7xtrKtlceFOfZZEN3un8WqvtTd6FS
-----END PRIVATE KEY-----

View File

@ -1,5 +0,0 @@
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg+BA5ICCzjxuwZ5i7
5Suu7dCYNbImee4paKJP6WtxJ9WhRANCAATUVj78QH3obYShm/obu800JWQn5okv
3qKkWoeIquD53BBh0BvbZLAQTty9SB7AVM9vxC2MSzZTSGJ6FyjklQw8
-----END PRIVATE KEY-----

View File

@ -1,5 +0,0 @@
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg4SNeaopN1Se3qVv/
BCxIXG3/COVy1FjkMheKobyih5WhRANCAAS9AJP9DZyWbnrNLU40r12iTWe5uXrq
6GiqXNOB3k2th6N4mBq9AJaloC1RzQ3dRmtBp20Y9eWhMNHPE8HnyFup
-----END PRIVATE KEY-----

View File

@ -1,5 +0,0 @@
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg+hFErz+bxEi9wnnt
5csy/gg1iRjmmVbXycbxni6iMUyhRANCAAR9KsDw5dAQJsuZ+7CCeXG0y5xT9snt
lAi3P6ln3SQoPaZ0SgAYyy46YePeMJMkSxEMFG2OsZ7zIYYhdWrUQze+
-----END PRIVATE KEY-----

View File

@ -1,5 +0,0 @@
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgFkl0Lb18EGBeuwty
447E1ct+BdqMtKVGI7aUt50LYD+hRANCAASYVn329fWRD6137eYtAh1GHRP3Df1d
ID52ynz2fKNeHCdwlJ3iq+cuk1MBzd5cNhRNrmYaBClTVREBMq9tftnh
-----END PRIVATE KEY-----

View File

@ -1,5 +0,0 @@
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgt6Xk6IkIiKAA0rAe
WNy/VNzLBSvI7+vLE5VcLrBrVd+hRANCAASdx21EBJIivo2uzItVcxr7UfMlDQel
2MqU0/yy8QxxnSGjlU8ls/Pbh+sRH5Rmyp+H5jT82Ke+8NHc50QCXa+x
-----END PRIVATE KEY-----

View File

@ -1,15 +0,0 @@
-----BEGIN CERTIFICATE-----
MIICZTCCAgugAwIBAgIRAPwH/HqM5KwVEJovSk1rVlgwCgYIKoZIzj0EAwIwbDEL
MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
cmFuY2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRowGAYDVQQDExF0bHNjYS5l
eGFtcGxlLmNvbTAeFw0xNzA2MjMwOTQ1MThaFw0yNzA2MjEwOTQ1MThaMGwxCzAJ
BgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJh
bmNpc2NvMRQwEgYDVQQKEwtleGFtcGxlLmNvbTEaMBgGA1UEAxMRdGxzY2EuZXhh
bXBsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATUVj78QH3obYShm/ob
u800JWQn5okv3qKkWoeIquD53BBh0BvbZLAQTty9SB7AVM9vxC2MSzZTSGJ6Fyjk
lQw8o4GNMIGKMA4GA1UdDwEB/wQEAwIBpjAPBgNVHSUECDAGBgRVHSUAMA8GA1Ud
EwEB/wQFMAMBAf8wKQYDVR0OBCIEIEYNzIQg6Rd/soDPDDo23DCxEZ7Wjy/Nbvyf
VoLNaiB9MCsGA1UdIwQkMCKAIEYNzIQg6Rd/soDPDDo23DCxEZ7Wjy/NbvyfVoLN
aiB9MAoGCCqGSM49BAMCA0gAMEUCIQCjx3BifnJqiXuVjGOg+ZFGQIyFA5ugu/C6
k5Fpm1iz6wIgeJRzM8DaLzMJSCoCwSHsY9N7Xl50zq34ajXQPNJHQHU=
-----END CERTIFICATE-----

View File

@ -1,13 +0,0 @@
-----BEGIN CERTIFICATE-----
MIICCjCCAbGgAwIBAgIRALIrjkvk9xgZhhytcc/ouOgwCgYIKoZIzj0EAwIwaTEL
MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
cmFuY2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRcwFQYDVQQDEw5jYS5leGFt
cGxlLmNvbTAeFw0xNzA2MjMwOTQ1MThaFw0yNzA2MjEwOTQ1MThaMFYxCzAJBgNV
BAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNp
c2NvMRowGAYDVQQDDBFBZG1pbkBleGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqG
SM49AwEHA0IABEUfl5v41DGgKfdVyL3A0fzlKUwwZE2vADqmvziugtAfNAq/ap4b
8dSFxEpgk0bvakotoknhvqw3zYTQqI/AflujTTBLMA4GA1UdDwEB/wQEAwIHgDAM
BgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAII/ICSTlXmCEU/LM/lvMY87o6azCxcpv
V/orqxEaROqUMAoGCCqGSM49BAMCA0cAMEQCIDjRUljruSR3nBtgIwNmZSHL12Qc
haW5uQZw276eD6hSAiBuCbTXq3KchK/U/sELcxpgRkg8X9cyMH0pLsI6+MjJEA==
-----END CERTIFICATE-----

View File

@ -1,15 +0,0 @@
-----BEGIN CERTIFICATE-----
MIICXTCCAgSgAwIBAgIQMDsa+RYVFjguwd8o/TpEojAKBggqhkjOPQQDAjBpMQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xFzAVBgNVBAMTDmNhLmV4YW1w
bGUuY29tMB4XDTE3MDYyMzA5NDUxOFoXDTI3MDYyMTA5NDUxOFowaTELMAkGA1UE
BhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lz
Y28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRcwFQYDVQQDEw5jYS5leGFtcGxlLmNv
bTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABACZpLZ9FNrKgd9UsMzIRjI6L6oE
ZFjWDAVXGmq2jAn2xb3Tc1dhxW15FcUd/mUJx/cvhQO6lZOSA7UTu2jvZx2jgY0w
gYowDgYDVR0PAQH/BAQDAgGmMA8GA1UdJQQIMAYGBFUdJQAwDwYDVR0TAQH/BAUw
AwEB/zApBgNVHQ4EIgQgj8gJJOVeYIRT8sz+W8xjzujprMLFym9X+iurERpE6pQw
KwYDVR0jBCQwIoAgj8gJJOVeYIRT8sz+W8xjzujprMLFym9X+iurERpE6pQwCgYI
KoZIzj0EAwIDRwAwRAIgTonhp+wElDQmYIJLX0ikupVj5FwGpdm2aP7UJvGEio4C
IEzddBjcuGCOeTlVdG4hkwzmBqzhhd9L85rgzBCWxJ4V
-----END CERTIFICATE-----

View File

@ -1,5 +0,0 @@
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgWLs2HBZ2qQy/PDB2
oA3vFS9pokW7ZC79u4gObbHXRMWhRANCAATKfrnGdalMerCK8nrQumxrjVm9W/WZ
ED0x6oJgtP3zOJUso0GEPtYREHr9/rshVr1X3ZEMfR7F7WpiWKJW34gk
-----END PRIVATE KEY-----

View File

@ -1,5 +0,0 @@
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg9rdgzutrnjzPO0Gv
0mhJe5R07+j5si4WltvkXyUF3uuhRANCAASGGwTxOjr3X/P/0oloqv9V1k9OFNmI
kcdukuCgUUgDVSV3V2+tGuzfwTF5tEurx7UtvgagOUOyulN7P3CwiI83
-----END PRIVATE KEY-----

View File

@ -1,5 +0,0 @@
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg/Yr6YCbqpeAIGzd7
sfB1R2k2XeogimO7NfTBzDmiZrihRANCAARAe4F30r0qqsiCBbeuBUWE5p7H3kDx
/BfpmEQIJtYYRF5QQ+fcXmUGd0tRoYdLWy4IWi50GfG6Uw6MQAF78PRV
-----END PRIVATE KEY-----

View File

@ -1,5 +0,0 @@
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgWqN6OjWwLFeqnclj
AS1RiVQ7VAupBWSyDYsCrmudOnyhRANCAATZABCeW1BtVavRQdks+aAyN895RSb5
ZkJwzag+kW9onJ0k4tHfipRXdbuDDaeD4QIFcAM2OpY4J2Zl72c8etT1
-----END PRIVATE KEY-----

View File

@ -1,5 +0,0 @@
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgAfEvqbarS+SZ9R2d
P1ZvJFjvAFVdIGv/MTAopwk7I2mhRANCAARFH5eb+NQxoCn3Vci9wNH85SlMMGRN
rwA6pr84roLQHzQKv2qeG/HUhcRKYJNG72pKLaJJ4b6sN82E0KiPwH5b
-----END PRIVATE KEY-----

View File

@ -1,5 +0,0 @@
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgU8nag5FLZ3C6Vqp3
ELK8TUL9o0KJWcQjwIiE4kGQytyhRANCAAQwzqHKFXuYHO55AEF/s5XrQXxMBbvn
rUmCbB80sMCEIB8q+hZMQ6HASBSAUi/ObMsBnuf0V8/Hwe8UiH2rR5/B
-----END PRIVATE KEY-----

View File

@ -1,13 +0,0 @@
-----BEGIN CERTIFICATE-----
MIICCjCCAbGgAwIBAgIRALIrjkvk9xgZhhytcc/ouOgwCgYIKoZIzj0EAwIwaTEL
MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
cmFuY2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRcwFQYDVQQDEw5jYS5leGFt
cGxlLmNvbTAeFw0xNzA2MjMwOTQ1MThaFw0yNzA2MjEwOTQ1MThaMFYxCzAJBgNV
BAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNp
c2NvMRowGAYDVQQDDBFBZG1pbkBleGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqG
SM49AwEHA0IABEUfl5v41DGgKfdVyL3A0fzlKUwwZE2vADqmvziugtAfNAq/ap4b
8dSFxEpgk0bvakotoknhvqw3zYTQqI/AflujTTBLMA4GA1UdDwEB/wQEAwIHgDAM
BgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAII/ICSTlXmCEU/LM/lvMY87o6azCxcpv
V/orqxEaROqUMAoGCCqGSM49BAMCA0cAMEQCIDjRUljruSR3nBtgIwNmZSHL12Qc
haW5uQZw276eD6hSAiBuCbTXq3KchK/U/sELcxpgRkg8X9cyMH0pLsI6+MjJEA==
-----END CERTIFICATE-----

View File

@ -1,15 +0,0 @@
-----BEGIN CERTIFICATE-----
MIICZTCCAgugAwIBAgIRAPwH/HqM5KwVEJovSk1rVlgwCgYIKoZIzj0EAwIwbDEL
MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
cmFuY2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRowGAYDVQQDExF0bHNjYS5l
eGFtcGxlLmNvbTAeFw0xNzA2MjMwOTQ1MThaFw0yNzA2MjEwOTQ1MThaMGwxCzAJ
BgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJh
bmNpc2NvMRQwEgYDVQQKEwtleGFtcGxlLmNvbTEaMBgGA1UEAxMRdGxzY2EuZXhh
bXBsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATUVj78QH3obYShm/ob
u800JWQn5okv3qKkWoeIquD53BBh0BvbZLAQTty9SB7AVM9vxC2MSzZTSGJ6Fyjk
lQw8o4GNMIGKMA4GA1UdDwEB/wQEAwIBpjAPBgNVHSUECDAGBgRVHSUAMA8GA1Ud
EwEB/wQFMAMBAf8wKQYDVR0OBCIEIEYNzIQg6Rd/soDPDDo23DCxEZ7Wjy/Nbvyf
VoLNaiB9MCsGA1UdIwQkMCKAIEYNzIQg6Rd/soDPDDo23DCxEZ7Wjy/NbvyfVoLN
aiB9MAoGCCqGSM49BAMCA0gAMEUCIQCjx3BifnJqiXuVjGOg+ZFGQIyFA5ugu/C6
k5Fpm1iz6wIgeJRzM8DaLzMJSCoCwSHsY9N7Xl50zq34ajXQPNJHQHU=
-----END CERTIFICATE-----

Some files were not shown because too many files have changed in this diff Show More