######################
HyperLedger fabric
######################
네트워크 구성 단계
Org1 - Org2만 공유할 수 있는 원장을 만들기 위해 채널 생성하는 과정
1. Org1과 Org2가 협의하여 오더링 서비스 노드 구축 = Orderer
2. 채널에 참여하는 조직 및 노드에 대한 정보와 블록 생성 방법
및 블록 당 트랜잭션 허용정보 등을 바탕으로 제네시스 블록을
생성하여 채널 구축
3. 각 Org에서 Leader peer를 채널에 참여시키고
채널1에서 공유할 수 있는 원장을 보유
4. 채널1에서 공유하는 원장에 접근하기 위해 체인코드를 설치
(endorsing peer에 설치) + 사용자들도 참여할 수 있도록
dapp도 함께 설치
위의 단게를 반복하여 여러 조직과 이어 나갈 수 있음.
트랜잭션이 처리되는 과정 e.g. Marbles
(execution - ordering - validation)
Marbles: dapp을 통해 사용자들은 패브릭 네트워크의 peer에 접근해
체인코드를 실행시켜 원장을 업데이트할 수 있음
4장. 하이퍼레저 패브릭 개발
$FABRICHOME/test-network
configtx: 네트워크의 channel과 제네시스 블록을 만들고 Anchor peer node 파일을
생성하기 위한 설정 파일
organizations: MSP에서 인증서를 발급하기 위한 설정 파일. cryptogen 툴로 인증서를
발급할 때 사용되는데, 이 파일을 이용해서 조직과 참가자들에게 각각의 인증서를 발급한다.
===================================================================
===========================TUTORIALS===============================
- test network 사용
1-1. createChannel
- Org1, Org2, Orderer Identity 생성
- channel genesis block 생성
- channel에 Org1, Org2 참가 + Anchor node setting
- 채널에 스마트 컨트랙트 배포
- 스마트 컨트랙트 package화
peer lifecycle chaincode package basic.tar.gz --path ../asset-transfer-basic/chaincode-go --lang golang --label basic_1.0
- package된 chaincode 설치(install)
peer lifecycle chaincode install basic.tar.gz
- chaincode 정의(definition) 승인(Approve)
definition: organization, parameters(name, version, endorsement
policy)
approve: channel memebers majority가 승인
peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name basic --version 1.0 --package-id $CC_PACKAGE_ID --sequence 1 --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem"
- chaincode 정의를 채널에 커밋(commit)
Approval 확인: peer lifecycle chaincode checkcommitreadiness --channelID mychannel --name basic --version 1.0 --sequence 1 --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" --output json
커밋: peer lifecycle chaincode commit -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name basic --version 1.0 --sequence 1 --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" --peerAddresses localhost:7051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt" --peerAddresses localhost:9051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt"
커밋 확인: peer lifecycle chaincode querycommitted --channelID mychannel --name basic --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem"
- chaincode 호출(invoking)
호출: peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" -C mychannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt" --peerAddresses localhost:9051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt" -c '{"function":"InitLedger","Args":[]}'
쿼리: peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}'
- smart contract 업그레이드(Upgrade)
채널에 이미 배포된 chaincode를 업그레이드 할 수 있음 (example: javascript)
패키지화: peer lifecycle chaincode package basic_2.tar.gz --path ../asset-transfer-basic/chaincode-javascript/ --lang node --label basic_2.0
설치: peer lifecycle chaincode install basic_2.tar.gz
승인: peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name basic --version 2.0 --package-id $NEW_CC_PACKAGE_ID --sequence 2 --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem"
승인확인: peer lifecycle chaincode checkcommitreadiness --channelID mychannel --name basic --version 2.0 --sequence 2 --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" --output json
커밋: peer lifecycle chaincode commit -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name basic --version 2.0 --sequence 2 --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" --peerAddresses localhost:7051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt" --peerAddresses localhost:9051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt"
- Running a Fabric Application
- 블록체인 네트워크 설정(setup)
1-1) 블록체인 네트워크 시작(launch)
CA 생성: Org1, Org2
MSP 등록: peer0+peer0tls, user, org admin
1-2) 스마트 컨트랙트 배포(deploy)
./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-typescript/ -ccl typescript
1-3) 샘플 애플리케이션 준비(Prepare)
nvm install 14
-
샘플 애플리케이션 운영(run)
2-1) Gateway에 gRPC 연결 수립(establish)
- Warning: 클라이언트 ID와 동일한 조직에 속한 Fabric Gateway에 연결해야 함
-> private data security 때문에
2-2) Gateway 연결 생성(create)
- gRPC, Client ID, Client signature
- Client ID: Org1 user X.509 cert
- Client signature: Org1 user's private key
2-3) 호출될 스마트 컨트랙트 접근(access)
Network(channel) -> contract(chaincode)
2-4) 샘플 asset으로 ledger에 채우기(populate)
tx 제안 -> OSN 제출 -> commit 대기 및 ledger state 업데이트
2-5) asset를 읽고 쓸(read&write) 트랜잭션 함수 호출
트랜잭션 결과는 항상 byte -> byte 해석은 application
2-6) 새로운 asset 생성(create)
2-7) asset 변경(update)
2-8) 변경된 asset 조회(query)
2-9) tx 에러 다루기(handle)
-
Running External Chaincode Builders
문제: k8s or docker daemon에 대한 액세스가 제한된 환경에
체인코드를 배포하고 실행하는데 어려움이 있었음
해결: Chaincode as a service(CCAAS)
ccaasbuilder: core.yaml + binary
-
Private data 사용
gossip: anchor peers.
PDC(Private Data Collections): 저장(store)하고 검색(retrieval) 제공
- 네트워크 시작(start)
./network.sh up createChannel -ca -s couchdb
- private data smart contract를 채널에 배포(deploy)
설치: ./network.sh deployCC -ccn private -ccp ../asset-transfer-private-data/chaincode-go/ -ccl go -ccep "OR('Org1MSP.peer','Org2MSP.peer')" -cccg ../asset-transfer-private-data/chaincode-go/collections_config.json
승인: peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name private --version 1.0 --collections-config ../asset-transfer-private-data/chaincode-go/collections_config.json --signature-policy "OR('Org1MSP.member','Org2MSP.member')" --package-id $CC_PACKAGE_ID --sequence 1 --tls --cafile /home/vagrant/go/src/fabric-samples/test-network/organizations/fabric-ca/ordererOrg/ca-cert.pem
커밋: peer lifecycle chaincode commit -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name private --version 1.0 --sequence 1 --collections-config ../asset-transfer-private-data/chaincode-go/collections_config.json --signature-policy "OR('Org1MSP.member','Org2MSP.member')" --tls --cafile /home/vagrant/go/src/fabric-samples/test-network/organizations/fabric-ca/ordererOrg/ca-cert.pem --peerAddresses localhost:7051 --tlsRootCertFiles /home/vagrant/go/src/fabric-samples/test-network/organizations/fabric-ca/org1/ca-cert.pem --peerAddresses localhost:9051 --tlsRootCertFiles /home/vagrant/go/src/fabric-samples/test-network/organizations/fabric-ca/org2/ca-cert.pem
- identity 등록(register)
owner 등록: fabric-ca-client register --caname ca-org1 --id.name owner --id.secret ownerpw --id.type client --tls.certfiles "${PWD}/organizations/fabric-ca/org1/tls-cert.pem"
MSP 등록(enroll): fabric-ca-client enroll -u https://owner:ownerpw@localhost:7054 --caname ca-org1 -M "${PWD}/organizations/peerOrganizations/org1.example.com/users/[email protected]/msp" --tls.certfiles "${PWD}/organizations/fabric-ca/org1/tls-cert.pem"
cp "${PWD}/organizations/peerOrganizations/org1.example.com/msp/config.yaml" "${PWD}/organizations/peerOrganizations/org1.example.com/users/[email protected]/msp/config.yaml"
fabric-ca-client register --caname ca-org2 --id.name buyer --id.secret buyerpw --id.type client --tls.certfiles "${PWD}/organizations/fabric-ca/org2/tls-cert.pem"
fabric-ca-client enroll -u https://buyer:buyerpw@localhost:8054 --caname ca-org2 -M "${PWD}/organizations/peerOrganizations/org2.example.com/users/[email protected]/msp" --tls.certfiles "${PWD}/organizations/fabric-ca/org2/tls-cert.pem"
cp "${PWD}/organizations/peerOrganizations/org2.example.com/msp/config.yaml" "${PWD}/organizations/peerOrganizations/org2.example.com/users/[email protected]/msp/config.yaml"
# Org1
# Org2
- private data안에 asset 생성(create)
- authorized peer가 조회(query)
- unauthorized peer가 조회(query)
- Purge Private Data(제거)
-
Secured asset 전송
organizations 사이에 asset이 어떻게 represented and traded 되는지 ?
어떻게 privacy가 유지되는지? (transient옵션)
-
collection은 체인코드에 명시적으로 정의될 필요가 없음
-
random salt(org+salt값을 더해 암호화)로 hash됨
-
transient(smart contract에 포함시키지 않는) field로 관리됨
-
client id = owner's org id 매치
1)테스트 네트워크 배포(deploy)
./network.sh up createChannel -c mychannel
2)스마트 컨트랙트 배포(deploy)
./network.sh deployCC -ccn secured -ccp ../asset-transfer-secured-agreement/chaincode-go/ -ccl go -ccep "OR('Org1MSP.peer','Org2MSP.peer')"
-
asset 생성(create)
export ASSET_PROPERTIES=$(echo -n "{\"object_type\":\"asset_properties\",\"color\":\"blue\",\"size\":35,\"salt\":\"a94a8fe5ccb19ba61c4c0873d391e987982fbbd3\"}" | base64 | tr -d \\n)
호출: peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" -C mychannel -n secured -c '{"function":"CreateAsset","Args":["A new asset for Org1MSP"]}' --transient "{\"asset_properties\":\"$ASSET_PROPERTIES\"}"
- 생성할 때 clientid = orgid, 변경할 때 clientid = ownerid 비교
- assetid는 asset_properties JSON의 sha256값이다
export ASSET_ID=d9923f21b770adbc79cbcc47a3aeecc81dc7f030bd129155301ce3932be7fbcc
조회: peer chaincode query -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" -C mychannel -n secured -c "{\"function\":\"GetAssetPrivateProperties\",\"Args\":[\"$ASSET_ID\"]}"
peer chaincode query -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" -C mychannel -n secured -c "{\"function\":\"ReadAsset\",\"Args\":[\"$ASSET_ID\"]}"
-
asset 판매 동의
-
Org1 판매 동의
-
Org2 구매 동의
-
Org1 -> Org2로 asset 이동
- CouchDB 사용
- why couchDB?
LevelDB: peer node에 내장된 default state DB
- chaincode data 저장
couchDB: JSON
- query large datasets.
- index: 모든 row를 조사하지 않고도 쿼리
- Fabric에서 CouchDB 사용
- index 생성(create)
.json file + fields(쿼리할 필드) + name(인덱스 이름)
- 체인코드 폴더에 index 추가
META-INF/statedb/couchdb/indexes
- 스마트 컨트랙트 배포(deploy)
- CouchDB 상태 DB 조회(Query) + index로도 조회
peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" -C mychannel -n ledger -c '{"Args":["CreateAsset","asset1","blue","5","tom","35"]}'
- Pagination해서 조회(query)
- index 변경(update), 삭제(delete)
- 채널에 Org 추가(add)
- CA 생성 (CA root cert: 검증된 사용자, TLS root cert: 다른 사람들에게 알리기 위함)
- Org3 compoents(도커) 가져오기(Bring up)
- 설정 가져오기(Fetch)
- 구성을 JSON으로 변환하고 다듬기
- Org3 추가(Add)
- 서명(sign) 및 제출(submit)
majority 만큼 sign
OSN에게 channel genesis block 전송
- 체인코드 작성
- 체인코드 access control
- go 체인코드를 위한 외부 dependencies 관리
- e.g. shim: chaincode가 원장 state 접속, tx access, 다른 체인코드 호출
===========================
======== 추가 논문 ===========
FastFabric: Scaling Hyperledger Fabric to 20,000 Transactions per Second