Git Product home page Git Product logo

mymarket's Introduction

Hyperledger Fabric을 이용한 상품 거래 시스템 개발

개발환경은 우분투 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_architecture

아래 그림은 mymarket 실행을 위한 컨테이너 리스트 입니다. mymarket_containers

사전 개발 환경 준비

  • Docker
    • 17.06.2-ce 이상
  • Docker-compose
    • 1.14.0 이상 버전
  • Golang
    • 1.10.x 버전 이상
  • Nodejs
    • 8.x 버전
  • NPM
    • 5.6
  • 우분투
    • g++ 설치
    apt install g++

VM 네트워크 설정

이 항목은 Fabric Network를 멀티노드로 구성하기 위해서 필요합니다.(현재는 Docker swarm으로 설명하고 있으며, 다른 방법으로 멀티 노드 구성은 업데이트 예정) 단일 노드로 구성 할 경우 네트워크 설정 항목은 다음의 docker network만 생성합니다.

docker network create my-net

Docker swarm 네트워크 설정

  • 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

Fabric 네트워크를 위한 아티팩트 생성

인증서 생성

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 도 수정합니다.

Fabric 네트워크 실행

Docker swarm 기반 멀티 노드

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개의 컨테이너가 실행됩니다.

채널 생성 및 Peer join

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

Peer join to channel

  • 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

AnchorPeer update

  • 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

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.