* 본 포스팅은 하이퍼레저 패브릭 docs를 번역한 내용으로, 번역 과정에서 잘못된 부분이 있을 수 있습니다.
상세 내용은 하단 링크를 참조 부탁드리며, 잘못된 내용에 대한 피드백은 언제든 환영합니다 : )
https://hyperledger.github.io/composer/latest/tutorials/deploy-to-fabric-multi-org
이 튜토리얼은 여러 조직에 블록체인 네트워크를 구성하는 절차를 제공합니다.
이 튜토리얼은 하이퍼레저 패브릭 기반의 여러 조직 블록체인 네트워크를 구성하는데 필요한 단계에 대해 설명합니다. 두 개의 조직으로 구성된 블록체인 네트워크는 하이퍼레저 패브릭에서 제공하는 샘플 네트워크를 기반으로 합니다. 또한, 필요한 보안 artifact를 생성하고 두 조직 간 네트워크를 보호하는 단계에 대해 설명합니다.
블록체인 네트워크가 구성되면, 우리는 비즈니스 네트워크가 어떻게 배포되는지 확인할 수 있습니다. (예: 샘플 네트워크의 Commodity 거래 비즈니스 네트워크) 이 비즈니스 네트워크는 체인코드 컨테이너를 운영하고 양 쪽 기관의 분산 원장에서 인스턴스화 됩니다. 그리고나서 우리는 각 조직의 신원 제공자로 생성된 서로 다른 참가자 및 신원 간 분산원장에서의 상호작용을 확인합니다.
먼저 첨부된 단일 기관 튜토리얼을 먼저 해보는 것이 좋습니다. 이 튜토리얼에서는 블록체인 네트워크를 단일 조직용 하이퍼레저 패브릭 객체에 배포하는 것을 먼저 보여주고 몇 가지 개념을 자세히 설명합니다.
이 튜토리얼의 하이퍼레저 패브릭 블록체인 네트워크 ( 두 개의 조직용) 는 docker 컨테이너를 사용해서 구성되며, 두 조직의 패브릭 네트워크는 동일한 머신에 있습니다. 현실 세계에서는 두 조직은 분리된 IP 네트워크나 도메인 혹은 secure 클라우드 환경에 있을 것입니다.
이 튜토리얼은 편의를 위해 색깔로 단계를 구분했습니다. '어느 조직'이 특정 단계를 따라야하는지, 혹은 두 조직 모두 필요한 단계일 수도 있습니다.
첫 번째 종류는 양 쪽 조직 모두 따라하는 단계입니다.
Org1은 Alice라 불리며 초록색 블록입니다.
Org2는 Bob이라 불리며 보라색 블록입니다.
이 단계는 스스로 따라할 수도 있고 친구 혹은 동료와 함께 따라할 수도 있습니다.
Prerequisites
이전에 컴포저 개발 환경을 설치했다면, 먼저 개발 환경에서 제공하는 하이퍼레저 패브릭 컨테이너를 해제해야 합니다.
cd ~/fabric-dev-servers
export FABRIC_VERSION=hlfv12
./stopFabric.sh
./teardownFabric.sh
다음으로는 아래 명령어를 사용해 GitHub Fabric Samples repository를 복사합니다. (중요: Fabric site에 있는 샘플을 사용하지 마세요, 이 튜토리얼에서 필요한 몇몇이 누락되어 있습니다.)
git clone https://github.com/mahoney1/fabric-samples.git
우리는 여러 조직용 튜토리얼을 하기 위해 Building Your First Network 패브릭 샘플을 사용합니다. 우리는 이 하이퍼레저 패브릭 네트워크를 'BYFN' (Building Your First Network) 네트워크라고 부를 것입니다. 조직을 별도의 물리적 컴퓨터 또는 다른 IP 네트워크에서 실행되는 별도의 가상 컴퓨터로 분할하려는 경우 이 튜토리얼의 범위를 벗어납니다.
Step One: Starting a Hyperledger Fabric network
이 튜토리얼을 따라하기 위해서는 새로운 하이퍼레저 패브릭 네트워크를 시작해야 합니다. 이 튜토리얼은 하이퍼레저 패브릭의 Building Your First Network tutorial에서 제공된 하이퍼레저 패브릭 네트워크를 사용할 것입니다.
1. fabric-samples 디렉토리로 이동하세요.
cd fabric-samples
2. 아래 커맨드를 사용해 cryptogen을 포함한 플랫폼 바이너리파일을 다운받으세요. (bash command를 위해 3 개의 파라미터가 필요합니다.)
curl -sSL http://bit.ly/2ysbOFE | bash -s 1.2.1 1.2.1 0.4.10
다운로드받은 docket image 리스트에 이슈가 없는지 확인하세요.
("error: pathspec v1.x.x did not match" 메시지는 무시해도 좋습니다.)
3. 우리는 앞서 복사해둔 Git repo의 multi-org 브랜치를 사용해야 합니다.
git checkout multi-org
4. first-network 디렉토리로 이동하세요.
cd first-network
5. 다음으로 BYFN 네트워크를 시작합니다. 우리는 world state 데이터베이스로 CouchDB를 사용하고 있기 때문에 (byfn.sh 스크립트에) 부가적인 플래그가 필요합니다. (패브릭 BYFN 페이지에 나온 것과 약간 다름) 또, 우리는 각 조직 별 CA를 시작해야 합니다.
6. first-network 폴더에서 아래 커맨드를 순서대로 실행하세요.
./byfn.sh -m generate
./byfn.sh -m up -s couchdb -a
명령어가 성공적으로 동작하면 첫 번째 커맨드는 패브릭 네트워크 / security artifacts를 생성합니다. 두 번째 커맨드를 통해 BYFN 네트워크가 시작되고, 아래와 같이 출력되는지 확인하세요.
========= All GOOD, BYFN execution completed ===========
_____ _ _ ____
| ____| | \ | | | _ \
| _| | \| | | | | |
| |___ | |\ | | |_| |
|_____| |_| \_| |____/
다음으로 이전 패브릭 환경에서 생성되어 지갑에 있을 수도 있는 비즈니스 네트워크 카드를 삭제합니다. 비즈니스 네트워크 카드를 찾을 수 없다는 에러는 무시해도 좋습니다.
composer card delete -c PeerAdmin@byfn-network-org1
composer card delete -c PeerAdmin@byfn-network-org2
composer card delete -c alice@trade-network
composer card delete -c bob@trade-network
composer card delete -c admin@trade-network
composer card delete -c PeerAdmin@fabric-network
하지만, 다른 유형의 에러는 더 이전 버전의 하이퍼레저 컴포저에 카드가 저장되어 있을수도 있습니다. 그러므로 HOME 디렉토리에서 아래와 같은 명령어를 실행해 파일 시스템 내 카드 저장소를 삭제해야 합니다.
rm -fr $HOME/.composer
Step Two: Exploring the Hyperledger Fabric network
이 단계에서는 BFYN 네트워크 구성 및 요소들을 살펴볼 것입니다. 구성의 세부 요소들은 아래 단계를 완료해야 합니다.
Organizations
BYFN 네트워크는 Org1과 Org2, 두 개의 조직으로 구성되어 있습니다. Org1은 org1.example.com이라는 도메인 이름을 사용합니다. Org1의 MSP는 Org1MSP라고 불립니다. Org2는 org2.example.com이라는 도메인 이름을 사용하고 Org2MSP라는 MSP를 갖고 있습니다. 이 튜토리얼에서는 Org1과 Org2가 상호작용할 수 있는 블록체인 비즈니스 네트워크를 배포합니다.
Network components
하이퍼레저 패브릭 네트워크는 몇몇 구성요소로 이뤄져 있습니다.
- Org1의 두 개의 피어 노드: peer0.org1.example.com, peer1.org1.example.com
> request port (peer0) : 7051
> event hub port (peer0) : 7053
> request port (peer1) : 8051
> event hub port (peer1) : 8053
- Org1의 단일 CA: ca.org1.example.com
> CA port : 7054
- Org2의 두 개의 피어 노드: peer0.org2.example.com, peer1.org1.example.com
> request port (peer0) : 9051
> event hub port (peer0) : 9053
> request port (peer1) : 10051
> event hub port (peer1) : 10053
- Org2의 단일 CA: ca.org2.example.com
> CA port : 8054
- 단일 orderer 노드: orderer.example.com
> orderer port : 7050
위 구성요소들은 Docker 컨테이너 내에서 동작합니다. 하이퍼레저 컴포저가 Docker 컨테이너에서 동작할 때 위의 이름 (예: peer0.org1.example.com)은 하이퍼레저 패브릭 네트워크와 상호작용하는데 사용될 수 있습니다.
이 튜토리얼에서는 하이퍼레저 컴포저 커맨드를 Docker network 내에서 실행하기 보다는 host machine에서 실행합니다. 이는 하이퍼레저 컴포터 커맨드가 localhost를 호스트 이름으로 사용하고 공개된 컨테이너 포트를 사용해 하이퍼레저 패브릭 네트워크와 상호작용한다는 것을 의미합니다.
모든 네트워크 구성요소들은 통신 암호화에 TLS를 사용하여 보호됩니다. 해당 네트워크 구성요소에 연결하려면 모든 네트워크 구성요소에 대한 CA 인증서가 필요합니다. CA 인증서는 byfn.sh 스크립트가 들어있는 폴더에서 찾을 수 있습니다.
orderer 노드의 CA 인증서:
crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/ca.crt
Org1의 CA 인증서:
crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
Org2의 CA 인증서:
crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
이 파일들은 이후 하이퍼레저 패브릭 네트워크와 상호작용하는 데 사용될 것입니다.
Users
Org1은 Admin@org1.example.com이라는 사용자로 구성되며, 이 사용자는 관리자입니다.
Admin@org1.example.com 사용자는 아래 폴더에 인증서와 개인 키 파일을 저장하고 있습니다.
crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
Org2는 Admin@org2.example.com이라는 사용자로 구성되며, 이 사용자는 관리자입니다.
Admin@org2.example.com 사용자는 아래 폴더에 인증서와 개인 키 파일을 저장하고 있습니다.
crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
이 파일 중 일부는 이후 하이퍼레저 패브릭 네트워크와 상호작용하는 데 사용될 것입니다.
관리자 외에도 Org1 및 Org2의 CA는 기본 사용자로 구성되어 있습니다. 이 기본 사용자는 등록 ID가 admin이고 비밀번호가 adminpw입니다. 하지만, 이 사용자에게는 블록체인 비즈니스 네트워크를 배포할 수 있는 권한이 없습니다.
이 튜토리얼에서 나중에 작업할 컴포터 connector profile과 키/인증서 파일을 관리하기 위해 임시 작업용 디렉토리 (및 하위 디렉토리) 를 생성하는 것이 좋습니다.
mkdir -p /tmp/composer/org1
mkdir -p /tmp/composer/org2
Channel
mychannel 이라는 채널이 생성되었다. 모든 4개의 피어 노드 - peer0.org1.example.com, peer1.org1.example.com, peer0.org2.example.com, peer1.org2.example.com은 이 채널에 조인된다.
Connection Profiles
우리는 패브릭 네트워크를 설명하는 기본 connection profile가 필요합니다. 이 connection profile은 alice와 bob에게 전달되어 해당 조직에 맞게 커스터마이징 될 수 있습니다.
{
"name": "byfn-network",
"x-type": "hlfv1",
"version": "1.0.0",
"channels": {
"mychannel": {
"orderers": [
"orderer.example.com"
],
"peers": {
"peer0.org1.example.com": {
"endorsingPeer": true,
"chaincodeQuery": true,
"eventSource": true
},
"peer1.org1.example.com": {
"endorsingPeer": true,
"chaincodeQuery": true,
"eventSource": true
},
"peer0.org2.example.com": {
"endorsingPeer": true,
"chaincodeQuery": true,
"eventSource": true
},
"peer1.org2.example.com": {
"endorsingPeer": true,
"chaincodeQuery": true,
"eventSource": true
}
}
}
},
"organizations": {
"Org1": {
"mspid": "Org1MSP",
"peers": [
"peer0.org1.example.com",
"peer1.org1.example.com"
],
"certificateAuthorities": [
"ca.org1.example.com"
]
},
"Org2": {
"mspid": "Org2MSP",
"peers": [
"peer0.org2.example.com",
"peer1.org2.example.com"
],
"certificateAuthorities": [
"ca.org2.example.com"
]
}
},
"orderers": {
"orderer.example.com": {
"url": "grpcs://localhost:7050",
"grpcOptions": {
"ssl-target-name-override": "orderer.example.com"
},
"tlsCACerts": {
"pem": "INSERT_ORDERER_CA_CERT"
}
}
},
"peers": {
"peer0.org1.example.com": {
"url": "grpcs://localhost:7051",
"grpcOptions": {
"ssl-target-name-override": "peer0.org1.example.com"
},
"tlsCACerts": {
"pem": "INSERT_ORG1_CA_CERT"
}
},
"peer1.org1.example.com": {
"url": "grpcs://localhost:8051",
"grpcOptions": {
"ssl-target-name-override": "peer1.org1.example.com"
},
"tlsCACerts": {
"pem": "INSERT_ORG1_CA_CERT"
}
},
"peer0.org2.example.com": {
"url": "grpcs://localhost:9051",
"grpcOptions": {
"ssl-target-name-override": "peer0.org2.example.com"
},
"tlsCACerts": {
"pem": "INSERT_ORG2_CA_CERT"
}
},
"peer1.org2.example.com": {
"url": "grpcs://localhost:10051",
"grpcOptions": {
"ssl-target-name-override": "peer1.org2.example.com"
},
"tlsCACerts": {
"pem": "INSERT_ORG2_CA_CERT"
}
}
},
"certificateAuthorities": {
"ca.org1.example.com": {
"url": "https://localhost:7054",
"caName": "ca-org1",
"httpOptions": {
"verify": false
}
},
"ca.org2.example.com": {
"url": "https://localhost:8054",
"caName": "ca-org2",
"httpOptions": {
"verify": false
}
}
}
}
위 기본 파일을 복사해서 /tmp/composer 라는 새 디렉토리 아래 byfn-network.json파일을 생성하고 붙여넣으세요.
byfn-network.json파일을 열고 INSERT_ORG1_CA_CERT를 Org1 피어노드의 CA인증서로 교체하세요:
아래 커맨드를 사용해 .pem파일에서 인증서를 가져와 위 connection profile에 포함되도록 하세요.
awk 'NF {sub(/\r/, ""); printf "%s\\n",$0;}' crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt > /tmp/composer/org1/ca-org1.txt
/tmp/composer/org1/ca-org1.txt 파일 내용을 복사하고 .json 파일의 INSERT_ORG1_CA_CERT 자리에 넣으세요. 아래와 같은 형태가 될 것입니다. (profile 파일에서는 한 줄이어야 합니다.)
"pem": "-----BEGIN CERTIFICATE-----\nMIICNTCCAdygAwIBAgIRAMNvmQpnXi7uM19BLdha3MwwCgYIKoZIzj0EAwIwbDEL\nMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG\ncmFuY2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRowGAYDVQQDExF0bHNjYS5l\neGFtcGxlLmNvbTAeFw0xNzA2MjYxMjQ5MjZaFw0yNzA2MjQxMjQ5MjZaMGwxCzAJ\nBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJh\nbmNpc2NvMRQwEgYDVQQKEwtleGFtcGxlLmNvbTEaMBgGA1UEAxMRdGxzY2EuZXhh\nbXBsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASJn3QUVcKCp+s6lSPE\nP5KlWmE9rEG0kpECsAfW28vZQSIg2Ez+Tp1alA9SYN/5BtL1N6lUUoVhG3lz8uvi\n8zhro18wXTAOBgNVHQ8BAf8EBAMCAaYwDwYDVR0lBAgwBgYEVR0lADAPBgNVHRMB\nAf8EBTADAQH/MCkGA1UdDgQiBCB7ULYTq3+BQqnzwae1RsnwQgJv/HQ5+je2xcDr\nka4MHTAKBggqhkjOPQQDAgNHADBEAiB2hLiS8B1g4J5Qbxu15dVWAZTAXX9xPAvm\n4l25e1oS+gIgBiU/aBwSxY0uambwMB6xtQz0ZE/D4lyTZZcW9SODlOE=\n-----END CERTIFICATE-----\n"
동일한 .json 파일에서 INSERT_ORG2_CA_CERT도 Org2 피어 노드의 CA 인증서로 교체해야 합니다. 아래 커맨드를 사용해 .pem 파일에서 인증서를 가져오고 connection profile에 포함되도록 하세요.
awk 'NF {sub(/\r/, ""); printf "%s\\n",$0;}' crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt > /tmp/composer/org2/ca-org2.txt
/tmp/composer/org2/ca-org2.txt파일 내용을 복사하고 INSERT_ORG2_CA_CERT 자리에 넣으세요. 다시 한 번 언급하지만 모두 한 줄에 있어야 합니다.
INSERT_ORDERER_CA_CERT를 orderer 노드의 CA 인증서로 교체하세요. 아래 커맨드를 사용해 .pem 파일 내용이 connetion profile json 파일로 포함되도록 하세요.
awk 'NF {sub(/\r/, ""); printf "%s\\n",$0;}' crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/ca.crt > /tmp/composer/ca-orderer.txt
/tmp/composer/ca-orderer.txt파일 내용을 복사하고 INSERT_ORDERER_CA_CERT 자리에 넣으세요. 다시 한 번 언급하지만 모두 동일한 라인에 있어야 합니다.
완료되면 이 파일을 /tmp/composer/byfn-network.json 파일에 저장하세요.
이 connectino profile은 이제 네트워크의 일부분인 모든 피어, orderer, 인증서를 포함한 패브릭 네트워크 구성을 나타냅니다. 이 파일은 네트워크에 참여하는 모든 조직을 나타내고 이 네트워크에 있는 모든 채널을 정의합니다. 하이퍼레저 컴포저는 단일 채널과 상호작용할 수 있기 때문에 하나의 채널만이 정의되어 있습니다.
Step Three: Customizing the connection profile for Org1
이 단계는 alice가 속한 조직을 지정하는 것입니다. 타임아웃이 있는 클라이언트 섹션에서는 다음 블록을 위에서 작성한 /tmp/composer/byfn-network.json 이라는 connection profile 파일에 추가합니다. 이는 version 속성과 channel 속성 사이에 있습니다. 완료되면 /tmp/composer/org1/byfn-network-org1.json이라는 새로운 파일로 저장하세요.
"client": {
"organization": "Org1",
"connection": {
"timeout": {
"peer": {
"endorser": "300",
"eventHub": "300",
"eventReg": "300"
},
"orderer": "300"
}
}
},
그러면 profile 섹션은 아래와 같아집니다.
...
"version": "1.0.0",
"client": {
"organization": "Org1",
"connection": {
"timeout": {
"peer": {
"endorser": "300",
"eventHub": "300",
"eventReg": "300"
},
"orderer": "300"
}
}
},
"channel": {
...
Step Four: Building a connection profile for Org2
bob에 동일한 절차를 반복합니다. 하지만 이번에는 조직을 Org2로 지정하고 파일명 또한 /tmp/composer/byfn-network-org2.json이라고 지정합니다. 그러면 profile 섹션은 아래와 같아집니다.
...
"version": "1.0.0",
"client": {
"organization": "Org2",
"connection": {
"timeout": {
"peer": {
"endorser": "300",
"eventHub": "300",
"eventReg": "300"
},
"orderer": "300"
}
}
},
"channel": {
...
Step Five: Locating the certificate and private key for the Hyperledger Fabric administrator for Org1
하이퍼레저 패브릭 Org1 네트워크의 관리자는 Admin@org1.example.com라 불리는 사용자입니다. 이 인증서와 개인키 파일은 아래 디렉토리에 저장되어 있습니다.
crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
먼저 사용자의 인증서 파일을 위치시켜야 합니다. 인증서는 신원확인의 공개된 부분입니다. 인증서 파일은 signcerts 하위 디렉토리에서 찾을 수 있으며 Admin@org1.example.com-cert.pem이라는 파일입니다.
다음으로 사용자의 개인키 파일을 위치시켜야 합니다. 개인키는 이 신원을 통해 트랜잭션을 인증할 때 사용됩니다. 개인 키 파일은 keystore 하위 디렉토리에서 찾을 수 있습니다. 개인 키 파일은 16진수 문자열로 접미어는 _sk입니다. 예를 들면 78f2139bfcfc0edc7ada0801650ed785a11cfcdef3f9c36f3c8ca2ebfa00a59c_sk와 같이 생겼습니다. 이 이름은 구성이 생성될 때마다 매번 바뀌므로 아래의 와일드 카드를 사용하세요.
이 두 파일 경로를 모두 기억하세요, 혹은 step 3에서 생성한 connection profile 파일인 /tmp/composer/orgl/byfn-network-org1.json 파일과 동일한 폴더에 복사해두세요. 이 파일은 다음 단계에서 필요합니다.
이 작업을 하기 위해 아래 커맨드를 사용하세요.
export ORG1=crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
cp -p $ORG1/signcerts/A*.pem /tmp/composer/org1
cp -p $ORG1/keystore/*_sk /tmp/composer/org1
Step Six: Locating the certificate and private key for the Hyperledger Fabric administrator for Org2
하이퍼레저 패브릭 네트워크의 관리자는 Admin@org2.example.com이라는 사용자입니다. 이 사용자의 인증서와 개인 키는 아래 디렉토리에 있습니다.
crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
먼저 사용자의 인증서 파일을 위치시켜야 합니다. 인증서는 신원확인의 공개된 부분입니다. 인증서 파일은 signcerts 하위 디렉토리에서 찾을 수 있으며 Admin@org2.example.com-cert.pem이라는 파일입니다.
다음으로 사용자의 개인키 파일을 위치시켜야 합니다. 개인키는 이 신원을 통해 트랜잭션을 인증할 때 사용됩니다. 개인 키 파일은 keystore 하위 디렉토리에서 찾을 수 있습니다. 개인 키 파일은 16진수 문자열로 접미어는 _sk입니다. 예를 들면 d4889cb2a32e167bf7aeced872a214673ee5976b63a94a6a4e61c135ca2f2dbb_sk와 같이 생겼습니다. 이 이름은 구성이 생성될 때마다 매번 바뀌므로 아래의 와일드 카드를 사용하세요.
이 두 파일 경로를 모두 기억하세요, 혹은 step 3에서 생성한 connection profile 파일인 /tmp/composer/orgl/byfn-network-org2.json 파일과 동일한 폴더에 복사해두세요. 이 파일은 다음 단계에서 필요합니다.
이 작업을 하기 위해 아래 커맨드를 사용하세요.
export ORG2=crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
cp -p $ORG2/signcerts/A*.pem /tmp/composer/org2
cp -p $ORG2/keystore/*_sk /tmp/composer/org2
Step Seven: Creating business network cards for the Hyperledger Fabric administrator for Org1
이 단계는 관리자가 하이퍼레저 패브릭 네트워크에 블록체인 비즈니스 네트워크를 배포하는데 사용되는 비즈니스 네트워크 카드를 생성합니다.
composer card create 커맨드를 실행해서 Org1의 connection profile을 사용하는 비즈니스 네트워크 카드를 생성하세요. 이전 단계에서 생성 혹은 위치시킨 3가지 파일 경로를 모두 지정해야 합니다. (주의: sk파일은 다를 것입니다.)
composer card create -p /tmp/composer/org1/byfn-network-org1.json -u PeerAdmin -c /tmp/composer/org1/Admin@org1.example.com-cert.pem -k /tmp/composer/org1/*_sk -r PeerAdmin -r ChannelAdmin -f PeerAdmin@byfn-network-org1.card
커맨드가 성공적으로 수행되면, PeerAdmin@byfn-network-org1.card라는 비즈니스 네트워크 카드 파일이 현재 폴더에 생성됩니다.
Step Eight: Creating business network cards for the Hyperledger Fabric administrator for Org2
이 단계는 관리자가 하이퍼레저 패브릭 네트워크에 블록체인 비즈니스 네트워크를 배포하는데 사용되는 비즈니스 네트워크 카드를 생성합니다.
composer card create 커맨드를 실행해서 Org2의 connection profile을 사용하는 비즈니스 네트워크 카드를 생성하세요. 이전 단계에서 생성 혹은 위치시킨 3가지 파일 경로를 모두 지정해야 합니다.
composer card create -p /tmp/composer/org2/byfn-network-org2.json -u PeerAdmin -c /tmp/composer/org2/Admin@org2.example.com-cert.pem -k /tmp/composer/org2/*_sk -r PeerAdmin -r ChannelAdmin -f PeerAdmin@byfn-network-org2.card
커맨드가 성공적으로 수행되면, PeerAdmin@byfn-network-org2.card라는 비즈니스 네트워크 카드 파일이 현재 폴더에 생성됩니다.
Step Nine: Importing the business network cards for the Hyperledger Fabric administrator for Org1
composer card import 커맨드를 사용해 Org1의 비즈니스 네트워크 카드를 지갑으로 import하세요.
composer card import -f PeerAdmin@byfn-network-org1.card --card PeerAdmin@byfn-network-org1
명령어가 올바르게 실행되면 PeerAdmin@byfn-network-org1이라는 비즈니스 네트워크 카드가 지갑으로 import됩니다.
Step Ten: Importing the business network cards for the Hyperledger Fabric administrator for Org2
composer card import 커맨드를 사용해 Org2의 비즈니스 네트워크 카드를 지갑으로 import하세요.
composer card import -f PeerAdmin@byfn-network-org2.card --card PeerAdmin@byfn-network-org2
명령어가 올바르게 실행되면 PeerAdmin@byfn-network-org2이라는 비즈니스 네트워크 카드가 지갑으로 import됩니다.
Step Eleven: Installing the business network onto the Hyperledger Fabric peer nodes for Org1
composer network install 명령어를 사용해 Step 3에서 connection profile 파일에 정의한 Org1의 하이퍼레저 패브릭 피어 노드에 비즈니스 네트워크를 설치하세요.
composer network install --card PeerAdmin@byfn-network-org1 --archiveFile trade-network.bna
위에서 볼 수 있듯이, 여러 조직 환경을 테스트하기 위해 trade-network라 불리는 하이퍼레저 컴포저 비스니스 네트워크를 사용합니다. 테스트를 하려면 trade-network.bna (샘플 네트워크에서 만들어진 비즈니스 네트워크 아카이브) 파일이 필요합니다. 이 파일을 가지고 있지 않다면 https://composer-playground.mybluemix.net/ 옆의 링크로 이동해 온라인 플레이그라운드에서 trade-network 샘플을 배포한 다음 admin으로 비즈니스 네트워크에 connect 하세요. 왼쪽 하단 버전을 0.1.14로 변경하고 현재 폴더에 trade-network.bna파일을 export하세요. 비즈니스 네트워크는 package.json 파일에 version 속성을 가지고 있습니다. 이 버전은 비즈니스 네트워크가 step 17에서 composer start 커맨드를 사용해 시작될 때 지정되어야 합니다. trade-network 샘플 네트워크를 사용하고 있다면 버전은 0.1.14입니다. (주의: 컴포저 튜토리얼 네트워크 tutorial-network같은 다른 네트워크를 비즈니스 네트워크로 사용하려 한다면 위의 network install 커맨드에 해당 파일을 이 튜토리얼의 비즈니스 네트워크 아카이브로 지정하고 버전 또한 알맞게 지정해야 합니다.)
network install 커맨드의 유용한 기능은 설치된 비즈니스 네트워크 이름과 버전 번호를 출력한다는 것입니다. 이는 아래 step 17에서 사용할 수 있습니다.
Step Twelve: Installing the business network onto the Hyperledger Fabric peer nodes for Org2
composer network install 명령어를 사용해 Step 4에서 connection profile 파일에 정의한 Org2의 하이퍼레저 패브릭 피어 노드에 비즈니스 네트워크를 설치하세요.
composer network install --card PeerAdmin@byfn-network-org2 --archiveFile trade-network.bna
Step Thirteen: Defining the endorsement policy for the business network
운영중인 비즈니스 네트워크는 인증 정책을 가지고 있습니다. 이 정책은 트랜잭션이 블록체인에 커밋되기 전에 어느 조직이 트랜잭션을 검증할지를 결정하는 규칙을 정의합니다. 기본적으로 비즈니스 네트워크는 블록체인에 트랜잭션이 커밋되기 전 하나의 기관이 트랜잭션을 검증하도록 배포됩니다.
실제 블록체인 비즈니스 네트워크에서는 여러 기관들이 블록체인에 트랜잭션이 커밋되기 전 검증하기를 원합니다. 그리고 기본 검증 정책은 여기에 적합하지 못합니다. 그래서 비즈니스 네트워크를 시작할 때 검증 정책을 커스텀할 수 있습니다.
검증 정책과 관련해서는 하이퍼레저 패브릭 docs 내 아래 링크를 참고하면 더 상세한 정보를 알 수 있습니다.
https://hyperledger-fabric.readthedocs.io/en/release/endorsement-policies.html
비즈니스 네트워크에서 사용되는 검증 정책은 하이퍼레저 패브릭 Node.js SDK에서 사용하는 JSON 형식이어야 합니다. 하이퍼레저 패브릭 CLI에서 사용되는 간단한 검증 정책 형식과 다른 형식으로 하이퍼레저 패브릭 문서에서 확인할 수 있습니다.
/tmp/composer/endorsement-policy.json 이라는 검증 정책 파일을 생성하고 아래 내용을 복사해 붙여넣은 후 저장하세요. 이후 단계에서 이 파일을 사용할 것이므로 어디 저장했는지 기억하세요.
{
"identities": [
{
"role": {
"name": "member",
"mspId": "Org1MSP"
}
},
{
"role": {
"name": "member",
"mspId": "Org2MSP"
}
}
],
"policy": {
"2-of": [
{
"signed-by": 0
},
{
"signed-by": 1
}
]
}
}
방금 생성한 검증정책은 Org1과 Org2 모두 블록체인에 트랜잭션을 커밋하기 전 비즈니스 네트워크 내 트랜잭션을 검증해야만 합니다. Org1 혹은 Org2가 트랜잭션을 검증하지 않거나, 트랜잭션 결과에 동의하지 않으면 해당 트랜잭션은 비즈니스 네트워크에 의해 거절당합니다.
Step Fourteen: Understanding and selecting the business network administrators
비즈니스 네트워크가 시작되면, 초기 참가자 집단으로 구성됩니다. 이 참가자들은 비즈니스 네트워크를 시작하고 다른 참가자들을 비즈니스 네트워크에 초대하는 역할을 합니다. 하이퍼레저 컴포저에서 우리는 이 초기 참가자들을 비즈니스 네트워크 관리자라고 부릅니다.
여기서 Org1과 Org2는 동일한 권한을 갖고 있습니다. 각 조직은 비즈니스 네트워크에 관리자를 제공하고 , 해당 관리자들은 각 조직에 다른 참가자들을 초대합니다. Org1의 비즈니스 네트워크 관리자는 Alice이고 Org2의 관리자는 Bob입니다.
비즈니스 네트워크가 시작되면 모든 비즈니스 네트워크 관리자의 인증서 (신원확인의 공개파트) 는 비즈니스 네트워크를 시작하는 조직에 제출되어야 합니다. 비즈니스 네트워크가 시작되면, 모든 관리자들은 비즈니스 네트워크와 상호작용하는데 그들의 신원을 사용할 수 있습니다.
비즈니스 네트워크 관리자에 대해 더 자세한 내용은 아래 링크를 참고하세요.
https://hyperledger.github.io/composer/latest/business-network/bnd-deploy.html
Step Fifteen: Retrieving business network administrator certificates for Org1
composer identity request 커맨드를 사용해 Org1의 비즈니스 네트워크 관리자로 사용할 Alice의 인증서를 검색하세요.
composer identity request -c PeerAdmin@byfn-network-org1 -u admin -s adminpw -d alice
이 커맨드의 -u admin 과 -s adminpw 옵션은 하이퍼레저 패브릭 CA에 등록된 기본 사용자입니다.
인증서는 현재 작업 디렉토리의 alice폴더에 위치할 것입니다. 3개의 인증서가 생성되지만 2가지가 중요합니다. 이 두 가지는 admin-pub.pem이라는 공개키를 포함한 인증서와 admin-priv.pem이라는 개인키 파일입니다. admin-pub.pem파일만이 다른 조직과 공유되어야 합니다. admin-priv.pem파일은 비밀로 유지되어야 하며 조직을 대표해 트랜잭션을 인증하는데 사용됩니다.
Step Sixteen: Retrieving business network administrator certificates for Org2
composer identity request 커맨드를 사용해 Org2의 비즈니스 네트워크 관리자로 사용할 Alice의 인증서를 검색하세요.
composer identity request -c PeerAdmin@byfn-network-org2 -u admin -s adminpw -d bob
이 커맨드의 -u admin 과 -s adminpw 옵션은 하이퍼레저 패브릭 CA에 등록된 기본 사용자입니다.
인증서는 현재 작업 디렉토리의 bob폴더에 위치할 것입니다. 3개의 인증서가 생성되지만 2가지가 중요합니다. 이 두 가지는 admin-pub.pem이라는 공개키를 포함한 인증서와 admin-priv.pem이라는 개인키 파일입니다. admin-pub.pem파일만이 다른 조직과 공유되어야 합니다. admin-priv.pem파일은 비밀로 유지되어야 하며 조직을 대표해 트랜잭션을 인증하는데 사용됩니다.
Step Seventeen: Starting the business networ
composer network start 커맨드를 사용해 비즈니스 네트워크를 시작하세요. 이 동작은 Org1에서만 수행합니다. 이 명령어는 step 13에서 생성한 /tmp/composer/endorsement-policy.json 파일을 사용합니다. 그리고 step 15, 16에서 Alice와 Bob에 의해 생성된 admin-pub.pem 파일을 사용합니다. 그러므로 위 모든 파일에 아래 명령어로 접근할 수 있어야 합니다.
composer network start -c PeerAdmin@byfn-network-org1 -n trade-network -V 0.1.14 -o endorsementPolicyFile=/tmp/composer/endorsement-policy.json -A alice -C alice/admin-pub.pem -A bob -C bob/admin-pub.pem
위 명령어가 수행되면, 비즈니스 네트워크는 시작됩니다. Alice와 Bob모두 비즈니스 네트워크에 접근해 시작할 수 있고 각 조직에 다른 참가자들을 초대할 수 있습니다. 하지만, Alice와 Bob은 이전 단계에서 생성한 인증서로 비즈니스 네트워크 카드를 생성해야 비즈니스 네트워크에 접근할 수 있습니다.
Step Eighteen: Creating a business network card to access the business network as Org1
composer card create 커맨드를 사용해 Org1의 비즈니스 네트워크 관리자인 Alice의 비즈니스 네트워크 카드를 생성하세요. 그러면 비즈니스 네트워크에 접근할 수 있습니다.
composer card create -p /tmp/composer/org1/byfn-network-org1.json -u alice -n trade-network -c alice/admin-pub.pem -k alice/admin-priv.pem
composer card import 커맨드를 사용해 방금 생성한 비즈니스 네트워크 카드를 import 하세요.
composer card import -f alice@trade-network.card
composer network ping 커맨드를 사용해 블록체인 비즈니스 네트워크 접속을 테스트하세요.
composer network ping -c alice@trade-network
위 커맨드가 성공적으로 동작하면, org.hyperledger.composer.system.NetworkAdmin#alice와 같은 참가자 신분을 확인할 수 있을 것입니다. 이제 블록체인 비즈니스 네트워크와 상호작용하고 다른 참가자들을 초대하는데 이 비즈니스 네트워크 카드를 사용할 수 있습니다.
참가자를 생성하고 해당 참가자에 매핑된 ID를 발급하고 해당 ID로 블록체인 네트워크에서 자산을 생성할 수 있습니다.
아래의 composer participant add 명령어를 실행하세요.
composer participant add -c alice@trade-network -d '{"$class":"org.example.trading.Trader","tradeId":"trader1-org1", "firstName":"Jo","lastName":"Doe"}'
다음으로 trader1-org1의 id를 생성하기 위해 composer issue identity 커맨드를 사용하세요.
composer identity issue -c alice@trade-network -f jo.card -u jdoe -a "resource:org.example.trading.Trader#trader1-org1"
카드를 import하고 테스트해보세요.
composer card import -f jo.card
composer network ping -c jdoe@trade-network
다음으로 자산을 생성할 것입니다. 커맨드 라인에서 jdoe 참가자로 Commodity 자산을 생성하는 트랜잭션을 제출합니다. (혹은 컴포저 플레이그라운드를 설치했다면 jdoe@trade-network로 trade-network에 접속해 'EMA'라는 아래 JSON형태의 자산을 생성하세요.)
CLI를 사용해 자산을 생성하기 위해 아래 transaction submit 시퀀스를 복사합니다. 이 내용은 Commodity 자산을 생성합니다.
composer transaction submit --card jdoe@trade-network -d '{"$class": "org.hyperledger.composer.system.AddAsset", "targetRegistry" : "resource:org.hyperledger.composer.system.AssetRegistry#org.example.trading.Commodity", "resources": [{"$class": "org.example.trading.Commodity","tradingSymbol":"EMA", "description":"Corn commodity","mainExchange":"EURONEXT", "quantity":"10","owner":"resource:org.example.trading.Trader#trader1-org1"}]}'
혹은 플레이그라운드에서 생성하려면 아래 내용을 복사하세요.
{
"$class": "org.example.trading.Commodity",
"tradingSymbol": "EMA",
"description": "Corn commodity",
"mainExchange": "EURONEXT",
"quantity": 10,
"owner": "resource:org.example.trading.Trader#trader1-org1"
}
마지막으로 composer network list 커맨드를 사용해서 비즈니스 네트워크에 생성된 산출물을 확인하세요.
composer network list -c jdoe@trade-network
Step Nineteen: Creating a business network card to access the business network as Org2
composer card create 커맨드를 사용해 Org2의 비즈니스 네트워크 관리자인 Bob의 비즈니스 네트워크 카드를 생성하세요. 그러면 비즈니스 네트워크에 접근할 수 있습니다.
composer card create -p /tmp/composer/org2/byfn-network-org2.json -u bob -n trade-network -c bob/admin-pub.pem -k bob/admin-priv.pem
composer card import 커맨드를 사용해 방금 생성한 비즈니스 네트워크 카드를 import 하세요.
composer card import -f bob@trade-network.card
composer network ping 커맨드를 사용해 블록체인 비즈니스 네트워크 접속을 테스트하세요.
composer network ping -c bob@trade-network
위 커맨드가 성공적으로 동작하면, org.hyperledger.composer.system.NetworkAdmin#bob와 같은 참가자 신분을 확인할 수 있을 것입니다. 이제 다른 Trader를 초대해봅시다.
다시 한 번 참가자를 생성하고 해당 참가자에 매핑된 ID를 발급합니다. 이미 블록체인 네트워크에 자산을 갖고 있기 때문에, 우리는 소유자를 변경하는 트랜잭션을 사용할 것입니다. (Org1에서 Org2 trader로)
아래의 composer participant add 명령어를 실행하세요.
composer participant add -c bob@trade-network -d '{"$class":"org.example.trading.Trader","tradeId":"trader2-org2", "firstName":"Dave","lastName":"Lowe"}'
다음으로 trader2-org2의 id를 생성하기 위해 composer issue identity 커맨드를 사용하세요.
composer identity issue -c bob@trade-network -f dave.card -u dlowe -a "resource:org.example.trading.Trader#trader2-org2"
카드를 import하고 테스트해보세요.
composer card import -f dave.card
composer network ping -c dlowe@trade-network
마지막으로 이전에 생성한 Commodity 자산의 소유자를 변경하는 트랜잭션을 제출합니다. 우리는 자산 소유자인 Jon Doe로 트랜잭션을 제출하고 Dave Lowe에게 전달할 것입니다. 그리고나서 dlowe라고 매핑된 Org2의 trader 참가자로 소유자가 변경되었는지 확인할 것입니다. 아래 단계를 따라 수행하세요.
composer transaction submit --card jdoe@trade-network -d '{"$class":"org.example.trading.Trade","commodity":"resource:org.example.trading.Commodity#EMA","newOwner":"resource:org.example.trading.Trader#trader2-org2"}'
마지막으로 Org2 trader 참가자로 composer network list 커맨드를 사용해서 자산의 소유자가 변경되었는지 확인하세요.
'● STUDY ● > Hyperledger' 카테고리의 다른 글
Access Control in Hyperledger Composer (0) | 2019.07.21 |
---|---|
Interacting with other business networks (0) | 2019.07.20 |
Deploying a Hyperledger Composer blockchain business network to Hyperledger Fabric for a single organization (0) | 2019.07.18 |
Queries Tutorial using the Composer Query language and REST APIs (0) | 2019.07.17 |
Hyperledger Caliper 시작하기 (0) | 2019.07.16 |