[BlockChain/Hyperledger Fabric] Using Private Data in Fabric

yujeongkwon·2023년 8월 15일
0

BlockChain

목록 보기
10/10
  • PDC = Private Data Collections
  • 컬렉션 : 해당 컬렉션을 관리하는 정책이 포함된 컬렉션 정의 파일을 사용하여 지정
  • 순서
    1. 자산 전송 개인 데이터 샘플 사용 사례
    1. 컬렉션 정의 JSON 파일 빌드
    2. 체인코드 API를 사용하여 비공개 데이터 읽기 및 쓰기
    3. 프라이빗 데이터 스마트 계약을 채널에 배포
    4. 신원 등록
    5. 비공개 데이터로 자산 만들기
    6. 인증된 피어로 프라이빗 데이터 쿼리
    7. 권한이 없는 피어로 비공개 데이터 쿼리
    8. 자산 이전
    9. 개인 데이터 제거
    10. 프라이빗 데이터에 인덱스 사용
    11. 추가 리소스

자산 전송 개인 데이터 샘플 사용 사례

  • 세 개의 프라이빗 데이터 컬렉션(assetCollection, Org1MSPPrivateCollection, Org2MSPPrivateCollection)을 사용하여 Org1과 Org2 간에 자산을 전송하는 방법 가정
  • Org1의 구성원은 새 자산(소유자)을 생성
    • assetCollection : 인용 데이터 콜렉션, 소유자의 ID를 포함하여 자산의 public 세부사항 저장
    • 자산도 소유자가 제공한 감정된 가격으로 생성
    • 소유자 조직의 컬렉션 : 감정된 가격 저장, 각 참가자가 자산 이전에 동의하는 데 사용
    • Org1MSPPrivateCollection : 소유자가 동의한 초기 감정가 저장
  • 자산을 구매하려면 구매자는 자산 소유자와 동일한 감정된 가격에 동의
    • 구매자(Org2의 구성원)가 스마트 계약 기능 'AgreeToTransfer'를 사용하여 거래에 대한 동의를 작성하고 감정가에 동의
    • 이 값은 Org2MSPPrivateCollection 컬렉션에 저장
    • 이제 자산 소유자는 스마트 계약 기능 'TransferAsset'을 사용하여 자산을 구매자에게 양도 가능
    • 'TransferAsset' 기능은 채널 원장의 해시를 사용하여 소유자와 구매자가 자산을 이전하기 전에 동일한 감정가에 동의했는지 확인

컬렉션 정의 JSON 파일 빌드

  • 조직이 비공개 데이터로 거래하려면 채널의 모든 조직이 컬렉션 정의 파일을 빌드해야 함.
    • 컬렉션 정의 파일 : 각 체인코드와 연결된(조직이 체인코드에서 읽고 쓸 수 있는 모든) private 데이터 컬렉션 정의
    • private 데이터 콜렉션에 저장된 데이터는 채널의 모든 구성원이 아닌 특정 조직의 피어에게만 분배
  • 각 컬렉션의 속성
    • name : 컬렉션의 이름
    • policy : 컬렉션 데이터를 유지할 수 있는 조직 피어를 정의
    • requiredPeerCount: 체인코드 보증 조건으로 private 데이터를 배포하는 데 필요한 피어 수
    • maxPeerCount: 데이터 중복성을 위해 현재 승인 피어가 데이터 배포를 시도할 다른 피어의 수
      • 보증하는 피어가 다운되면, private 데이터를 가져오기 위한 요청이 있는 경우 커밋 시간에 이러한 다른 피어 사용 가능
    • blockToLive: 매우 민감한 정보(가격, 개인정보)의 경우, 데이터가 블록 측면에서 private 데이터베이스에 있어야 하는 기간
      • 데이터는 private 데이터베이스에서 이 지정된 블록 수 동안 유지되며 그 후에는 제거 -> 이 데이터를 네트워크에서 더 이상 사용x
      • private 데이터를 제거하지 않으려면 blockToLive 속성을 0으로 설정
    • memberOnlyRead: true 값은 수집 구성원 조직 중 하나에 속하는 클라이언트만 private 데이터에 대한 읽기 액세스가 허용되도록 피어가 자동으로 시행함
    • memberOnlyWrite: true 값은 수집 구성원 조직 중 하나에 속하는 클라이언트만 개인 데이터에 대한 쓰기 액세스가 허용되도록 피어가 자동으로 시행함
    • endorsementPolicy: private 데이터 콜렉션에 쓰기 위해 충족해야 하는 보증 정책을 정의
      • 컬렉션 수준 보증 정책은 체인코드 수준 정책보다 우선
  • 조직이 어떤 컬렉션에도 속하지 않은 경우에도 동일한 컬렉션 정의 파일을 배포
  • 컬렉션 파일에 명시적으로 정의된 컬렉션 외에도 각 조직은 해당 조직에서만 읽을 수 있는 피어의 암시적 컬렉션에 액세스 가능
  • 여기의 자산 전송 프라이빗 데이터 예제
    • collections_config.json 파일 : 세 가지 private 데이터 컬렉션 정의(assetCollection, Org1MSPPrivateCollection 및 Org2MSPPrivateCollection)를 정의
// collections_config.json

[
   {
   "name": "assetCollection",
   "policy": "OR('Org1MSP.member', 'Org2MSP.member')",
   "requiredPeerCount": 1,
   "maxPeerCount": 1,
   "blockToLive":1000000,
   "memberOnlyRead": true,
   "memberOnlyWrite": true
   },
   {
   "name": "Org1MSPPrivateCollection",
   "policy": "OR('Org1MSP.member')",
   "requiredPeerCount": 0,
   "maxPeerCount": 1,
   "blockToLive":3,
   "memberOnlyRead": true,
   "memberOnlyWrite": false,
   "endorsementPolicy": {
       "signaturePolicy": "OR('Org1MSP.member')"
   }
   },
   {
   "name": "Org2MSPPrivateCollection",
   "policy": "OR('Org2MSP.member')",
   "requiredPeerCount": 0,
   "maxPeerCount": 1,
   "blockToLive":3,
   "memberOnlyRead": true,
   "memberOnlyWrite": false,
   "endorsementPolicy": {
       "signaturePolicy": "OR('Org2MSP.member')"
   }
   }
]
  • assetCollection 컬렉션 정의
    • policy 속성 : Org1과 Org2 모두 해당 피어에 컬렉션을 저장할 수 있음을 지정
    • memberOnlyRead 및 memberOnlyWrite 매개변수 : Org1 및 Org2 클라이언트만 이 컬렉션을 읽고 쓸 수 있도록 지정
  • Org1MSPPrivateCollection 컬렉션 정의
    • Org1의 피어만 프라이빗 데이터베이스에 프라이빗 데이터를 가질 수 있음.
    • 업데이트는 피어에 컬렉션을 저장하는 조직에서 보증
  • Org2MSPPrivateCollection 컬렉션 정의
    • Org2의 피어만 프라이빗 데이터베이스에 프라이빗 데이터를 가질 수 있음.
    • endorsementPolicy 매개변수 : 컬렉션별 보증 정책을 생성
    • 업데이트는 피어에 컬렉션을 저장하는 조직에서 보증
  • 이 컬렉션 정의 파일은 피어 수명 주기 chaincode commit 명령을 사용하여 체인코드 정의가 채널에 커밋될 때 배포됨.

체인코드 API를 사용하여 비공개 데이터 읽기 및 쓰기

  • 체인코드에서 데이터 정의 구축
  • asset transfer private 데이터 샘플의 private 데이터를 데이터에 액세스하는 방법에 따른 개별 데이터 정의
// 아래 모든 조직에 표시되는 기본 자산 세부 정보를 설명
// = Org1 및 Org2의 피어는 사이드 데이터베이스에 이 개인 데이터를 가짐
type Asset struct {
		// Type : satate 데이터베이스에서 다양한 유형의 개체를 구별하는 데 사용
       Type  string `json:"objectType"` 
       ID    string `json:"assetID"`
       Color string `json:"color"`
       Size  int    `json:"size"`
       Owner string `json:"owner"`
}

// AssetPrivateDetails는 소유자에게 비공개인 세부 정보를 설명

// Org1의 피어만 사이드 데이터베이스에 이 프라이빗 데이터를 가짐.
type AssetPrivateDetails struct {
       ID             string `json:"assetID"`
       AppraisedValue int    `json:"appraisedValue"`
}

// Org2의 피어만 사이드 데이터베이스에 이 프라이빗 데이터를 가짐.
type AssetPrivateDetails struct {
       ID             string `json:"assetID"`
       AppraisedValue int    `json:"appraisedValue"`
}
  • GetPrivateData(), PutPrivateData()를 사용하여 PDC에 private 데이터를 r/w 가능
  • 이 프라이빗 데이터는 피어의 프라이빗 상태 db(퍼블릭 상태 db와 별개)에 저장되며, 가십 프로토콜을 통해 인증된 피어 간에 전파

컬렉션 데이터 읽기

  • 체인코드 API GetPrivateData() : private 데이터 쿼리
    • 사용 매개 변수
      • collection name
      • the data key
    • assetCollection 컬렉션은 Org1 및 Org2의 피어가 사이드 데이터베이스에 프라이빗 데이터를 가질 수 있도록 허용
    • Org1MSPPrivateCollection 컬렉션은 Org1의 피어만 사이드 데이터베이스에서 프라이빗 데이터를 가질 수 있도록 허용
    • Org2MSPPrivateCollection 컬렉션은 Org2의 피어만 사이드 데이터베이스에서 프라이빗 데이터를 가질 수 있도록 허용
    • 구현 세부 정보는 다음 두 자산 전송 개인 데이터 기능을 참조하십시오.
      • assetID, color, size and owner 속성 값을 쿼리하기 위한 ReadAsset.
      • appraisedValue 속성 값을 쿼리하기 위한 ReadAssetPrivateDetails.

private 데이터 쓰기

  • 체인코드 API PutPrivateData() : private 데이터를 개인 데이터베이스에 저장
    • 컬렉션 이름 필요
    • asset transfer private 데이터 샘플에는 세 가지 다른 프라이빗 데이터 컬렉션이 포함되어 있지만 체인코드에서 두 번 호출됨.(이 시나리오에서는 Org1 역할을 함).
    • assetCollection 컬렉션 : 프라이빗 데이터 assetID, 색상, 크기 및 소유자를 작성
    • Org1MSPPrivateCollection 컬렉션 : 개인 데이터 appraisedValue를 작성
  • Org2 역할을 하는 경우 Org1MSPPrivateCollection을 Org2MSPPrivateCollection으로 변환.
profile
인생 살자.

1개의 댓글

comment-user-thumbnail
2023년 8월 15일

좋은 정보 얻어갑니다, 감사합니다.

답글 달기