Fabric connector

HH·2022년 1월 9일
0

Hyperledger Caliper

목록 보기
5/12

Fabric connector

새 패브릭 커넥터 소개


이 페이지는 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 바인딩


패브릭 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 기반 어댑터에 존재하지 않는다. 이 케이퍼빌리티는 캘리퍼 통합 테스트를 지원하기 위해 남아있으며, 이 메커니즘을 채널과 컨트랙트 설정을 위해 사용하는 것은 절대 권장되지 않는다. 이 케이퍼빌리티는 레거시로 분류되며, 유지되지 않을 것이다. 벤치마크를 위해 캘리퍼를 구동하기 전 네트워크를 설정하는 대안적인 방법을 찾아보아야 한다.

런타임 셋팅


Common settings


어댑터의 몇몇 런타임 프로퍼티들은 캘리퍼의 런타임 구성 메커니즘을 통해 설정될 수 있다. 가능한 설정들을 위해 기본 구성 파일caliper.fabric 섹션과 내장 문서를 보자.

위 설정은 캘리퍼 시작 시 처리된다. 테스트 동안 이것들을 수정하는 것은 영향이 없다. 하지만, 캘리퍼가 시작하기 전 일반 구성 소스에서 기본 값들을 오버라이딩할 수 있다.

참고

구성 파일의 객체 계층은 각 리프 프로퍼티를 위한 엔트리 설정을 생성한다. 아래 구성 파일을 고려하자:

caliper:
 fabric:
   gateway:
     localhost: false
     enabled: true

프로젝트 설정 파일을 caliper.yaml로 이름짓고 워크스페이스 디렉토리 루트에 두면 이 파일이 아래 두 설정 키를 아래 값들로 오버라이딩한다:

  • caliper-fabric-gateway-enabledtrue로 설정된다.
  • caliper-fabric-gateway-localhostfalse로 설정된다.

다른 설정들은 변화되지 않은 채로 유지된다.

caliper-fabric-gateway-discovery 설정은 새 커넥터에서 지원되지 않고 구성 파일에서 정의되어야 하지만 레거시 패브릭 커넥터를 지원하기 위해서만 유지된다.

채널 생성 건너뛰기


추가적으로, 어댑터는 채널 생성을 건너뛰기 위한 동적 설정 (패밀리)를 제공한다. 설정 키 포맷은 caliper-fabric-skipcreatechannel-<channel_name>이다. <channel_name>부분을 생성을 건너뛰고 싶은 채널 이름으로 대체한다. 예:

user@ubuntu:~/caliper-benchmarks$ export CALIPER_FABRIC_SKIPCREATECHANNEL_MYCHANNEL=true

참고

이 설정은 네트워크 구성 파일에 "생성되지 않음"으로 지정되는 채널의 생성을 쉽게 건너뛰기 위한 용도이다. 하지만 벤치마킹 중에 항상 채널이 생성된다는 것을 안다면, 네트워크 생성 파일에 이를 명시적으로 표기하는 것이 추천된다.

자연스럽게, 위 설정을 여러 방법으로 지정할 수 있다 (예: 커맨드라인 argument, 구성 파일 entry)

커넥터 API


워크로드 모듈은 테스트의 세 단계들에서 어댑터와 상호작용한다. 사용자 모듈을 생성하는 동안(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(하이퍼레저 소투스)처럼 트랜잭션의 아토믹 배치 제출을 지원하지 않는다. 그러므로 이 트랜잭션들의 순서가 똑같이 유지되거나, 트랜잭션들이 같은 블록에 위치하게 되는 것에는 어떤 게런티도 없다.

수집된 TX 데이터


앞서 논의된 sendRequests 함수는 제출된 리퀘스트(들)에 대한 결과(또는 결과들의 배열)을 TxStatus 타입으로 반환한다. 이 클래스는 관련된 트랜잭션의 표준 및 플랫폼 특정적 정보를 제공한다.

제공되는 표준 데이터는 아래와 같다:

  • GetID() : string. 트랜잭션 ID를 반환한다.
  • GetStatus() : string. 트랜잭션의 마지막 상태를 반환한다. success 또는 failed이다.
  • GetTimeCreate() : number. 트랜잭션이 제출된 시간(epoch)를 반환한다.
  • GetTimeFinal() : number. 트랜잭션이 완료된 시간(epoch)를 반환한다.
  • IsVerified() : boolean. 트랜잭션의 마지막 상태에 대해 확신할 수 있는지를 가리킨다. 검증되지 않은(실패로 간주되는) 트랜잭션들이 존재한다면, 예를 들어 모든 패브릭 이벤트 허브에 대한 커넥션을 어댑터가 잃었다면, 트랜잭션의 마지막 상태를 놓쳤을 수 있다.
  • GetResult() : Buffer. 컨트랙트에 의해 반환되는 보증 결과 중 하나를 Buffer 형태로 반환한다. 컨트랙트-사이드 인코딩에 따라 이것을 디코딩하는 역할은 사용자 콜백 함수에 있다.

어댑터는 또한 (만약 관찰된다면) 각 트랜잭션에 대한 아래 플랫폼 특정적 데이터들을 모은다. 각각은 특정한 키 이름을 통해 노출된다. 키 이름들의 placeholder들인 <P><o>는 네트워크 구성 파일의 최상위 peersorderers 섹션에 있는 값을 가져오는 노드 이름이다 (예: endorsement_result_peer0.org1.example.com). Get(key:string):any 함수가 주어진 키와 관련된 관찰값을 반환한다. 대안적으로, GetCustomData():Map<string,any>는 수집된 데이터의 전체 컬렉션을 Map 형태로 반환한다.

게이트웨이 및 비 게이트웨이 어댑터에서 공통적인 어댑터 특정적인 데이터 키들은 다음과 같다:

키 이름데이터 타입설명
request_typestring기존 트랜잭션 또는 쿼리 각각에 대한 트랜잭션 또는 쿼리 문자열 값.

v1.x 비 게이트웨이 어댑터에서만 사용가능한 어댑터 특정적 데이터 키들은 다음과 같다:

키 이름데이터 타입설명
time_endorsenumber어댑터가 보증자로부터 제안(proposal) 리스폰스를 받은 유닉스 에포크. 보증 에러인 경우에도 저장된다.
proposal_errorstring보증자로부터 제안 리스폰스 송신/대기 동안 에러가 발생할 경우 에러 메시지
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_errorstring전송된 트랜잭션 프로포절로 인해 서로 다른 읽기/쓰기 세트들이 생긴 경우 'MISMATCH' 값을 가진다.
time_orderer_acknumber오더러로부터 성공적으로 트랜잭션을 받았다는 확증을 받은 유닉스 에포크. 이것이 트랜잭션의 실제 정렬 시간은 아니라는 점을 주의하자.
broadcast_error_<O>string어댑터가 오더러 노드 로부터 성공 확증을 받지 못한 경우 경고 메시지. 이것이 트랜잭션이 실패했음을 의미하지 않는다는 것에 주의하자(즉, 일시적인 네트워크 지연이나 에러로 인해 응답이 지연되는 동안 타임아웃이 일어났을 수 있다).
broadcast_response_error_<O>string어댑터가 오더러 노드 로부터 명시적인 실패 메시지를 받은 경우 에러 메시지.
unexpected_errorstring트랜잭션 라이프사이클동안 예상치 못한 에러가 일어난 경우 에러 메시지.
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 만이 예외이다.

name

Required. Non-empty string.
구성 파일의 이름.

name: Fabric

version

Required. Non-empty string.
Fabric SDK가 사용할 YAML 스키마 버전을 지정한다. '2.0.0'문자열만 지정되어야 한다.

version: '2.0.0'

caliper

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 파일 경로일 수 있다.

        yaml
        certificates:
          - 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와 마찬가지로 반드시 pathpem을 포함해야 한다.

  • channels

    Required. A list of objects.
    하나 이상의 고유한 채널을 포함한다. 각 채널에서 사용가능한 체인코드(컨트랙트)에 대한 정보를 가지고 있다.

    yaml
    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 네트워크에만 사용할 수 있다. 따라서 자세한 내용은 여기를 참조하자.

네트워크 구성 예시


아래 예시는 다음 네트워크 토폴로지와 아티팩트를 위한 패브릭 네트워크 구성이다:

  • 두 조직 Org1MSP와 Org2MSP
  • mychannel이라는 이름의 한 채널
  • mychannel에서 모든 피어에 설치 및 초기화되는 marbles@v0 컨트랙트
  • 네트워크의 노드들은 TLS를 사용하지만 mutual TLS는 사용하지 않음
  • 캘리퍼에 의해 로컬 네트워크가 자동으로 배포되고 정리됨
예시
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/.

0개의 댓글

관련 채용 정보