/Hyperledger_Private_Data

My lab when Private Data with Hyperledger Fabric

Primary LanguageShell

Hyperledger Topology different channels

Network is:

  • 6 members ( Airlines [BA,EZ] Ansp [NATS] Airports [LHR, BHX, MAN]

  • No system channel

  • 2 channels UK_Airspace [BA, EZ, NATS] --> consensus is ba, ez and nats UK_Airports [BA, EZ, LHR, BHX, MAN] --> consensus is lhr,bhx and man

  • 2 chaincodes / dlt(s) FPL (flight planning) OPS (Airport operations)

Test is to have OPS cc able to query some data frpm FPL dlt

Type of databases: State Private Implicit

👁️‍🗨️ Note: Update different term-x files and paths to reflect your own environment

rm -rf /tmp/hyperledger/*
docker volume prune
docker network prune

Build the network

  docker-compose up -d rca-ba rca-ez rca-nats rca-lhr rca-bhx rca-man ca-tls
 ./allCAnReg.sh
 ./enrollAllOrgs.sh
  docker-compose up -d

Build the Channel channelairspace [BA, EZ, NATS]

Join the peer(s)

source term-channels
source term-ba

configtxgen -profile ${CHANNEL_PROFILE_1} -configPath ${PWD} -outputBlock ${CHANNEL_NAME_1}.block -channelID ${CHANNEL_NAME_1}
source term-ba
osnadmin channel join --channelID ${CHANNEL_NAME_1} --config-block ${CHANNEL_NAME_1}.block -o $CORE_ORDERER_ADDRESS --ca-file $ORDERER_CA --client-cert $ADMIN_TLS_CERTFILE  --client-key $ADMIN_TLS_KEYFILE

Output is: Status: 201 { "name": "channelairspace", "url": "/participation/v1/channels/channelairspace", "consensusRelation": "consenter", "status": "active", "height": 1 }

And join the ba peer to the channel channelairspace

peer channel join -b ${CHANNEL_NAME_1}.block

Repeat this for ez and nats

Package FPL chaincode

FPL functions as follow:

	if fn == "set" {
		result, err = set(stub, args)
	} else if fn == "setFPL" {
		result, err = setFPL(stub, args)
	} else if fn == "getFPL" {
		result, err = getFPL(stub, args)
	} else if fn == "getFPLasBA" {
		result, err = getFPLasBA(stub, args)
	} else if fn == "getFPLasEZ" {
		result, err = getFPLasEZ(stub, args)
	} else { // assume 'get' even if fn is nil
		result, err = get(stub, args)
	}
	if err != nil {
		return shim.Error(err.Error())
	}

Package chaincode as below

peer lifecycle chaincode package fpl.tar.gz --path /Users/arnaud/BlockChain/FabricLabs/Hyperledger_Private_Data/fpl --label fpl_1

Install fpl chaincode on ba, ez and nats peers

source term-ba
peer lifecycle chaincode install fpl.tar.gz

Repeat this for ez and nats

Approve Chaincode

package-id is an output of chaincode installation above

source term-ba

peer lifecycle chaincode approveformyorg --tls --cafile $ORDERER_CA -o localhost:7050 --channelID $CHANNEL_NAME_1 --name fplcc --version 1 --init-required --sequence 1 --waitForEvent --signature-policy "OR ('baMSP.peer','natsMSP.peer','ezMSP.peer')" --collections-config collection_airspace.json --package-id fpl_1:c18af9a084a4b9baa6911ea40cb5501d1ebd9691403e4e063ef475a47370168a

Repeat this for ez and nats

Note: --signature-policy "OR ('baMSP.peer','natsMSP.peer','ezMSP.peer')" to supersede the endorsement policy to have only one member to invoke a transaction

Commit Chaincode

source term-ba

peer lifecycle chaincode commit --tls --cafile $ORDERER_CA -o localhost:7050 --peerAddresses $CORE_PEER_ADDRESS --tlsRootCertFiles $CORE_PEER_TLS_ROOTCERT_FILE --peerAddresses localhost:9051 --tlsRootCertFiles /tmp/hyperledger/nats/peer1/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem --peerAddresses localhost:8051 --tlsRootCertFiles /tmp/hyperledger/ez/peer1/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem --channelID $CHANNEL_NAME_1 --name fplcc --version 1 --sequence 1  --init-required --signature-policy "OR ('baMSP.peer','natsMSP.peer','ezMSP.peer')" --collections-config collection_airspace.json

And 3 containers for chaincode are started

Init Chaincode

peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer1-ba --tls true --cafile $ORDERER_CA --peerAddresses localhost:7051 --tlsRootCertFiles /tmp/hyperledger/ba/peer1/assets/tls-ca/tls-ca-cert.pem --channelID $CHANNEL_NAME_1 --name fplcc --isInit -c '{"Args":["2021-08-04ZAGBA0849","Created"]}' 

That will create the state database on each nodes

peer chaincode invoke -o localhost:9050 --ordererTLSHostnameOverride orderer1-nats --tls true --cafile $ORDERER_CA --peerAddresses localhost:9051 --tlsRootCertFiles /tmp/hyperledger/nats/peer1/assets/tls-ca/tls-ca-cert.pem  --channelID $CHANNEL_NAME_1 --name fplcc -c '{"Args":["setFPL","2021-10-03ZAGBA0876","flight plan public RouteText:N0441F380  ","flight plan private RouteText:PODET DCT INGID DCT SIMBA","ez"]}'

That will create private and/or hash databases as referred in the private collection definition

       "name": "natsba",
       "policy": "OR('baMSP.member', 'natsMSP.member')",

        "name": "natsez",
        "policy": "OR('ezMSP.member', 'natsMSP.member')",

Observe Databases

As per docker-compose.yaml definition (username admin password adminpw)

http://localhost:7984/_utils/#/_all_dbs for ba http://localhost:8984/_utils/#/_all_dbs for ez http://localhost:9984/_utils/#/_all_dbs for nats

Build the Channel channelairports [BA, EZ, LHR, BHX, MAN]

Join the peer(s)

source term-channels
source term-lhr

configtxgen -profile ${CHANNEL_PROFILE_2} -configPath ${PWD} -outputBlock ${CHANNEL_NAME_2}.block -channelID ${CHANNEL_NAME_2}
source term-lhr
osnadmin channel join --channelID ${CHANNEL_NAME_2} --config-block ${CHANNEL_NAME_2}.block -o $CORE_ORDERER_ADDRESS --ca-file $ORDERER_CA --client-cert $ADMIN_TLS_CERTFILE  --client-key $ADMIN_TLS_KEYFILE

And join the ba peer to the channel channelairports

peer channel join -b ${CHANNEL_NAME_2}.block

Repeat this for bhx, man, ba and ez

Package Fchain chaincode

Fchain functions as follow:

	if fn == "set" {
		result, err = set(stub, args)
	} else if fn == "getFPLpublic" {
		result, err = getFPLpublic(stub, args)
	} else if fn == "getFPLprivateasBA" {
		result, err = getFPLprivateasBA(stub, args)
	} else if fn == "getFPLprivateasEZ" {
		result, err = getFPLprivateasBA(stub, args)
	} else { // assume 'get' even if fn is nil
		result, err = get(stub, args)
	}

Package chaincode as below

peer lifecycle chaincode package fchain.tar.gz --path /Users/arnaud/BlockChain/FabricLabs/Hyperledger_Private_Data/fchain --label fchain_1

Install fchain chaincode on lhr, bhx, man, ba and ez peers

source term-lhr
peer lifecycle chaincode install fchain.tar.gz

Repeat this for bhx, man,ba and ez.

Approve Chaincode

package-id is an output of chaincode installation above

source term-lhr

peer lifecycle chaincode approveformyorg --tls --cafile $ORDERER_CA -o localhost:10050 --channelID $CHANNEL_NAME_2 --name fchaincc --version 1 --sequence 1  --init-required --waitForEvent --signature-policy "OR ('baMSP.peer','lhrMSP.peer','ezMSP.peer','bhxMSP.peer','manMSP.peer')" --package-id fchain_2:072c8761a8b663965b98b4d95e1803ead880a9d9c566e55f58d4195154e1e2f0

Repeat this for bhx, man,ba and ez.

Commit Chaincode

source term-lhr

peer lifecycle chaincode commit --tls --cafile $ORDERER_CA -o localhost:10050 --peerAddresses $CORE_PEER_ADDRESS --tlsRootCertFiles $CORE_PEER_TLS_ROOTCERT_FILE --peerAddresses localhost:11051 --tlsRootCertFiles /tmp/hyperledger/bhx/peer1/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem --peerAddresses localhost:12051 --tlsRootCertFiles /tmp/hyperledger/man/peer1/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem --channelID $CHANNEL_NAME_2 --name fchaincc --version 1 --sequence 1  --init-required  --signature-policy "OR ('baMSP.peer','lhrMSP.peer','ezMSP.peer','bhxMSP.peer','manMSP.peer')"

And 3 containers for chaincode are started

Init Chaincode

peer chaincode invoke -o localhost:10050 --ordererTLSHostnameOverride orderer1-lhr --tls true --cafile $ORDERER_CA --peerAddresses localhost:10051 --tlsRootCertFiles /tmp/hyperledger/lhr/peer1/assets/tls-ca/tls-ca-cert.pem  --channelID $CHANNEL_NAME_2 --name fchaincc --isInit -c '{"Args":["2021-09-04ZAGBA0872","Created"]}'
peer chaincode query --channelID $CHANNEL_NAME_2 --name fchaincc -c '{"Args":["getFPLpublic","2021-10-03ZAGBA0872"]}'

Inter channels test

🛫 As NATS create a flight plan for BA with a public part[N0441F380 ] , a private part [INGIDIMBA] limited to BA & NATS and a restricted part [SIMBA] limited to NATS This use the chaincode fpl hosted on channel 'channelairspace'

>>>source term-nats 
>>>peer chaincode invoke -o localhost:9050 --ordererTLSHostnameOverride orderer1-nats --tls true --cafile $ORDERER_CA --peerAddresses localhost:9051 --tlsRootCertFiles /tmp/hyperledger/nats/peer1/assets/tls-ca/tls-ca-cert.pem  --channelID $CHANNEL_NAME_1 --name fplcc -c '{"Args":["setFPL","2021-10-03ZAGBA0800","flight plan Public:N0441F380  ","flight plan Private:INGIDIMBA","flight plan Restricted:SIMBA","ba"]}'

Output is:

2021-09-28 10:05:15.688 CEST [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Chaincode invoke successful. result: status:200 payload:"The asset is 2021-10-03ZAGBA0800 where public info is flight plan Public:N0441F380 and private info is flight plan Private:INGIDIMBAvisible only from nats & ba and restricted info is flight plan Restricted:SIMBA visible only from nats."

🛬 From BA node using chanicode fchain hosted on channel 'channelairports', query public and private informations for flight 2021-10-03ZAGBA080 and potentially update the asset on fchain@channelairports

>>>source term-ba                                                                                                       
>>>peer chaincode query --channelID $CHANNEL_NAME_2 --name fchaincc -c '{"Args":["getFPLpublic","2021-10-03ZAGBA0800"]}'

Output is: flight plan Public:N0441F380

>>>peer chaincode query --channelID $CHANNEL_NAME_2 --name fchaincc -c '{"Args":["getFPLprivateasBA","2021-10-03ZAGBA0800"]}'

Output is: Public info is flight plan Public:N0441F380 | Private info only visible by BA & NATS is flight plan Private:INGIDIMBA