Programing

WSL을 이용한 하이퍼레저 패브릭 테스트

handam 2023. 2. 23. 19:19

 


윈도우즈 테스트 환경 구성

WSL은 윈도우즈 10 이상, 특정 업데이트 버전 이상에서 지원한다.

실제 테스트 진행한 PC 시스템 정보
Windows 10 x64
OS build : 19043.2364
Windows Feature Experience Pack 120.2212.4190.0

사전준비

1. WSL 설치

2. Docker 설치

3. Go, jq 설치

튜토리얼 진행시 스크립트 언어가 Gojq로 실행하게 되므로 추가적인 설치가 필요하다.


하이퍼레저 테스트 환경 구성

  • 하이퍼레저 v2.2.x 버전을 기준으로 작성되었다.

사전준비

1. GOPATH / GOROOT 환경변수 설정

mkdir /home/gopath
gedit /etc/profile                          -- gedit 대신 vim 으로 대체

# 하단에 추가
export GOPATH=/home/gopath      -- 가이드에서는 /root/ 인데 /home/ 으로 변경하여 진행 
export GOROOT=/home/go
export PATH=$PATH:$GOROOT/bin

기본 디렉토리가 /root/ 로 가이드 되어 있었지만 윈도우 vs code 에서 권한 때문에 루트 디렉토리에 접근할 수 없었다. 윈도우 vs code 에서 리눅스의 폴더를 열 위해 /home/ 폴더로 변경, 진행하였다. 하지만 기본적인 권한 때문에 읽기 모드로 열리긴 하지만 수정이 되지 않아 권한조정(chmod)이 필요할 수 있다.

2. 하이퍼레저 패브릭 샘플 소스 및 도커 이미지 다운로드

  • CLI 를 이용한 패브릭 샘플, 도커 이미지 다운로드
# .../fabric-samples/ 에서

## 최신버전으로 
curl -sSL https://bit.ly/2ysbOFE | bash -s 

## 특정버전으로 
-- fabric v2.2.2 / CA v1.4.9 라는 뜻
curl -sSL https://bit.ly/2ysbOFE | bash -s -- 2.2.2 1.4.9 
  • GIT 을 이용한 패브릭 샘플 소스 복제시 (도커 이미지 파일은 해당하지 않는다)
# /home/gopath/src/github.com/hyperledger/ 에서 
git clone https://github.com/hyperledger/fabric-samples

# 계정과 비번이 필요한 듯 해서 fork 하여 내 레파지토리에서 복제함 
glt clone https://github.com/나의계정/fabric-samples

3. 하이퍼레저 테스트 네트워크 실습

3-1. 시작하기

https://hyperledger-fabric.readthedocs.io/ko/release-2.2/getting_started.html

3-2. 튜토리얼

https://hyperledger-fabric.readthedocs.io/ko/latest/test_network.html


기타 진행시 막힌부분

채널생성

  • 채널생성 전, core.yaml 설정파일과 테스트 네트워크를 구성하는 도커컴포즈 설정파일의 NetworkMode 값을 맞춰줘야 했다.
# 채널 생성하기 전 
# fabric-samples/config/core.yaml
line 530 NetworkMode: host -> docker_test

# fabric-samples/test-network/compose/docker/docker-compose-test-net.yaml
CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=fabric_test -> docker_test

  • 채널생성 시 스크립트 오류가 발생하여 찾아보니, 특정 명령어 지원을 v2.3.x 부터 지원 한다는 글을 찾을 수 있었다. 그리고 v2.2.x 버전을 믿을 수 없어서 최신 릴리즈로 처음부터 다시 진행함

체인코드 배포

  • 체인코드 배포시 기본 언어로 go를 사용하는 듯 한데 java로 (또는 기타 언어로) 지정하여 배포할 수 있는 옵션이 있다.
# 체인코드 채널에 배포시 JAVA 로 
root@SSPN-SREC005101:/home/gopath/src/github.com/hyperledger/fabric-samples/test-network# ./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-java -ccl java

deployCC옵션은 asset-transfer(basic) 체인코드를 peer0.org1.example.com과, peer0.org2.example.com에 디팬던시와 함꼐 설치하고 배포한다.-l 옵션을 추가해서 language 를 바꿀 수 있다. (go, typescript, javascript 등).

네트워크 상호작용

  1. Path 및 환경변수 설정
# .../test-network/  에서 한 라인씩 진행

1. PATH 설정
export PATH=${PWD}/../bin:$PATH
export FABRIC_CFG_PATH=$PWD/../config/

2. 환경변수 설정 (Org1 CLI 설정)
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
export CORE_PEER_ADDRESS=localhost:7051


  1. 실행
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 -C mychannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"function":"InitLedger","Args":[]}'


---> 성공
KST 0001 INFO [chaincodeCmd] chaincodeInvokeOrQuery -> Chaincode invoke successful. result: status:200

query & invoke 차이점은 read, write 차이

  1. 모든 지갑 불러오기
peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}'

  1. Organization2 invoke
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 -C mychannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"function":"TransferAsset","Args":["asset6","Christopher"]}'


---> 성공
KST 0001 INFO [chaincodeCmd] chaincodeInvokeOrQuery -> Chaincode invoke successful. result: status:200 payload:"Michel"

  1. Org2 CLI 설정
# Environment variables for Org2

export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org2MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
export CORE_PEER_ADDRESS=localhost:9051
  1. asset6의 지갑 확인
peer chaincode query -C mychannel -n basic -c '{"Args":["ReadAsset","asset6"]}'


---> 성공
{"owner":"Christopher","color":"white","size":15,"appraisedValue":700,"assetID":"asset6"}


기타

./network.sh 명령어

아래 내용은 ./network.sh -h 명령어로 확인 가능하다.

기본 명령어 (Modes)

up - Fabric orderer 및 피어 노드를 불러옵니다. (생성된 채널 없음)
up createChannel - 하나의 채널로 패브릭 네트워크를 불러옵니다.
createChannel - 네트워크 생성 후 채널 생성 및 가입
deployCC - 채널에 체인코드 배포(기본값: asset-transfer-basic)
down - 네트워크를 종료합니다.

up, createChannel 명령어 옵션

-ca <use CAs> - 인증 기관을 사용하여 네트워크 암호화 자료 생성
-c <채널 이름> - 만들 채널의 이름(기본값은 "mychannel")
-s <dbtype> - 배포할 피어 상태 데이터베이스: goleveldb(기본값) 또는 couchdb
-r <최대 재시도> - 특정 횟수의 시도 후 CLI 시간 초과(기본값은 5)
-d <지연> - CLI가 특정 시간(초) 동안 지연됩니다(기본값은 3)
-verbose - 자세한 정보 표시 모드

deployCC 명령어 옵션

-c <채널 이름> - 체인코드를 배포할 채널의 이름
-ccn <이름> - 체인코드 이름.
-ccl <언어> - 배포할 체인코드의 프로그래밍 언어: go, java, javascript, typescript
-ccv <버전> - 체인코드 버전. 1.0(기본값), v2, version3.x 등
-ccs <시퀀스> - 체인코드 정의 시퀀스. 정수, 1(기본값), 2, 3 등 이어야 합니다
-ccp <경로> - 체인코드의 파일 경로입니다
-ccep <policy> - (선택) 서명 정책 구문을 사용하는 체인코드 보증 정책입니다. 기본 정책에는 Org1 및 Org2의 보증이 필요합니다
-cccg <collection-config> - (선택) 개인 데이터 컬렉션 구성 파일의 파일 경로
-cci <fcn name> - (선택) 체인코드 초기화 함수의 이름입니다. 함수가 제공되면 init 실행이 요청되고 함수가 호출됩니다

조합 예시

up -ca -r -d -s -verbose
up createChannel -ca -c -r -d -s -verbose
createChannel -c -r -d -verbose
deployCC -ccn -ccl -ccv -ccs -ccp -cci -r -d -verbose

예시

network.sh up createChannel -ca -c mychannel -s couchdb
network.sh createChannel -c channelName
network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-javascript/ -ccl javascript
network.sh deployCC -ccn mychaincode -ccp ./user/mychaincode -ccv 1 -ccl javascript
반응형