Latest news about Bitcoin and all cryptocurrencies. Your daily crypto news habit.
Taste all the Features of the Hyperledger Fabric v1.4 Network
At Minimum Configuration of Multi-Channels with Different Participating Organizations Using CouchDB & Raft Ordering Service.System Architecture
Overview
This article covers all the features of Hyperledger Fabric v1.4 network at minimum configuration which is the “next step” of Building Your First Network. In this article we are showing a network with three organizations where two organizations have multi-peer and a setup of a two different channels each of which has different participating organizations established with Raft ordering service by using CouchDB as ledger database.
We assume you know all the key concepts of Hyperledger Fabric v1.4 and have sound knowledge on Building Your First Network.
This is the fast article covering all the features of Hyperledger Fabric v1.4 network with minimum configuration.
System Architecture
Here we have three organizations as Org1, Org2 & Org3 where Org1 & Org2 have 2 peers. There are two channels as channel1 & channel2.
Here channel1 consists with all the peers and all the organizations where channel2 consists with peer0.Org2 & peer0.Org3. By using raft ordering service we can use multiple Orderer and so we will use five Orderer. L1 is the ledger for Channel1 which is invoked by smart contact S1 and L2 is the ledger for Channel2 which is invoked by smart contact S2.
Step 1
First of all, prepare the prerequisites and after that you also need to Install Samples, Binaries and Docker Images. I assume you are now in home directory and run the following command:
curl -sSL http://bit.ly/2ysbOFE | bash -s
After completion you will see the directory ‘fabric-samples’, and the required docker images are already downloaded as well.
Caution: Samples, Binaries may change and so you need to edit some of your files according to that changes.
Step 2
First you need to create a new directory under home/fabric-samples named as mynetwork and then need to enter into that directory. From now we will run all our commands from home/fabric-samples/mynetwork directory.
cd fabric-samplesmkdir mynetworkcd mynetwork
To stop and delete all the previous docker containers, docker volumes, docker networks, script created files we need to run those commands:
#STOP AND DELETE THE DOCKER CONTAINERSdocker ps -aq | xargs -n 1 docker stopdocker ps -aq | xargs -n 1 docker rm -v
#DELETE THE OLD DOCKER VOLUMESdocker volume prune -f
#DELETE OLD DOCKER NETWORKSdocker network prune -f
#Remove all stopped containersdocker container prune -f
#Remove All Unused Objectsdocker system prune -fdocker system prune --volumes -f
#DELETE SCRIPT-CREATED FILESrm -rf channel-artifacts/*.block channel-artifacts/*.tx crypto-config
#if you get error in future you may also need to remove docker images using the commands given below:#docker rm -f $(docker ps -aq)#docker rmi -f $(docker images -q)
All our binaries are housed inside bin directory. First we need to create crypto-config.yaml file as given below:
We have to run the cryptogen tool which will create all the necessary certificates and keys inside crypto-config folder.
../bin/cryptogen generate --config=./crypto-config.yaml
Step 3
First we need to create a directory named channel-artifacts where we store scripts created files like ‘_.block’ or ‘_.tx’ .
Then we need to create configtx.yaml file at home/fabric-samples/mynetwork directory which hosts all the business network.
We need to create a new directory named channel-artifacts inside home/fabric-samples/mynetwork directory after that we need to tell the configtxgentool to look for the configtx.yaml file at our present working directory:
export FABRIC_CFG_PATH=$PWD
Finally we need to invoke the configtxgen tool to create the orderer genesis block for Raft ordering service. It will create genesis.block inside channel-artifacts directory.
../bin/configtxgen -profile SampleMultiNodeEtcdRaft -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block
Step 4
In this step we will create all the channel transactions artifacts. So we need to define some environment variables.
export CHANNEL_ONE_NAME=channel1
export CHANNEL_ONE_PROFILE=Channel1
export CHANNEL_TWO_NAME=channel2
export CHANNEL_TWO_PROFILE=Channel2
Now we need to create channel transaction artifacts which will create ‘_.tx’ files inside channel-artifacts directory and those contains the definitions of channels. The command for channel1 and channel2 are given respectively:
../bin/configtxgen -profile ${CHANNEL_ONE_PROFILE} -outputCreateChannelTx ./channel-artifacts/${CHANNEL_ONE_NAME}.tx -channelID $CHANNEL_ONE_NAME
../bin/configtxgen -profile ${CHANNEL_TWO_PROFILE} -outputCreateChannelTx ./channel-artifacts/${CHANNEL_TWO_NAME}.tx -channelID $CHANNEL_TWO_NAME
It is time to define anchor peers for channel1 which consists with three organizations.
../bin/configtxgen -profile ${CHANNEL_ONE_PROFILE} -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors_${CHANNEL_ONE_NAME}.tx -channelID $CHANNEL_ONE_NAME -asOrg Org1MSP
../bin/configtxgen -profile ${CHANNEL_ONE_PROFILE} -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors_${CHANNEL_ONE_NAME}.tx -channelID $CHANNEL_ONE_NAME -asOrg Org2MSP
../bin/configtxgen -profile ${CHANNEL_ONE_PROFILE} -outputAnchorPeersUpdate ./channel-artifacts/Org3MSPanchors_${CHANNEL_ONE_NAME}.tx -channelID $CHANNEL_ONE_NAME -asOrg Org3MSP
After that we need to define the anchor peers for Channel2 consists with two organizations .
../bin/configtxgen -profile ${CHANNEL_TWO_PROFILE} -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors_${CHANNEL_TWO_NAME}.tx -channelID $CHANNEL_TWO_NAME -asOrg Org2MSP
../bin/configtxgen -profile ${CHANNEL_TWO_PROFILE} -outputAnchorPeersUpdate ./channel-artifacts/Org3MSPanchors_${CHANNEL_TWO_NAME}.tx -channelID $CHANNEL_TWO_NAME -asOrg Org3MSP
Step 5
We need to create a directory named base inside home/fabric-samples/mynetwork directory. Inside base we need to create two files named as docker-compose-base.yaml & peer-base.yaml.
docker-compose-base.yaml file is given below:
peer-base.yaml file is given below:
Now we need to create a file named docker-compose-cli.yaml inside home/fabric-samples/mynetwork directory.
Hyperledger Fabric network is deployed in Docker containers and so we need to write those files.
We will store our ledger using CouchDB so we need to create docker-compose-couch.yaml file.
As we are using Raft ordering services we need to create docker-compose-etcdraft2.yaml file.
We also need to create .env file.
Finally we complete to write all our files and it is time to start the network with the following command:
docker-compose -f docker-compose-cli.yaml -f docker-compose-couch.yaml -f docker-compose-etcdraft2.yaml up -d
Step 6
Now we can create our channels and can add peers to the channels. To do that we need to enter into the CLI container.
docker exec -it cli bash
After entering into the CLI container we need to add channel1.
#environment variable for peer0.org1CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/mspCORE_PEER_ADDRESS=peer0.org1.example.com:7051CORE_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
#export channel nameexport CHANNEL_NAME=channel1
#creation of channel1peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel1.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
Now we need to join all peers of channel1.
#Now let’s join peer0.org1.example.com to the channel.
peer channel join -b channel1.block
#Rather than join every peer, we will simply join peer1.org1.example.com in our channel.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=peer1.org1.example.com:8051 CORE_PEER_LOCALMSPID="Org1MSP" CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls/ca.crt peer channel join -b channel1.block
#Rather than join every peer, we will simply join peer0.org2.example.com so that we can properly update the anchor peer definitions in our channel.
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp CORE_PEER_ADDRESS=peer0.org2.example.com:9051 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 peer channel join -b channel1.block
#Rather than join every peer, we will simply join peer1.org2.example.com in our channel.CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp CORE_PEER_ADDRESS=peer1.org2.example.com:10051 CORE_PEER_LOCALMSPID="Org2MSP" CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls/ca.crt peer channel join -b channel1.block
#Rather than join every peer, we will simply join peer0.org3.example.com so that we can properly update the anchor peer definitions in our channel.
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.example.com/users/Admin@org3.example.com/msp CORE_PEER_ADDRESS=peer0.org3.example.com:11051 CORE_PEER_LOCALMSPID="Org3MSP" CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.example.com/peers/peer0.org3.example.com/tls/ca.crt peer channel join -b channel1.block
Now we need to update the channel definition to define the anchor peers for channel1.
#Update the channel definition to define the anchor peer for Org1 as peer0.org1.example.com:
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 peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Org1MSPanchors_channel1.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
#Now update the channel definition to define the anchor peer for Org2 as peer0.org2.example.com.
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp CORE_PEER_ADDRESS=peer0.org2.example.com:9051 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 peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Org2MSPanchors_channel1.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
#Now update the channel definition to define the anchor peer for Org3 as peer0.org3.example.com.
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.example.com/users/Admin@org3.example.com/msp CORE_PEER_ADDRESS=peer0.org3.example.com:11051 CORE_PEER_LOCALMSPID="Org3MSP" CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.example.com/peers/peer0.org3.example.com/tls/ca.crt peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Org3MSPanchors_channel1.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
We need to follow the same procedures for channel2 and all commands are given below:
#environment variable for peer0.org2CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/mspCORE_PEER_ADDRESS=peer0.org2.example.com:9051CORE_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
#export channel nameexport CHANNEL_NAME=channel2
#creation of channel2peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel2.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
#Now let’s join peer0.org1.example.com to the channel.
peer channel join -b channel2.block
#Rather than join every peer, we will simply join peer0.org3.example.com so that we can properly update the anchor peer definitions in our channel.
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.example.com/users/Admin@org3.example.com/msp CORE_PEER_ADDRESS=peer0.org3.example.com:11051 CORE_PEER_LOCALMSPID="Org3MSP" CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.example.com/peers/peer0.org3.example.com/tls/ca.crt peer channel join -b channel2.block
#Now update the channel definition to define the anchor peer for Org2 as peer0.org2.example.com.
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp CORE_PEER_ADDRESS=peer0.org2.example.com:7051 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 peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Org2MSPanchors_channel2.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
#Now update the channel definition to define the anchor peer for Org3 as peer0.org3.example.com.
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.example.com/users/Admin@org3.example.com/msp CORE_PEER_ADDRESS=peer0.org3.example.com:7051 CORE_PEER_LOCALMSPID="Org3MSP" CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.example.com/peers/peer0.org3.example.com/tls/ca.crt peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Org3MSPanchors_channel2.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
Step 6
We will install two different smart contracts into two channels.
We will install smart contract ‘mycc’ (S1) in channel1 and will issue the install command against every peer. By using go language the smart contract is written under home/fabric-samples/chaincode/chaincode_example02 directory.
#Applications interact with the blockchain ledger through chaincode. As such we need to install the chaincode on every peer that will execute and endorse our transactions, and then instantiate the chaincode on the channel.#Modify the following four environment variables to issue the install command against peer0 in Org1:CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/mspCORE_PEER_ADDRESS=peer0.org1.example.com:7051CORE_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
# this installs the Go chaincode. For go chaincode -p takes the relative path from $GOPATH/srcpeer chaincode install -n mycc -v 1.0 -p github.com/chaincode/chaincode_example02/go/
#Modify the following four environment variables to issue the install command against peer1 in Org1:CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/mspCORE_PEER_ADDRESS=peer1.org1.example.com:8051CORE_PEER_LOCALMSPID="Org1MSP"CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls/ca.crt
#Now install the sample Go chaincode onto a peer1 in Org1peer chaincode install -n mycc -v 1.0 -p github.com/chaincode/chaincode_example02/go/
#Modify the following four environment variables to issue the install command against peer0 in Org2:
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/mspCORE_PEER_ADDRESS=peer0.org2.example.com:9051CORE_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
#Now install the sample Go chaincode onto a peer0 in Org2peer chaincode install -n mycc -v 1.0 -p github.com/chaincode/chaincode_example02/go/
#Modify the following four environment variables to issue the install command against peer1 in Org2:
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/mspCORE_PEER_ADDRESS=peer1.org2.example.com:10051CORE_PEER_LOCALMSPID="Org2MSP"CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls/ca.crt
#17. Now install the sample Go chaincode onto a peer1 in Org2.
peer chaincode install -n mycc -v 1.0 -p github.com/chaincode/chaincode_example02/go/
#Modify the following four environment variables to issue the install command against peer0 in Org3:
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.example.com/users/Admin@org3.example.com/mspCORE_PEER_ADDRESS=peer0.org3.example.com:11051CORE_PEER_LOCALMSPID="Org3MSP"CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.example.com/peers/peer0.org3.example.com/tls/ca.crt
#17.1 Now install the Go chaincode onto a peer0 in Org3.
peer chaincode install -n mycc -v 1.0 -p github.com/chaincode/chaincode_example02/go/
We will install smart contract ‘marbles’ (S2) in channel2 and will issue the install command against every peer. By using go language the smart contract is written under home/fabric-samples/chaincode/marbles02 directory.
#Modify the following four environment variables to issue the install command against peer0 in Org2:
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/mspCORE_PEER_ADDRESS=peer0.org2.example.com:9051CORE_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
#Now install the sample Go chaincode onto a peer0 in Org2peer chaincode install -n marbles -v 1.0 -p github.com/chaincode/marbles02/go
#Modify the following four environment variables to issue the install command against peer0 in Org3:
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.example.com/users/Admin@org3.example.com/mspCORE_PEER_ADDRESS=peer0.org3.example.com:11051CORE_PEER_LOCALMSPID="Org3MSP"CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.example.com/peers/peer0.org3.example.com/tls/ca.crt
#Now install the Go chaincode onto a peer0 in Org3.
peer chaincode install -n marbles -v 1.0 -p github.com/chaincode/marbles02/go
After installing , we need to instantiate our chaincode.
To instantiate chaincode ‘mycc’ (S1) in channel1 we need to use follwing commands:
#environment variable for peer0.org1CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/mspCORE_PEER_ADDRESS=peer0.org1.example.com:7051CORE_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
#export channel nameexport CHANNEL_NAME=channel1
#instantiatepeer chaincode instantiate -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n mycc -v 1.0 -c '{"Args":["init","a", "100", "b","200"]}' -P "OR ('Org1MSP.peer', 'Org2MSP.peer', 'Org3MSP.peer')"
To instantiate chaincode ‘marbles’ (S2) in channel2 we need to use follwing commands:
#environment variable for peer0.org2CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/mspCORE_PEER_ADDRESS=peer0.org2.example.com:9051CORE_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
#export channel nameexport CHANNEL_NAME=channel2
#instantiatepeer chaincode instantiate -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n marbles -v 1.0 -c '{"Args":["init"]}' -P "OR ('Org2MSP.peer','Org3MSP.peer')"
Step 7
We completed all the configarational setup now we are ready to us our network.
First we try to use channel1 by using following commands:
#environmental variable for peer0.org1CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/mspCORE_PEER_ADDRESS=peer0.org1.example.com:7051CORE_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
#export channel nameexport CHANNEL_NAME=channel1
#querypeer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","b"]}'
#invokingpeer chaincode invoke -o orderer.example.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n mycc --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt -c '{"Args":["invoke","a","b","10"]}'
#environmental variable for peer0.org2CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/mspCORE_PEER_ADDRESS=peer0.org2.example.com:9051CORE_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
#export channel nameexport CHANNEL_NAME=channel1
#querypeer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","b"]}'
Now we try to use channel2 by using following commands:
#environmental variable for peer0.org2CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/mspCORE_PEER_ADDRESS=peer0.org2.example.com:9051CORE_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
#export channel nameexport CHANNEL_NAME=channel2
#invokingpeer chaincode invoke -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.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 --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.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 --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.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 --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n marbles -c '{"Args":["transferMarble","marble2","jerry"]}'
peer chaincode invoke -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n marbles -c '{"Args":["transferMarblesBasedOnColor","blue","jerry"]}'
#environmental variable for peer0.org3CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.example.com/users/Admin@org3.example.com/mspCORE_PEER_ADDRESS=peer0.org3.example.com:11051CORE_PEER_LOCALMSPID="Org3MSP"CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.example.com/peers/peer0.org3.example.com/tls/ca.crt
#export channel nameexport CHANNEL_NAME=channel2
#invoking & querypeer chaincode query -C $CHANNEL_NAME -n marbles -c '{"Args":["readMarble","marble2"]}'
peer chaincode query -C $CHANNEL_NAME -n marbles -c '{"Args":["getHistoryForMarble","marble1"]}'
peer chaincode query -C $CHANNEL_NAME -n marbles -c '{"Args":["queryMarblesByOwner","jerry"]}'
peer chaincode invoke -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n marbles -c '{"Args":["delete","marble1"]}'
Step 8
After finishing it is a good practice to clear all setup by using following commands:
#STOP AND DELETE THE DOCKER CONTAINERSdocker ps -aq | xargs -n 1 docker stopdocker ps -aq | xargs -n 1 docker rm -v
#DELETE THE OLD DOCKER VOLUMESdocker volume prune -f#DELETE OLD DOCKER NETWORKSdocker network prune -f
#Remove all stopped containersdocker container prune -f#Remove All Unused Objectsdocker system prune -fdocker system prune --volumes -f
#DELETE SCRIPT-CREATED FILESrm -rf channel-artifacts/*.block channel-artifacts/*.tx crypto-config
#if you get error in future you may also need to remove docker images using the commands given below:#docker rm -f $(docker ps -aq)#docker rmi -f $(docker images -q)
Summary:
In this article we focus to taste all the features of Hyperledger Fabric v1.4 network at minimum configuration. We hope it will be very helpfull for you and if you will face some problems please troubleshooting those. My colleagues at BJIT group are helping me to write this article.
Taste all the features of Hyperledger Fabric v1.4 was originally published in Hacker Noon on Medium, where people are continuing the conversation by highlighting and responding to this story.
Disclaimer
The views and opinions expressed in this article are solely those of the authors and do not reflect the views of Bitcoin Insider. Every investment and trading move involves risk - this is especially true for cryptocurrencies given their volatility. We strongly advise our readers to conduct their own research when making a decision.