Skip to content

Instantly share code, notes, and snippets.

@BEMELON
Last active June 29, 2018 09:08
Show Gist options
  • Save BEMELON/8446447d8941b0a7c2d667ebb216102a to your computer and use it in GitHub Desktop.
Save BEMELON/8446447d8941b0a7c2d667ebb216102a to your computer and use it in GitHub Desktop.
우분투 16.04 에서 Hyperledger Fabric 1.1 튜토리얼 진행하기 - network

Hyperledger Fabric

환경 : Ubuntu 16.04 64Bit

$로 시작하는 행은 리눅스 쉘에 입력하는 명령어 입니다.

test

설치를 시작하기전에, 기본적으로 필요한 요소들 설치하기

(reference : https://hyperledger-fabric.readthedocs.io/en/release-1.1/prereqs.html)

curl 설치하기

서버와 통신할 수 있는 커맨드 명령어 툴입니다.
웹개발에 매우 많이 사용되고 있는 무료 오픈소스입니다.
$ apt-get install curl

Docker 와 Docker-composer 설치하기

만약 설치가 되어있지 않다면,
$ sudo apt install docker.io
$ sudo apt install docker-composer

Docker는 17.06.2-ce 이상 버전을, Docker-composer는 1.14.0 이상의 버전을 요구합니다.

$ docker --version
$ docker-composer --version

Go 언어 설치하기tiate

1.9.X 버전이 설치되어야 됩니다.

설치가 완료되면, $ export GOPATH=$HOME/go
$ export PATH=$PATH:$GOPATH/bin
명령어를 입력해서 Go lang 환경변수를 설정해야 합니다.

node.js 언어 설치하기

fabric 는 9.X 버전을 지원하지 않습니다.

따라서 8.X 버전을 설치해주어야 합니다.
node.js 업그레이드 방법은 아래 링크에 자세히 나와 있습니다.
https://velopert.com/1351
만약, node.js 버전 때문에 위 링크가 정상적으로 작동되지 않는다면, 아래 링크를 참조하셔서 설치하시면 될듯 합니다.
https://stackoverflow.com/questions/46360567/error-npm-is-known-not-to-run-on-node-js-v4-2-6
node.js 에 관련되어서 오류 처리에 많은 시간을 보냈습니다! 꼼꼼히 따라해주는 것을 추천합니다.

node -v 로 버전을 체크할 수 있습니다.
만약 없다고 뜬다면 아래 명령어를 통해서 설치 후 실행합니다.
$ sudo apt install nodejs-legacy

저는 기본적으로 4.X버전이 깔려있었고 이를, 8.X 로 업그레이드 하려고 했구요.
아래 링크에 그 과정이 잘 나와있습니다.
https://velopert.com/1351

Git에서 fabric-samples를 받아 first-network 설치하기

(https://hyperledger-fabric.readthedocs.io/en/release-1.1/build_network.html)

byfn.sh이 뭐죠?

byfn.sh는 fabric-samples 에서 제공하는 쉘 스크립트 입니다.
byfn.sh 는 2개의 다른 집단을 나타내는 4개의 구성원(peer)과, orderer(서버 역할?) 을 빠르게 구성할 수 있도록 도와주는 스크립트 입니다.
뿐만 아니라, peer들을 해당하는 channel로 join 할 수 있도록 도와주고, chaincode 를 배포(deploy)와 instantiate 하고 배포된 chaincode 들로 transaction(거래)를 할 수 있도록 도와줍니다.
(./btfn.sh --help 명령어로 여러 옵션들을 확인 할 수 있습니다.)

만약, channel name을 우리가 제공하지 않는다면, 기본적으로 mychannel 이라는 default name을 쓰게 됩니다.

byfn.sh 를 사용해서 블록들 생성하기

$./btfn.sh -m generate
위 명령어를 실행하게 되면, byfn.sh이 무슨일을 할껀지에 대한 설명과 Y/N 으로 대답을 물어보는데 Y를 클릭하시면 됩니다.
첫번째로, 우리가 사용할 다양한 네트워크에 필요한 entities(블록)과 key 들을 생성하게 됩니다.
그 중 Genesis Block은 서비스를 제공하는 블록이 되고, 채널을 구성하는데 필요한 configuration transactions(거래 설정)을 저장하게 됩니다.

네트워크 구축하기

아래 명렁어를 통해서 네트워크 구축을 할 수 있습니다.
$./byfn.sh -m up
실행하게 된다면 기본 설정은 GO언어로 구성이 되어있구요.만약 NODE로 구축을 하고 싶다면
$./byfn.sh -m up -l node 로 실행하시면 됩니다.
명령을 실행하게 된다면, 다시한번 Y/N 으로 진행여부를 물어볼텐데 Y나 return key를 입력하시면 됩니다.
입력하게되면 로그들을 보여주게 되면서, 모든 컨테이너들을 실행하고 완벽한(end-to-end) 예시 모델(application scenario) 를 만들게 됩니다.
만약 성공 하게 된다면, 아래와 같은 그림을 보여주게 되고, 스크롤을 통해서 다양한 transactions(거래) 로그들을 볼 수 있습니다.

네트워크 내리기, 닫기(?)(Bring down)

네트워크를 종료해서, 네트워크 설정들을 살펴 볼 수 있습니다. 아래와 같은 커맨드를 사용하면 구축을 할 때 만들었던 chaincode 이미지를 Docker Registry에서 삭제하게 됩니다.
$./byfn.sh -m down

다음으로는 Fully-functional Hyperledger Fabric network에 필요한 다양한 과정과 요구사항들에 대해서 설명할 예정입니다.

Crypto Generator??

우리는 network entity에 필요한 cryptographic material(X509 인증키)를 만들기 위해 cryptogen 이라는 도구를 사용할 것입니다.

실행과정

Cryptogen은 crypto-config.yaml 파일을 사용하는데, .yaml 파일 안에는 network topology 가 있고, 조직과 조직에 속하는 구성원(component)들에게 필요한 키와 인증서들을 생성합니다.
각 조직은 유일한(unique) Root certificate(CA-cert)를 제공하는데, 조직에 포함되는 peer과 orderer들을 묶어(bind)줍니다.
각 조직에 CA-cert를 할당을 하면서, 참여 구성원들이 자체 인증기관을 사용하는 전형적인 네트워크 조직을 모방하고 있습니다.
Hyperledger 내에서의 거래(transaction)와 통신(communications)은 개인(entity)의 private key(keystore)로 서명되고 있습니다.
그리고 공개 키(signcerts)를 사용하여 확인 됩니다.

crypto-config.yaml 파일 내에서 count 변수를 찾을 수 있는데, 이 변수는 조직(Organization)에 구성원(peers)들의 수를 명시하는데 사용됩니다.
우리는 x.509certificates and public key infrastructure 을 지금 조사하지는 않을겁니다. 만약 흥미가 있으면 직접 공부하세요!

crypto-config.yaml 살펴보기

cryptogen 을 사용하기 전에 간단하게 crypto-config.yaml 파일을 살펴보려고 합니다.
OrderOrgs 에 있는 "Name", "Domain", "Specs" 매개변수들에 대해서 설명을 드리려고 합니다.
Naming Convention : {{.Hostname}}.{{.Domain}} 이 되는데, Orderer Node를 예시로 들자면, 이름이 order이라면 우리는 그 도메인을 order.example.com 으로 설정합니다.
이 파일은 문서에 써져 있는 문법과 정의들보다 조금 더 확장된 문법들이 포함되어 있는데, 이러한 문법들은 MSP(Membership Service Providers)문서 에서 자세히 살펴볼 수 있습니다.

cryptogen 를 실행하게 되면, 생성된 인증서와 키들은 crypto-config 라는 폴더 안에 저장될 것입니다.

Transaction Generator 설정하기

configtxgen tool 은 4개의 configuration artifacts 를 생성하기 위해 사용됩니다.

Orderer Gensis block
Channel configuration transaction
2개의 Anchor peer transactions (조직 당 1개, 조직이 2개임으로)
orderer block 은 ordering service를 위한 Genesis block이고, channel configuration tranction file은 Channel creation time 에 orderer 에 broadcast 됩니다.
Anchor peer transaction 은 채널에서의 Anchor Peer를 지정합니다.
이 파일은 또한 consortium(SampleConsortium)을 명시하는데, 이것은 2개의 peer Orgs을 구성되어 있습니다.
파일 상단에 Profile 세션을 보면, 2개의 header(TwoOrgsOrderGenesis, TwoOrgsChannel)가 있는 것을 확인 할 수 있는데 각각 Genesis block과 channel을 위한 것 입니다. 우리는 artifacts를 생성하기위해 header들을 매개변수로 넘겨줌으로 header 들은 중요합니다.

Configtxgen tool -> How does it work?

Configtxgen은 configtx.yaml 파일을 사용합니다. .yaml 파일 안에는 예시 네트워크들의 정의(definitions)가 들어 있는데,
파일 내에는 3개의 멤버가 있는데, Order Org(orderOrg) 1개와, 2개의 peer node들을 가지고, 관리하는 Peer Orgs(Org1, Org2) 입니다. 이 파일은 또한 2개의 추가적인 특징(specifications)들을 포함하고 있습니다.
첫번째로는 각 Peer Org에서의 anchor peers를 명시합니다. ( peer0.org1.example.com & peer0.org2.example.com )
두번째로는 각 멤버(member)의 MSP 디렉토리의 위치정보를 가지고 있고, 이를 통해 각 조직(Org)에 있는 orderer genesis block에 CA-cert 인증서를 저장할 수 있게 합니다. 이것은 매우 중요한 개념이고, 이제 Ordering service를 사용하는 어느 network entity 들은 디지털 서명을 확인할 수 있습니다.

Cryptogen 실행하기!

configtxgen 과 cryptogen 을 사용해서 이제 인증서/키(certificates/keys)와 다양한 configuration artifacts 를 만들어 낼 수 있습니다.

Maually generate the artifacts

network configuration을 위해 사용될 증명서들을 생성하기 위해서 우리는 byfn.sh 스크립트에 있는 generateCerts 함수를 사용 할 것입니다.
cryptogen 를 실행하기 위해서는 아래의 명령어를 입력하면 됩니다. $../bin/cryptogen generate --config=./crypto-config.yaml
실행하기 위해서는 crypto-config.yaml 가 어디에 있는지 상대경로로 알려주어야 합니다.
명령어를 실행하게 되면
org1.example.com 과 org2.example.com 을 볼 수 있어야 합니다.
증명서와 키들은 crypto-config 디렉토리에 저장될 것입니다.

다음으로 우리는, configtxgen 이 사용하는 configtx.yaml이 어디에 위치되어 있는지 알려주어야 합니다.
$export FARIC_CFG_PATH=$PWD (PWD는 configtx.yaml이 있는 디렉토리)

설정을 완료했다면 우리는 orderer genesis block을 만들기 위해 configtxgen 를 호출할 것입니다.
$../bin/configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block
명령을 실행하셨다면 다음과 비슷한! 결과를 보셔야 합니다.
[common/tools/configtxgen] main -> INFO 001 Loading configuration
[common/tools/configtxgen] doOutputBlock -> INFO 002 Generating genesis block
[common/tools/configtxgen] doOutputBlock -> INFO 003 Writing genesis block
우리가 생성한 Orderer genesis block과 그 다음?(subsequent)의 artifacts은 channel-artifacts 디렉토리에 저장될 것입니다.

저 같은경우 바이너리 파일들은 /fabric-samples/bin 에 설치가 되어있어서
$ export PATH=~/fabric-samples/bin:$PATH
이렇게 입력을 했습니다. ./syfn.sh -m up 시 도커 관련 에러가 뜬다면
아래와 같이 도커를 USER 그룹에 등록하시면 됩니다.
도커는 항상 sudo 권한으로 실행이 되어야 되기 때문입니다.
$ sudo usermod -a -G docker $USER
$ sudo service docker restart

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment