이 페이지는 deprecated된 레거시 패브릭 커넥터를 대체하는 새 패브릭 커넥터 구현을 소개한다.
두 구현 간의 차이는 다음과 같다.
- 네트워크 공급자로부터 제공된 연결 프로필을 활용하는 더 논리적인 네트워크 구성
- 더 견고한 구현
- 수정과 향상이 새 컨넥터 구현에만 이루어질 것이다.
- 새 커넥터 구현은 이전 커넥터의 일부 기능을 삭제했다.
- 컨트랙트 설치 또는 초기화 동안 타겟 피어를 지정하지 않는다.
- node-sdk 인증서 또는 암호화 저장소로부터 신원을 저장하고 읽는 기능은 구현되지 않는다.
- 인증서 승인을 통한 자동 신원 기재(register) 및 등록(enroll) 지원이 구현되지 않는다.
#ORG2
타입 표기법을 사용해서 워크로드 리퀘스트에서 관리자 신원을 사용하기 위해 지정할 수 없다.
사용할 구현 선택은 제공되는 네트워크 구성 파일과 특히 해당 파일에서 선언한 버전에 따라 정해진다.
- 버전 1.0은 레거시 커넥터를 선택한다.
- 버전 2.0.0은 새 커넥터를 선택한다.
예를 들어
name: Fabric
version: "1.0"
이것은 레거시 커넥터를 선택한다. 이 네트워크 구성 파일은 반드시 예전 deprecated 네트워크 구성 파일 형식을 준수해야 한다.
name: Fabric
version: "2.0.0"
이것은 새 커넥터를 선택한다. 이 파일은 반드시 새 네트워크 구성 파일 형식을 준수해야 한다.
이 페이지는 Fabric SDK 의 Common Connection Profile (CCP) 기능을 활용해 다양한 패브릭 버전에 통합 프로그래밍 모델과 호환성을 제공하는 패브릭 어댑터를 소개한다.
최신 지원 하이퍼레저 패브릭은 v2.x이다. 탐색(discover)을 위한 기능은
gateway
옵션을 사용할 때만 사용할 수 있다.
어댑터는 많은 SDK 기능을 사용자 콜백 모듈에 직접 노출시킨다. 이것은 복잡한 시나리오 구현을 가능하도록 한다.
제공되는 기능들 중 일부 하이라이트:
- 다중 오더러 지원
- 다중 채널 및 컨트랙트 지원
- 컨트랙트를 위한 메타데이터 및 프라이빗 컬렉션 지원
- TLS 및 상호 TLS 통신 지원
- TX/쿼리 제출을 위한 신원 선택 옵션
- 모든 TX에 대한 자세한 실행 데이터
연관된(또는 호환되는) SUT 버전을 타겟으로 삼기 위해 특정한 패브릭 SDK를 캘리퍼에 바인딩해야 한다. 자세한 내용은 바인딩 문서를 참조하자. 1.4 패브릭 SDK는 패브릭 2.1과 2.2 SUT와 호환되지만 컨트랙트(체인코드) 설치 및 초기화는 오래된 라이프사이클 구현을 사용하고 있을 때에만 동작한다.
패브릭 SDK 2.x을 바인딩 타겟으로 삼을 때는 다음과 같은 케이퍼빌리티 제약이 있다:
- 2.x SDK에서는 관리 동작이 불가능하다. 채널 생성 및 가입, 컨트랙트 설치 및 초기화가 불가능하다. 결론적으로 2.x 바인딩은
--caliper-flow-only-test
플래그로만 동작한다.- 2.x SDK는
gateway
를 사용하는 동작만을 지원한다. 즉, 2.x 바인딩은-caliper-fabric-gateway-enabled
플래그를 필요로 한다.
채널 생성과 컨트랙트(체인코드) 설치 및 초기화 기능은 새 1.x SDK 기반 어댑터에 남아 있다. 이들과 동일한 기능은 2.x SDK 기반 어댑터에 존재하지 않는다. 이 케이퍼빌리티는 캘리퍼 통합 테스트를 지원하기 위해 남아있으며, 이 메커니즘을 채널과 컨트랙트 설정을 위해 사용하는 것은 절대 권장되지 않는다. 이 케이퍼빌리티는 레거시로 분류되며, 유지되지 않을 것이다. 벤치마크를 위해 캘리퍼를 구동하기 전 네트워크를 설정하는 대안적인 방법을 찾아보아야 한다.
어댑터의 몇몇 런타임 프로퍼티들은 캘리퍼의 런타임 구성 메커니즘을 통해 설정될 수 있다. 가능한 설정들을 위해 기본 구성 파일의 caliper.fabric
섹션과 내장 문서를 보자.
위 설정은 캘리퍼 시작 시 처리된다. 테스트 동안 이것들을 수정하는 것은 영향이 없다. 하지만, 캘리퍼가 시작하기 전 일반 구성 소스에서 기본 값들을 오버라이딩할 수 있다.
참고
구성 파일의 객체 계층은 각 리프 프로퍼티를 위한 엔트리 설정을 생성한다. 아래 구성 파일을 고려하자:
caliper: fabric: gateway: localhost: false enabled: true
프로젝트 설정 파일을
caliper.yaml
로 이름짓고 워크스페이스 디렉토리 루트에 두면 이 파일이 아래 두 설정 키를 아래 값들로 오버라이딩한다:
caliper-fabric-gateway-enabled
가true
로 설정된다.caliper-fabric-gateway-localhost
가false
로 설정된다.다른 설정들은 변화되지 않은 채로 유지된다.
caliper-fabric-gateway-discovery
설정은 새 커넥터에서 지원되지 않고 구성 파일에서 정의되어야 하지만 레거시 패브릭 커넥터를 지원하기 위해서만 유지된다.
추가적으로, 어댑터는 채널 생성을 건너뛰기 위한 동적 설정 (패밀리)를 제공한다. 설정 키 포맷은 caliper-fabric-skipcreatechannel-<channel_name>
이다. <channel_name>
부분을 생성을 건너뛰고 싶은 채널 이름으로 대체한다. 예:
user@ubuntu:~/caliper-benchmarks$ export CALIPER_FABRIC_SKIPCREATECHANNEL_MYCHANNEL=true
참고
이 설정은 네트워크 구성 파일에 "생성되지 않음"으로 지정되는 채널의 생성을 쉽게 건너뛰기 위한 용도이다. 하지만 벤치마킹 중에 항상 채널이 생성된다는 것을 안다면, 네트워크 생성 파일에 이를 명시적으로 표기하는 것이 추천된다.
자연스럽게, 위 설정을 여러 방법으로 지정할 수 있다 (예: 커맨드라인 argument, 구성 파일 entry)
워크로드 모듈은 테스트의 세 단계들에서 어댑터와 상호작용한다. 사용자 모듈을 생성하는 동안(initializeWorkloadModule
콜백), 쿼리 또는 호출 트랜잭션을 제출하는 동안(submitTransaction
콜백), 유저 모듈의 선택사항인 청소를 시행할 때(cleanupWorkloadModule
콜백)이다.
initializeWorkloadModule
함수파라미터 설명을 위해 함수와 관련된 문서를 보자.
함수의 마지막 argument는 sutContext
객체이다. 이 객체는 백엔드 블록체인의 커넥터에 의해 제공되는 플랫폼 특징적인(platform-specific) 객체이다. 커넥터에 의해 제공되는 컨텍스트 객체는 FabricNetwork
인스턴스이고, 네트워크 토폴로지에 대한 단순 문자열 기반인 "쿼리들"과 결과를 제공한다. 따라서 사용자 콜백은 보다 일반적인 방식으로 구현될 수 있다.
API의 현재 세부사항과 문서를 보고 싶다면 소스 코드를 참조하자.
submitTransaction
함수initializeWorkloadModule
함수에서 받은(그리고 저장된)sutAdapter
객체는 ConnectorInterface 타입이다. 이것의 getType()
함수는 fabric
문자열 값을 반환한다.
커넥터 API의 sendRequests
메서드는 워크로드 모듈이 SUT에 리퀘스트를 제출할 수 있도록 한다. 이것은 단일 파라미터를 받는다: 리퀘스트의 설정들을 담은 객체 또는 객체의 배열이다.
설정 객체는 아래 스트럭처를 가지고 있다:
contractId
: string. Required. 호출하려는 컨트랙트의 ID.contractFunction
: string. Required. 컨트랙트에서 호출하려는 함수의 이름contractArguments
: string[]. Optional. 컨트랙트로 전달되는 문자열 argument의 목록.readOnly
: boolean. Optional. 리퀘스트가 TX인지 쿼리인지를 가리킨다. 기본값은 false
이다.timeout
: number. Optional. 이 리퀘스트를 사용할 때의 타임아웃(초). 이 설정은 게이트웨이 사용이 활성화되면 적용 불가능하다. transientMap
: Map<string, byte[]>. Optional. 컨트랙트로 전달되는 transient map.invokerIdentity
: string. Optional. 컨트랙트를 호출해야 하는 사용자의 이름. 제공되지 않으면 invokerMspId
에 의해 정의된 조직에서 사용자가 선택되고, 이 프로퍼티가 제공되지 않으면 네트워크 구성 파일의 첫 조직에서 사용자가 선택된다. invokerMspId
: string. Optional. 컨트랙트를 호출해야 하는 사용자 조직의 mspid. 기본값은 네트워크 구성 파일의 첫 조직이다.targetPeers
: string[]. Optional. 트랜잭션 프로포절(제안)의 타겟인 보증 피어 이름들의 배열. 생략되면 타겟 목록이 자동으로 선택된다. 탐색(discovery)가 사용되는 경우 node SDK가 올바른 피어를 결정하긱 위해 탐색(discovery)를 사용한다. targetOrganizations
: string[]. Optional. 호출의 타겟인 보증 조직들의 배열. targetPeers
와 이것이 둘 다 지정된다면 targetPeers
가 우선된다.orderer
: string. Optional. 트랜잭션 브로캐스트를 위한 타겟 오더러 이름. 생략되면 채널의 오더러 하나가 자동으로 선택된다.channel
: string. Optional. 호출할 컨트랙트가 있는 채널의 이름따라서 컨트랙트 호출은 아래와 같이 보인다:
let requestSettings = {
contractId: 'marbles',
contractFunction: 'initMarble',
contractArguments: ['MARBLE#1', 'Red', '100', 'Attila'],
invokerIdentity: 'client0.org2.example.com',
timeout: 10
};
await this.sutAdapter.sendRequests(requestSettings);
참고
sendRequests
는 리퀘스트 설정의 배열 또한 받아들인다. 하지만, 패브릭은 Sawtooth(하이퍼레저 소투스)처럼 트랜잭션의 아토믹 배치 제출을 지원하지 않는다. 그러므로 이 트랜잭션들의 순서가 똑같이 유지되거나, 트랜잭션들이 같은 블록에 위치하게 되는 것에는 어떤 게런티도 없다.
앞서 논의된 sendRequests
함수는 제출된 리퀘스트(들)에 대한 결과(또는 결과들의 배열)을 TxStatus
타입으로 반환한다. 이 클래스는 관련된 트랜잭션의 표준 및 플랫폼 특정적 정보를 제공한다.
제공되는 표준 데이터는 아래와 같다:
GetID()
: string. 트랜잭션 ID를 반환한다.GetStatus()
: string. 트랜잭션의 마지막 상태를 반환한다. success
또는 failed
이다.GetTimeCreate()
: number. 트랜잭션이 제출된 시간(epoch)를 반환한다.GetTimeFinal()
: number. 트랜잭션이 완료된 시간(epoch)를 반환한다.IsVerified()
: boolean. 트랜잭션의 마지막 상태에 대해 확신할 수 있는지를 가리킨다. 검증되지 않은(실패로 간주되는) 트랜잭션들이 존재한다면, 예를 들어 모든 패브릭 이벤트 허브에 대한 커넥션을 어댑터가 잃었다면, 트랜잭션의 마지막 상태를 놓쳤을 수 있다.GetResult()
: Buffer. 컨트랙트에 의해 반환되는 보증 결과 중 하나를 Buffer
형태로 반환한다. 컨트랙트-사이드 인코딩에 따라 이것을 디코딩하는 역할은 사용자 콜백 함수에 있다. 어댑터는 또한 (만약 관찰된다면) 각 트랜잭션에 대한 아래 플랫폼 특정적 데이터들을 모은다. 각각은 특정한 키 이름을 통해 노출된다. 키 이름들의 placeholder들인 <P>
와 <o>
는 네트워크 구성 파일의 최상위 peers
및 orderers
섹션에 있는 값을 가져오는 노드 이름이다 (예: endorsement_result_peer0.org1.example.com
). Get(key:string):any
함수가 주어진 키와 관련된 관찰값을 반환한다. 대안적으로, GetCustomData():Map<string,any>
는 수집된 데이터의 전체 컬렉션을 Map 형태로 반환한다.
게이트웨이 및 비 게이트웨이 어댑터에서 공통적인 어댑터 특정적인 데이터 키들은 다음과 같다:
키 이름 | 데이터 타입 | 설명 |
---|---|---|
request_type | string | 기존 트랜잭션 또는 쿼리 각각에 대한 트랜잭션 또는 쿼리 문자열 값. |
v1.x 비 게이트웨이 어댑터에서만 사용가능한 어댑터 특정적 데이터 키들은 다음과 같다:
키 이름 | 데이터 타입 | 설명 |
---|---|---|
time_endorse | number | 어댑터가 보증자로부터 제안(proposal) 리스폰스를 받은 유닉스 에포크. 보증 에러인 경우에도 저장된다. |
proposal_error | string | 보증자로부터 제안 리스폰스 송신/대기 동안 에러가 발생할 경우 에러 메시지 |
proposal_response_error_<P> | string | 보증 피어 <P> 가 보증 결과로 에러를 반환하는 경우 에러 메시지 |
endorsement_result_<P> | Buffer | 보증 피어 <P> 에서 반환된 인코딩된 컨트랙트 호출 결과. 이 결과를 디코딩하는 것은 사용자 콜백 함수가 담당한다. |
endorsement_verify_error_<P> | string | 보증 피어 <P> 의 신원 또는 서명이 검증되지 못한 경우 'INVALID' 값을 가진다. 이 검증 단계는 런타임 구성 옵션을 통해 켜지고 꺼질 수 있다. |
endorsement_result_error<P> | string | 보증 피어 <P> 에서 트랜잭션 프로포절 또는 쿼리 실행 결과가 에러라면 이 필드가 에러 메시지를 포함한다. |
read_write_set_error | string | 전송된 트랜잭션 프로포절로 인해 서로 다른 읽기/쓰기 세트들이 생긴 경우 'MISMATCH' 값을 가진다. |
time_orderer_ack | number | 오더러로부터 성공적으로 트랜잭션을 받았다는 확증을 받은 유닉스 에포크. 이것이 트랜잭션의 실제 정렬 시간은 아니라는 점을 주의하자. |
broadcast_error_<O> | string | 어댑터가 오더러 노드 로부터 성공 확증을 받지 못한 경우 경고 메시지. 이것이 트랜잭션이 실패했음을 의미하지 않는다는 것에 주의하자(즉, 일시적인 네트워크 지연이나 에러로 인해 응답이 지연되는 동안 타임아웃이 일어났을 수 있다). |
broadcast_response_error_<O> | string | 어댑터가 오더러 노드 로부터 명시적인 실패 메시지를 받은 경우 에러 메시지. |
unexpected_error | string | 트랜잭션 라이프사이클동안 예상치 못한 에러가 일어난 경우 에러 메시지. |
commit_timeout_<P> | string | 피어 노드 <P> 로부터 트랜잭션에 대한 이벤트 알림(notification)이 제시간에 도착하지 않은 경우 'TIMEOUT' 값을 가진다. |
commit_error_<P> | string | 피어 노드 <P> 에서 트랜잭션 라이프사이클이 끝날 때 트랜잭션 검증이 실패한 경우 에러 코드를 포함한다. |
commit_success_<P> | number | 어댑터가 피어 노드 <P> 로부터 성공적인 커밋 이벤트를 수신한 유닉스 에포크. 같은 블록에 커밋된 트랜잭션들은 거의 동일한 커밋 시간을 갖는다는 것에 주의하자. 이는 SDK가 그 트랜잭션들을 블록 단위로, 즉 같은 시간에, 수신하기 때문이다. |
event_hub_error_<P> | string | 피어 노드 <P> 에서 이벤트 허브 커넥션 관련 에러가 일어났을 때 에러 메시지. |
sendRequests
호출 후 워크로드 모듈에서 이 데이터들에 접근할 수 있다:
let requestSettings = {
contractId: 'marbles',
contractVersion: '0.1.0',
contractFunction: 'initMarble',
contractArguments: ['MARBLE#1', 'Red', '100', 'Attila'],
invokerIdentity: 'client0.org2.example.com',
timeout: 10
};
// single argument, single return value
const result = await this.sutAdapter.sendRequests(requestSettings);
let shortID = result.GetID().substring(8);
let executionTime = result.GetTimeFinal() - result.GetTimeCreate();
console.log(`TX [${shortID}] took ${executionTime}ms to execute. Result: ${result.GetStatus()}`);
cleanupWorkloadModule
함수cleanupWorkloadModule
함수는 라운드가 종료될 때 호출된다. 이것은 워크로드 구현에 필요했던 리소스 정리에 사용된다.
어댑터의 yaml 네트워크 구성 파일은 조직 및 그 조직과 연관된 신원들을 기술한다. 이것은 또한 패브릭 네트워크의 채널과 그 채널에 배포된 컨트랙트(체인코드)들에 대한 명시적 정보를 제공한다. 이것은 각 조직에 대한 공통 커넥션 프로필(Common Connection Profiles)을 (각 조직에 대해 공통 커넥션 프로필을 지정함으로써) 참조할 수 있다. node-sdk가 사용할 수 있는 동일한 커넥션 프로필들이 있다. 패브릭 네트워크나 채널을 생성한 누구나 각 조직에 대한 적절한 프로필을 제공할 수 있다.
아래 섹션들은 각 파트의 디테일을 설명한다. 완전한 예시는 캘리퍼 리포지토리의 caliper-fabric test 폴더에 있는 것과 같은 파일 하나나 예시 섹션를 참조하자.
참고
알려지지 않은 키는 구성의 어떤 부분에서도 허용되지 않는다. 네트워크 아티팩트 이름들이 키 역할을 할 때(피어 이름, 채널 이름 등)와
info
property 만이 예외이다.
Required. Non-empty string.
구성 파일의 이름.
name: Fabric
Required. Non-empty string.
Fabric SDK가 사용할 YAML 스키마 버전을 지정한다. '2.0.0'
문자열만 지정되어야 한다.
version: '2.0.0'
Required. Non-empty object.
캘리퍼에 대한 런타임 정보를 포함한다. 아래 키들을 포함할 수 있다.
blockchain
Required. Non-empty string.
이 어댑터에서는 "fabric"
문자열만 허용된다.
caliper:
blockchain: fabric
sutOptions
Optional. Non-empty object.
SUT 특징적 옵션 블록이다. 패브릭 구현에서는 아래를 지정한다.
mutualTls
Optional. Boolean.
server-side TLS에 더해 client-side TLS를 사용할지 정한다. server-side TLS를 사용하지 않고 true
를 지정할 수 없다. 기본값은 false
이다.
caliper:
blockchain: fabric
sutOptions:
mutualTls: true
command
Optional. Non-empty object.
스크립트의 시작과 끝을 지정한다. 반드시 아래 키 중 하나 이상을 포함해야 한다.
start
Optional. Non-empty string.
시작(startup) 시간에 실행할 커맨드를 포함한다. 커맨드의 현재 워킹 디렉토리가 워크스페이스로 지정된다.
caliper:
command:
start: my-startup-script.sh
end
Optional. Non-empty string.
종료시간에 실행될 커맨드를 포함한다. 커맨드의 현재 워킹 디렉토리가 워크스페이스로 지정된다.
caliper:
command:
end: my-cleanup-script.sh
info
Optional. Object.
생성되는 캘리퍼 리포트에 그대로 포함될 커스텀 키-밸류 쌍을 지정한다. 이 키-밸류 쌍은 런타임 동작에 영향을 미치지 않는다.
info:
Version: 1.1.0
Size: 2 Orgs with 2 Peers
Orderer: Solo
Distribution: Single Host
StateDB: CouchDB
organizations
Required. Non-empty object.
워크로드 구동에 사용될 하나 이상의 조직에 대한 정보를 포함한다. 여러 조직으로 구성된 패브릭 네트워크에서도, 워크로드는 일반적으로 단일 조직에서 구동된다. 따라서 단일 조직 정의만 볼 수 있는 것이 일반적이다. 하지만 워크로드가 사용될 조직을 명시적으로 선언할 수 있도록 여러 조직을 정의하는 것 또한 지원한다. 어떤 명시적 조직이 선언되지 않는다면 네트워크 구성의 첫 조직이 사용되는 기본 조직이다.
organizations:
- mspid: Org1MSP
identities:
wallet:
path: './org1wallet'
adminNames:
- admin
certificates:
- name: 'User1'
clientPrivateKey:
pem: |-
-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----
clientSignedCert:
pem: |-
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
connectionProfile:
path: './Org1ConnectionProfile.yaml'
discover: true
- mspid: Org2MSP
connectionProfile:
path: './Org2ConnectionProfile.yaml'
discover: false
identities:
wallet:
path: './org2wallet'
adminNames:
- admin
각 조직은 반드시 mspid
, connectionProfle
, identities
를 가져야 하고, identities 섹션에는 반드시 하나 이상의 인증서 또는 지갑 정의가 있어서 하나 이상의 신원이 정의되도록 해야 한다.
mspid
Required. Non-empty string.
조직의 고유한 MSP ID.
organizations:
- mspid: Org1MSP
connectionProfile
Required. Non-empty object.
패브릭 네트워크 공통 커넥션 프로필에 대한 참조. 이 프로필들은 패브릭 SDK가 패브릭 네트워크와 상호작용하기위해 사용하는 프로필과 동일하다. 공통 커넥션 프로필은 조직 특정적이므로, 프로필이 포함되는 조직 각각을 가리키고 있는지 확실히 확인해야 하낟. 커넥션 프로필은 두가지 형식일 수 있다. 정적 커넥션 프로필은 패브릭 네트워크의 완전한 기술을 포함한다. 즉, 해당 조직이 속한 모든 채널뿐만 아니라 모든 피어들 및 모든 오더러를 포함해야 한다. 동적 커넥션 파일은 최소한의 정보를 포함한다. 일반적으로 조직에 속한 (또는 접근이 허용된) 하나 이상의 피어 리스트만을 가진다. 이것은 패브릭 네트워크 노드들과 채널들을 탐색하기 위해 사용된다.
organizations:
- mspid: Org1MSP
connectionProfile:
path: './test/sample-configs/Org1ConnectionProfile.yaml'
discover: true
path
Required. Non-empty string.
커넥션 프로필 파일 경로
discover
Optional. Boolean.
true
는 이 커넥션 파일이 동적이며 탐색이 사용될 것임을 의미한다. 지정되지 않는다면 기본값은 false
이다. gateway
옵션을 사용한다면 반드시 true
로 설정해야 한다.
identities
Required. Non-empty object.
하나 이상의 사용가능한 신원 위치를 정의한다. 현재는 PEM 형태인 인증서와 비밀키, 또는 파일 시스템으로 하나 이상의 신원을 포함한 SDK 지갑으로 제공되는 명시적 신원만이 지원된다. 신원의 자식 프로퍼티들 중 하나를 통해 하나 이상의 신원이 반드시 제공되어야 한다.
identities:
wallet:
path: './wallets/org1wallet'
adminNames:
- admin
certificates:
- name: 'User1'
clientPrivateKey:
pem: |-
-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----
clientSignedCert:
pem: |-
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
certificates
Optional. A List of non-empty objects.
하나 이상의 신원을 정의한다. 이것은 클라이언트 인증서와 클라이언트 개인 키에 대한 PEM 정보를 제공함으로써 이루어진다. 각 키는 삽입된 PEM, 즉 PEM 파일 컨텐츠의 base64 encoded string이거나, 각 PEM 파일 경로일 수 있다.
yamlcertificates:
- name: 'User1'
clientPrivateKey:
path: path/to/privateKey.pem
clientSignedCert:
path: path/to/cert.pem
- name: 'Admin'
admin: true
clientPrivateKey:
pem: |-
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgIRZo3SAPXAJnGVOe
jRALBJ208m+ojeCYCkmJQV2aBqahRANCAARnoGOEw1k+MtjHH4y2rTxRjtOaKWXn
FGpsALLXfBkKZvxIhbr+mPOFZVZ8ztihIsZBaCuCIHjw1Tx65szJADcO
-----END PRIVATE KEY-----
clientSignedCert:
pem: |-
-----BEGIN CERTIFICATE-----
MIICSDCCAe+gAwIBAgIQfpGy5OOXBYpKZxg89x75hDAKBggqhkjOPQQDAjB2MQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEfMB0GA1UEAxMWdGxz
Y2Eub3JnMS5leGFtcGxlLmNvbTAeFw0xODA5MjExNzU3NTVaFw0yODA5MTgxNzU3
NTVaMHYxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH
Ew1TYW4gRnJhbmNpc2NvMRkwFwYDVQQKExBvcmcxLmV4YW1wbGUuY29tMR8wHQYD
VQQDExZ0bHNjYS5vcmcxLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0D
AQcDQgAED4FM1+iq04cjveIDyn4uj90lJlO6rASeOIzm/Oc2KQOjpRRlB3H+mVnp
rXN6FacjOp0/6OKeEiW392dcdCMvRqNfMF0wDgYDVR0PAQH/BAQDAgGmMA8GA1Ud
JQQIMAYGBFUdJQAwDwYDVR0TAQH/BAUwAwEB/zApBgNVHQ4EIgQgPQRWjQR5EUJ7
xkV+zbfY618IzOYGIpfLaV8hdlZfWVIwCgYIKoZIzj0EAwIDRwAwRAIgYzk8553v
fWAOZLxiDuMN9RiHve1o5aAQad+uD+eLpxMCIBmv8CtXf1C60h/0zyG1D6tTTnrB
H8Zua3x+ZQn/kqVv
-----END CERTIFICATE-----
- name: 'User3'
clientPrivateKey:
pem: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JR0hBZ0VBTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEJHMHdhd0lCQVFRZ0lSWm8zU0FQWEFKbkdWT2UKalJBTEJKMjA4bStvamVDWUNrbUpRVjJhQnFhaFJBTkNBQVJub0dPRXcxaytNdGpISDR5MnJUeFJqdE9hS1dYbgpGR3BzQUxMWGZCa0tadnhJaGJyK21QT0ZaVlo4enRpaElzWkJhQ3VDSUhqdzFUeDY1c3pKQURjTwotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tCg==
clientSignedCert:
pem: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNXRENDQWY2Z0F3SUJBZ0lSQU1wU2dXRmpESE9vaFhhMFI2ZTlUSGd3Q2dZSUtvWkl6ajBFQXdJd2RqRUwKTUFrR0ExVUVCaE1DVlZNeEV6QVJCZ05WQkFnVENrTmhiR2xtYjNKdWFXRXhGakFVQmdOVkJBY1REVk5oYmlCRwpjbUZ1WTJselkyOHhHVEFYQmdOVkJBb1RFRzl5WnpFdVpYaGhiWEJzWlM1amIyMHhIekFkQmdOVkJBTVRGblJzCmMyTmhMbTl5WnpFdVpYaGhiWEJzWlM1amIyMHdIaGNOTWpBd09UQTNNVEUwTWpBd1doY05NekF3T1RBMU1URTAKTWpBd1dqQjJNUXN3Q1FZRFZRUUdFd0pWVXpFVE1CRUdBMVVFQ0JNS1EyRnNhV1p2Y201cFlURVdNQlFHQTFVRQpCeE1OVTJGdUlFWnlZVzVqYVhOamJ6RVpNQmNHQTFVRUNoTVFiM0puTVM1bGVHRnRjR3hsTG1OdmJURWZNQjBHCkExVUVBeE1XZEd4elkyRXViM0puTVM1bGVHRnRjR3hsTG1OdmJUQlpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDkKQXdFSEEwSUFCTWRMdlNVRElqV1l1Qnc0WVZ2SkVXNmlmRkx5bU9BWDdHS1k2YnRWUERsa2RlSjh2WkVyWExNegpKV2ppdnIvTDVWMlluWnF2ME9XUE1NZlB2K3pIK1JHamJUQnJNQTRHQTFVZER3RUIvd1FFQXdJQnBqQWRCZ05WCiBIU1VFRmpBVUJnZ3JCZ0VGQlFjREFnWUlLd1lCQlFVSEF3RXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QXBCZ05WCkhRNEVJZ1FnNWZPaHl6d2FMS20zdDU0L0g0YjBhVGU3L25HUHlKWk5oOUlGUks2ZkRhQXdDZ1lJS29aSXpqMEUKQXdJRFNBQXdSUUloQUtFbnkvL0pZN0dYWi9USHNRSXZVVFltWHNqUC9iTFRJL1Z1TFg3VHpjZWZBaUJZb1N5WQp5OTByZHBySTZNcDZSUGlxalZmMDJQNVpDODZVa1AwVnc0cGZpUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
name
Required. Non-empty string.
해당 신원 이름을 지정한다. 이 이름은 인증서 내 어떤 것과 일치할 필요는 없지만, 반드시 고유해야 한다.
certificates:
- name: 'User1'
admin
Optional. Boolean.
해당 신원이 조직 관리자 신원인지를 가리킨다. 기본값은 false이고, 채널을 생성하고 체인코드(컨트랙트)를 설치하고 초기화할 계획이 있을 때만 필요하다.
certificates:
- name: 'User2'
admin: true
clientPrivateKey
Required. Non-empty object.
신원의 개인 키를 지정한다. 반드시 아래 중 하나를 포함해야 한다.
path
Optional. Non-empty string.
비밀키가 있는 파일에 대한 경로
clientPrivateKey:
path: path/to/cert.pem
pem
Optional. Non-empty string.
정확한 PEM 포맷 (yaml의 경우 반드시 여러 줄로 분할되고, JSON의 경우 반드시 개행문자를 포함하는) 이거나 단일 문자열인 PEM의 base 64 encoded 버전일 수 있다 (필요한 개행도 인코딩된다). 이 단일 문자열 포맷은 네트워크 구성 파일 (특히 JSON파일)에 삽입하기 쉽다.
clientPrivateKey:
pem: |
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgIRZo3SAPXAJnGVOe
jRALBJ208m+ojeCYCkmJQV2aBqahRANCAARnoGOEw1k+MtjHH4y2rTxRjtOaKWXn
FGpsALLXfBkKZvxIhbr+mPOFZVZ8ztihIsZBaCuCIHjw1Tx65szJADcO
-----END PRIVATE KEY-----
clientSignedCert
Required. Non-empty object.
신원의 인증서를 지정한다. clientPrivateKey
와 마찬가지로 반드시 path
나 pem
을 포함해야 한다.
channels
Required. A list of objects.
하나 이상의 고유한 채널을 포함한다. 각 채널에서 사용가능한 체인코드(컨트랙트)에 대한 정보를 가지고 있다.
channels:
- channelName: mychannel
create:
buildTransaction:
capabilities: []
consortium: 'SampleConsortium2'
msps: ['Org1MSP', 'Org2MSP']
version: 0
contracts:
- id: marbles
contractID: myMarbles
install:
version: v0
language: golang
path: marbles/go
metadataPath: src/marbles/go/metadata
instantiate:
initFunction: init
initArguments: []
initTransientMap:
key1: value1
key2: value2
endorsementPolicy: ''
collectionsConfig: ''
- channelName: somechannel
create:
prebuiltTransaction: 'channel.tx'
channelName
Required. Non-empty String.
채널의 이름
create
Optional. Non-empty object.
생성되어야 하는 채널과 자식 프로퍼티들을 가리킨다. 이것들은 채널이 생성되는 방법을 정의하는데, 채널 트랜잭션을 빌드하는것인지 아니면 이미 빌드된 것을 사용하는지를 결정한다. 반드시 아래 키 중 하나를 포함해야 한.
prebuiltTransaction
Optional. Non-empty string.
채널이 아직 존재하지 않는 경우, 어댑터가 제공된 채널 구성 바이너리(일반적으로 configtxgen tool의 결과물인) 경로를 기반으로 채널을 생성할 수 있다.
channels:
- channelName: somechannel
create:
prebuiltTransaction: 'channel.tx'
buildTransaction
Optional. Object.
채널이 아직 존재하지 않는 경우, 여러 프로퍼티로 구성된, 채널을 생성할 트랜잭션 빌드 방법에 대한 정보를 바탕으로 어댑터가 채널을 생성할 수 있다.
channels:
- channelName: somechannel
create:
buildTransaction:
capabilities: []
consortium: SampleConsortium
msps: ['Org1MSP', 'Org2MSP']
version: 0
capabilities
Required. Non-sparse array of strings.
구성 트랜잭션에 포함되는 채널 케이퍼빌리티 목록.
consortium
Required. Non-empty string.
컨소시움 이름.
msps
Required. Non-sparse array of unique strings.
채널 조직들의 MSP ID들.
version
Required. Non-negative integer.
구성의 버전 넘버.
contracts
Required. Non-sparse array of objects.
각 배열 엘리먼트는 채널의 컨트랙트에 대한 정보를 갖고 있어야 한다.
참고
구성 파일 수준에서, 모든 채널의 모든 컨트랙트에서
contractID
값이 고유해야 한다.contractID
가 컨트랙트를 특정하지 못하는 경우 기본값은 컨트랙트의id
이다.
channels:
mychannel:
contracts:
- id: simple
# other properties of simple CC
- id: smallbank
# other properties of smallbank CC
어떤 프로퍼티들은 컨트랙트가 배포되어야 하느냐에 따라 필수적이다. 아래 제약이 적용된다:
참고
컨트랙트 설치를 위한 제약
metadataPath
가 제공되면path
도 필수적이다.path
가 제공되면language
도 필수적이다.컨트랙트 초기화를 위한 제약:
- 다음 프로퍼티 중 하나가 제공되면
language
가 필요하다:initArguments
,initFunction
,initTransientMap
,collectionsConfig
,endorsementPolicy
. 각 요소는 아래 프로퍼티들을 가질 수 있다.
id
Required. Non-empty string.
컨트랙트의 id
contractID
Optional. Non-empty string.
컨트랙트의 캘리퍼 수준 고유 ID. 이 ID가 유저 콜백 모듈에 의해 참조된다. 임시 이름일 수 있고, 패브릭 side의 컨트랙트 프로퍼티에 영향을 주지 않는다. 만약 생략되면 id
프로퍼티 값이 기본이다.
install
Optional. Non-empty object
컨트랙트(체인코드)가 설치되고 초기화되는 요구 사항을 정의한다. 하위 프로퍼티는 설치될 컨트랙트(체인코드)의 정보를 정의한다. 이것은 1.4 SUT와 새 라이프사이클이 활성화되지 않은 2.x 네트워크에만 사용할 수 있다. 따라서 자세한 내용은 여기를 참조하자.
instantiate
Optional. Non-empty object.
초기화 단계 동안 제공되는 추가적인 파라피터들을 정의한다. 이 섹션은 체인코드가 초기화되었는지를 컨트롤하지 않고, 추가적인 초기화 파라미터를 제공하기 위한 케이퍼빌리티만을 제공한다. 이것은 1.4 SUT와 새 라이프사이클이 활성화되지 않은 2.x 네트워크에만 사용할 수 있다. 따라서 자세한 내용은 여기를 참조하자.
아래 예시는 다음 네트워크 토폴로지와 아티팩트를 위한 패브릭 네트워크 구성이다:
name: Fabric
version: "2.0.0"
caliper:
blockchain: fabric
sutOptions:
mutualTls: false
command:
start: docker-compose -f network/fabric-v1.1/2org2peergoleveldb/docker-compose-tls.yaml up -d;sleep 3s
end: docker-compose -f network/fabric-v1.1/2org2peergoleveldb/docker-compose-tls.yaml down;docker rm $(docker ps -aq);docker rmi $(docker images dev* -q)
info:
Version: 1.1.0
Size: 2 Orgs
Orderer: Raft
Distribution: Single Host
StateDB: GoLevelDB
channels:
- channelName: mychannel
create:
buildTransaction:
capabilities: []
consortium: 'SampleConsortium'
msps: ['Org1MSP', 'Org2MSP']
version: 0
# Array of contracts to be installed/instantiated on the named channel and available for use by the workload module
contracts:
- id: marbles
contractID: myMarbles
install:
version: v0
language: golang
path: marbles/go
metadataPath: src/marbles/go/metadata
instantiate:
initFunction: init
initArguments: []
endorsementPolicy:
identities:
- role:
name: member
mspId: Org1MSP
- role:
name: member
mspId: Org2MSP
policy:
2-of:
- signed-by: 0
- signed-by: 1
organizations:
- mspid: Org1MSP
identities:
certificates:
- name: 'admin.org1.example.com'
admin: true
clientPrivateKey:
pem: |-
-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----
clientSignedCert:
pem: |-
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
connectionProfile:
path: './Org1ConnectionProfile.yaml'
discover: true
- mspid: Org2MSP
connectionProfile:
identities:
certificates:
- name: 'admin.org2.example.com'
admin: true
clientPrivateKey:
pem: |-
-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----
clientSignedCert:
pem: |-
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
path: './Org2ConnectionProfile.json'
discover: true
The Caliper codebase is released under the Apache 2.0 license. Any documentation developed by the Caliper Project is licensed under the Creative Commons Attribution 4.0 International License. You may obtain a copy of the license, titled CC-BY-4.0, at http://creativecommons.org/licenses/by/4.0/.