개발환경은 우분투 16.04 기반으로 테스트하여 작성하였습니다.
도메인 정보
- Headquater
- mymarket.com
- Store1
- store1.mymarket.com
- Store2
- store2.mymarket.com
Ordering Service
- OrdererType : kafka
- Orderer
- orderer0.mymarket.com
- orderer1.mymarket.com
- orderer2.mymarket.com
- kafka broker
- kafka0
- kafka1
- kafka2
- kafka3
CA (멤버쉽 서비스)
- Headquater
- ca.mymarket.com
- Store1
- ca.store1.mymarket.com
- Store2
- ca.store2.mymarket.com
아래 그림은 mymarket 실행을 위한 컨테이너 리스트 입니다.
- Docker
- 17.06.2-ce 이상
- Docker-compose
- 1.14.0 이상 버전
- Golang
- 1.10.x 버전 이상
- Nodejs
- 8.x 버전
- NPM
- 5.6
- 우분투
- g++ 설치
apt install g++
이 항목은 Fabric Network를 멀티노드로 구성하기 위해서 필요합니다.(현재는 Docker swarm으로 설명하고 있으며, 다른 방법으로 멀티 노드 구성은 업데이트 예정)
단일 노드로 구성 할 경우 네트워크 설정 항목은 다음의 docker network
만 생성합니다.
docker network create my-net
- VM1
VM1에서 다음의 명령을 실행
docker swarm init
docker swarm join-token manager
위의 명령을 실행하면 아래와 같은 메시지를 확인 할 수 있으며 VM2에서 명령을 실행합니다.
docker swarm join --token SWMTKN-1-3uhjzu2hfh9x3yhwzleh326wud22yaee65kqb88pczx4m0uwij-40ksc4c7pnmj9b3okxdmc9wqp 10.142.0.3:2377
다음의 명령을 통해서 도커 네트워크를 생성합니다.
docker network create --attachable --driver overlay my-net
github repository를 clone 합니다.
git clone https://github.com/mjkong/mymarket
cd mymarket
인증서 생성
cryptogen generate --config=./crypto-config.yaml
아티팩트 생성
mkdir channel-artifacts
export FABRIC_CFG_PATH=$PWD
export CHANNEL_NAME=mymarketchannel
configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block
configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Store1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Store1MSP
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Store2MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Store2MSP
새로 생성된 인증서에서 CA Key파일의 정보를 YAML 파일에서 수정합니다.
- ca.store1.mymarket.com 를 위한 인증서 위치
~/mymarket/crypto-config/peerOrganizations/store1.mymarket.com/ca$ ls
66c2bea4ef42056d1f1807c978c8ec783e403557e1311c8beb1118244092ac4f_sk ca.store1.mymarket.com-cert.pem
~/mymarket/crypto-config/peerOrganizations/store1.mymarket.com/ca$
Key 파일명(66c2bea4ef42056d1f1807c978c8ec783e403557e1311c8beb1118244092ac4f_sk)을 node1.yaml의 다음 위치에 적용합니다.
ca.store1.mymarket.com:
image: hyperledger/fabric-ca
environment:
- CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=my-net
- FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
- FABRIC_CA_SERVER_CA_NAME=ca.store1.mymarket.com
- FABRIC_CA_SERVER_CA_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.store1.mymarket.com-cert.pem
- FABRIC_CA_SERVER_CA_KEYFILE=/etc/hyperledger/fabric-ca-server-config/**66c2bea4ef42056d1f1807c978c8ec783e403557e1311c8beb1118244092ac4f_sk**
ports:
- "17054:7054"
위와 같이 ca.mymarket.com
, node2.yaml에서 ca2.store2.mymarket.com
도 수정합니다.
mymarket 프로젝트 디렉토리를 압축하여 VM2로 복사합니다.
cd ../
tar -cvf mymarket.tar mymarket
각 VM에서 도커 컨테이너를 실행합니다.
- VM1
mymarket 디렉토리로 이동합니다.
docker-compose -f node1.yaml up -d
- VM2
VM1에서와 같이 mymarket 디렉토리로 이동합니다.
docker-compose -f node2.yaml up -d
cd deploy/docker-compose
docker-compose up -d
정상적으로 컨테이너가 실행되었으면 19개의 컨테이너가 실행됩니다.
Fabric Network 설정을 위해서 cli
컨테이너에 접속합니다.
docker exec -it cli bash
다음의 명령을 통해서 채널을 생성합니다.
export CHANNEL_NAME=mymarketchannel
peer channel create -o orderer0.mymarket.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/mymarket.com/orderers/orderer0.mymarket.com/msp/tlscacerts/tlsca.mymarket.com-cert.pem
- peer0.store1
CORE_PEER_LOCALMSPID=Store1MSP
CORE_PEER_ADDRESS=peer0.store1.mymarket.com:7051
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/store1.mymarket.com/peers/peer0.store1.mymarket.com/tls/ca.crt
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/store1.mymarket.com/users/[email protected]/msp
peer channel join -b $CHANNEL_NAME.block
- peer1.store1
CORE_PEER_LOCALMSPID=Store1MSP
CORE_PEER_ADDRESS=peer1.store1.mymarket.com:7051
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/store1.mymarket.com/peers/peer1.store1.mymarket.com/tls/ca.crt
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/store1.mymarket.com/users/[email protected]/msp
peer channel join -b $CHANNEL_NAME.block
- peer0.store2
CORE_PEER_LOCALMSPID=Store2MSP
CORE_PEER_ADDRESS=peer0.store2.mymarket.com:7051
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/store2.mymarket.com/peers/peer0.store2.mymarket.com/tls/ca.crt
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/store2.mymarket.com/users/[email protected]/msp
peer channel join -b $CHANNEL_NAME.block
- peer1.store2
CORE_PEER_LOCALMSPID=Store2MSP
CORE_PEER_ADDRESS=peer1.store2.mymarket.com:7051
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/store2.mymarket.com/peers/peer1.store2.mymarket.com/tls/ca.crt
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/store2.mymarket.com/users/[email protected]/msp
peer channel join -b $CHANNEL_NAME.block
- peer0.store1
CORE_PEER_LOCALMSPID=Store1MSP
CORE_PEER_ADDRESS=peer0.store1.mymarket.com:7051
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/store1.mymarket.com/peers/peer0.store1.mymarket.com/tls/ca.crt
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/store1.mymarket.com/users/[email protected]/msp
peer channel update -o orderer0.mymarket.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Store1MSPanchors.tx --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/mymarket.com/orderers/orderer0.mymarket.com/msp/tlscacerts/tlsca.mymarket.com-cert.pem
- peer0.store2
CORE_PEER_LOCALMSPID=Store2MSP
CORE_PEER_ADDRESS=peer0.store2.mymarket.com:7051
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/store2.mymarket.com/peers/peer0.store2.mymarket.com/tls/ca.crt
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/store2.mymarket.com/users/[email protected]/msp
peer channel update -o orderer0.mymarket.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Store2MSPanchors.tx --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/mymarket.com/orderers/orderer0.mymarket.com/msp/tlscacerts/tlsca.mymarket.com-cert.pem
- peer0.store1
CORE_PEER_LOCALMSPID=Store1MSP
CORE_PEER_ADDRESS=peer0.store1.mymarket.com:7051
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/store1.mymarket.com/peers/peer0.store1.mymarket.com/tls/ca.crt
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/store1.mymarket.com/users/[email protected]/msp
peer chaincode install -n marketcc -v 0 -l golang -p github.com/chaincode/mymarket/go
- peer1.store1
CORE_PEER_LOCALMSPID=Store1MSP
CORE_PEER_ADDRESS=peer1.store1.mymarket.com:7051
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/store1.mymarket.com/peers/peer1.store1.mymarket.com/tls/ca.crt
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/store1.mymarket.com/users/[email protected]/msp
peer chaincode install -n marketcc -v 0 -l golang -p github.com/chaincode/mymarket/go
- peer0.store2
CORE_PEER_LOCALMSPID=Store2MSP
CORE_PEER_ADDRESS=peer0.store2.mymarket.com:7051
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/store2.mymarket.com/peers/peer0.store2.mymarket.com/tls/ca.crt
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/store2.mymarket.com/users/[email protected]/msp
peer chaincode install -n marketcc -v 0 -l golang -p github.com/chaincode/mymarket/go
- peer1.store2
CORE_PEER_LOCALMSPID=Store2MSP
CORE_PEER_ADDRESS=peer1.store2.mymarket.com:7051
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/store2.mymarket.com/peers/peer1.store2.mymarket.com/tls/ca.crt
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/store2.mymarket.com/users/[email protected]/msp
peer chaincode install -n marketcc -v 0 -l golang -p github.com/chaincode/mymarket/go
peer chaincode instantiate -o orderer0.mymarket.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/mymarket.com/orderers/orderer0.mymarket.com/msp/tlscacerts/tlsca.mymarket.com-cert.pem -C $CHANNEL_NAME -n marketcc -l golang -v 0 -c '{"Args":[]}' -P "OR ('Store1MSP.peer','Store2MSP.peer')" --collections-config /opt/gopath/src/github.com/chaincode/mymarket/collections_config.json