다음 Hyperledger 패브릭 가이드 시리즈는 CRUD 작업, 데이터 보호, 체인 코드 테스트에 이르기까지 Hyperledger Fabric 체인 코드 개발에 대한 다양한 측면을 설명하는 3 개의 문서로 구성됩니다..

1 부

2 부

파트 3

으로  미치 엘 멀더 스

시리즈 개요 :

  • 기사 1 : 기본 체인 코드 개발 및 컬렉션에 개인 데이터 저장
  • 기사 2 : 고급 체인 코드 쿼리 및 CouchDB GUI
  • 기사 3 : MockStub으로 체인 코드를 테스트하기위한 튜토리얼

요구 사항

  • 4GB RAM (더 선호 됨)
  • Docker, Docker-Compose, 코드 편집기 (예 : Visual Studio Code), Git
  • NodeJS 버전 8.9+ (권장 8.9.4 – 버전 관리자 ‘’)
  • 기본 JavaScript 지식

목표

  • 원장에 데이터 읽기 및 추가와 같은 기본 체인 코드 기능 생성.
  • Docker exec commando를 통해 생성 된 기능의 유효성 검사.
  • 개인 데이터 수집 구성.
  • 개인 데이터 수집에 데이터를 추가하고 원장에서 집계 된 개체를 검색합니다..

소개 : Hyperledger 패브릭 튜토리얼

이 첫 번째 기사에서는이 튜토리얼 시리즈 전체에서 사용할 NodeJS 체인 코드 용 Hyperledger Fabric 보일러 플레이트에 익숙해집니다. 보일러 플레이트는 벨기에 블록 체인 컨설팅 회사에서 개발했습니다. TheLedger.be, 이 보일러 플레이트를 오픈 소싱 해 주셔서 감사합니다..

이 보일러 플레이트를 사용하는 이유는 무엇입니까? 그것은 당신의 삶을 더 쉽게 만듭니다! 예를 들어 상용구는 다음과 같이 응답을 자동으로 래핑하고 직렬화합니다. shim.success ()shim.error (). javascript 객체를 반환하면 나머지는 수행됩니다..

이 튜토리얼에서는 개인 데이터 수집을 포함하거나 포함하지 않는 기본 CRUD 작업을 개발하는 데 중점을두고 나중에 테스트 할 것입니다. 그 외에도 개인 컬렉션의 작동 방식에 대한 간략한 소개를 제공합니다..

코드 받기

코드는 Github michielmulders / hyperledger-fabric-blockgeeks. 사용하는 것이 좋습니다

자식 클론 https://github.com/michielmulders/hyperledger-fabric-blockgeeks.git

컴퓨터에 저장소의 로컬 복제본을 만들고 다음을 사용하여 자습서의 첫 번째 부분을 확인합니다. git checkout tutorial-1

보일러 플레이트 설정

좋습니다. Hyperledger Fabric은 갑자기 시작되지 않습니다. 먼저 Fabric에 필요한 컨테이너 (인증 기관, 주문자, 피어, 멤버십 서비스)를 생성하는 데 필요한 필수 Docker 이미지를 가져와야합니다..

스크립트 폴더에는 bootstrap.sh 기본적으로 나중에 사용할 개인 컬렉션 기능을 지원하는 Hyperledger Fabric의 버전 1.2.0을 가져옵니다. 이미지 크기가 총 1GB보다 크므로 디스크에 충분한 여유 공간이 있고 적절한 인터넷 연결이 있는지 확인하십시오. 다음과 같은 스크립트를 실행하십시오. ./scripts/bootstrap.sh

필요한 모든 이미지를 다운로드하면 오류없이 시작되는지 확인하여 상용구를 테스트 할 수 있습니다. startFabric.sh 스크립트를 실행 해 보겠습니다. ./scripts/startFabric.sh

성공적으로 완료되면 (실행중인 Hyperledger Fabric 네트워크) 상태 200이 반환되어야합니다..

Hyperledger Fabric Tutorial : Mockstub을 사용하여 NodeJS 체인 코드를 테스트하는 방법-1 부

: Bash (.sh) 스크립트를 실행할 수없는 경우 다음을 사용하여 실행 권한을 부여해보십시오.

chmod + x bootstrap.sh

개인 컬렉션 정보

Hyperledger Fabric은 SideDB를 소유 한 노드에서만 볼 수있는 개인 데이터를 포함하는이 SideDB 개념을 개발했습니다. 기본적으로 이것은 사설망간에 공개적으로 공유되지 않은 정보입니다. 최근 Hyperledger는이를 “GDPR 호환”솔루션이 내장 된 개인 컬렉션으로 리 브랜딩했습니다..

이전에는 채널 사용을 통해 Hyperledger 네트워크에서 기밀이 생성되었습니다. 가장 일반적인 예는 특정 물고기에 대한 킬로 당 가격 협상입니다. Fisher A는 친한 친구이기 때문에 레스토랑 A에 특별 가격을 제공하고 싶지만 Fisher A는 레스토랑 B가 레스토랑 A와의이 저렴한 거래를 보는 것을 원하지 않습니다. 안전한 통신을 만들기 위해 Fisher A에서 두 개의 채널을 생성합니다. 레스토랑 A로, 피셔 A에서 레스토랑 B로.

그러나 채널 생성 프로세스는 각각 여러 채널을 가진 수천 명의 고객이 말하는 핀 테크 상황에서 상당히 복잡해질 수 있습니다. 이것이 Hyperledger Fabric이 과도한 채널 사용을 막는 이유입니다. 이로 인해 네트워크가 급격히 느려지고 성능이 저하됩니다..

TheLedger의 Jonas Snellinckx가 Hyperledger 네트워크 내에서 개인 데이터를 더 잘 관리 할 수있는 방법을 설명합니다.,

개인 데이터를 사용하면 채널에서 데이터에 액세스 할 수있는 당사자를 정의하는 정책을 사용하여 데이터 모음을 만들 수 있습니다. 이 액세스는 컬렉션에 정책을 추가하여 간단히 관리 할 수 ​​있습니다. 이를 통해 일부 데이터는 공개되고 일부는 일부 당사자에게 비공개가 될 수 있습니다. “

Hyperledger Fabric Tutorial : Mockstub을 사용하여 NodeJS 체인 코드를 테스트하는 방법-1 부

이미지 1 : slidedeck“Privacy Enabled Ledger”https://jira.hyperledger.org/browse/FAB-1151

이 튜토리얼에서는 Fabric 네트워크 내부에 저장 될 자동차를 정의합니다. 소유자에 대한 데이터는 비공개이므로 비공개 컬렉션에 추가됩니다. 코딩하자!

하이퍼 레저 패브릭 체인 코드

찾을 수있는 현재 체인 코드를 살펴 보겠습니다. chaincode / node / src / MyChaincode.ts. 파일에는 하나의 기능이 있습니다., initLedger 원장을 일부 자동차로 미리 채우는 데 사용됩니다. 자동차 개체는 제조업체, 모델, 색상 및 소유자로 구성됩니다. 자동차 개체를 원장에 추가 할 때 모든 개체에 고유 한 키와 문서 유형을 제공하므로 쉽게 검색 할 수 있습니다..

for (let i = 0; i < cars.length; i ++) {

           const car : any = cars [i];

           car.docType = ‘자동차’;

           //car.key =`CAR $ {i}`;

           await stubHelper.putState ( ‘CAR’+ i, car);

           this.logger.info ( ‘추가됨 <–> ‘, 차);

       }

1. 새 차 만들기

Hyperledger의 세계 상태에서 새 자동차 객체를 만드는 함수를 코딩 해 보겠습니다. 이 함수는 문자열 배열을 허용하지만 배열의 첫 번째 요소 만 문자열 화 된 JSON 객체를 포함합니다. 도우미 함수를 사용하여 인수를 쉽게 확인합니다. . 인수를 확인하는 것 외에도 문자열에서 필요한 데이터 형식으로 인수를 구문 분석 할 수도 있습니다. Yup은 우리가 정의한 제공된 스키마에 따라 문자열 화 된 JSON 객체를 구문 분석합니다. Yup.object (). shape ({my-object}.

async createCar (stubHelper : StubHelper, args : string []) {

       const VerifiedArgs = Helpers.checkArgs 대기<어떤>(인수 [0], Yup.object ()

           .모양({

               키 : Yup.string (). required (),

               make : Yup.string (). required (),

               모델 : Yup.string (). required (),

               색상 : Yup.string (). required (),

               소유자 : Yup.string (). required (),

           }));

    …

}

다음으로이 서식이 지정된 개체 (verifyArgs 상수)를 사용하여 새 자동차 개체를 만듭니다. 추가하는 것을 잊지 마십시오 doctype. 이제 개체를 원장에 추가 할 준비가되었습니다. 사용합시다 stubHelper 데이터 검색, 추가, 업데이트 및 삭제와 같은 원장 상태와 상호 작용하기위한 모든 기능을 포함합니다..

async createCar (stubHelper : StubHelper, args : string []) {

       const VerifiedArgs = Helpers.checkArgs 대기<어떤>(인수 [0], Yup.object ()

           .모양({

               키 : Yup.string (). required (),

               make : Yup.string (). required (),

               모델 : Yup.string (). required (),

               색상 : Yup.string (). required (),

               소유자 : Yup.string (). required (),

           }));

       let car = {

           docType : ‘자동차’,

           make : validateArgs.make,

           모델 : validateArgs.model,

           색상 : validateArgs.color,

           소유자 : VerifiedArgs.owner,

           키 : validateArgs.key,

       };

       await stubHelper.putState (verifiedArgs.key, car);

   }

그만큼 putState 함수는 원장에 저장할 키와 객체를받습니다. 여기서 사용하는 putState 함수는 원장이 JSON 객체가 아닌 바이트 배열 만 저장할 수 있기 때문에 래퍼 함수입니다. 그만큼 stubHelper 우리를 위해 마법을 사용하면 원래 구현은 ChaincodeStubInterface.PutState.

1.1 자동차 추가 확인

피어가 최신 버전의 체인 코드를 보유하고 있으므로 Docker를 사용하여 피어의 컨테이너 내부에서 명령을 실행합니다. 피어에게이 업데이트 된 버전을 제공하려면 다음을 사용하여 Hyperledger Fabric 네트워크를 다시 시작하겠습니다. ./scripts/startFabric.sh. 이 스크립트를 사용하는 이유는 무엇입니까? 피어의 체인 코드 만 교체하고 전체 네트워크를 다시 시작하지 않으므로 더 빠르게 실행됩니다..

터미널을 열고 다음 명령을 실행하십시오. docker exec cli peer chaincode invoke -C mychannel -n fabcar -c ‘{ “function”: “createCar”, “Args”: [ “{\”key \ “: \”CAR100 \ “, \”make \ “: \ ”Peugot \”, \”model \”: \”307 \”, \”color \”: \”green \”, \”owner \”: \”John Doe \”}”]} ‘

이 명령은 원장의 세계 상태에 포함될 새로운 트랜잭션 제안을 피어에게 보냅니다. 우리는 ‘createCar’함수를 사용하고 문자열 배열의 첫 번째 매개 변수로‘CAR100’키가있는 문자열 화 된 JSON 개체를 추가합니다. 체인 코드에 전달하기 위해 JSON 객체의 큰 따옴표를 이스케이프해야합니다..

의 사용법에 주목하십시오 호출 예어. 차이점을 아는 것이 중요합니다. 호출질문. invoke 키워드는 원장에 데이터를 변경하거나 추가하려고 할 때 사용되는 반면 query 키워드는 원장에서 정보를 검색 할 때만 사용됩니다..

Docker 명령을 성공적으로 실행하면 ‘결과 : 상태 : 200’이 반환되어야합니다..

Hyperledger Fabric Tutorial : Mockstub을 사용하여 NodeJS 체인 코드를 테스트하는 방법-1 부

2. 원장에서 데이터 읽기

원장에서 데이터를 읽기 위해 특정 키를 찾을 수 있습니다. 키가‘CAR100’인 새로 생성 된 Car 개체를 찾아 보겠습니다. 체인 코드에서받은 인수의 유효성을 다시 검사합니다. 이번에는 키만받습니다..

다음으로 우리는 getStateAsObject 지정된 키에 대해 원장에서 JSON 개체를 검색하는 함수입니다. 키가 존재하지 않을 수 있습니다. 이 경우 다음과 같이 사용자 지정 오류를 던질 수 있습니다. NotFoundError 의 일부입니다 패브릭 체인 코드 유틸리티, 파일 상단에서 가져옵니다. stubHelper.

async queryCar (stubHelper : StubHelper, args : string []) : Promise<어떤> {

       

       const VerifiedArgs = Helpers.checkArgs 대기<{키 : 문자열}>(인수 [0], Yup.object ()

           .모양({

               키 : Yup.string (). required (),

           }));

       const car = await stubHelper.getStateAsObject (verifiedArgs.key);

       if (! car) {

           throw new NotFoundError ( ‘자동차가 존재하지 않음’);

       }

       반환 차;

   }

2.1 유효성 검사 쿼리 자동차 기능

다음 Docker 명령을 사용하여 ‘CAR100’키로 Car를 쿼리합니다.이 명령에서 쿼리 키워드 사용을 확인하십시오..

docker exec cli peer chaincode query -C mychannel -n fabcar -c‘{“function”:”queryCar”,”Args”: [“{\”key \”: \”CAR100 \”}”]}’

Hyperledger Fabric Tutorial : Mockstub을 사용하여 NodeJS 체인 코드를 테스트하는 방법-1 부

3 개인 컬렉션

시작하려면 먼저 컬렉션 ​​구성 파일이 필요합니다. collections_config.json 컬렉션 이름과 정책이 포함됩니다. 정책은 보증과 유사하므로 OR, AND,… 연산자와 같은 기존 정책 로직을 사용할 수 있습니다..

3.1 개인 컬렉션 구성

비공개 컬렉션은 이름과 정책으로 구성되며 다른 속성은이 자습서의 범위를 벗어나며 Hyperledger 네트워크에 최적화되어 있습니다. 우리는 조직의 한 구성원 만 트랜잭션을 확인해야하는 정책과 함께 “privateCarCollection”이라는 컬렉션을 사용합니다..

[

 {

   "이름": "privateCarCollection",

   "수단": "또는 ( ‘Org1MSP.member’, ‘Org2MSP.member’)",

   "requiredPeerCount": 0,

   "maxPeerCount": 삼,

   "blockToLive": 1000000

 }

]

3.2 개인 컬렉션에 데이터 추가

이제 개인 컬렉션이 있으므로 코드에서 사용하겠습니다. 말하는 것은 큰 일이 아닙니다. stubHelper 데이터를 네트워크에 분산하는 대신 개인 컬렉션에 저장.

stubHelper.putState (

           verifyArgs.key,

           차,

           {privateCollection : ‘privateCarCollection’}

       );

자동차 소유자와 주소를 개인 자동차 컬렉션에 저장하도록 코드를 약간 수정 해 보겠습니다. 전체 개체를 더 쉽게 검색 할 수 있도록이 새 개인용 자동차 개체에 동일한 키를 추가해야합니다. 그 외에도 키, 주소 및 소유자 속성 만 허용하도록 Yup 개체 유효성 검사기를 변경합니다. 모범 사례로 doctype을 다음과 같이 변경합니다. ‘privateCar’.

async createPrivateCar (stubHelper : StubHelper, args : string []) {

const VerifiedArgs = Helpers.checkArgs (args [0], Yup.object ()를 기다립니다.

.모양({

키 : Yup.string (). required (),

주소 : Yup.string (). required (),

소유자 : Yup.string (). required (),

}));

let car = {

docType : ‘privateCar’,

주소 : validateArgs.address,

소유자 : VerifiedArgs.owner,

키 : validateArgs.key,

};

stubHelper.putState (

verifyArgs.key,

차,

{privateCollection : ‘privateCarCollection’}

);

}

3.3 쿼리 집계 자동차

집계 된 자동차 객체를 생성하기 위해 Hyperledger 네트워크와 자동차 소유자 및 주소가 포함 된 개인 데이터 수집을 쿼리합니다..

먼저 다음을 사용하여 공용 자동차를 검색해 보겠습니다.

let publicCar = await stubHelper.getStateAsObject (verifiedArgs.key);

다음으로 동일한 방식으로 개인 차량 데이터를 쿼리 할 수 ​​있습니다.

let privateCar = await stubHelper.getStateAsObject (verifiedArgs.key, {privateCollection :‘privateCarCollection’})

마지막으로 집계 된 자동차 객체를 반환하겠습니다. 각 객체의 모든 속성을 가져와 하나의 새 객체로 병합하는 ECMAscript 2018 방법 인 객체 스프레드 (점 3 개 ‘…’)를 사용하고 있습니다..

async queryAggregatedCar (stubHelper : StubHelper, args : string []) : Promise<어떤> {

       

       const VerifiedArgs = Helpers.checkArgs 대기<{키 : 문자열}>(인수 [0], Yup.object ()

           .모양({

               키 : Yup.string (). required (),

           }));

       let publicCar = await stubHelper.getStateAsObject (verifiedArgs.key);

       if (! publicCar) {

           throw new NotFoundError ( ‘자동차가 존재하지 않음’);

       }

       let privateCar = await stubHelper.getStateAsObject (

           verifyArgs.key,

           {privateCollection : ‘privateCarCollection’}

       );

       const car = {

           …publicCar,

           …privateCar

       };

       반환 차;

   }

3.4 집계 된 쿼리 유효성 검사

이 튜토리얼의 1.1 번 글 머리 기호에서는‘CAR100’. 이 키를 사용하여 Docker exec 명령을 통해 새 개인 데이터 개체를 만들어 보겠습니다..

docker exec cli peer chaincode invoke -C mychannel -n fabcar -c ‘{ “function”: “createPrivateCar”, “Args”: [ “{\”key \ “: \”CAR100 \ “, \”address \ “: \ ”Parklane 20, Italy \”, \”owner \”: \”John Doe \”}”]} ‘

이제 우리는 둘 다 개인용 자동차 객체로 공개됩니다. 이와 같은 집계 호출을 시도해 보겠습니다. 사용하는 것을 잊지 마십시오 질문 데이터 만 검색하므로 키워드.

docker exec cli peer chaincode query -C mychannel -n fabcar -c‘{ “function”: “queryAggregatedCar”, “Args”: [ “{\”key \ “: \”CAR100 \ “}”]} ‘

다음을 반환해야합니다.

{“color”:”green”,”docType”:”privateCar”,”key”:”CAR100 ″,”make”:”Peugot”,”model”:”307 ″,”owner”:”John Doe”, ”address”:”Parklane 20, 이탈리아”}

4. 우리는 무엇을 배웠습니까??

그만큼 stubHelper 원장의 데이터와 상호 작용하는 데 가장 중요한 도구입니다. 데이터를 추가, 업데이트 및 삭제할 수 있습니다. 그러나 원장에서 개체를 찾고 쿼리하고 JSON 개체로 반환하는데도 도움이 될 수 있습니다..

코드 치트 시트

Hyperledger Fabric Tutorial : Mockstub을 사용하여 NodeJS 체인 코드를 테스트하는 방법-1 부

하이퍼 레저에 대해 더 자세히 알고 싶으십니까? Hyperledger Accelerator 확인 

여기에서 2 부로 계속 진행하십시오. 

추가 읽기

  • 여기 의 전체 인터페이스 구현을 찾을 수 있습니다. ChaincodeStubInterface 이 새로운 언어로 Hyperledger가 생성 될 때 Golang으로 코딩됩니다..
  • 전체 API 투기 StubHelper.
  • Hyperledger Fabric 관련 리소스 모음 Github.

으로 미치 엘 멀더 스

@Michiel_mulders

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me