Add configtxlator example
parent
825a0c69d3
commit
e1513fad0c
|
@ -45,7 +45,7 @@ ready: restart
|
||||||
@echo "run 'make stop' when done."
|
@echo "run 'make stop' when done."
|
||||||
|
|
||||||
start: # bootup the fabric network
|
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
|
make clean
|
||||||
docker-compose -f ${COMPOSE_FILE} up -d # Start a fabric network
|
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
|
gen_kafka: # generate kafka artifacts
|
||||||
cd kafka && bash gen_artifacts.sh
|
cd kafka && bash gen_artifacts.sh
|
||||||
|
|
||||||
|
configtxlator: # run configtxlator
|
||||||
|
cd kafka && bash run_configtxlator.sh
|
||||||
|
|
||||||
download: # download required images
|
download: # download required images
|
||||||
@echo "Download Docker images"
|
@echo "Download Docker images"
|
||||||
docker pull yeasy/hyperledger-fabric:latest
|
docker pull yeasy/hyperledger-fabric:latest
|
||||||
|
|
|
@ -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
|
|
|
@ -12,16 +12,26 @@ services:
|
||||||
extends:
|
extends:
|
||||||
file: docker-compose-base-dev.yaml
|
file: docker-compose-base-dev.yaml
|
||||||
service: orderer.example.com
|
service: orderer.example.com
|
||||||
|
depends_on:
|
||||||
|
- kafka0
|
||||||
|
- kafka1
|
||||||
|
- kafka2
|
||||||
|
- kafka3
|
||||||
|
|
||||||
peer0.org1.example.com:
|
peer0.org1.example.com:
|
||||||
extends:
|
extends:
|
||||||
file: docker-compose-base-dev.yaml
|
file: docker-compose-base-dev.yaml
|
||||||
service: peer0.org1.example.com
|
service: peer0.org1.example.com
|
||||||
|
depends_on:
|
||||||
|
- orderer.example.com
|
||||||
|
|
||||||
cli:
|
cli:
|
||||||
extends:
|
extends:
|
||||||
file: docker-compose-base-dev.yaml
|
file: docker-compose-base-dev.yaml
|
||||||
service: cli
|
service: cli
|
||||||
|
depends_on:
|
||||||
|
- peer0.org1.example.com
|
||||||
|
- orderer.example.com
|
||||||
|
|
||||||
# ZooKeeper services, at least 3 nodes
|
# ZooKeeper services, at least 3 nodes
|
||||||
zookeeper0:
|
zookeeper0:
|
||||||
|
|
|
@ -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 =====================
|
|
||||||
|
|
||||||
```
|
|
|
@ -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 =====================
|
|
||||||
```
|
|
|
@ -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
|
|
||||||
```
|
|
|
@ -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`
|
|
||||||
|
|
|
@ -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.
|
|
|
@ -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
|
|
||||||
```
|
|
|
@ -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...
|
|
||||||
```
|
|
|
@ -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.
|
|
|
@ -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.
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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*
|
|
|
@ -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/
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -12,6 +12,10 @@ OrdererOrgs:
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
- Name: Orderer
|
- Name: Orderer
|
||||||
Domain: example.com
|
Domain: example.com
|
||||||
|
CA:
|
||||||
|
Country: US
|
||||||
|
Province: California
|
||||||
|
Locality: San Francisco
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
# "Specs" - See PeerOrgs below for complete description
|
# "Specs" - See PeerOrgs below for complete description
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
@ -26,6 +30,10 @@ PeerOrgs:
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
- Name: Org1
|
- Name: Org1
|
||||||
Domain: org1.example.com
|
Domain: org1.example.com
|
||||||
|
CA:
|
||||||
|
Country: US
|
||||||
|
Province: California
|
||||||
|
Locality: San Francisco
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
# "Specs"
|
# "Specs"
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
@ -75,6 +83,10 @@ PeerOrgs:
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
- Name: Org2
|
- Name: Org2
|
||||||
Domain: org2.example.com
|
Domain: org2.example.com
|
||||||
|
CA:
|
||||||
|
Country: US
|
||||||
|
Province: California
|
||||||
|
Locality: San Francisco
|
||||||
Template:
|
Template:
|
||||||
Count: 2
|
Count: 2
|
||||||
Users:
|
Users:
|
||||||
|
|
|
@ -17,10 +17,13 @@ fi
|
||||||
echo_b "Clean up all containers..."
|
echo_b "Clean up all containers..."
|
||||||
docker rm -f `docker ps -qa`
|
docker rm -f `docker ps -qa`
|
||||||
|
|
||||||
echo_b "Clean up all chaincode-images..."
|
echo_b "Clean up all chaincode images..."
|
||||||
docker rmi -f $(docker images |grep 'dev-peer*'|awk '{print $3}')
|
docker rmi -f $(docker images |grep 'dev-peer'|awk '{print $3}')
|
||||||
|
|
||||||
echo_b "Clean up all hyperledger related images..."
|
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!"
|
echo_g "Env cleanup done!"
|
|
@ -1,19 +0,0 @@
|
||||||
[36m2017-09-15 06:32:05.922 UTC [msp] GetLocalMSP -> DEBU 001[0m Returning existing local MSP
|
|
||||||
[36m2017-09-15 06:32:05.922 UTC [msp] GetDefaultSigningIdentity -> DEBU 002[0m Obtaining default signing identity
|
|
||||||
2017-09-15 06:32:05.928 UTC [channelCmd] InitCmdFactory -> INFO 003[0m 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
|
|
||||||
|
|
|
@ -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 =====================
|
|
||||||
|
|
||||||
```
|
|
|
@ -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 =====================
|
|
||||||
```
|
|
|
@ -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
|
|
||||||
```
|
|
|
@ -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`
|
|
||||||
|
|
|
@ -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.
|
|
|
@ -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
|
|
||||||
```
|
|
|
@ -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...
|
|
||||||
```
|
|
|
@ -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.
|
|
|
@ -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.
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Binary file not shown.
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Binary file not shown.
Binary file not shown.
|
@ -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": [
|
|
||||||
"",
|
|
||||||
"",
|
|
||||||
"",
|
|
||||||
""
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
Binary file not shown.
|
@ -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",
|
|
||||||
"",
|
|
||||||
""
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
Binary file not shown.
|
@ -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",
|
|
||||||
"",
|
|
||||||
""
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Binary file not shown.
Binary file not shown.
|
@ -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": [
|
|
||||||
"",
|
|
||||||
"",
|
|
||||||
"",
|
|
||||||
""
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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": {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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
|
|
|
@ -1,5 +0,0 @@
|
||||||
-----BEGIN PRIVATE KEY-----
|
|
||||||
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgAqWUkCFWl50D57PU
|
|
||||||
uA6AKoJaWimubzNPQNeGYOq5Xq2hRANCAAT4aNfV+YLjQq4JijQ4NzKZfha5I1Kg
|
|
||||||
LjjZw1G0bEhDOntGLBILtEZNQOckEs0E2mBCpDx/UpdVLN6xNjThMPp9
|
|
||||||
-----END PRIVATE KEY-----
|
|
|
@ -1,5 +0,0 @@
|
||||||
-----BEGIN PRIVATE KEY-----
|
|
||||||
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgNmA6aPwJo+W1DKrZ
|
|
||||||
m2mpt6ZmE7uWma4hXLH2pfYBLYyhRANCAAQPtPXpwXAgZZZ2fFdVBONnjeCzS7yQ
|
|
||||||
speNbt76qsWy4KHXPGj1z5Euk5bU0b+KJ9AVVFcveMKELDyAZTnIoaQ5
|
|
||||||
-----END PRIVATE KEY-----
|
|
|
@ -1,5 +0,0 @@
|
||||||
-----BEGIN PRIVATE KEY-----
|
|
||||||
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgrQi/hCbWv6mqdhU7
|
|
||||||
zB5+dhewX6M3gN/cRv0FHFcQosehRANCAASXNzt2ovn0M8RcQlpBlEv4J8OL1RmZ
|
|
||||||
gzhPKs3FTdkZ14p0ly7oYFpT2WD9BPwsGotJXLz79bEwB07breDIvI2N
|
|
||||||
-----END PRIVATE KEY-----
|
|
|
@ -1,5 +0,0 @@
|
||||||
-----BEGIN PRIVATE KEY-----
|
|
||||||
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg2CCyrlE1dyOJAWd3
|
|
||||||
if6PVcKQMGOMCFgYho0kbOkAeCGhRANCAAQoUZ0xwOSOp9p2geCdu8tTNjsQrfrb
|
|
||||||
jlOHqgkEM8Bb3S+Xe2pHVXCQ3ey1YRlLEHL+VqMDQLyJ+fDtv+wgS7Tz
|
|
||||||
-----END PRIVATE KEY-----
|
|
|
@ -1,5 +0,0 @@
|
||||||
-----BEGIN PRIVATE KEY-----
|
|
||||||
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgTv6bVMDgA9uIkesr
|
|
||||||
lbsYC6bkcV9dC42D6YWbBY8HxyyhRANCAAR3Zu5rbvudW5v+dwvx2rnXJHFdWtV+
|
|
||||||
Z3Hx1eduw+xfiQW+hdK9Q8KVkGoS7sLhC5KQy+5ymIQLvKnYCqqfM35T
|
|
||||||
-----END PRIVATE KEY-----
|
|
|
@ -1,5 +0,0 @@
|
||||||
-----BEGIN PRIVATE KEY-----
|
|
||||||
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgEziP0toaZ8+dLJvo
|
|
||||||
W8ISj2hHRQvnVbUn4M1OY2FIi2OhRANCAAQAmaS2fRTayoHfVLDMyEYyOi+qBGRY
|
|
||||||
1gwFVxpqtowJ9sW903NXYcVteRXFHf5lCcf3L4UDupWTkgO1E7to72cd
|
|
||||||
-----END PRIVATE KEY-----
|
|
|
@ -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-----
|
|
|
@ -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-----
|
|
|
@ -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-----
|
|
|
@ -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-----
|
|
|
@ -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-----
|
|
|
@ -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-----
|
|
|
@ -1,5 +0,0 @@
|
||||||
-----BEGIN PRIVATE KEY-----
|
|
||||||
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgQWw6NN8O0l+v1+Fn
|
|
||||||
V3PKOf5cwAQ4vD9y1kW8POicfJOhRANCAATy/XhsxMI/qr5gzbNvfr/kVPSKSfVz
|
|
||||||
8W9AukVmiz2UKR+dglLUndP952wVALx6xtVd4fBnqUQHe73ZJ2LXO9I6
|
|
||||||
-----END PRIVATE KEY-----
|
|
|
@ -1,5 +0,0 @@
|
||||||
-----BEGIN PRIVATE KEY-----
|
|
||||||
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg1+0xQDf2JYFjBuIJ
|
|
||||||
1BOA7tZ88l3azHQUNOUtT3/zDsWhRANCAAQqqmRPyHmx/ZffKkqpcAQsf1MweHcx
|
|
||||||
UV3upg1CkyXVJo20T7AojuYxpPIWzYzpUtbdV1OUP46vG1cG4Ynsm0t3
|
|
||||||
-----END PRIVATE KEY-----
|
|
|
@ -1,5 +0,0 @@
|
||||||
-----BEGIN PRIVATE KEY-----
|
|
||||||
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg8P3T/yWHVGGDv3Fz
|
|
||||||
HzNw9c8RStFSOZ5H6UTLh7/rQrehRANCAAR60brbN1hwmV++txFQCmeRgiyOqVtS
|
|
||||||
qaJoLbg9slfxqEbOz0DDcmJz6rIoYx2BnDsjbz04Ttb/ZyEyPEpOTbeJ
|
|
||||||
-----END PRIVATE KEY-----
|
|
|
@ -1,5 +0,0 @@
|
||||||
-----BEGIN PRIVATE KEY-----
|
|
||||||
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgRKAxUGKP7CWlayEg
|
|
||||||
62Y+1QQC1oqPJ4KuL78SHT8MdryhRANCAAS1zSe6uP/G5k+5aBgUEKIRnEqaVJZ5
|
|
||||||
caSLIqM12Kww6eQ/H1b02EzVyFTynQosV73WWzWyBIvkNMLIjLaFaDeC
|
|
||||||
-----END PRIVATE KEY-----
|
|
|
@ -1,5 +0,0 @@
|
||||||
-----BEGIN PRIVATE KEY-----
|
|
||||||
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQguzJ57V/us6UWr29x
|
|
||||||
9WgHUKbCA8D7birWyR2RjmzAXzChRANCAASx7VddJHITlVhw0bBUDKQy1Hrut2hp
|
|
||||||
ri6F9KLvMo2qhDpy+o1+Kv/l7bz3VoFcwjNk/IGiO3locae20bMZKevI
|
|
||||||
-----END PRIVATE KEY-----
|
|
|
@ -1,5 +0,0 @@
|
||||||
-----BEGIN PRIVATE KEY-----
|
|
||||||
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgJC7LIsPZA5CweFuP
|
|
||||||
Qjxqjlqu1JYa9e2mf6pb5v/NxdWhRANCAAQAIJj7b/PJbaGbd4lz3rxIQ+MA2cgx
|
|
||||||
gbnYvmicFXLRffXjkNnICSqpf2W4KvtGUKkXEYpe9aY3qqbN1tHycmDB
|
|
||||||
-----END PRIVATE KEY-----
|
|
|
@ -1,13 +0,0 @@
|
||||||
-----BEGIN CERTIFICATE-----
|
|
||||||
MIICCzCCAbKgAwIBAgIQAxuKWC5I9BHkcXlnlgFGdDAKBggqhkjOPQQDAjBpMQsw
|
|
||||||
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
|
|
||||||
YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xFzAVBgNVBAMTDmNhLmV4YW1w
|
|
||||||
bGUuY29tMB4XDTE3MDYyMzA5NDUxOFoXDTI3MDYyMTA5NDUxOFowWDELMAkGA1UE
|
|
||||||
BhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lz
|
|
||||||
Y28xHDAaBgNVBAMTE29yZGVyZXIuZXhhbXBsZS5jb20wWTATBgcqhkjOPQIBBggq
|
|
||||||
hkjOPQMBBwNCAAQAIJj7b/PJbaGbd4lz3rxIQ+MA2cgxgbnYvmicFXLRffXjkNnI
|
|
||||||
CSqpf2W4KvtGUKkXEYpe9aY3qqbN1tHycmDBo00wSzAOBgNVHQ8BAf8EBAMCB4Aw
|
|
||||||
DAYDVR0TAQH/BAIwADArBgNVHSMEJDAigCCPyAkk5V5ghFPyzP5bzGPO6OmswsXK
|
|
||||||
b1f6K6sRGkTqlDAKBggqhkjOPQQDAgNHADBEAiAI5eVt3H50U2l74alaGn8GOEHl
|
|
||||||
LedZaegdRoHNJNCKGwIgGUE39OhXw6loZsRzvyCnWn7mWPF7jnV21MRKj/Kack4=
|
|
||||||
-----END CERTIFICATE-----
|
|
|
@ -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-----
|
|
|
@ -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-----
|
|
|
@ -1,5 +0,0 @@
|
||||||
-----BEGIN PRIVATE KEY-----
|
|
||||||
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgp9y9SVTYiJedyWFA
|
|
||||||
yW4CA3wkltgsXzdfOJvVX1n5KI6hRANCAARfgf3qLwh4Lm9fX2ot1fiNiQ13Q4n5
|
|
||||||
kihIko7F2I5mXs+y+RZqrTOtvRLfYb90JmUl2+rU4WHQwVXm85FKVKiX
|
|
||||||
-----END PRIVATE KEY-----
|
|
|
@ -1,5 +0,0 @@
|
||||||
-----BEGIN PRIVATE KEY-----
|
|
||||||
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgJTXNFyRZS2FlYv3B
|
|
||||||
wr+Ja89zEgVvR1S2MTHxl0priRmhRANCAARO2VJj+yapmOPv9AlxFwXu/o6rQBms
|
|
||||||
Ur1cLKgIHGHlO4Tc6I7hJI9YgeQ7xtrKtlceFOfZZEN3un8WqvtTd6FS
|
|
||||||
-----END PRIVATE KEY-----
|
|
|
@ -1,5 +0,0 @@
|
||||||
-----BEGIN PRIVATE KEY-----
|
|
||||||
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg+BA5ICCzjxuwZ5i7
|
|
||||||
5Suu7dCYNbImee4paKJP6WtxJ9WhRANCAATUVj78QH3obYShm/obu800JWQn5okv
|
|
||||||
3qKkWoeIquD53BBh0BvbZLAQTty9SB7AVM9vxC2MSzZTSGJ6FyjklQw8
|
|
||||||
-----END PRIVATE KEY-----
|
|
|
@ -1,5 +0,0 @@
|
||||||
-----BEGIN PRIVATE KEY-----
|
|
||||||
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg4SNeaopN1Se3qVv/
|
|
||||||
BCxIXG3/COVy1FjkMheKobyih5WhRANCAAS9AJP9DZyWbnrNLU40r12iTWe5uXrq
|
|
||||||
6GiqXNOB3k2th6N4mBq9AJaloC1RzQ3dRmtBp20Y9eWhMNHPE8HnyFup
|
|
||||||
-----END PRIVATE KEY-----
|
|
|
@ -1,5 +0,0 @@
|
||||||
-----BEGIN PRIVATE KEY-----
|
|
||||||
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg+hFErz+bxEi9wnnt
|
|
||||||
5csy/gg1iRjmmVbXycbxni6iMUyhRANCAAR9KsDw5dAQJsuZ+7CCeXG0y5xT9snt
|
|
||||||
lAi3P6ln3SQoPaZ0SgAYyy46YePeMJMkSxEMFG2OsZ7zIYYhdWrUQze+
|
|
||||||
-----END PRIVATE KEY-----
|
|
|
@ -1,5 +0,0 @@
|
||||||
-----BEGIN PRIVATE KEY-----
|
|
||||||
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgFkl0Lb18EGBeuwty
|
|
||||||
447E1ct+BdqMtKVGI7aUt50LYD+hRANCAASYVn329fWRD6137eYtAh1GHRP3Df1d
|
|
||||||
ID52ynz2fKNeHCdwlJ3iq+cuk1MBzd5cNhRNrmYaBClTVREBMq9tftnh
|
|
||||||
-----END PRIVATE KEY-----
|
|
|
@ -1,5 +0,0 @@
|
||||||
-----BEGIN PRIVATE KEY-----
|
|
||||||
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgt6Xk6IkIiKAA0rAe
|
|
||||||
WNy/VNzLBSvI7+vLE5VcLrBrVd+hRANCAASdx21EBJIivo2uzItVcxr7UfMlDQel
|
|
||||||
2MqU0/yy8QxxnSGjlU8ls/Pbh+sRH5Rmyp+H5jT82Ke+8NHc50QCXa+x
|
|
||||||
-----END PRIVATE KEY-----
|
|
|
@ -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-----
|
|
|
@ -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-----
|
|
|
@ -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-----
|
|
|
@ -1,5 +0,0 @@
|
||||||
-----BEGIN PRIVATE KEY-----
|
|
||||||
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgWLs2HBZ2qQy/PDB2
|
|
||||||
oA3vFS9pokW7ZC79u4gObbHXRMWhRANCAATKfrnGdalMerCK8nrQumxrjVm9W/WZ
|
|
||||||
ED0x6oJgtP3zOJUso0GEPtYREHr9/rshVr1X3ZEMfR7F7WpiWKJW34gk
|
|
||||||
-----END PRIVATE KEY-----
|
|
|
@ -1,5 +0,0 @@
|
||||||
-----BEGIN PRIVATE KEY-----
|
|
||||||
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg9rdgzutrnjzPO0Gv
|
|
||||||
0mhJe5R07+j5si4WltvkXyUF3uuhRANCAASGGwTxOjr3X/P/0oloqv9V1k9OFNmI
|
|
||||||
kcdukuCgUUgDVSV3V2+tGuzfwTF5tEurx7UtvgagOUOyulN7P3CwiI83
|
|
||||||
-----END PRIVATE KEY-----
|
|
|
@ -1,5 +0,0 @@
|
||||||
-----BEGIN PRIVATE KEY-----
|
|
||||||
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg/Yr6YCbqpeAIGzd7
|
|
||||||
sfB1R2k2XeogimO7NfTBzDmiZrihRANCAARAe4F30r0qqsiCBbeuBUWE5p7H3kDx
|
|
||||||
/BfpmEQIJtYYRF5QQ+fcXmUGd0tRoYdLWy4IWi50GfG6Uw6MQAF78PRV
|
|
||||||
-----END PRIVATE KEY-----
|
|
|
@ -1,5 +0,0 @@
|
||||||
-----BEGIN PRIVATE KEY-----
|
|
||||||
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgWqN6OjWwLFeqnclj
|
|
||||||
AS1RiVQ7VAupBWSyDYsCrmudOnyhRANCAATZABCeW1BtVavRQdks+aAyN895RSb5
|
|
||||||
ZkJwzag+kW9onJ0k4tHfipRXdbuDDaeD4QIFcAM2OpY4J2Zl72c8etT1
|
|
||||||
-----END PRIVATE KEY-----
|
|
|
@ -1,5 +0,0 @@
|
||||||
-----BEGIN PRIVATE KEY-----
|
|
||||||
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgAfEvqbarS+SZ9R2d
|
|
||||||
P1ZvJFjvAFVdIGv/MTAopwk7I2mhRANCAARFH5eb+NQxoCn3Vci9wNH85SlMMGRN
|
|
||||||
rwA6pr84roLQHzQKv2qeG/HUhcRKYJNG72pKLaJJ4b6sN82E0KiPwH5b
|
|
||||||
-----END PRIVATE KEY-----
|
|
|
@ -1,5 +0,0 @@
|
||||||
-----BEGIN PRIVATE KEY-----
|
|
||||||
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgU8nag5FLZ3C6Vqp3
|
|
||||||
ELK8TUL9o0KJWcQjwIiE4kGQytyhRANCAAQwzqHKFXuYHO55AEF/s5XrQXxMBbvn
|
|
||||||
rUmCbB80sMCEIB8q+hZMQ6HASBSAUi/ObMsBnuf0V8/Hwe8UiH2rR5/B
|
|
||||||
-----END PRIVATE KEY-----
|
|
|
@ -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-----
|
|
|
@ -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
Loading…
Reference in New Issue