[블록체인] ICT 이노베이션 블록체인 개발자 17일차 First network

IT/Blockchain|2020. 11. 25. 01:19

 

17일 차 First network예제 

 

1. first network 구조

2. 프라이빗 데이터 활용 marbles_private

 

1. first network 구조

 

어제 에이어서 first network에 대해서 알아보았다.

설치는 peer

배포는 channel에 된다

 

 

 

 

원래 있던 network를 내려주고 다시 올렸다. 

# fabric-sample/first-network 에 가서
/byfn.sh down  #원래있던것들 docker 에서 내리고
./byfn.sh up  -a –s couchdb –o etcdraft #이걸로올리기

 이게 된다면  수업에서는 다시 내리고 couch db만 넣고 다시 올려줬다

아직 까지  -a  -o에 관한 커맨드 라인의 뜻은 모른다... 아직 갈길이 먼 것 같다.

 

 

 

 

chaincode example2 

 

 

 

 

2. 프라이빗 데이터 활용 marbles_private

 

아래 tutorial  기반으로  

hyperledger-fabric.readthedocs.io/en/release-1.4/private_data_tutorial.html#pd-install-instantiate-cc

수업시간에 못 따라갓는데 어차피 ppt도 여기서 나온 거라서  이 페이지만 봐도 다 이해가 잘되게 정말 잘 만들었다

역시 official document가 최고인가...

 

설명은 인제부터 해석하기도 귀찮고 별로 어렵지도 않은 영어니깐 수업시간에 따로 배운 내용이 아니면 

영어로 하겠다.

 

This part if for the using private data in in fabric

이 튜토리얼은  marbles private data sample — running on the Building Your First Network (BYFN) tutorial network — to demonstrate how to create, deploy, and use a collection of private data

The marbles private data sample will be deployed to the Building Your First Network (BYFN) tutorial network.

 

 

이 순서는 정확히 튜토리얼이랑 일치한다 -  마지막 두 개는 수업시간에 실습하진 않았다.

 

 

The first step in privatizing data on a channel is to build a collection definition which defines access to the private data.

채널에서 데이터를 민영화의 첫 번째 단계는 private 데이터에 접근을 정의하는 컬렉션 정의를 만드는 것

 

The collection definition describes who can persist data, how many peers the data is distributed to, how many peers are required to disseminate the private data, and how long the private data is persisted in the private database.

collection 정의는 누가 데이터를 유지할 수 있는지, 데이터가 배포되는 피어 수, 개인 데이터를 배포하는 데 필요한 피어 수 및 개인 데이터가 개인 데이터베이스에 유지되는 기간을 설명한다

 

Later, we will demonstrate how chaincode APIs PutPrivateData and GetPrivateData are used to map the collection to the private data being secured.

나중에 체인 코드 APIs PutPrivateData와 GetPrivateData가 어떻게 수집을 보안되고 있는 개인 데이터에 매핑하는 데 사용되는지 시연해 보일 것이다.

 

( get privatedat / put privatedate  from shim )는 수업내용이었는데  shim library? 에서 나왔다고 한 것 같다.

 

첫 번째로는 JSON file이 필요한데, 자세한 사항은 아래처럼 : 

1. 이름 

2.policy: 누가 접근할 수 있는지

3. 필요한 peer 수

4.? 흠 분산 저장을 위한 peer 최대수?

5. 몇 번 블록이 생성되면 몇 번을 지우는지,  blocktolive 자동 삭제  (이 부분이 중요한 것 같다) 

   나중에 개인정보라든지 필요에 의해서 지워야 하는 데이터가 있으면 이것을 이용할 수 있다.

6. private data에 누가 접근 가능한지?  

 

그럼 3번이랑 6번이랑 뭐가 다르지?

 

 

To illustrate usage of private data, the marbles private data example contains two private data collection definitions: collectionMarbles and collectionMarblePrivateDetails. The policy property in the collectionMarbles definition allows all members of the channel (Org1 and Org2) to have the private data in a private database. The collectionMarblesPrivateDetails collection allows only members of Org1 to have the private data in their private database.

 

개인 데이터의 사용을 설명하기 위해 marble private data예제에는 collectionMarbles와 collectionMarblePrivateDetails의 두 가지 개인 데이터 수집 정의가 포함되어 있다.

 

collectMarbles  속성은 채널의 모든 구성원(Org1 및 Org2)이 개인 데이터베이스에 개인 데이터를 가질 수 있도록 허용한다.

 

MarblesPrivateDetails 속성은 Org1의 구성원만 개인 데이터베이스에 개인 데이터를 가질 수 있다.

 

 

[
 {
 // Peers in Org1 and Org2 모두 side database에 이걸가지고잇다
   "name": "collectionMarbles",
   "policy": "OR('Org1MSP.member', 'Org2MSP.member')",
   "requiredPeerCount": 0,
   "maxPeerCount": 3,
   "blockToLive":1000000,
   "memberOnlyRead": true
},
 {
 //peer 1만  private data in a side database
   "name": "collectionMarblePrivateDetails",
   "policy": "OR('Org1MSP.member')",
   "requiredPeerCount": 0,
   "maxPeerCount": 3,
   "blockToLive":3,
   "memberOnlyRead": true
 }
]

 

collection marble는 org1 2 모두 다 가지고 있다.

collection marble details은 org 1만 가지고 있다 

 

 

 

 

read/ write of private data : 

 

 

Use the chaincode API GetPrivateData() to query private data in the database. GetPrivateData() takes two arguments, the collection name and the data key

 

Read 

  • readMarble for querying the values of the name, color, size and owner attributes
  • readMarblePrivateDetails for querying the values of the price attribute

Write 

  • Write the private data name, color, size and owner using the collection named collectionMarbles
  • Write the private data price using the collection named collectionMarblePrivateDetails.

To summarize, the policy definition above for our collection.json allows all peers in Org1 and Org2 to store and transact with the marbles private data name, color, size, owner in their private database. But only peers in Org1 can store and transact with the price private data in its private database.

initMarble function 

 

요약하면,  Org1 이랑 Org2  모든 피어가 개인 데이터베이스에 개인(구슬의) 데이터 이름, 색상, 크기, 소유자를 저장하고   (fab-car 이랑 비슷함) 거래할 수 있도록 허용한다. 그러나 Org1의 peer들만  개인 데이터베이스의 가격 개인 데이터를 저장하고 거래할 수 있다.

 

 

 

private data는 트렌지 언트 디비로 보내서 가져온다

중요한 점하 나는  이렇게 두 번 데이터가 써지는데 한 번은  collection Marbles 또 한 번은 collectionmarblePrivateDetails이다

 

 

 

 

 

 

자 처음 시작으로 원래 있던 network를 지우고 다시 구축한다.

구축 시 couchdb만 넣고 구축한다.

./byfn.sh down
./byfn.sh up -s couchdb

 

여기서도 개념은 나도 조금 헷갈리는데,

 

Client applications interact with the blockchain ledger through chaincode. As such we need to install and instantiate the chaincode on every peer that will execute and endorse our transactions. Chaincode is installed onto a peer and then instantiated onto the channel using peer-commands.

클라이언트 애플리케이션이 체인 코드를이용해서 블록체인과 interact를 하기때문에  트랜잭션을 실행하고 승인할 모든 피어에 체인코드를 설치하고 배포할 수 있다.  체인 코드는 피어에 설치되었다가 피어 명령을 사용하여 채널에 인스턴스화 된다.

 

우리의 이번 실습에는 Org1 and Org2, with two peers each. Therefore the chaincode has to be installed on four peers:

  • peer0.org 1.example.com
  • peer1.org 1.example.com
  • peer0.org 2.example.com
  • peer1.org 2.example.com

이렇게 4개를 만들어야 한다.

 

새로 cli를 열어줘야 하는데 

docker exec -it cli bash

밑에처럼 나오면 열린 거다

root@81 eac8493633:/opt/gopath/src/github.com/hyperledger/fabric/peer

 

 

깃 repository로부터 체인 코드 설치

peer chaincode install -n marblesp -v 1.0 -p github.com/chaincode/marbles02_private/go/

install -> INFO 003 Installed remotely response:<status:200 payload:"OK" >

 

Org1의 두 번째 피어를 활설화 하고 체인 코드 설치 

export CORE_PEER_ADDRESS=peer1.org1.example.com:8051
peer chaincode install -n marblesp -v 1.0 -p github.com/chaincode/marbles02_private/go/

 

Org2로 바꾸는 커맨드 라인

export CORE_PEER_LOCALMSPID=Org2MSP
export PEER0_ORG2_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
export CORE_PEER_TLS_ROOTCERT_FILE=$PEER0_ORG2_CA
export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp

 

Org2의 첫 번째 피어를 활설화 하고 체인 코드 설치 

export CORE_PEER_ADDRESS=peer0.org2.example.com:9051
peer chaincode install -n marblesp -v 1.0 -p github.com/chaincode/marbles02_private/go/

 

Org2의 두 번째 피어를 활설화 하고 체인 코드 설치 

export CORE_PEER_ADDRESS=peer1.org2.example.com:10051
peer chaincode install -n marblesp -v 1.0 -p github.com/chaincode/marbles02_private/go/

 

그럼 4번 설치를 한 거니깐 

이렇게 나와야 한다

 

 

 

 데이터 샘플의 모든 개인 데이터와 거래할 수 있는 권한을 가진  Org1 피어로 전환하고 구슬 추가

export CORE_PEER_ADDRESS=peer0.org1.example.com:7051
export CORE_PEER_LOCALMSPID=Org1MSP
export CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
export PEER0_ORG1_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt

 

marbles init Marble 기능을 호출하여 개인 데이터로 대리석을 만드는 marble init Marble 기능을 실행한다

 개인 데이터는 --transient 플래그를 사용하여 전달된다는 점 중요.중요.

일시적인 데이터로 전달된 입력은 데이터를 비공개로 유지하기 위해 트랜잭션에서 유지되지 않는다. 

export MARBLE=$(echo -n "{\"name\":\"marble1\",\"color\":\"blue\",\"size\":35,\"owner\":\"tom\",\"price\":99}" | base64 | tr -d \\n)
peer chaincode invoke -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n marblesp -c '{"Args":["initMarble"]}'  --transient "{\"marble\":\"$MARBLE\"}"

 

구슬 1 - 파란색-35 사이즈-톰으로 구성된 구슬이 생성된다

밑에처럼 나오면 된 것

 chaincodeCmd] chaincodeInvokeOrQuery->INFO 001 Chaincode invoke successful. result: status:200

 

 

Our collection definition allows all members of Org1 and Org2 to have the name, color, size, owner private data in their side database, but only peers in Org1 can have the price private data in their side database. As an authorized peer in Org1, we will query both sets of private data

 Org1과 Org2의 모든 구성원이 이름, 색상, 크기, 소유자 개인 데이터를 그들의 사이드 데이터베이스에 가질 수 있도록 허용하지만, Org1의 peer들만이 그들의 사이드 데이터베이스에 가격 개인 데이터를 가질 수 있다.

 

 

 Org1에서 쿼리를 보면 

peer chaincode query -C mychannel -n marblesp -c '{"Args":["readMarble","marble1"]}'

{"color":"blue","docType":"marble","name":"marble1","owner":"tom","size":35}

 

peer chaincode query -C mychannel -n marblesp -c '{"Args":["readMarblePrivateDetails","marble1"]}'

 

{"docType":"marblePrivateDetails","name":"marble1","price":99}

 

 

readMarble은 color, docType, name, owner, size가 보인다

marblePrivateDeatils 은 price가 보인다

 

 

Org2로 바꿔서

export CORE_PEER_ADDRESS=peer0.org2.example.com:9051
export CORE_PEER_LOCALMSPID=Org2MSP
export PEER0_ORG2_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
export CORE_PEER_TLS_ROOTCERT_FILE=$PEER0_ORG2_CA
export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp

qury로 보면 

peer chaincode query -C mychannel -n marblesp -c '{"Args":["readMarble","marble1"]}'

 

 

{"docType":"marble","name":"marble1","color":"blue","size":35,"owner":"tom"}

peer chaincode query -C mychannel -n marblesp -c '{"Args":["readMarblePrivateDetails","marble1"]}'

{"Error":"Failed to get private details for marble1: GET_STATE failed: transaction ID: b04adebbf165ddc90b4ab897171e1daa7d360079ac18e65fa15d84ddfebfae90: Private data matching public hash version is not available. Public hash version = &version.Height{BlockNum:0x6, TxNum:0x0}, Private data version = (*version.Height)(nil)"}

  

org1이랑 다르게 org2에서  readMarblePrivatedetails은 에러가 나온다. 

이게 중요한 점이 우리가 org2에서는 private data가 안 보이게 price  값이 안 나오게 했다! 

 

이게 제일 중요해

 

이거 다음으로는 10번째 블록이 생기면 첫 번째 블록에 있는 데이터 자동으로 없애기  blockToLive에 관해서 실습인데 이것 또한 그냥 

저 튜토리얼을 따라가면 바로 된다 

 

제일 중요한 부분은 여기 까지니깐 - 여기까지만 적어야지 너무 힘들어


 

반응형

댓글()