티스토리 뷰

반응형

해당 글은 Hyperledger Fabric 페이지의 게시글을 번역 및 정리한 자료입니다.

본 사이트 : http://hyperledger-fabric.readthedocs.io/en/release/fabric_model.html

Building Your First Network(첫번째 네트워크 구축)

첫 번째 네트워크 (BYFN) 시나리오를 구축하면 두 개의 피어 노드를 유지 관리하는 두 개의 조직과 "솔로" ordering ​​서비스로 구성된 샘플 Hyperbelger 패브릭 네트워크가 프로비저닝됩니다.

Install prerequisites(필수 구성 요소 설치)

시작하기 전에 아직 수행하지 않은 경우, 블록 체인 응용 프로그램을 개발하거나 Hyperledger Fabric을 운영할 플랫폼에 모든 필수 구성 요소가 설치되어 있는지 확인하십시오.

또한 Hyperledger Fabric Samples 를 다운로드하여 설치해야합니다. fabric-samples 저장소에 여러 샘플이 포함되어 있음을 알 수 있습니다. first-network샘플을 사용할 것 입니다. 이제 그 하위 디렉토리를 열어봅니다.

cd /opt/gopath/src/github.com/hyperledger
git clone https://github.com/hyperledger/fabric-samples.git
cd fabric-samples


먼저 hyperledger fabric samples에서 다음을 다운로드 합니다.

curl -sSL https://goo.gl/iX9dek | bash

위의 curl 명령은 네트워크를 설정하고 위에 작성한 복제 된 레포에 배치해야하는 모든 플랫폼 특정 2 진 파일을 다운로드하고 추출하는 bash 스크립트를 다운로드하고 실행합니다. 4 개의 플랫폼 별 바이너리를 검색합니다.

  • cryptogen,
  • configtxgen,
  • configtxlator, 및
  • peer

현재 작업 디렉토리 bin의 서브 디렉토리에 위치시킵니다.


Want to run it now?(지금 실행하고 싶습니까?)

우리는 두 개의 다른 조직(organizations)을 대표하는 4 명의 피어(peer)와 주문자(orderer) 노드로 구성된 Hyperledger 패브릭 네트워크를 신속하게 부트 스트랩하기 위해 이 Docker 이미지를 활용하는 완전히 주석된 스크립트 - byfn.sh를 제공합니다. 또한 피어를 채널에 참여시키고 체인 코드를 배포 및 인스턴스화하며 배포된 체인 코드에 대한 트랜잭션 실행을 유도하는 스크립트 실행을 실행하는 컨테이너를 시작합니다.

./byfn.sh -h

./byfn.sh 스크립트의 도움말 텍스트는 다음과 같습니다 .

./byfn.sh -h
용법:
   byfn.sh -m up | down | restart [-c <채널 이름>] 생성 [-t <timeout>]
   byfn.sh -h | --help (이 메시지를 출력하십시오)
     -m <mode> - 'up', 'down', 'restart'또는 'generate'중 하나
       - 'up'- 도커로 네트워크 구성 - 구성
       - 'down'- 도커로 네트워크 정리 - 작성
       - 'restart'- 네트워크 재시작
       - 'generate'- 필수 인증서 및 생성 창 생성
       - c <채널 이름> - 사용할 구성 이름 (기본값은 "mychannel")
       - t <timeout> - CLI 시간 종료 기간 (마이크로 초) (기본값은 10000)

일반적으로, 먼저 필요한 인증서와 genesis 블록을 생성하고
네트워크를 불러 오십시오. 예 :

   byfn.sh -m generate -c <채널 이름>
   byfn.sh -m up -c <채널 이름>

채널 이름을 제공하지 않기로 선택하면 스크립트는 기본 이름인 mychannel을 사용합니다. CLI 시간 초과 매개 변수 (-t 플래그로 지정)는 optional 값입니다. 설정하지 않으면 스크립트가 끝나고 나서 CLI 컨테이너가 종료됩니다.


Generate Network Artifacts(네트워크 아티팩트 생성)

그것을 줄 준비가 되었습니까? 좋아, 그럼! 다음 명령을 실행하십시오.

./byfn.sh -m generate

예 / 아니오 명령 행 프롬프트와 함께 일어날 일에 대한 간단한 설명을 볼 수 있습니다. 설명된 작업을 실행하려면 y로 응답하십시오.

Generating certs and genesis block for with channel 'mychannel' and CLI timeout of '10000'
Continue (y/n)?y
proceeding ...
/Users/xxx/dev/fabric-samples/bin/cryptogen

##########################################################
##### Generate certificates using cryptogen tool #########
##########################################################
org1.example.com
2017-06-12 21:01:37.334 EDT [bccsp] GetDefault -> WARN 001 Before using BCCSP, please call InitFactories(). Falling back to bootBCCSP.
...

/Users/xxx/dev/fabric-samples/bin/configtxgen
##########################################################
#########  Generating Orderer Genesis block ##############
##########################################################
2017-06-12 21:01:37.558 EDT [common/configtx/tool] main -> INFO 001 Loading configuration
2017-06-12 21:01:37.562 EDT [msp] getMspConfig -> INFO 002 intermediate certs folder not found at [/Users/xxx/dev/byfn/crypto-config/ordererOrganizations/example.com/msp/intermediatecerts]. Skipping.: [stat /Users/xxx/dev/byfn/crypto-config/ordererOrganizations/example.com/msp/intermediatecerts: no such file or directory]
...
2017-06-12 21:01:37.588 EDT [common/configtx/tool] doOutputBlock -> INFO 00b Generating genesis block
2017-06-12 21:01:37.590 EDT [common/configtx/tool] doOutputBlock -> INFO 00c Writing genesis block

#################################################################
### Generating channel configuration transaction 'channel.tx' ###
#################################################################
2017-06-12 21:01:37.634 EDT [common/configtx/tool] main -> INFO 001 Loading configuration
2017-06-12 21:01:37.644 EDT [common/configtx/tool] doOutputChannelCreateTx -> INFO 002 Generating new channel configtx
2017-06-12 21:01:37.645 EDT [common/configtx/tool] doOutputChannelCreateTx -> INFO 003 Writing new channel tx

#################################################################
#######    Generating anchor peer update for Org1MSP   ##########
#################################################################
2017-06-12 21:01:37.674 EDT [common/configtx/tool] main -> INFO 001 Loading configuration
2017-06-12 21:01:37.678 EDT [common/configtx/tool] doOutputAnchorPeersUpdate -> INFO 002 Generating anchor peer update
2017-06-12 21:01:37.679 EDT [common/configtx/tool] doOutputAnchorPeersUpdate -> INFO 003 Writing anchor peer update

#################################################################
#######    Generating anchor peer update for Org2MSP   ##########
#################################################################
2017-06-12 21:01:37.700 EDT [common/configtx/tool] main -> INFO 001 Loading configuration
2017-06-12 21:01:37.704 EDT [common/configtx/tool] doOutputAnchorPeersUpdate -> INFO 002 Generating anchor peer update
2017-06-12 21:01:37.704 EDT [common/configtx/tool] doOutputAnchorPeersUpdate -> INFO 003 Writing anchor peer update

이 첫 번째 명령어는 모든 다양한 네트워크 엔터티에 대한 모든 인증서와 키, ordering 서비스를 부트 스트랩하는 데 사용되는 genesis block 및 채널을 구성하는 데 필요한 구성 트랜잭션 모음을 생성합니다.


Bring Up the Network(네트워크 시작하기)

다음 명령을 사용하여 네트워크를 가동시킬 수 있습니다.

./byfn.sh -m up

다시 한 번 계속하거나 중단 할 것인지 묻는 메시지가 나타납니다. y로 응답하십시오. :

Starting with channel 'mychannel' and CLI timeout of '10000'
Continue (y/n)?y
proceeding ...
Creating network "net_byfn" with the default driver
Creating peer0.org1.example.com
Creating peer1.org1.example.com
Creating peer0.org2.example.com
Creating orderer.example.com
Creating peer1.org2.example.com
Creating cli


 ____    _____      _      ____    _____
/ ___|  |_   _|    / \    |  _ \  |_   _|
\___ \    | |     / _ \   | |_) |   | |
 ___) |   | |    / ___ \  |  _ <    | |
|____/    |_|   /_/   \_\ |_| \_\   |_|

Channel name : mychannel
Creating channel...

거기에서 로그가 계속됩니다. 이렇게하면 모든 컨테이너가 시작되고 완전한 종단 간 응용 프로그램 시나리오가 시작됩니다. 성공적으로 완료되면 터미널 창에서 다음을 보고해야합니다.

2017-05-16 17:08:01.366 UTC [msp] GetLocalMSP -> DEBU 004 Returning existing local MSP
2017-05-16 17:08:01.366 UTC [msp] GetDefaultSigningIdentity -> DEBU 005 Obtaining default signing identity
2017-05-16 17:08:01.366 UTC [msp/identity] Sign -> DEBU 006 Sign: plaintext: 0AB1070A6708031A0C08F1E3ECC80510...6D7963631A0A0A0571756572790A0161
2017-05-16 17:08:01.367 UTC [msp/identity] Sign -> DEBU 007 Sign: digest: E61DB37F4E8B0D32C9FE10E3936BA9B8CD278FAA1F3320B08712164248285C54
Query Result: 90
2017-05-16 17:08:15.158 UTC [main] main -> INFO 008 Exiting.....
===================== Query on PEER3 on channel 'mychannel' is successful =====================

===================== All GOOD, BYFN execution completed =====================


 _____   _   _   ____
| ____| | \ | | |  _ \
|  _|   |  \| | | | | |
| |___  | |\  | | |_| |
|_____| |_| \_| |____/

이러한 로그를 스크롤하여 다양한 트랜잭션을 볼 수 있습니다. 이 결과를 얻지 못하면 문제 해결 섹션으로 넘어가 무엇이 잘못되었는지 발견 할 수 있는지 알아 보겠습니다.


Bring Down the Network(네트워크 다운)

마지막으로 한 번에 한 단계 씩 네트워크 설정을 탐색 할 수 있도록 모든 항목을 가져와 봅시다. 다음은 컨테이너를 죽이고, 암호 자료와 네 가지 아티팩트를 제거하고, Docker 레지스트리에서 체인 코드 이미지를 삭제합니다.

./byfn.sh -m down

다시 한 번 계속하라는 메시지가 표시됩니다. y로 응답하세요. :

Stopping with channel 'mychannel' and CLI timeout of '10000'
Continue (y/n)?y
proceeding ...
WARNING: The CHANNEL_NAME variable is not set. Defaulting to a blank string.
WARNING: The TIMEOUT variable is not set. Defaulting to a blank string.
Removing network net_byfn
468aaa6201ed
...
Untagged: dev-peer1.org2.example.com-mycc-1.0:latest
Deleted: sha256:ed3230614e64e1c83e510c0c282e982d2b06d148b1c498bbdcc429e2b2531e91
...

기본 툴링 및 부트 스트랩 메커니즘에 대해 더 자세히 알고 싶으면 계속 읽으십시오. 다음 섹션에서는 완전한 기능의 Hyperledger 패브릭 네트워크를 구축하기위한 다양한 단계와 요구 사항을 살펴 보겠습니다.


Crypto Generator(암호 생성기)

우리는 이 cryptogen도구를 사용하여 다양한 네트워크 엔터티용 암호화 자료(x509 certs)를 생성합니다. 이 인증서는 신원을 나타내며 당사 엔티티가 통신하고 거래 할 때 서명 / 확인 인증을 수행할 수 있습니다.


How does it work?(어떻게 작동합니까?)

Cryptogen은 네트워크 토폴로지가 포함된 crypto-config.yaml 파일을 사용하며 조직과 해당 조직에 속한 구성 요소 모두에 대해 일련의 인증서와 키를 생성할 수 있습니다. 각 조직에는 특정 구성 요소 (peer 및 ​​orderer)를 해당 조직에 바인드 하는 고유한 루트 인증서(ca-cert)가 제공됩니다. 각 조직에 고유한 CA 인증서를 할당하여 참여하는 회원이 자체 인증 기관을 사용하는 일반적인 네트워크를 모방합니다. Hyperledger Fabric 내의 트랜잭션과 통신은 엔티티의 개인 키(keystore)에 의해 서명된 다음 공개 키(signcerts)를 통해 검증됩니다.

이 파일 내에 count 변수가 있음을 알 수 있습니다. 우리는 이를 사용하여 조직 당 피어의 수를 지정합니다. 우리의 경우 Org 당 두 명의 동료가 있습니다. 우리는 지금 x.509 인증서 및 공개 키 인프라 의 세부 사항을 조사하지 않을 것 입니다. 관심이 있다면, 당신은 이 주제들을 당신의 시간에 정독할 수 있습니다.

이 도구를 실행하기 전에 crypto-config.yaml에서 간단한 내용을 살펴 보겠습니다. OrdererOrgs 헤더 아래의 "이름(Name)", "도메인(Domain)"및 "사양(Specs)"매개 변수에 특히 주의하십시오 .

OrdererOrgs:
#---------------------------------------------------------
# Orderer
# --------------------------------------------------------
- Name: Orderer
  Domain: example.com
  CA:
      Country: US
      Province: California
      Locality: San Francisco
  #   OrganizationalUnit: Hyperledger Fabric
  #   StreetAddress: address for org # default nil
  #   PostalCode: postalCode for org # default nil
  # ------------------------------------------------------
  # "Specs" - See PeerOrgs below for complete description
# -----------------------------------------------------
  Specs:
    - Hostname: orderer
# -------------------------------------------------------
# "PeerOrgs" - Definition of organizations managing peer nodes
# ------------------------------------------------------
PeerOrgs:
# -----------------------------------------------------
# Org1
# ----------------------------------------------------
- Name: Org1
  Domain: org1.example.com

네트워크 엔터티의 명명 규칙은 "{{.Hostname}}. {{. Domain}}"입니다. 따라서 우리의 ordering 노드를 참조 점으로 사용하여 Orderer의 MSP ID에 연결된  orderer.example.com라는 이름의 ordering 노드가 남게됩니다. 이 파일에는 정의 및 구문에 대한 광범위한 설명서가 들어 있습니다. MSP에 관한보다 자세한 정보는 Membership Service Providers(MSP) 문서를 참조하십시오.

cryptogen 도구를 실행하면 생성된 인증서와 키가 crypto-config라는 폴더에 저장됩니다.


Configuration Transaction Generator(구성 트랜잭션 생성기)

configtxgen tool은 네 개의 구성 아티팩트를 만드는 데 사용됩니다. :

  • orderer genesis block,
  • channel configuration transaction,
  • 두 개의 anchor peer transactions - 각 피어 조직에 하나씩

이 도구의 사용에 대한 전체 설명은 채널 구성(configtxgen) 을 참조하십시오 .

orderer 블록은 ordering 서비스를위한 Genesis Block이며, 채널 트랜잭션 파일은 채널 생성시 orderer에게 전송됩니다. 앵커 피어 트랜잭션은 이름에서 알 수 있듯이 이 채널에서 각 조직의 앵커 피어를 지정합니다.


How does it work?(어떻게 작동합니까?)

Configtxgen은 샘플 네트워크에 대한 정의가 들어 있는 configtx.yaml 파일을 사용합니다. 각 피어 노드를 관리하고 유지 관리하는 Orderer Org(OrdererOrg)와 Peer Orgs(Org1Org2)의 세 멤버가 있습니다. 이 파일은 또한 두 개의 Peer Orgs로 구성된 컨소시엄(SampleConsortium)을 지정합니다. 이 파일 맨 위에있는 "프로필(Profiles)" 섹션에 특히 주의하십시오. 두 개의 고유 한 헤더가 있음을 알 수 있습니다. orderer genesis block(TwoOrgsOrdererGenesis)과 우리 채널(TwoOrgsChannel)을 위한 블록이 하나씩 있습니다.

이러한 헤더는 중요합니다. 우리가 artifacts를 생성할 때 인수로 전달합니다.

이 파일에는 주목할 가치가 있는 두 가지 추가 사양이 포함되어 있습니다. 첫째, 각 피어 조직에 대한 앵커 피어(peer0.org1.example.compeer0.org2.example.com)를 지정합니다 . 두 번째로, 우리는 각 구성원에 대한 MSP 디렉토리의 위치를 ​​가리키며 차례로 orderer genesis 블록에 각 Org에 대한 루트 인증서를 저장할 수 있습니다. 이것은 중요한 개념입니다. 이제 ordering 서비스와 통신하는 모든 네트워크 엔터티는 디지털 서명을 확인할 수 있습니다.


Run the tools(도구 실행)

configtxgen 및 cryptogen 명령을 사용하여 수동으로 인증서 / 키(certificates/keys)와 다양한 구성 아티팩트를 생성할 수 있습니다. 또는, 목표를 달성하기 위해 byfn.sh 스크립트를 적용할 수도 있습니다.


Manually generate the artifacts(이슈 수동 생성)

byfn.sh 스크립트의 generateCerts 함수를 참조하여 crypto-config.yaml 파일에 정의된 대로 네트워크 구성에 사용될 인증서를 생성하는 데 필요한 명령을 참조할 수 있습니다. 그러나 편의를 위해 여기서도 참조할 것입니다.

먼저 cryptogen도구를 실행해 봅시다. 우리의 바이너리는 bin 디렉토리에 있으므로 도구가 있는 상대 경로를 제공해야합니다.

../bin/cryptogen generate --config=./crypto-config.yaml

다음 경고가 표시됩니다. 그것은 무해하고 무시합니다.

[bccsp] GetDefault -> WARN 001 Before using BCCSP, please call InitFactories(). Falling back to bootBCCSP.

다음으로, 우리는 configtxgen 도구에게 가져올 configtx.yaml 구성 파일을 찾을 위치를 알려야합니다. 우리는 현재의 작업 디렉토리를 살펴볼 것입니다 :

먼저 환경 변수를 설정하여 configtxgenconfigtx.yaml 구성 파일을 찾을 위치를 지정해야합니다.

export FABRIC_CFG_PATH=$PWD

그런 다음 orderer genesis block을 생성하는 configtxgen 도구를 호출합니다.

../bin/configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block

중간 인증서, 인증서 해지 목록 (crls) 및 MSP 구성과 관련된 로그 경고를 무시할 수 있습니다. 우리는 이 샘플 네트워크에 있는 것을 사용하지 않습니다.


Create a Channel Configuration Transaction(채널 구성 트랜잭션 만들기)

다음에는 채널 트랜잭션 이슈를 생성해야합니다. 다음 안내에 따라 사용할 수 있는 환경 변수로 $CHANNEL_NAME을(를) 바꾸거나 CHANNEL_NAME을(를) 설정해야합니다.

export CHANNEL_NAME=mychannel

# this file contains the definitions for our sample channel
../bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME


다음으로 우리가 구성중인 채널에서 Org1의 앵커 피어를 정의합니다. 다시 말하지만 다음 명령에 대해 $CHANNEL_NAME을 바꾸거나 환경 변수를 설정하십시오.

../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP


이제 Org2에 대한 앵커 피어를 동일한 채널에서 정의합니다.

../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org2MSP


Start the network(네트워크 시작)

docker-compose 스크립트를 활용하여 네트워크를 확대할 것입니다. docker-compose 파일은 이전에 다운로드한 이미지를 참조하고 이전에 생성된 genesis.block으로 orderer를 부트 스트랩합니다.

first-network 폴더내의 docker-compose-cli.yaml에 들어가 command 부분을 주석 처리합니다.

working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
# command: /bin/bash -c './scripts/script.sh ${CHANNEL_NAME}; sleep $TIMEOUT'
volumes

주석 처리되지 않은 상태로 남겨두면, 그 스크립트는 네트워크가 시작될 때 'What’s happening behind the scenes?' 섹션에서 설명한 모든 CLI 명령을 실행합니다. 그러나 각 호출의 구문과 기능을 노출하기 위해 수동으로 명령을 수행하려고합니다.

TIMEOUT 변수에 적당한 값(초 단위로 지정)을 전달하십시오. 그렇지 않으면 기본적으로 CLI 컨테이너가 60 초 후에 종료됩니다.

네트워크 시작 :

CHANNEL_NAME=$CHANNEL_NAME TIMEOUT=<pick_a_value> docker-compose -f docker-compose-cli.yaml up -d

네트워크의 실시간 로그를 보려면 -d플래그를 제공하지 마십시오. 로그 스트림을 보내려면 CLI 호출을 실행하기 위해 두 번째 터미널을 열어야합니다.


Environment variables(환경변수)

peer0.org1.example.com에 대한 다음 CLI 명령이 작동하려면 아래에 제시된 네 개의 환경 변수를 사용하여 명령을 시작해야합니다. peer0.org1.example.com에 대한 이러한 변수는 CLI 컨테이너로 구워 지므로 전달하지 않고 조작할 수 있습니다. 그러나 다른 동료 또는 orderer에게 요청을 보내려면 해당 값을 적절하게 제공해야합니다. docker-compose-base.yaml에서 특정 경로를 검사합니다.

first-network의 base 폴더 내의 docker-compose-base.yaml 파일에서 peer0.org1.example.com에 대한 환경변수를 다음과 같이 수정합니다.

# Environment variables for PEER0

CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
CORE_PEER_ADDRESS=peer0.org1.example.com:7051
CORE_PEER_LOCALMSPID="Org1MSP"
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt


Create & Join Channel(채널 만들기 및 가입)

위의 채널 구성 트랜잭션 만들기(Create a Channel Configuration Transaction) 섹션의 configtxgen 도구를 사용하여 채널 구성 트랜잭션을 만들었습니다. 이 프로세스를 반복하여 configtxgen 도구에 전달한 configtx.yaml와 동일한 또는 다른 프로파일을 사용하여 추가 채널 구성 트랜잭션을 생성할 수 있습니다. 그런 다음 이 섹션에서 정의한 프로세스를 반복하여 네트워크에 다른 채널을 설정할 수 있습니다.

docker exec 명령을 사용하여 CLI 컨테이너에 들어갑니다.

docker exec -it cli bash

성공한 경우 다음이 표시됩니다.

root@0d78bb69300d:/opt/gopath/src/github.com/hyperledger/fabric/peer#


다음으로, 생성된 채널 구성 트랜잭션 아티팩트를 전달합니다. 이 아티팩트는 채널 생성 요청의 일환으로 orderer에게 Create a Channel Configuration Transaction(채널 구성 트랜잭션 생성) 섹션에서 생성한 항목(channel.tx)입니다.

-c 플래그와 함께 채널 이름을 지정하고 채널 구성 트랜잭션을 -f 플래그와 함께 지정합니다. 이 경우 channel.tx이지만 다른 이름으로 구성 트랜잭션을 마운트할 수 있습니다.

※ 참고 이 명령의 일부로 전달할 -- cafile 을 확인하십시오. 이것은 발주자의 루트 인증서에 대한 로컬 경로이므로 TLS 핸드 셰이크를 확인할 수 있습니다.

export CHANNEL_NAME=mychannel

# channel.tx 파일은 CLI 컨테이너 내의 channel-artifacts 디렉토리에 마운트됩니다.
# 결과적으로 파일의 전체 경로를 전달합니다.
# 우리는 TLS 핸드 셰이크를 확인하기 위해 주문자 ca-cert의 경로도 전달합니다
# $ CHANNEL_NAME 변수를 적절하게 바꿔야합니다.

peer channel create -o orderer.example.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/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

이 명령은 채널에 참여할 때 사용하는 기원 블록 <channel-ID.block>을 반환합니다. channel.tx에 지정된 구성 정보가 들어 있습니다.

※ 참고 이러한 나머지 수동 명령은 CLI 컨테이너에 남아 있습니다. peer0.org1.example.com이 아닌 다른 피어를 대상으로 할 때는 모든 명령 앞에 해당 환경 변수를 사용하는 것을 기억해야합니다.

이제 peer0.org1.example.com 채널에 참여합시다 .

# 기본적으로 이 명령은 `peer0.org1.example.com`에만 ​​합류합니다.
# 이전 명령에서 <channel-ID.block>이 반환되었습니다
# peer channel join -b <channel-ID.block> 

peer channel join -b mychannel.block

위의 peerenvvars 섹션에서 사용한 네 개의 환경 변수를 적절히 변경하여 다른 피어를 필요에 따라 채널에 참여시킬 수 있습니다.

Install & Instantiate Chaincode(체인 코드 설치 및 인스턴스화)

※ 참고: 기존의 단순한 체인 코드를 활용할 것입니다. 독자적인 체인 코드를 작성하는 방법을 배우려면, 개발자용 Chaincode 자습서를 참조하십시오.

응용 프로그램은 chaincode를 통해 블록 체인 원장과 상호 작용합니다. 따라서 트랜잭션을 실행하고 보증하는 모든 피어에 체인 코드를 설치한 다음 채널에서 체인 코드를 인스턴스화 해야합니다. 먼저 샘플 Go 코드를 네 개의 피어 노드 중 하나에 설치합니다. 이 명령은 피어의 파일 시스템에 소스 코드를 저장합니다.

peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02

그런 다음 채널에서 체인 코드를 인스턴스화합니다. 이렇게 하면 채널에서 체인 코드가 초기화되고 체인 코드에 대한 보증(endorsement) 정책이 설정되며 대상 피어에 대해 체인 코드 컨테이너가 시작됩니다. -P 인수에 유의하십시오. 이것은 우리의 정책으로, 이 체인 코드에 대한 트랜잭션의 유효성을 검증하는 데 필요한 보증 수준을 지정합니다.

아래 명령에서 정책을 -P "OR ( 'Org0MSP.member', 'Org1MSP.member')로 지정했음을 알 수 있습니다. 즉, Org1 또는 Org2에 속한 동료 (즉, 단 하나의 endorsement)로부터 "보증(endorsement)"해야합니다. 구문을 AND로 변경하면 두 가지 보증이 필요합니다.

# $CHANNEL_NAME 환경 변수를 바꿔야합니다.(바꾸지 않을 경우 export CHANNEL_NAME=mychannel 명령을 실행하세요.) 
# mycc라는 이름으로 체인 코드를 설치하지 않았다면, 그 인수도 수정하십시오 
peer chaincode instantiate -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n mycc -v 1.0 -c '{"Args":["init","a", "100", "b","200"]}' -P "OR ('Org1MSP.member','Org2MSP.member')"

정책 구현에 대한 자세한 내용은 보증 정책 문서를 참조하십시오.

Query(쿼리)

체인 코드가 올바르게 인스턴스화되고 상태 데이터베이스에 채워 졌는지 확인하기 위해 a의 값을 쿼리합니다. 쿼리의 구문은 다음과 같습니다.

# -C 및 -n 플래그를 적절하게 설정하십시오. 
peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}' 
peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","b"]}'

Invoke(호출)

이제 10a에서 b로 이동합시다. 이 트랜잭션은 새 블록을 잘라내어 상태 데이터베이스를 업데이트합니다. 호출 구문은 다음과 같습니다.

# -C 및 -n 플래그를 적절하게 설정하십시오. 
peer chaincode invoke -o orderer.example.com:7050  --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem  -C $CHANNEL_NAME -n mycc -c '{"Args":["invoke","a","b","10"]}'

Query(쿼리)

우리의 이전 호출이 제대로 실행되었는지 확인합시다. 키 a100으로 초기화하고 이전 호출을 사용하여 10을 제거했습니다. 따라서 a에 대한 쿼리는 90을 나타내야합니다. 쿼리 구문은 다음과 같습니다.

# -C 및 -n 플래그를 적절하게 설정하십시오. 
peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}' 
peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","b"]}'

다음과 같은 결과가 나와야합니다.

Query Result: 90
Query Result: 210

처음부터 다시 시작하여 키 값 쌍 및 후속 호출을 조작하십시오.

What’s happening behind the scenes? (그 뒤에서 무슨 일이 일어나고있는거야?)

※ 참고: 이 단계에서는 script.shdocker-compose-cli.yaml 파일에서 주석 처리되지 않은 시나리오를 설명합니다. ./byfn.sh -m down을 사용하여 네트워크를 정리하고 이 명령이 활성 상태인지 확인하십시오. 그런 다음 동일한 도커 작성 프롬프트를 사용하여 네트워크를 다시 시작하십시오.

  • 스크립트 - script.sh -는 CLI 컨테이너에서 구워집니다. 이 스크립트는 제공된 채널 이름에 대해 createChannel 명령을 실행하고 채널 구성에 channel.tx 파일을 사용합니다.
  • createChannel의 결과는 피어의 파일 시스템에 저장되고 channel.tx에서 지정된 채널 구성을 포함하는 기원 블록(<your_channel_name>.block)입니다.
  • joinChannel 명령은 이전에 생성된 기원 블록(genesis block)을 입력으로 사용하는 네 개의 모든 피어에 대해 실행됩니다. 이 명령은 피어가 <your_channel_name>에 가입하고 <your_channel_name>.block으로 시작하는 체인을 생성하도록 지시합니다.
  • 이제 우리에게는 4 명의 동료와 2 개의 조직으로 구성된 채널이 있습니다. 이것은 TwoOrgsChannel 프로필입니다.
  • peer0.org1.example.compeer1.org1.example.com은 Org1에 속합니다. peer0.org2.example.compeer1.org2.example.com은 Org2에 속합니다.
  • 이러한 관계는 crypto-config.yaml을 통해 정의되며 MSP 경로는 docker-compose에서 지정됩니다.
  • 앵커 피어가 Org1MSP(peer0.org1.example.com) 및 Org2MSP (peer0.org2.example.com)에 업데이트됩니다. Org1MSPanchors.txOrg2MSPanchors.tx 아티팩트를 채널 이름과 함께 ordering 서비스에 전달하여 이 작업을 수행합니다.
  • chaincode - chaincode_example02 -는 peer0.org1.example.compeer0.org2.example.com에 설치됩니다.
  • 그런 다음 chaincode는 peer0.org2.example.com에서 "인스턴스화"됩니다. 인스턴스화는 채널에 체인 코드를 추가하고 대상 피어에 대한 컨테이너를 시작하며 체인 코드와 연관된 키 값 쌍을 초기화합니다. 이 예제의 초기 값은 [ "a", "100" "b", "200"]입니다. 이 "인스턴스화"는 dev-peer0.org2.example.com-mycc-1.0이라는 이름으로 컨테이너를 시작합니다.
  • 이 인스턴스화는 보증 정책에 대한 인수도 전달합니다. 정책은 -P "OR ( 'Org1MSP.member', 'Org2MSP.member')"로 정의됩니다. 이는 모든 트랜잭션이 Org1 또는 Org2에 연결된 동료에 의해 보증(endorse)되어야 함을 의미합니다.
  • peer0.org1.example.com에 "a"값에 대한 쿼리가 발행됩니다. chaincode는 이전에 peer0.org1.example.com에 설치되었으므로 Org1 peer0의 컨테이너가 dev-peer0.org1.example.com-mycc-1.0이라는 이름으로 시작됩니다. 쿼리의 결과도 반환됩니다. 쓰기 작업이 발생하지 않으므로 "a"에 대한 쿼리는 여전히 "100"값을 반환합니다.
  • "a"에서 "b"로 "10"을 이동하기 위해 호출이 peer0.org1.example.com으로 전송됩니다.
  • chaincode는 peer1.org2.example.com에 설치됩니다.
  • "a"값에 대해 peer1.org2.example.com에 쿼리가 전송됩니다. 그러면 dev-peer1.org2.example.com-mycc-1.0이라는 이름으로 세 번째 chaincode 컨테이너가 시작됩니다. 키 "a"의 값이 10으로 수정 된 이전 트랜잭션을 정확하게 반영하여 값 90이 리턴됩니다.

What does this demonstrate? (이것은 무엇을 보여줍니까?)

원장에 대한 읽기 / 쓰기 작업을 성공적으로 수행하려면 반드시 피어에 체인 코드를 설치해야 합니다. 또한 체인 코드 컨테이너는 해당 체인 코드(예: "a"값에 대한 쿼리)에 대해 init 또는 기존 트랜잭션(읽기 / 쓰기)이 수행될 때까지 피어에 대해 시작되지 않습니다. 트랜잭션은 컨테이너를 시작하게 합니다. 또한 채널의 모든 피어는 불변의 시퀀스된 레코드를 블록으로 저장하는 블록 체인과 현재 상태의 스냅 샷을 유지 관리하는 상태 데이터베이스를 포함하는 원장의 정확한 사본을 유지 관리합니다. 여기에는 체인 코드가 설치되지 않은 피어(위의 예에서 peer1.org1.example.com와 같이)가 포함됩니다. 마지막으로, 체인 코드는 이미 인스턴스화 되었으므로 위의 예에서 peer1.org2.example.com과 같이 설치한 후에 액세스할 수 있습니다.

How do I see these transactions? ( 이러한 거래는 어떻게 볼 수 있습니까? )

CLI Docker 컨테이너의 로그를 확인하십시오.

docker logs -f cli

다음과 같은 결과가 나타납니다.

2017-05-16 17:08:01.366 UTC [msp] GetLocalMSP -> DEBU 004 Returning existing local MSP
2017-05-16 17:08:01.366 UTC [msp] GetDefaultSigningIdentity -> DEBU 005 Obtaining default signing identity
2017-05-16 17:08:01.366 UTC [msp/identity] Sign -> DEBU 006 Sign: plaintext: 0AB1070A6708031A0C08F1E3ECC80510...6D7963631A0A0A0571756572790A0161
2017-05-16 17:08:01.367 UTC [msp/identity] Sign -> DEBU 007 Sign: digest: E61DB37F4E8B0D32C9FE10E3936BA9B8CD278FAA1F3320B08712164248285C54
Query Result: 90
2017-05-16 17:08:15.158 UTC [main] main -> INFO 008 Exiting.....
===================== Query on PEER3 on channel 'mychannel' is successful =====================

===================== All GOOD, BYFN execution completed =====================


 _____   _   _   ____
| ____| | \ | | |  _ \
|  _|   |  \| | | | | |
| |___  | |\  | | |_| |
|_____| |_| \_| |____/

이 로그를 스크롤하여 다양한 트랜잭션을 볼 수 있습니다.

How can I see the chaincode logs? (체인 코드 로그는 어떻게 볼 수 있습니까?)

개별 체인 코드 컨테이너를 검사하여 각 컨테이너에 대해 실행되는 별도의 트랜잭션을 확인합니다. 다음은 각 컨테이너에서 결합된 출력입니다.

$ docker logs dev-peer0.org2.example.com-mycc-1.0
04:30:45.947 [BCCSP_FACTORY] DEBU : Initialize BCCSP [SW]
ex02 Init
Aval = 100, Bval = 200

$ docker logs dev-peer0.org1.example.com-mycc-1.0
04:31:10.569 [BCCSP_FACTORY] DEBU : Initialize BCCSP [SW]
ex02 Invoke
Query Response:{"Name":"a","Amount":"100"}
ex02 Invoke
Aval = 90, Bval = 210

$ docker logs dev-peer1.org2.example.com-mycc-1.0
04:31:30.420 [BCCSP_FACTORY] DEBU : Initialize BCCSP [SW]
ex02 Invoke
Query Response:{"Name":"a","Amount":"90"}


Understanding the Docker Compose topology ( Docker 작성 토폴로지 이해 )

BYFN 샘플은 docker-compose-base.yaml (base 폴더에 있음)에서 확장된 두 가지 Docker Compose 파일을 제공합니다. 우리의 첫 번째 예제, docker-compose-cli.yaml은 CLI 컨테이너와 함께 orderer, 4 명의 peer를 제공합니다. 이 파일은 이 페이지의 지침 전체에 사용됩니다.

※ 참고: 이 절의 나머지 부분에서는 SDK 용으로 설계된 Docker Compose 파일에 대해 설명합니다. 이러한 테스트 실행에 대한 자세한 내용은 노드 SDK 레포를 참조하십시오.

두 번째 flavor인 docker-compose-e2e.yaml 은 Node.js SDK를 사용하여 end-to-end 테스트를 실행하도록 구성됩니다. SDK의 기능 외에도 fabric-ca 서버를 위한 컨테이너가 있다는 것이 가장 큰 차이점입니다. 결과적으로 사용자 등록(registration) 및 등록(enrollment)을 위해 REST 호출을 조직 CA에 보낼 수 있습니다.

byfn.sh 스크립트를 먼저 실행하지 않고 docker-compose-e2e.yaml을 사용하려면 4 단계를 약간 수정해야합니다. 조직의 CA에 대한 개인 키를 가리킬 필요가 있습니다. crypto-config 폴더에서 이 값을 찾을 수 있습니다. 예를 들어 Org1의 개인 키를 찾으려면 이 경로 (crypto-config/peerOrganizations/org1.example.com/ca/)를 따라야합니다. 개인 키는 _sk 뒤에 오는 긴 해시 값입니다. Org2의 경로는 crypto-config/peerOrganizations/org2.example.com/ca/ 입니다.

docker-compose-e2e.yaml에서 ca0 및 ca1에 대한 FABRIC_CA_SERVER_TLS_KEYFILE 변수를 업데이트하십시오. 또한 ca 서버를 시작하기 위해 명령에 제공된 경로를 편집해야합니다. 각 CA 컨테이너에 동일한 개인 키를 두 번 제공하고 있습니다.


Using CouchDB ( CouchDB 사용 )

상태 데이터베이스는 기본값 (goleveldb)에서 CouchDB로 전환할 수 있습니다. 동일한 체인 코드 기능을 CouchDB에서 사용할 수 있지만 체인 코드 데이터를 JSON으로 모델링 할 때 상태 데이터베이스 데이터 내용에 대해 풍부하고 복잡한 쿼리를 수행할 수있는 추가 기능이 있습니다.

기본 데이터베이스(goleveldb) 대신 CouchDB를 사용하려면 앞에서 설명한 아티팩트 생성 절차와 동일한 절차를 따르십시오. 여기서는 예외적으로 네트워크를 시작할 때 docker-compose-couch.yaml도 전달합니다.

# CHANNEL_NAME=$CHANNEL_NAME TIMEOUT=<pick_a_value> docker-compose -f docker-compose-cli.yaml -f docker-compose-couch.yaml up -d
CHANNEL_NAME=$CHANNEL_NAME TIMEOUT=30 docker-compose -f docker-compose-cli.yaml -f docker-compose-couch.yaml up -d

chaincode_example02는 이제 CouchDB를 사용하여 작동합니다.

※ 참고: fabric-couchdb 컨테이너 포트를 호스트 포트에 매핑하는 것을 선택하는 경우, 보안 관련 사항을 알고 있는지 확인하십시오. 개발환경에서 포트를 맵핑하면 CouchDB REST API를 사용할 수 있으며 CouchDB 웹 인터페이스 (Fauxton)를 통해 데이터베이스를 시각화해서 확인할 수있습니다. 프로덕션 환경에서는 CouchDB 컨테이너에 대한 외부 액세스를 제한하기 위해 포트 매핑을 구현하지 않을 수 있습니다.

위에서 설명한 단계를 사용하여 CouchDB 상태 데이터베이스에 chaincode_example02 체인 코드를 사용할 수 있지만, CouchDB 쿼리 기능을 사용하려면 JSON으로 모델링된 데이터가 있는 체인 코드 (예 : marbles02)를 사용해야합니다. marbles02 chaincode는 fabric/examples/chaincode/go 디렉토리에서 찾을 수 있습니다.

위의 'Create & Join Channel(채널 만들기 및 가입)' 섹션에서 설명한대로 동일한 프로세스를 따라 채널을 만들고 가입하십시오. 피어(들)를 채널에 가입시킨 후 다음 단계를 사용하여 marbles02 체인 코드와 상호 작용하십시오.

./byfn.sh -m down
./byfn.sh -m generate

../bin/cryptogen generate --config=./crypto-config.yaml

export FABRIC_CFG_PATH=$PWD
../bin/configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block

export CHANNEL_NAME=mychannel
../bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME
../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP
../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org2MSP
CHANNEL_NAME=$CHANNEL_NAME TIMEOUT=30 docker-compose -f docker-compose-cli.yaml -f docker-compose-couch.yaml up -d

docker exec -it cli bash

export CHANNEL_NAME=mychannel
peer channel create -o orderer.example.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/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
peer channel join -b mychannel.block

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

[join시 발생하는 Error]

Error: Error getting endorser client channel: PER:404 - Error trying to connect to local peer

해결 방법: docker-compose-base.yaml 파일에서 peer0.org1.example.com의 환경변수를 원래대로 수정합니다.

peer0.org1.example.com:
    container_name: peer0.org1.example.com
    extends:
      file: peer-base.yaml
      service: peer-base
    environment:
      - CORE_PEER_ID=peer0.org1.example.com
      - CORE_PEER_ADDRESS=peer0.org1.example.com:7051
      - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org1.example.com:7051
      - CORE_PEER_LOCALMSPID=Org1MSP
    volumes:
        - /var/run/:/host/var/run/
        - ../crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp:/etc/hyperledger/fabric/msp
        - ../crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls:/etc/hyperledger/fabric/tls
    ports:
      - 7051:7051
      - 7053:7053

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

  • peer0.org1.example.com에 체인 코드를 설치하고 인스턴스화하십시오.
# 인스턴스화 명령에 따라 $ CHANNEL_NAME 변수를 수정해야합니다.

peer chaincode install -n marbles -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/marbles02
peer chaincode instantiate -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n marbles -v 1.0 -c '{"Args":["init"]}' -P "OR ('Org0MSP.member','Org1MSP.member')"

  • 일부 구슬을 만들고 주위로 이동하십시오.
# $ CHANNEL_NAME 변수를 적절히 수정해야합니다.

peer chaincode invoke -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n marbles -c '{"Args":["initMarble","marble1","blue","35","tom"]}'
peer chaincode invoke -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n marbles -c '{"Args":["initMarble","marble2","red","50","tom"]}'
peer chaincode invoke -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n marbles -c '{"Args":["initMarble","marble3","blue","70","tom"]}'
peer chaincode invoke -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n marbles -c '{"Args":["transferMarble","marble2","jerry"]}'
peer chaincode invoke -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n marbles -c '{"Args":["transferMarblesBasedOnColor","blue","jerry"]}'
peer chaincode invoke -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n marbles -c '{"Args":["delete","marble1"]}'
  • docker-compose에서 CouchDB 포트를 매핑하도록 선택한 경우 브라우저를 열고 다음 URL로 이동하여 CouchDB 웹 인터페이스 (Fauxton)를 통해 상태 데이터베이스를 볼 수 있습니다. http://localhost:5984/_utils/
  • 데이터베이스 mychannel(또는 고유 한 채널 이름)와 그 안에있는 문서를 볼 수 있습니다.

[참고] 아래 명령에 대해서는 $CHANNEL_NAME 변수를 적절하게 업데이트해야합니다.

CLI에서 정기적 인 쿼리를 실행할 수 있습니다 (예 : 읽기 marble2).

peer chaincode query -C $CHANNEL_NAME -n marbles -c '{"Args":["readMarble","marble2"]}'

출력에는 marble2다음과 같은 세부 정보가 표시되어야합니다.

Query Result: {"color":"red","docType":"marble","name":"marble2","owner":"jerry","size":50}

특정 구슬의 기록을 검색할 수 있습니다.(  예 marble1)

peer chaincode query -C $CHANNEL_NAME -n marbles -c '{"Args":["getHistoryForMarble","marble1"]}'

결과물은  marble1에 트랜잭션을 표시해야합니다.

Query Result: [{"TxId":"1c3d3caf124c89f91a4c0f353723ac736c58155325f02890adebaa15e16e6464", "Value":{"docType":"marble","name":"marble1","color":"blue","size":35,"owner":"tom"}},{"TxId":"755d55c281889eaeebf405586f9e25d71d36eb3d35420af833a20a2f53a3eefd", "Value":{"docType":"marble","name":"marble1","color":"blue","size":35,"owner":"jerry"}},{"TxId":"819451032d813dde6247f85e56a89262555e04f14788ee33e28b232eef36d98f", "Value":}]

Marble 필드를 소유자 jerry별로 쿼리하는 것과 같이 데이터 내용에 대한 풍부한 쿼리를 수행 할 수도 있습니다.

peer chaincode query -C $CHANNEL_NAME -n marbles -c '{"Args":["queryMarblesByOwner","jerry"]}'

결과물에는 jerry 소유의 두 구슬(marble)이 표시되어야합니다.

Query Result: [{"Key":"marble2", "Record":{"color":"red","docType":"marble","name":"marble2","owner":"jerry","size":50}},{"Key":"marble3", "Record":{"color":"blue","docType":"marble","name":"marble3","owner":"jerry","size":70}}]

Why CouchDB(왜 CouchDB인가?)

CouchDB는 일종의 NoSQL 솔루션입니다. 문서 필드가 키 - 값 mpas로 저장되는 문서 지향 데이터베이스입니다. 필드는 간단한 키 / 값 쌍, 목록 또는 맵이 될 수 있습니다. LevelDB에서 지원하는 키 / 복합 키(composite-key) / 키 범위(key-range) 쿼리 외에도 CouchDB는 전체 블록 체인 데이터에 대한 키가 아닌 쿼리와 같은 전체 데이터 리치 쿼리 기능을 지원합니다. 데이터 내용은 JSON 형식으로 저장되므로 완전히 쿼리 가능합니다. 따라서 CouchDB는 LevelDB에서 지원하지 않는 많은 유스 케이스에 대한 체인 코드, 감사, 보고 요구 사항을 충족시킬 수 있습니다.

또한 CouchDB는 블록 체인에서 준수 및 데이터 보호를 위한 보안을 향상시킬 수 있습니다. 트랜잭션 내에서 개별 속성의 필터링 및 마스킹을 통해 필드 수준의 보안을 구현할 수 있으므로 필요에 따라 읽기 전용 권한만 인증합니다.

또한 CouchDB는 CAP 정리의 AP 유형(가용성 및 파티션 허용 오차)에 해당합니다. Eventual Consistency(최종 일관성)을 갖춘 마스터 - 마스터 복제 모델을 사용 합니다. 더 많은 정보는 'Eventual Consistency page of the CouchDB documentation' 페이지 에서 찾을 수 있습니다. 그러나 각 패브릭 피어마다 데이터베이스 복제본이 없으며 데이터베이스에 대한 쓰기가 일관되고 내구성이 보장됩니다.(Eventual Consistency이 아님)


A Note on Data Persistence ( 데이터 지속성에 대한 참고 사항 )

피어 컨테이너 또는 CouchDB 컨테이너에서 데이터 지속성이 필요한 경우, 한 가지 옵션은 docker-host의 디렉토리를 컨테이너의 관련 디렉토리에 마운트하는 것입니다. 예를 들어, docker-compose-base.yaml 파일의 피어 컨테이너 스펙에 다음 두 행을 추가 할 수 있습니다.

volumes:
 - /var/hyperledger/peer0:/var/hyperledger/production

CouchDB 컨테이너의 경우 CouchDB 컨테이너 사양에 다음 두 줄을 추가 할 수있습니다.

volumes:
 - /var/hyperledger/couchdb0:/opt/couchdb/data


Troubleshooting ( 문제 해결 )

  • 항상 네트워크를 새로 시작하십시오. 아티팩트, 암호, 컨테이너 및 체인 코드 이미지를 제거하려면 다음 명령을 사용하십시오.
./byfn.sh -m down
  • 컨테이너와 이미지를 지우지 않으면 오류가 발생합니다.
  • Docker 오류가 표시되면 먼저 도커 버전 ( 선행 조건 )을 확인한 다음 Docker 프로세스를 다시 시작하십시오. Docker의 문제점은 종종 즉시 인식되지 않습니다. 예를 들어, 컨테이너에 마운트 된 암호 자료에 액세스 할 수 없으므로 오류가 발생할 수 있습니다.
  • 그들이 지속되면 이미지를 제거하고 처음부터 시작하십시오.
docker rm -f $(docker ps -aq)
docker rmi -f $(docker images -q)
  • 작성, 인스턴스 작성, 호출 또는 조회 명령에 오류가있는 경우 채널 이름 및 체인 코드 이름을 올바르게 갱신했는지 확인하십시오. 제공된 샘플 명령에는 자리 표시 자 값이 있습니다.
  • 아래 오류가 표시되면
Error: Error endorsing chaincode: rpc error: code = 2 desc = Error installing chaincode code mycc:1.0(chaincode /var/hyperledger/production/chaincodes/mycc.1.0 exits)
  • 이전 실행에서 체인 코드 이미지 (예 dev-peer1.org2.example.com-mycc-1.0또는 dev-peer0.org1.example.com-mycc-1.0) 가있을 가능성이 큽니다 . 그들을 제거하고 다시 시도하십시오
docker rmi -f $(docker images | grep peer[0-9]-peer[0-9] | awk '{print $3}')
  • 다음과 유사한 내용이 표시되는 경우
Error connecting: rpc error: code = 14 desc = grpc: RPC failed fast due to transport failure
Error: rpc error: code = 14 desc = grpc: RPC failed fast due to transport failure
  • "최신"으로 태그가 다시 지정된 "1.0.0"이미지에 대해 네트워크를 실행하고 있는지 확인하십시오.
  • 아래 오류가 표시되면
[configtx/tool/localconfig] Load -> CRIT 002 Error reading configuration: Unsupported Config Type ""
panic: Error reading configuration: Unsupported Config Type ""

그런 다음 FABRIC_CFG_PATH 환경 변수를 올바르게 설정하지 않았습니다. configtxgen 도구는 configtx.yaml을 찾으려면이 변수가 필요합니다. 돌아가서 내보내기 FABRIC_CFG_PATH = $ PWD를 실행 한 다음 채널 아티팩트를 다시 만드십시오.

  • 네트워크를 정리하려면 다음 down옵션을 사용하십시오 .
./byfn.sh -m down
  • "active endpoints"이 여전히 있음을 알리는 오류가 표시되면 Docker 네트워크를 정리합니다. 이렇게하면 이전 네트워크를 지우고 새로운 환경에서 시작할 수 있습니다.
docker network prune

다음 메시지가 표시됩니다.

WARNING! This will remove all networks not used by at least one container. Are you sure you want to continue? [y/N]
#경고! 이렇게하면 하나 이상의 컨테이너에서 사용하지 않는 모든 네트워크가 제거됩니다. 계속 하시겠습니까? [y / N]

y를 선택하십시오.

  • 오류가 계속 발생하면 Hyperledger Rocket Chat 의 # fabric-questions 채널에서 로그를 공유하십시오.


반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함