
mkdir /home/blockchain
install docker
cd /home/blockchain.
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
start docker
systemctl start docker
enable docker
systemctl enable docker
install docker-compose
curl -SL https://github.com/docker/compose/releases/download/v2.18.1/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
create symbolic link
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
실행권한 부여
chmod a+x /usr/local/bin/docker-compose
cd /home/blockchain
curl -sSLO https://raw.githubusercontent.com/hyperledger/fabric/main/scripts/install-fabric.sh
chmod +x install-fabric.sh
./install-fabric.sh
yum install -y epel-release
yum install -y jq
환경변수 등록
vi /etc/profile
# 아래 내용 추가
GO_HOME='/usr/local/go'
PATH=$GO_HOME/bin:$PATH
export GO_HOME PATH
source /etc/profile
확인
go version
root권한으로 실행 하여도 되나 일반사용자를 생성해서 실행해보기로 함
# 사용자 생성
adduser hyperledger_admin
# docker 사용을 위해
usermod -aG docker hyperledger_admin
newgrp docker
master node
kopo-network-1
tar xvf kopo-network-1.tar
slave1 node
kopo-network-2
asset-transfer-basic-2
tar xvf kopo-network-2.tar
tar xvf asset-transfer-basic-2.tar
slave2 node
kopo-network-3
asset-transfer-basic-3
tar xvf kopo-network-3.tar
tar xvf asset-transfer-basic-2.tar
master node
hostnamectl set-hostname master
slave1 node
hostnamectl set-hostname slave1
slave2 node
hostnamectl set-hostname slave2
master node
docker swarm init --advertise-addr 192.168.0.240
# 아래와 같은 결과 확인
Swarm initialized: current node (1ahdy3bi39lkdvsslz1d8ndwv) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-5plo9x3po1gvq6a8k5jobjcb5klwe95f7yfb86gjw4sqzv9we4-0u6wqzg041w7imyfu98k11sgj 192.168.0.240:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
# docker network create
docker network create --attachable --driver overlay fmd-network
slave1, slave2 node
# 위에서 복사해서 아래와 같이 명령을 붙여넣는다.
docker swarm join --token SWMTKN-1-5plo9x3po1gvq6a8k5jobjcb5klwe95f7yfb86gjw4sqzv9we4-0u6wqzg041w7imyfu98k11sgj 192.168.0.240:2377
# 아래와 같은 결과 확인
This node joined a swarm as a worker.
master node
docker node promote slave1
docker node promote slave2
# 아래와 같은 결과 확인
Node slave1 promoted to a manager in the swarm.
Node slave2 promoted to a manager in the swarm.
확인
docker node ls
# 아래와 같은 결과 확인
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
dl4jhp8xd6nvnjbfvgqwtyjuf blockchain-slave1-dev.novalocal Ready Active 26.0.0
721iwr9q3wdn5c9kcap3p53qh blockchain-slave2-dev.novalocal Ready Active 26.0.0
1ahdy3bi39lkdvsslz1d8ndwv * master Ready Active Leader 26.0.0
master node
cd /home/blockchain/kopo-network-1
# 기존 파일 삭제를 위함
./network.sh down
# 인증서를 생성
./network.sh up -ca
vi /home/blockchain/fabric-samples/kopo-network-1/organizations/fabric-ca/registerEnroll.sh
slave1 node
cd /home/blockchain/kopo-network-2
# 기존 인증서 삭제를 위함
rm -rf organization
slave2 node
cd /home/blockchain/kopo-network-3
# 기존 인증서 삭제를 위함
rm -rf organization
master node
# master node에서 생성한 인증서파일이 root권한으로 되어있다. 그래서 그 부분을 hyperledger_admin으로 전부 변경해주어야 한다.
cd /home/blockchaiin/kopo-network-1
chown -R organization
slave1 node, slave2 node
master node
cd /home/blockchain/fabric-samples/kopo-network-1/compose
vi compose-test-net.yaml
# 52,53번 라인을 수정해준다.
52 #- ../bkupOrderer:/var/hyperledger/production/orderer
53 - orderer.fmd.com:/var/hyperledger/production/orderer
cd /home/blockchain/fabric-samples/kopo-network1/
./kopo-network.sh up
slave1 slave2 node
cd /home/blockchain/fabric-samples/kopo-network1/
./kopo-network.sh up
master node에서 channel 생성을 위한 설정파일 확인
# 아래 파일을 열어보면 확인이 가능하다.
# 현재는 orderer 5개로 구성된 파일이 작성되어있음
# 사내 서버에는 3대의 node에 orderer를 3개로 구성예정이니 나머지 2개를 삭제해준다.
vi /home/blockchain/fabric-samples/kopo-network-1/configtx/configtx.yaml
# 기존파일
210 Addresses:
211 - orderer.fmd.com:7050
212 - orderer2.fmd.com:8050
213 - orderer3.fmd.com:9050
214 - orderer4.fmd.com:10050
215 - orderer5.fmd.com:11050
216
217 EtcdRaft:
218 Consenters:
219 - Host: orderer.fmd.com
220 Port: 7050
221 ClientTLSCert: ../organizations/ordererOrganizations/fmd.com/orderers/orderer.fmd.com/tls/server.crt
222 ServerTLSCert: ../organizations/ordererOrganizations/fmd.com/orderers/orderer.fmd.com/tls/server.crt
223 - Host: orderer2.fmd.com
224 Port: 8050
225 ClientTLSCert: ../organizations/ordererOrganizations/fmd.com/orderers/orderer2.fmd.com/tls/server.crt
226 ServerTLSCert: ../organizations/ordererOrganizations/fmd.com/orderers/orderer2.fmd.com/tls/server.crt
227 - Host: orderer3.fmd.com
228 Port: 9050
229 ClientTLSCert: ../organizations/ordererOrganizations/fmd.com/orderers/orderer3.fmd.com/tls/server.crt
230 ServerTLSCert: ../organizations/ordererOrganizations/fmd.com/orderers/orderer3.fmd.com/tls/server.crt
231 - Host: orderer4.fmd.com
232 Port: 10050
233 ClientTLSCert: ../organizations/ordererOrganizations/fmd.com/orderers/orderer4.fmd.com/tls/server.crt
234 ServerTLSCert: ../organizations/ordererOrganizations/fmd.com/orderers/orderer4.fmd.com/tls/server.crt
235 - Host: orderer5.fmd.com
236 Port: 11050
237 ClientTLSCert: ../organizations/ordererOrganizations/fmd.com/orderers/orderer5.fmd.com/tls/server.crt
238 ServerTLSCert: ../organizations/ordererOrganizations/fmd.com/orderers/orderer5.fmd.com/tls/server.crt
# 수정파일
210 Addresses:
211 - orderer.fmd.com:7050
212 - orderer2.fmd.com:8050
213 - orderer3.fmd.com:9050
214
215 EtcdRaft:
216 Consenters:
217 - Host: orderer.fmd.com
218 Port: 7050
219 ClientTLSCert: ../organizations/ordererOrganizations/fmd.com/orderers/orderer.fmd.com/tls/server.crt
220 ServerTLSCert: ../organizations/ordererOrganizations/fmd.com/orderers/orderer.fmd.com/tls/server.crt
221 - Host: orderer2.fmd.com
222 Port: 8050
223 ClientTLSCert: ../organizations/ordererOrganizations/fmd.com/orderers/orderer2.fmd.com/tls/server.crt
224 ServerTLSCert: ../organizations/ordererOrganizations/fmd.com/orderers/orderer2.fmd.com/tls/server.crt
225 - Host: orderer3.fmd.com
226 Port: 9050
227 ClientTLSCert: ../organizations/ordererOrganizations/fmd.com/orderers/orderer3.fmd.com/tls/server.crt
228 ServerTLSCert: ../organizations/ordererOrganizations/fmd.com/orderers/orderer3.fmd.com/tls/server.crt
master node
export PATH=${PWD}/../bin:$PATH
export FABRIC_CFG_PATH=${PWD}/configtx
configtxgen -profile TwoOrgsApplicationGenesis -outputBlock ./channel-artifacts/channel1.block -channelID channel1
# 아래 디렉터리로 들어가면 channel1.block이 보인다.
cd /home/blockchain/kopo-network-1/channel-artifacts/
# channel-artifacts 디렉터리를 다운로드 받아서 나머지 slave node들에게 옮긴다.
# 다른 orderer들도 위 block을 기준으로 채널에 join하기 위해
master node
export ORDERER_CA=${PWD}/organizations/ordererOrganizations/fmd.com/orderers/orderer.fmd.com/msp/tlscacerts/tlsca.fmd.com-cert.pem
export ORDERER_ADMIN_TLS_SIGN_CERT=${PWD}/organizations/ordererOrganizations/fmd.com/orderers/orderer.fmd.com/tls/server.crt
export ORDERER_ADMIN_TLS_PRIVATE_KEY=${PWD}/organizations/ordererOrganizations/fmd.com/orderers/orderer.fmd.com/tls/server.key
# localhost:7053은 orderer1번의 ip
osnadmin channel join --channelID channel1 --config-block ./channel-artifacts/channel1.block -o localhost:7053 --ca-file "$ORDERER_CA" --client-cert "$ORDERER_ADMIN_TLS_SIGN_CERT" --client-key "$ORDERER_ADMIN_TLS_PRIVATE_KEY"
# 위 명령후에 아래 결과가 나온다.
Status: 201
{
"name": "channel1",
"url": "/participation/v1/channels/channel1",
"consensusRelation": "consenter",
"status": "active",
"height": 1
}
slave1 node
export PATH=${PWD}/../bin:$PATH
export FABRIC_CFG_PATH=${PWD}/configtx
export ORDERER_CA=${PWD}/organizations/ordererOrganizations/fmd.com/orderers/orderer2.fmd.com/msp/tlscacerts/tlsca.fmd.com-cert.pem
export ORDERER_ADMIN_TLS_SIGN_CERT=${PWD}/organizations/ordererOrganizations/fmd.com/orderers/orderer2.fmd.com/tls/server.crt
export ORDERER_ADMIN_TLS_PRIVATE_KEY=${PWD}/organizations/ordererOrganizations/fmd.com/orderers/orderer2.fmd.com/tls/server.key
# localhost:8053은 orderer2번의 ip
osnadmin channel join --channelID channel1 --config-block ./channel-artifacts/channel1.block -o localhost:8053 --ca-file "$ORDERER_CA" --client-cert "$ORDERER_ADMIN_TLS_SIGN_CERT" --client-key "$ORDERER_ADMIN_TLS_PRIVATE_KEY"
# 위 명령후에 아래 결과가 나온다.
Status: 201
{
"name": "channel1",
"url": "/participation/v1/channels/channel1",
"consensusRelation": "consenter",
"status": "active",
"height": 1
}
slave2 node
export PATH=${PWD}/../bin:$PATH
export FABRIC_CFG_PATH=${PWD}/configtx
export ORDERER_CA=${PWD}/organizations/ordererOrganizations/fmd.com/orderers/orderer3.fmd.com/msp/tlscacerts/tlsca.fmd.com-cert.pem
export ORDERER_ADMIN_TLS_SIGN_CERT=${PWD}/organizations/ordererOrganizations/fmd.com/orderers/orderer3.fmd.com/tls/server.crt
export ORDERER_ADMIN_TLS_PRIVATE_KEY=${PWD}/organizations/ordererOrganizations/fmd.com/orderers/orderer3.fmd.com/tls/server.key
# localhost:9053은 orderer3번의 ip
osnadmin channel join --channelID channel1 --config-block ./channel-artifacts/channel1.block -o localhost:9053 --ca-file "$ORDERER_CA" --client-cert "$ORDERER_ADMIN_TLS_SIGN_CERT" --client-key "$ORDERER_ADMIN_TLS_PRIVATE_KEY"
# 위 명령후에 아래 결과가 나온다.
Status: 201
{
"name": "channel1",
"url": "/participation/v1/channels/channel1",
"consensusRelation": "consenter",
"status": "active",
"height": 1
}
master node에서 channel 확인
osnadmin channel list -o localhost:7053 --ca-file "$ORDERER_CA" --client-cert "$ORDERER_ADMIN_TLS_SIGN_CERT" --client-key "$ORDERER_ADMIN_TLS_PRIVATE_KEY"
# 아래 결과값 확인
Status: 200
{
"systemChannel": null,
"channels": [
{
"name": "channel1",
"url": "/participation/v1/channels/channel1"
}
]
}
slave1 node
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.fmd.com/peers/peer0.org1.fmd.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.fmd.com/users/Admin@org1.fmd.com/msp
export CORE_PEER_ADDRESS=localhost:7051
export FABRIC_CFG_PATH=$PWD/../config/
peer channel join -b ./channel-artifacts/channel1.block
# 아래와 같은 결과 확인
2024-03-21 15:39:12.671 KST 0001 INFO [channelCmd] InitCmdFactory -> Endorser and orderer connections initialized
2024-03-21 15:39:15.053 KST 0002 INFO [channelCmd] executeJoin -> Successfully submitted proposal to join channel
slave2 node
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org2MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org2.fmd.com/peers/peer0.org2.fmd.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org2.fmd.com/users/Admin@org2.fmd.com/msp
export CORE_PEER_ADDRESS=localhost:9051
export FABRIC_CFG_PATH=$PWD/../config/
peer channel join -b ./channel-artifacts/channel1.block
# 아래와 같은 결과 확인
2024-03-21 15:41:20.862 KST 0001 INFO [channelCmd] InitCmdFactory -> Endorser and orderer connections initialized
2024-03-21 15:41:21.190 KST 0002 INFO [channelCmd] executeJoin -> Successfully submitted proposal to join channel
slave1 node
peer channel fetch config channel-artifacts/config_block.pb -o localhost:8050 --ordererTLSHostnameOverride orderer2.fmd.com -c channel1 --tls --cafile "$ORDERER_CA"
cd channel-artifacts
configtxlator proto_decode --input config_block.pb --type common.Block --output config_block.json
jq '.data.data[0].payload.data.config' config_block.json > config.json
cp config.json config_copy.json
jq '.channel_group.groups.Application.groups.Org1MSP.values += {"AnchorPeers":{"mod_policy": "Admins","value":{"anchor_peers": [{"host": "peer0.org1.fmd.com","port": 7051}]},"version": "0"}}' config_copy.json > modified_config.json
configtxlator proto_encode --input config.json --type common.Config --output config.pb
configtxlator proto_encode --input modified_config.json --type common.Config --output modified_config.pb
configtxlator compute_update --channel_id channel1 --original config.pb --updated modified_config.pb --output config_update.pb
configtxlator proto_decode --input config_update.pb --type common.ConfigUpdate --output config_update.json
echo '{"payload":{"header":{"channel_header":{"channel_id":"channel1", "type":2}},"data":{"config_update":'$(cat config_update.json)'}}}' | jq . > config_update_in_envelope.json
configtxlator proto_encode --input config_update_in_envelope.json --type common.Envelope --output config_update_in_envelope.pb
# 아래와 같은 결과 확인
2024-03-21 15:48:56.765 KST 0001 INFO [channelCmd] InitCmdFactory -> Endorser and orderer connections initialized
2024-03-21 15:48:56.772 KST 0002 INFO [cli.common] readBlock -> Received block: 0
2024-03-21 15:48:56.772 KST 0003 INFO [channelCmd] fetch -> Retrieving last config block: 0
2024-03-21 15:48:56.774 KST 0004 INFO [cli.common] readBlock -> Received block: 0
cd ..
# localhost:8050은 orderer ip
peer channel update -f channel-artifacts/config_update_in_envelope.pb -c channel1 -o localhost:8050 --ordererTLSHostnameOverride orderer2.fmd.com --tls --cafile "${PWD}/organizations/ordererOrganizations/fmd.com/orderers/orderer2.fmd.com/msp/tlscacerts/tlsca.fmd.com-cert.pem"
# 아래와 같은 결과 확인
2024-03-21 15:49:09.382 KST 0001 INFO [channelCmd] InitCmdFactory -> Endorser and orderer connections initialized
2024-03-21 15:49:09.411 KST 0002 INFO [channelCmd] update -> Successfully submitted channel update
slave2 node
peer channel fetch config channel-artifacts/config_block.pb -o localhost:9050 --ordererTLSHostnameOverride orderer3.fmd.com -c channel1 --tls --cafile "${PWD}/organizations/ordererOrganizations/fmd.com/orderers/orderer3.fmd.com/msp/tlscacerts/tlsca.fmd.com-cert.pem"
cd channel-artifacts
configtxlator proto_decode --input config_block.pb --type common.Block --output config_block.json
jq '.data.data[0].payload.data.config' config_block.json > config.json
cp config.json config_copy.json
jq '.channel_group.groups.Application.groups.Org2MSP.values += {"AnchorPeers":{"mod_policy": "Admins","value":{"anchor_peers": [{"host": "peer0.org2.fmd.com","port": 9051}]},"version": "0"}}' config_copy.json > modified_config.json
configtxlator proto_encode --input config.json --type common.Config --output config.pb
configtxlator proto_encode --input modified_config.json --type common.Config --output modified_config.pb
configtxlator compute_update --channel_id channel1 --original config.pb --updated modified_config.pb --output config_update.pb
configtxlator proto_decode --input config_update.pb --type common.ConfigUpdate --output config_update.json
echo '{"payload":{"header":{"channel_header":{"channel_id":"channel1", "type":2}},"data":{"config_update":'$(cat config_update.json)'}}}' | jq . > config_update_in_envelope.json
configtxlator proto_encode --input config_update_in_envelope.json --type common.Envelope --output config_update_in_envelope.pb
# 아래와 같은 결과 확인
2024-03-21 15:49:45.490 KST 0001 INFO [channelCmd] InitCmdFactory -> Endorser and orderer connections initialized
2024-03-21 15:49:45.496 KST 0002 INFO [cli.common] readBlock -> Received block: 1
2024-03-21 15:49:45.496 KST 0003 INFO [channelCmd] fetch -> Retrieving last config block: 1
2024-03-21 15:49:45.498 KST 0004 INFO [cli.common] readBlock -> Received block: 1
cd ..
peer channel update -f channel-artifacts/config_update_in_envelope.pb -c channel1 -o localhost:9050 --ordererTLSHostnameOverride orderer3.fmd.com --tls --cafile "${PWD}/organizations/ordererOrganizations/fmd.com/orderers/orderer3.fmd.com/msp/tlscacerts/tlsca.fmd.com-cert.pem"
# 아래와 같은 결과 확인
2024-03-21 15:51:33.534 KST 0001 INFO [channelCmd] InitCmdFactory -> Endorser and orderer connections initialized
2024-03-21 15:51:33.570 KST 0002 INFO [channelCmd] update -> Successfully submitted channel update
peer channel getinfo -c channel1
# 아래와 같은 결과 확인
2024-03-21 15:51:57.559 KST 0001 INFO [channelCmd] InitCmdFactory -> Endorser and orderer connections initialized
Blockchain info: {"height":3,"currentBlockHash":"8FJI2CTwDrsSGRbbVoxz8RRRV1B4UMfOVrPq83zOZvw=","previousBlockHash":"JbP3Hjw47IiTIno81I1Vsg5onoZ4x84h9sTa2nGHV2s="}
slave1 node
cd ../asset-transfer-basic/chaincode-go
GO111MODULE=on go mod vendor
cd ../../kopo-network/
export PATH=${PWD}/../bin:$PATH
export FABRIC_CFG_PATH=$PWD/../config/
peer lifecycle chaincode package familicare.tar.gz --path ../asset-transfer-basic/chaincode-go/ --lang golang --label familicare_1.0
# 위 명령을 실행하면 현재 디렉터리에 familicare.tar.gz 파일이 생성된다.
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.fmd.com/peers/peer0.org1.fmd.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.fmd.com/users/Admin@org1.fmd.com/msp
export CORE_PEER_ADDRESS=localhost:7051
peer lifecycle chaincode install familicare.tar.gz
# 위 명령후에 아래와 같이 결과가 반환됨
2024-03-21 16:06:35.956 KST 0001 INFO [cli.lifecycle.chaincode] submitInstallProposal -> Installed remotely: response:<status:200 payload:"\nOfamilicare_1.0:8b9674d06bdaa241d24cbec38b03d5d67582e6e31830237be0bc63707b2acf74\022\016familicare_1.0" >
2024-03-21 16:06:35.958 KST 0002 INFO [cli.lifecycle.chaincode] submitInstallProposal -> Chaincode code package identifier: familicare_1.0:8b9674d06bdaa241d24cbec38b03d5d67582e6e31830237be0bc63707b2acf74
# 위에서 반환된 identifier를 변수에 대입한다.
export CC_PACKAGE_ID=familicare_1.0:8b9674d06bdaa241d24cbec38b03d5d67582e6e31830237be0bc63707b2acf74
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.fmd.com/users/Admin@org1.fmd.com/msp
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.fmd.com/peers/peer0.org1.fmd.com/tls/ca.crt
export CORE_PEER_ADDRESS=localhost:7051
peer lifecycle chaincode approveformyorg -o localhost:8050 --ordererTLSHostnameOverride orderer2.fmd.com --channelID channel1 --name familicare --version 1.0 --package-id $CC_PACKAGE_ID --sequence 1 --tls --cafile "${PWD}/organizations/ordererOrganizations/fmd.com/orderers/orderer2.fmd.com/msp/tlscacerts/tlsca.fmd.com-cert.pem"
# 위 명령후에 아래와 같은 결과가 반환됨
2024-03-21 16:09:15.972 KST 0001 INFO [chaincodeCmd] ClientWait -> txid [876b7a2f69d56ee310949c83a71a7ed69892d2e83f9d916935a8e9d9aa828840] committed with status (VALID) at localhost:7051
slave2 node
cd ../asset-transfer-basic/chaincode-go
GO111MODULE=on go mod vendor
cd ../../kopo-network/
export PATH=${PWD}/../bin:$PATH
export FABRIC_CFG_PATH=$PWD/../config/
peer lifecycle chaincode package familicare.tar.gz --path ../asset-transfer-basic/chaincode-go/ --lang golang --label familicare_1.0
export CORE_PEER_LOCALMSPID="Org2MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org2.fmd.com/peers/peer0.org2.fmd.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org2.fmd.com/users/Admin@org2.fmd.com/msp
export CORE_PEER_ADDRESS=localhost:9051
peer lifecycle chaincode install familicare.tar.gz
export CC_PACKAGE_ID=familicare_1.0:8b9674d06bdaa241d24cbec38b03d5d67582e6e31830237be0bc63707b2acf74
peer lifecycle chaincode approveformyorg -o localhost:9050 --channelID channel1 --name familicare --version 1.0 --package-id $CC_PACKAGE_ID --sequence 1 --tls --cafile "${PWD}/organizations/ordererOrganizations/fmd.com/orderers/orderer3.fmd.com/msp/tlscacerts/tlsca.fmd.com-cert.pem"
peer lifecycle chaincode checkcommitreadiness --channelID channel1 --name familicare --version 1.0 --sequence 1 --tls --cafile "${PWD}/organizations/ordererOrganizations/fmd.com/orderers/orderer3.fmd.com/msp/tlscacerts/tlsca.fmd.com-cert.pem" --output json
# 위 명령후에 아래와 같이 결과가 반환됨
{
"approvals": {
"Org1MSP": true,
"Org2MSP": true
}
}
slave1 node
peer lifecycle chaincode checkcommitreadiness --channelID channel1 --name familicare --version 1.0 --sequence 1 --tls --cafile "${PWD}/organizations/ordererOrganizations/fmd.com/orderers/orderer2.fmd.com/msp/tlscacerts/tlsca.fmd.com-cert.pem" --output json
# 아래와 같은 결과 확인
{
"approvals": {
"Org1MSP": true,
"Org2MSP": true
}
}
peer lifecycle chaincode commit -o localhost:8050 --ordererTLSHostnameOverride orderer2.fmd.com --channelID channel1 --name familicare --version 1.0 --sequence 1 --tls --cafile "${PWD}/organizations/ordererOrganizations/fmd.com/orderers/orderer2.fmd.com/msp/tlscacerts/tlsca.fmd.com-cert.pem" --peerAddresses localhost:7051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org1.fmd.com/peers/peer0.org1.fmd.com/tls/ca.crt"
# 아래와 같은 결과 확인
2024-03-22 02:56:25.588 UTC 0001 INFO [chaincodeCmd] ClientWait -> txid [82dbd8fb7e219db531c66dc6afbdc2ce11d58b6eef1fe27ac4ba62aee6359610] committed with status (VALID) at localhost:7051
peer lifecycle chaincode querycommitted --channelID channel1 --name familicare --cafile "${PWD}/organizations/ordererOrganizations/fmd.com/orderers/orderer2.fmd.com/msp/tlscacerts/tlsca.fmd.com-cert.pem"
# 아래와 같은 결과 확인
Committed chaincode definition for chaincode 'familicare' on channel 'channel1':
Version: 1.0, Sequence: 1, Endorsement Plugin: escc, Validation Plugin: vscc, Approvals: [Org1MSP: true, Org2MSP: true]
slave1 node
CORE_PEER_ADDRESS=localhost:8051 peer channel join -b channel-artifacts/channel1.block
# 아래와 같이 결과 확인
2024-03-22 03:01:17.536 UTC 0001 INFO [channelCmd] InitCmdFactory -> Endorser and orderer connections initialized
2024-03-22 03:01:17.964 UTC 0002 INFO [channelCmd] executeJoin -> Successfully submitted proposal to join channel
CORE_PEER_ADDRESS=localhost:8051 peer lifecycle chaincode install familicare.tar.gz
# 아래와 같이 결과 확인
2024-03-22 03:01:53.781 UTC 0001 INFO [cli.lifecycle.chaincode] submitInstallProposal -> Installed remotely: response:<status:200 payload:"\nOfamilicare_1.0:8b9674d06bdaa241d24cbec38b03d5d67582e6e31830237be0bc63707b2acf74\022\016familicare_1.0" >
2024-03-22 03:01:53.782 UTC 0002 INFO [cli.lifecycle.chaincode] submitInstallProposal -> Chaincode code package identifier: familicare_1.0:8b9674d06bdaa241d24cbec38b03d5d67582e6e31830237be0bc63707b2acf74
slave2 node
CORE_PEER_ADDRESS=localhost:10051 peer channel join -b channel-artifacts/channel1.block
# 아래와 같이 결과 확인
2024-03-22 03:02:18.903 UTC 0001 INFO [channelCmd] InitCmdFactory -> Endorser and orderer connections initialized
2024-03-22 03:02:19.238 UTC 0002 INFO [channelCmd] executeJoin -> Successfully submitted proposal to join channel
CORE_PEER_ADDRESS=localhost:10051 peer lifecycle chaincode install familicare.tar.gz
# 아래와 같이 결과 확인
2024-03-22 03:03:00.424 UTC 0001 INFO [cli.lifecycle.chaincode] submitInstallProposal -> Installed remotely: response:<status:200 payload:"\nOfamilicare_1.0:8b9674d06bdaa241d24cbec38b03d5d67582e6e31830237be0bc63707b2acf74\022\016familicare_1.0" >
2024-03-22 03:03:00.424 UTC 0002 INFO [cli.lifecycle.chaincode] submitInstallProposal -> Chaincode code package identifier: familicare_1.0:8b9674d06bdaa241d24cbec38b03d5d67582e6e31830237be0bc63707b2acf74
master node
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
42d32a86e8fd hyperledger/fabric-tools:latest "/bin/bash" About an hour ago Up About an hour cli
6f231411908b hyperledger/fabric-orderer:latest "orderer" About an hour ago Up About an hour 0.0.0.0:7050->7050/tcp, :::7050->7050/tcp, 0.0.0.0:7053->7053/tcp, :::7053->7053/tcp, 0.0.0.0:9443->9443/tcp, :::9443->9443/tcp orderer.fmd.com
slave1 node
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
83f0fd4a7dd1 dev-peer1.org1.fmd.com-familicare_1.0-8b9674d06bdaa241d24cbec38b03d5d67582e6e31830237be0bc63707b2acf74-6d16eec83f797d185279698e066caee6091776bb57efded6883ee7b4f571a860 "chaincode -peer.add…" 3 minutes ago Up 3 minutes dev-peer1.org1.fmd.com-familicare_1.0-8b9674d06bdaa241d24cbec38b03d5d67582e6e31830237be0bc63707b2acf74
8acb9853495e dev-peer0.org1.fmd.com-familicare_1.0-8b9674d06bdaa241d24cbec38b03d5d67582e6e31830237be0bc63707b2acf74-66144f52d6b4d2cc7bc5b555236c7be6788aca7c542032919196abb924fee317 "chaincode -peer.add…" 8 minutes ago Up 8 minutes dev-peer0.org1.fmd.com-familicare_1.0-8b9674d06bdaa241d24cbec38b03d5d67582e6e31830237be0bc63707b2acf74
464a454d52b1 hyperledger/fabric-tools:latest "/bin/bash" About an hour ago Up About an hour cli
1204aeb168a2 hyperledger/fabric-peer:latest "peer node start" About an hour ago Up About an hour 0.0.0.0:7051->7051/tcp, :::7051->7051/tcp, 0.0.0.0:9444->9444/tcp, :::9444->9444/tcp peer0.org1.fmd.com
46a5b1e20fa5 hyperledger/fabric-peer:latest "peer node start" About an hour ago Up About an hour 0.0.0.0:8051->8051/tcp, :::8051->8051/tcp, 7051/tcp, 0.0.0.0:9445->9445/tcp, :::9445->9445/tcp peer1.org1.fmd.com
92ebf2e1c16e couchdb:3.1.1 "tini -- /docker-ent…" About an hour ago Up About an hour 4369/tcp, 9100/tcp, 0.0.0.0:5984->5984/tcp, :::5984->5984/tcp couchdb0
dc9d3b584e6b hyperledger/fabric-orderer:latest "orderer" About an hour ago Up About an hour 0.0.0.0:8050->8050/tcp, :::8050->8050/tcp, 0.0.0.0:8053->8053/tcp, :::8053->8053/tcp, 7050/tcp, 0.0.0.0:10443->10443/tcp, :::10443->10443/tcp orderer2.fmd.com
slave2 node
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
79382935bbeb dev-peer1.org2.fmd.com-familicare_1.0-8b9674d06bdaa241d24cbec38b03d5d67582e6e31830237be0bc63707b2acf74-6a16ee4c297e5eba5c0a76096af03d33df60111e0be094603894611617cb1118 "chaincode -peer.add…" 4 minutes ago Up 4 minutes dev-peer1.org2.fmd.com-familicare_1.0-8b9674d06bdaa241d24cbec38b03d5d67582e6e31830237be0bc63707b2acf74
f64206d31394 dev-peer0.org2.fmd.com-familicare_1.0-8b9674d06bdaa241d24cbec38b03d5d67582e6e31830237be0bc63707b2acf74-a33f291a53adba2a837608c189daf9702ec2075f2962e6d716fd92e3cdae0ce9 "chaincode -peer.add…" 11 minutes ago Up 11 minutes dev-peer0.org2.fmd.com-familicare_1.0-8b9674d06bdaa241d24cbec38b03d5d67582e6e31830237be0bc63707b2acf74
a54021147d34 hyperledger/fabric-tools:latest "/bin/bash" About an hour ago Up About an hour cli
f9ebadacd9ad hyperledger/fabric-peer:latest "peer node start" About an hour ago Up About an hour 0.0.0.0:9051->9051/tcp, :::9051->9051/tcp, 7051/tcp, 0.0.0.0:9445->9445/tcp, :::9445->9445/tcp peer0.org2.fmd.com
257da62e8744 hyperledger/fabric-peer:latest "peer node start" About an hour ago Up About an hour 0.0.0.0:10051->10051/tcp, :::10051->10051/tcp, 7051/tcp, 0.0.0.0:10445->10445/tcp, :::10445->10445/tcp peer1.org2.fmd.com
a2edca3f18eb hyperledger/fabric-orderer:latest "orderer" About an hour ago Up About an hour 0.0.0.0:9050->9050/tcp, :::9050->9050/tcp, 0.0.0.0:9053->9053/tcp, :::9053->9053/tcp, 7050/tcp, 0.0.0.0:11443->11443/tcp, :::11443->11443/tcp orderer3.fmd.com
실행위치
ls /home/hyperledger/fabric-samples/asset-transfer-basic/rest-api-go
-rw-r--r--. 1 root root 1292 May 17 2023 README.md
-rw-r--r--. 1 root root 519 May 18 2023 go.mod
-rw-r--r--. 1 root root 2710 May 18 2023 go.sum
-rwxr-xr-x. 1 root root 174 May 18 2023 hlfgw.sh
-rw-r--r--. 1 root root 708 May 18 2023 main.go
-rw-r--r--. 1 root root 3472 Mar 22 01:50 out.log
drwxr-xr-x. 2 root root 74 May 18 2023 web
# 위 파일들 중 hlfwq.sh를 실행시켜야 한다.
# 하지만 현재 kopo-network 프로젝트에서는 kopo-network.sh파일에 저걸 실행시키는 코드가 삽입되어 있다.
# 아래는 kopo-network.sh 파일의 일부이다.
171 function networkUp() {
172 checkPrereqs
173
174 COMPOSE_FILES="-f compose/${COMPOSE_FILE_BASE} -f compose/${CONTAINER_CLI}/${CONTAINER_CLI}-${COMPOSE_FILE_BASE}"
175
176 if [ "${DATABASE}" == "couchdb" ]; then
177 COMPOSE_FILES="${COMPOSE_FILES} -f compose/${COMPOSE_FILE_COUCH} -f compose/${CONTAINER_CLI}/${CONTAINER_CLI}-${COMPOSE_FILE_COUCH}"
178 fi
179
180 DOCKER_SOCK="${DOCKER_SOCK}" ${CONTAINER_CLI_COMPOSE} ${COMPOSE_FILES} up -d 2>&1
181
182 $CONTAINER_CLI ps -a
183 if [ $? -ne 0 ]; then
184 fatalln "Unable to start network"
185 fi
186
187 sh ../asset-transfer-basic/rest-api-go/hlfgw.sh &
188 }
# 위의 187라인
sh ../asset-transfer-basic/rest-api-go/hlfgw.sh &
실행확인
netstat -antp | grep 3000
tcp6 0 0 :::3000 :::* LISTEN 23435/main
nginx는 slave2에서만 설치해서 loadbalancer 역할을 수행함
vi /etc/yum.repos.d/nginx.repo
# 아래 내용추가
[nginx]
name=nginx repo
baseurl=https://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
yum install -y nginx
vi /etc/nginx/conf.d/default.conf
# 아래 내용대로 수정
upstream hlfgw {
server 192.168.0.241:3000;
server 192.168.0.242:3000;
}
server {
# listen 80;
server_name localhost;
#access_log /var/log/nginx/host.access.log main;
listen 8070;
listen [::]:8070;
location /invoke {
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
send_timeout 3000;
proxy_pass http://hlfgw/invoke;
}
location /query {
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
send_timeout 3000;
proxy_pass http://hlfgw/query;
}
}
설정파일 오류 확인
nginx -t
# 정상결과
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
semanage port -a -t http_port_t -p tcp 8070
setsebool httpd_can_network_connect on -P
systemctl restart nginx
access log : tail -f /var/log/nginx/access.log
error log : tail -f /var/log/nginx/error.log