Hyperledger Fabric Chaincode
Deployment (Latest Version)
This guide provides a fully working setup for deploying and testing a simple key-value
chaincode in Hyperledger Fabric (v2.5+).
Step 1: Prerequisites
Docker and Docker Compose installed.
Fabric samples downloaded from https://github.com/hyperledger/fabric-samples
Go (1.18+) installed for chaincode development.
Step 2: Cleanup
cd fabric-samples/test-network
./network.sh down
docker system prune -af --volumes
Step 3: Start Network
./network.sh up createChannel -ca
Step 4: Prepare Chaincode
mkdir -p ../chaincode/freshkv/go
cd ../chaincode/freshkv/go
go mod init freshkv
go get github.com/hyperledger/fabric-contract-api-go/contractapi
Create freshkv.go with Put/Get methods
Run:
go mod tidy
Step 5: Prepare Chaincode
cd ~/fabric-samples/test-network
./network.sh down
./network.sh up createChannel -ca
Step 6: Package Chaincode
cd ~/fabric-samples/test-network
set peer path
export PATH=${PWD}/../bin:$PATH
export FABRIC_CFG_PATH=$PWD/../config/
peer lifecycle chaincode package freshkv.tar.gz \
--path ../chaincode/freshkv/go \
--lang golang --label freshkv_1
Step 7: Install Chaincode on Org1 and Org2
Set Org1 environment and run install
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_ADDRESS=localhost:7051
export CORE_PEER_TLS_ENABLED=true
export
CORE_PEER_MSPCONFIGPATH=$PWD/organizations/peerOrganizations/org1.example
.com/users/[email protected]/msp
export
CORE_PEER_TLS_ROOTCERT_FILE=$PWD/organizations/peerOrganizations/org1.exam
ple.com/peers/peer0.org1.example.com/tls/ca.crt
peer lifecycle chaincode install freshkv.tar.gz
Set Org2 environment and run install
export CORE_PEER_LOCALMSPID="Org2MSP"
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_ADDRESS=localhost:9051
export
CORE_PEER_MSPCONFIGPATH=$PWD/organizations/peerOrganizations/org2.example
.com/users/[email protected]/msp
export
CORE_PEER_TLS_ROOTCERT_FILE=$PWD/organizations/peerOrganizations/org2.exam
ple.com/peers/peer0.org2.example.com/tls/ca.crt
peer lifecycle chaincode install freshkv.tar.gz
Step 8: Query Installed Chaincode
peer lifecycle chaincode queryinstalled
Step 9: Approve Chaincode Definition
Approve for Org 1:
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_ADDRESS=localhost:7051
export CORE_PEER_TLS_ENABLED=true
export
CORE_PEER_MSPCONFIGPATH=$PWD/organizations/peerOrganizations/org1.example.co
m/users/[email protected]/msp
export
CORE_PEER_TLS_ROOTCERT_FILE=$PWD/organizations/peerOrganizations/org1.example.
com/peers/peer0.org1.example.com/tls/ca.crt
peer lifecycle chaincode approveformyorg \
--channelID mychannel \
--name freshkv \
--version 1.0 \
--package-id freshkv_1:<your_package_id> \
--sequence 1 \
--signature-policy "OR('Org1MSP.peer','Org2MSP.peer')" \
--tls \
--orderer localhost:7050 \
--ordererTLSHostnameOverride orderer.example.com \
--cafile
"$PWD/organizations/ordererOrganizations/example.com/orderers/orderer.example.com
/msp/tlscacerts/tlsca.example.com-cert.pem"
Now Org 2 , approval
export CORE_PEER_LOCALMSPID="Org2MSP"
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_ADDRESS=localhost:9051
export
CORE_PEER_MSPCONFIGPATH=$PWD/organizations/peerOrganizations/org2.example.co
m/users/[email protected]/msp
export
CORE_PEER_TLS_ROOTCERT_FILE=$PWD/organizations/peerOrganizations/org2.example.
com/peers/peer0.org2.example.com/tls/ca.crt
peer lifecycle chaincode approveformyorg \
--channelID mychannel \
--name freshkv \
--version 1.0 \
--package-id freshkv_1:<your_package_id> \
--sequence 1 \
--signature-policy "OR('Org1MSP.peer','Org2MSP.peer')" \
--tls \
--orderer localhost:7050 \
--ordererTLSHostnameOverride orderer.example.com \
--cafile
"$PWD/organizations/ordererOrganizations/example.com/orderers/orderer.example.com
/msp/tlscacerts/tlsca.example.com-cert.pem"
Step 10: Commit Chaincode
peer lifecycle chaincode commit \
--channelID mychannel \
--name freshkv \
--version 1.0 \
--sequence 1 \
--signature-policy "OR('Org1MSP.peer','Org2MSP.peer')" \
--tls \
--orderer localhost:7050 \
--ordererTLSHostnameOverride orderer.example.com \
--cafile
"$PWD/organizations/ordererOrganizations/example.com/orderers/orderer.example.com
/msp/tlscacerts/tlsca.example.com-cert.pem" \
--peerAddresses localhost:7051 \
--tlsRootCertFiles
"$PWD/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.co
m/tls/ca.crt" \
--peerAddresses localhost:9051 \
--tlsRootCertFiles
"$PWD/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.co
m/tls/ca.crt"
Step 12: Invoke Chaincode
Set terminal to Org 1:
export CORE_PEER_LOCALMSPID="Org2MSP"
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_ADDRESS=localhost:9051
export
CORE_PEER_MSPCONFIGPATH=$PWD/organizations/peerOrganizations/org2.example.co
m/users/[email protected]/msp
export
CORE_PEER_TLS_ROOTCERT_FILE=$PWD/organizations/peerOrganizations/org2.example.
com/peers/peer0.org2.example.com/tls/ca.crt
Invoke the chaincode
peer chaincode invoke -o localhost:7050 \
--ordererTLSHostnameOverride orderer.example.com \
--tls \
--cafile
"$PWD/organizations/ordererOrganizations/example.com/orderers/orderer.example.com
/msp/tlscacerts/tlsca.example.com-cert.pem" \
--peerAddresses localhost:7051 \
--tlsRootCertFiles
"$PWD/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.co
m/tls/ca.crt" \
-C mychannel -n freshkv --waitForEvent \
-c '{"function":"InitLedger","Args":[]}'
Step 13: Query Chaincode
peer chaincode query -C mychannel -n freshkv -c '{"function":"GetAllKeys","Args":[]}'
peer chaincode invoke -o localhost:7050 \
--ordererTLSHostnameOverride orderer.example.com \
--tls \
--cafile
"$PWD/organizations/ordererOrganizations/example.com/orderers/orderer.example.com
/msp/tlscacerts/tlsca.example.com-cert.pem" \
--peerAddresses localhost:7051 \
--tlsRootCertFiles
"$PWD/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.co
m/tls/ca.crt" \
-C mychannel -n freshkv --waitForEvent \
-c '{"function":"Put","Args":["user1","Alice"]}'
peer chaincode query -C mychannel -n freshkv -c '{"function":"Get","Args":["user1"]}'
peer chaincode query -C mychannel -n freshkv -c '{"function":"GetHistoryForKey","Args":
["user1"]}'
peer chaincode invoke -o localhost:7050 \
--ordererTLSHostnameOverride orderer.example.com \
--tls \
--cafile
"$PWD/organizations/ordererOrganizations/example.com/orderers/orderer.example.com
/msp/tlscacerts/tlsca.example.com-cert.pem" \
--peerAddresses localhost:7051 \
--tlsRootCertFiles
"$PWD/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.co
m/tls/ca.crt" \
-C mychannel -n freshkv --waitForEvent \
-c '{"function":"Put","Args":["user1","Bob"]}'
peer chaincode query -C mychannel -n freshkv -c '{"function":"GetHistoryForKey","Args":
["user1"]}'