원서 : https://hyperledger-fabric.readthedocs.io/en/release-1.4/private_data_tutorial.html
- Using Private Data in Fabric
- 이번장에서는 블록체인 네트워크에서 "인가된 organization의 pee간"에서 collection을 활용해, private-data를 어떻게 저장하고? 검색하는지? 보여드리겠습니다.
- 이번에는 https://github.com/hyperledger/fabric-samples 의 /chaincode/marbles02_private 를 기반으로 진행됩니다.
- 그롬! private-data의 collection을 생성하고, 배포하고, 사용하는것을 알아봅시다!
- Build a collection definition JSON file
- 첫 단계는, private-data에 접근을 정의하는 collection을 작성하는것 입니다.
- collection은 "누가 데이터를 가지고 있을지?", "몇개의 peer_node에 분산을 해둘지?", "몇개의 peer_node로 분배를 할지?", "얼마동안 데이터를 유지하고 있을지?" 등등을 정의 합니다.
- 차후에 chaincode API(PutPrivateData,GetPrivateData)가 collection에 어떻게 매핑되는지? 보려드립니다.
- collection는 아래와 같은 속성으로 구성됩니다.
- name : collection 이름
- policy : 데이터를 가지고 있을수 있는 해당 organization peer
- requiredPeerCount : chaincode 보증에 필요한 조건으로, private-data를 분배에 필요한 peer의 갯수
- maxPeerCount : 데이터 중복을 피하기 위한 목적으로써, 현재 데이터를 배분하려고, 보증처리를 하고있는 peer의 갯수. (만약 어떤 보증peer가 내려갔을떄... private-data를 요청이 들어오면, 다른 peer를 커밋타임때 활용 할 수 있습니다.)
- blockToLive : 개인정보나 돈 가격 처럼 매우 민감한 데이터가 있을때, 데이터가 블록에서 TTL을 가지도록 하는것. 해당 데이터는 private-database에서 시간이 지나면 폐기되고(purged), 쓸수없게 됨.
- memberOnlyRead : peer가 자동으로 특정 collection member organization에 속한 client만 private-data에 접근 허용 하도록 하게 합니다.
- 예를 들어서 "marbles private-data" 에는 'collectionMarbles' 와 'collectionMarblePrivateDetails' 가 있습니다.
- "collection.json" 이라는 'collection 파일' 에 작성합니다.
- 'collectionMarbles'의 policy는 모든 channel의 member(org1,org2)가 private-data를 갖도록 허용합니다.
- 'collectionMarblePrivateDetails'의 policy는 org1만 private-data를 갖도록 허용합니다.
- 이런 정책으로 보안되는 '데이터'들은 chaincode에서 맵핑 됩니다.
- 이런 'collection 파일'은 연관된 chaincode가 "인스턴트화 커맨드" 될 때, channel으로 배포 됩니다.
- Read and Write private data using chaincode APIs
- 다음 단계는, chaincode에 '데이터'를 정의하는것 입니다.
- 예를 들어서 "marbles private-data sample" 에는 접근방법에 따라 나뉜 2개의 '데이터'가 있습니다.
- "name, color, size, owner" 는 Org1,Org2 모두에게 보일것임.
- "price" 는 Org1 에게만 보일것임.
- 이런 '데이터' 와 'collection 정책'의 맵핑은 chaincode APIs으로 제어됩니다.
- 특히, 'collection 정의'를 사용하여 private-data를 "읽고/쓰는" 작업은 "GetPrivateData() 및 PutPrivateData()" 으로 수행 됩니다.
- 아래와 같은 그림을 "private-data 모델" 이라고 볼수있습니다. ㅎㅎ
- Reading collection data
- private-data 를 쿼리할땐, chaincode API 인 GetPrivateData() 를 사용합니다.
- GetPrivateData() 에서 바로 'collection 이름' 과 '데이터 Key'를 아규먼트로 정할수있습니다.
- 즉 chaincode 상에서, GetPrivateData()에 'collectionMarbles' 와 'collectionMarblePrivateDetails' 를 명시하여! (하드코딩) 해당 private-data의 접근성을 정할수있는것 입니다.
- (그냥... chaincode 개발코딩으로 private-data를 직접 관리하는 거네 ㅎㅎ)
- Writing private data
- private-data 를 저장할땐, chaincode API 인 PutPrivateData() 를 사용합니다.
- PutPrivateData() 도 마찬가지로 'collection 이름' 과 '데이터 Key&Value'를 아규먼트로 정할수있습니다.
- chaincode 상에서, PutPrivateData()에 'collectionMarbles' 와 'collectionMarblePrivateDetails' 를 명시하여 각각!! 호출하면 되는것 입니다.
- 결국 private-data 는 해당 '해쉬값'만 orderer에게 전달되고, 데이터 그 자체는 기밀보안이 되는것! 입니다.
- Start the network
- private-data를 다루어 볼려면, 해당 Hyperledger Fabric 블록체인 네트워크를 잘~ 띄우세요.
- 그리고 또한, collection 처리에는 organization 간의 'gossip 설정'을 잘 하는것이 중요합니다.
- (즉, gossip anchor peers 를 잘 해두어야 잘동작 함)
- Install and instantiate chaincode with a collection
- 일반적으로 Client측의 어플리케이션은 chaincode를 통해~ blockchain-ledger와 상호작용 합니다.
- 그래서 peer가 각 transaction 실행 및 보증 작업을 하도록, chaincode를 'install 및 instantiate' 해둬야 합니다.
- (chaincode는 peer을 대상으로 install되고, channel을 대상으로 instantiate 됨)
- Install chaincode on all peers
- 각각의 peer에 잘 install 한다...
- Instantiate the chaincode on the channel
- 아래와 같이 --collections-config 를 사용하여, 'collection 파일' (collection.json)를 함께 배포한다.
- 예) peer chaincode instantiate -o {orderer 주소} -C {channel 이름} -n {chaincode 이름} -v 1.0 -c '{"Args":["init"]}' -P "OR('Org1.member','Org2.member')" --collections-config collection.json
- Store private data
- 아래와 같이 --transient 를 사용하여, private-date 저장을 하면 됩니다.
- 예) peer chaincode invoke -o {} -C {} -n {} -c '{"Args":["initMarble"]}' --transient "{"marble" : {"name":"marble1","color":"blue", ... "price":99}} | base64"
- (각각의 collection에 대응되는 private-data는 독립적으로 저장 될것)
- 즉, 'transient data' 는 orderer의 transaction에 기록되지 않는것 입니다.
- ('transient data' 는 'binary data'으로 전달되야 함으로~ base64 인코딩을 잊지마세요.)
- Query the private data as an authorized peer
- 단순 조회는 아래와 같이, 그냥 private-date 조회를 하면 됩니다.
- 예) peer chaincode query -C {} -n {} -c '{"Args":["readMarble","marble1"]}'
- 예) peer chaincode query -C {} -n {} -c '{"Args":["readMarblePrivateDetails","marble1"]}'
- Query the private data as an unauthorized peer
- Org2에서는 'readMarblePrivateDetails' 를 쿼리하면... "public hash of the private-data" 만 볼수있습니다.
- Purge Private Data
- private-data 폐기...
- ...
Using indexes with private data
private-data의 collection에 index를 걸수도 있습니다.
예) {"index":{"fields":["docType","owner"]},"ddoc":"indexOwnerDoc", "name":"indexOwner","type":"json"}
상용환경에서 chaincode에 나란히 'index 파일'을 만들어서, chaincode가 'install 및 instantiate' 할때 자동으로 함꼐 배포되도록 하는것이 좋습니다.
아마도 --collections-config 으로 'collection 파일' 지정할때, 자동으로 인식하는것 같습니다...
-끝-
'hyperledger > fabDoc.Tutorials' 카테고리의 다른 글
4) Upgrading Your Network Components (0) | 2019.06.30 |
---|---|
3) Adding an Org to a Channel (0) | 2019.06.30 |
2) Building Your First Network (0) | 2019.06.22 |
1) Writing Your First Application (0) | 2019.06.22 |
0) Tutorials (0) | 2019.06.22 |