######################

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===============================

  1. test network 사용 1-1. createChannel
  1. Org1, Org2, Orderer Identity 생성
  2. channel genesis block 생성
  3. channel에 Org1, Org2 참가 + Anchor node setting
  1. 채널에 스마트 컨트랙트 배포
    1. 스마트 컨트랙트 package화 peer lifecycle chaincode package basic.tar.gz --path ../asset-transfer-basic/chaincode-go --lang golang --label basic_1.0
    2. package된 chaincode 설치(install) peer lifecycle chaincode install basic.tar.gz
    3. 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"
    4. 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"
    5. 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"]}'
    6. 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"
  2. Running a Fabric Application
    1. 블록체인 네트워크 설정(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

    1. 샘플 애플리케이션 운영(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)
    2. Running External Chaincode Builders 문제: k8s or docker daemon에 대한 액세스가 제한된 환경에 체인코드를 배포하고 실행하는데 어려움이 있었음 해결: Chaincode as a service(CCAAS) ccaasbuilder: core.yaml + binary

    3. Private data 사용 gossip: anchor peers. PDC(Private Data Collections): 저장(store)하고 검색(retrieval) 제공

      1. 네트워크 시작(start) ./network.sh up createChannel -ca -s couchdb
      2. 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
      3. 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
      
      1. private data안에 asset 생성(create)
      2. authorized peer가 조회(query)
      3. unauthorized peer가 조회(query)
      4. Purge Private Data(제거)
    4. Secured asset 전송 organizations 사이에 asset이 어떻게 represented and traded 되는지 ? 어떻게 privacy가 유지되는지? (transient옵션)

    1. CouchDB 사용
      1. why couchDB? LevelDB: peer node에 내장된 default state DB
      • chaincode data 저장 couchDB: JSON
      • query large datasets.
      • index: 모든 row를 조사하지 않고도 쿼리
      1. Fabric에서 CouchDB 사용
        • core.yaml + config
      2. index 생성(create) .json file + fields(쿼리할 필드) + name(인덱스 이름)
      3. 체인코드 폴더에 index 추가 META-INF/statedb/couchdb/indexes
      4. 스마트 컨트랙트 배포(deploy)
      5. 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"]}'
      6. Pagination해서 조회(query)
      7. index 변경(update), 삭제(delete)
    2. 채널에 Org 추가(add)
      1. CA 생성 (CA root cert: 검증된 사용자, TLS root cert: 다른 사람들에게 알리기 위함)
      2. Org3 compoents(도커) 가져오기(Bring up)
      3. 설정 가져오기(Fetch)
      4. 구성을 JSON으로 변환하고 다듬기
      5. Org3 추가(Add)
        • 설정에 추가
      6. 서명(sign) 및 제출(submit) majority 만큼 sign OSN에게 channel genesis block 전송
    3. 체인코드 작성
      1. 체인코드 access control
        • client id
      2. go 체인코드를 위한 외부 dependencies 관리
        • e.g. shim: chaincode가 원장 state 접속, tx access, 다른 체인코드 호출

===========================

======== 추가 논문 ===========

FastFabric: Scaling Hyperledger Fabric to 20,000 Transactions per Second