Hyperledger Fabric
How to retrieve data more than totalQueryLimit
블록체인에 저장하는 원장(Ledger) 제약조건
imgage : https://hyperledger-fabric.readthedocs.io/en/latest/ledger/ledger.html#example-ledger-basic-asset-transfer
• 블록 생성 트랜잭션은 최대 4MB이하
• 블록 조회 한계 : 100,000 건 (totalQueryLimit)
Pagination
• 블록 조회 한계 및 적절한 Request/Response 성능을 고려하여
적정한 Pagination 처리가 필요
• 이를 위해 Hyperledger Fabric API에서 페이징 처리하여
리턴하는 기능을 제공하고 있음
Pagination 소스코드
https://github.com/hyperledger/fabric-samples/blob/main/asset-transfer-ledger-queries/chaincode-
go/asset_transfer_ledger_chaincode.go#L345-L356
startKey : 페이지 시작 키
end : 페이지 종료 키
pageSize : 한 페이지에 호출할 자료 건수
bookmark : (값을 부여할 경우) 이 키 부터 자료 조회
startKey가 있을 경우, bookmark가 우선
체인 코드 구현 (1/3)
source code : https://github.com/hyperledger/fabric-samples/blob/main/asset-transfer-ledger-queries/chaincode-go/asset_transfer_ledger_chaincode.go
체인 코드 구현 (2/3)
source code : https://github.com/hyperledger/fabric-samples/blob/main/asset-transfer-ledger-queries/chaincode-go/asset_transfer_ledger_chaincode.go
체인 코드 구현 (3/3)
source code : https://github.com/hyperledger/fabric-samples/blob/main/asset-transfer-ledger-queries/chaincode-go/asset_transfer_ledger_chaincode.go
체인코드 반영
[root@slave1 chaincode]# pwd
/root/fabric-samples/asset-transfer-basic/chaincode-go/chaincode
[root@slave1 chaincode]# ll
total 20
drwxr-xr-x. 2 root root 81 May 17 07:02 mocks
-rw-r--r--. 1 root root 10578 Oct 18 22:26 smartcontract.go
-rw-r--r--. 1 root root 6852 May 17 07:02 smartcontract_test.go
[root@slave1 chaincode]#
체인코드 버전업 및 설치 (1/3)
Org1 서버에서
실행 위치 예시 : /fabric-samples/kopo-network
export PATH=${PWD}/../bin:$PATH
export FABRIC_CFG_PATH=$PWD/../config/
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.fmd.com/users/Admin@org1.fmd.com/msp
peer lifecycle chaincode package basic_2.tar.gz --path ../asset-transfer-basic/chaincode-go/ --label basic_2.0
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.fmd.com/peers/peer0.org1.fmd.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.fmd.com/users/Admin@org1.fmd.com/msp
export CORE_PEER_ADDRESS=localhost:7051
peer lifecycle chaincode install basic_2.tar.gz
peer lifecycle chaincode queryinstalled
export NEW_CC_PACKAGE_ID=basic_2.0:6284dc812d6ddfa97c424c4ffd6f06e438618ccdcb5c987129ef69270688cd5e
peer lifecycle chaincode approveformyorg -o localhost:8050 --ordererTLSHostnameOverride orderer2.fmd.com --channelID channel1 --name
basic --version 2.0 --package-id $NEW_CC_PACKAGE_ID --sequence 2 --tls --cafile
"${PWD}/organizations/ordererOrganizations/fmd.com/orderers/orderer2.fmd.com/msp/tlscacerts/tlsca.fmd.com-cert.pem"
체인코드 버전업 및 설치 (2/3)
Org2 서버에서
실행 위치 예시 : /fabric-samples/kopo-network
export PATH=${PWD}/../bin:$PATH
export FABRIC_CFG_PATH=$PWD/../config/
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org2.fmd.com/users/Admin@org2.fmd.com/msp
peer lifecycle chaincode package basic_2.tar.gz --path ../asset-transfer-basic/chaincode-go/ --label basic_2.0
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org2MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org2.fmd.com/peers/peer0.org2.fmd.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org2.fmd.com/users/Admin@org2.fmd.com/msp
export CORE_PEER_ADDRESS=localhost:9051
peer lifecycle chaincode install basic_2.tar.gz
export NEW_CC_PACKAGE_ID=basic_2.0:6284dc812d6ddfa97c424c4ffd6f06e438618ccdcb5c987129ef69270688cd5e
peer lifecycle chaincode approveformyorg -o localhost:9050 --ordererTLSHostnameOverride orderer3.fmd.com --channelID channel1 --name
basic --version 2.0 --package-id $NEW_CC_PACKAGE_ID --sequence 2 --tls --cafile
"${PWD}/organizations/ordererOrganizations/fmd.com/orderers/orderer3.fmd.com/msp/tlscacerts/tlsca.fmd.com-cert.pem"
peer lifecycle chaincode checkcommitreadiness --channelID channel1 --name basic --version 2.0 --sequence 2 --tls --cafile
"${PWD}/organizations/ordererOrganizations/fmd.com/orderers/orderer3.fmd.com/msp/tlscacerts/tlsca.fmd.com-cert.pem" --output json
peer lifecycle chaincode commit -o localhost:9050 --ordererTLSHostnameOverride orderer3.fmd.com --channelID channel1 --name basic --
version 2.0 --sequence 2 --tls --cafile
"${PWD}/organizations/ordererOrganizations/fmd.com/orderers/orderer2.fmd.com/msp/tlscacerts/tlsca.fmd.com-cert.pem" --peerAddresses
localhost:9051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org2.fmd.com/peers/peer0.org2.fmd.com/tls/ca.crt"
체인코드 버전업 및 설치 (3/3)
[Org1의 non anchor peer에서 체인코드 설치]
export CORE_PEER_ADDRESS=localhost:8051
peer lifecycle chaincode install basic_2.tar.gz
[Org2의 non anchor peer에서 체인코드 설치]
export CORE_PEER_ADDRESS=localhost:10051
peer lifecycle chaincode install basic_2.tar.gz
테스트 (1/4)
startKey : 페이지 시작 키
end : 페이지 종료 키
pageSize : 한 페이지에 호출할 자료 건수
bookmark : (값을 부여할 경우) 이 키 부터 자료 조회
startKey가 있을 경우, bookmark가 우선
조회 조건 없을 경우
totalQueryLimit 까지 조회
테스트 (2/4)
시작키 ~ 종료키까지 300건 단위 조회
- 300건 미만일 경우 bookmark 정보 리턴 없음
테스트 (3/4)
시작키 ~ 종료키까지 3건 단위 조회
- bookmark 정보 리턴 되며,
해당 정보로 다음 페이지 조회 가능
테스트 (4/4)
bookmark 값으로 조회
- bookmark 키 값 부터 3건 조회

하이퍼레저 페이지 단위 블록 조회

  • 1.
    Hyperledger Fabric How toretrieve data more than totalQueryLimit
  • 2.
    블록체인에 저장하는 원장(Ledger)제약조건 imgage : https://hyperledger-fabric.readthedocs.io/en/latest/ledger/ledger.html#example-ledger-basic-asset-transfer • 블록 생성 트랜잭션은 최대 4MB이하 • 블록 조회 한계 : 100,000 건 (totalQueryLimit)
  • 3.
    Pagination • 블록 조회한계 및 적절한 Request/Response 성능을 고려하여 적정한 Pagination 처리가 필요 • 이를 위해 Hyperledger Fabric API에서 페이징 처리하여 리턴하는 기능을 제공하고 있음
  • 4.
    Pagination 소스코드 https://github.com/hyperledger/fabric-samples/blob/main/asset-transfer-ledger-queries/chaincode- go/asset_transfer_ledger_chaincode.go#L345-L356 startKey :페이지 시작 키 end : 페이지 종료 키 pageSize : 한 페이지에 호출할 자료 건수 bookmark : (값을 부여할 경우) 이 키 부터 자료 조회 startKey가 있을 경우, bookmark가 우선
  • 5.
    체인 코드 구현(1/3) source code : https://github.com/hyperledger/fabric-samples/blob/main/asset-transfer-ledger-queries/chaincode-go/asset_transfer_ledger_chaincode.go
  • 6.
    체인 코드 구현(2/3) source code : https://github.com/hyperledger/fabric-samples/blob/main/asset-transfer-ledger-queries/chaincode-go/asset_transfer_ledger_chaincode.go
  • 7.
    체인 코드 구현(3/3) source code : https://github.com/hyperledger/fabric-samples/blob/main/asset-transfer-ledger-queries/chaincode-go/asset_transfer_ledger_chaincode.go
  • 8.
    체인코드 반영 [root@slave1 chaincode]#pwd /root/fabric-samples/asset-transfer-basic/chaincode-go/chaincode [root@slave1 chaincode]# ll total 20 drwxr-xr-x. 2 root root 81 May 17 07:02 mocks -rw-r--r--. 1 root root 10578 Oct 18 22:26 smartcontract.go -rw-r--r--. 1 root root 6852 May 17 07:02 smartcontract_test.go [root@slave1 chaincode]#
  • 9.
    체인코드 버전업 및설치 (1/3) Org1 서버에서 실행 위치 예시 : /fabric-samples/kopo-network export PATH=${PWD}/../bin:$PATH export FABRIC_CFG_PATH=$PWD/../config/ export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.fmd.com/users/Admin@org1.fmd.com/msp peer lifecycle chaincode package basic_2.tar.gz --path ../asset-transfer-basic/chaincode-go/ --label basic_2.0 export CORE_PEER_TLS_ENABLED=true export CORE_PEER_LOCALMSPID="Org1MSP" export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.fmd.com/peers/peer0.org1.fmd.com/tls/ca.crt export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.fmd.com/users/Admin@org1.fmd.com/msp export CORE_PEER_ADDRESS=localhost:7051 peer lifecycle chaincode install basic_2.tar.gz peer lifecycle chaincode queryinstalled export NEW_CC_PACKAGE_ID=basic_2.0:6284dc812d6ddfa97c424c4ffd6f06e438618ccdcb5c987129ef69270688cd5e peer lifecycle chaincode approveformyorg -o localhost:8050 --ordererTLSHostnameOverride orderer2.fmd.com --channelID channel1 --name basic --version 2.0 --package-id $NEW_CC_PACKAGE_ID --sequence 2 --tls --cafile "${PWD}/organizations/ordererOrganizations/fmd.com/orderers/orderer2.fmd.com/msp/tlscacerts/tlsca.fmd.com-cert.pem"
  • 10.
    체인코드 버전업 및설치 (2/3) Org2 서버에서 실행 위치 예시 : /fabric-samples/kopo-network export PATH=${PWD}/../bin:$PATH export FABRIC_CFG_PATH=$PWD/../config/ export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org2.fmd.com/users/Admin@org2.fmd.com/msp peer lifecycle chaincode package basic_2.tar.gz --path ../asset-transfer-basic/chaincode-go/ --label basic_2.0 export CORE_PEER_TLS_ENABLED=true export CORE_PEER_LOCALMSPID="Org2MSP" export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org2.fmd.com/peers/peer0.org2.fmd.com/tls/ca.crt export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org2.fmd.com/users/Admin@org2.fmd.com/msp export CORE_PEER_ADDRESS=localhost:9051 peer lifecycle chaincode install basic_2.tar.gz export NEW_CC_PACKAGE_ID=basic_2.0:6284dc812d6ddfa97c424c4ffd6f06e438618ccdcb5c987129ef69270688cd5e peer lifecycle chaincode approveformyorg -o localhost:9050 --ordererTLSHostnameOverride orderer3.fmd.com --channelID channel1 --name basic --version 2.0 --package-id $NEW_CC_PACKAGE_ID --sequence 2 --tls --cafile "${PWD}/organizations/ordererOrganizations/fmd.com/orderers/orderer3.fmd.com/msp/tlscacerts/tlsca.fmd.com-cert.pem" peer lifecycle chaincode checkcommitreadiness --channelID channel1 --name basic --version 2.0 --sequence 2 --tls --cafile "${PWD}/organizations/ordererOrganizations/fmd.com/orderers/orderer3.fmd.com/msp/tlscacerts/tlsca.fmd.com-cert.pem" --output json peer lifecycle chaincode commit -o localhost:9050 --ordererTLSHostnameOverride orderer3.fmd.com --channelID channel1 --name basic -- version 2.0 --sequence 2 --tls --cafile "${PWD}/organizations/ordererOrganizations/fmd.com/orderers/orderer2.fmd.com/msp/tlscacerts/tlsca.fmd.com-cert.pem" --peerAddresses localhost:9051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org2.fmd.com/peers/peer0.org2.fmd.com/tls/ca.crt"
  • 11.
    체인코드 버전업 및설치 (3/3) [Org1의 non anchor peer에서 체인코드 설치] export CORE_PEER_ADDRESS=localhost:8051 peer lifecycle chaincode install basic_2.tar.gz [Org2의 non anchor peer에서 체인코드 설치] export CORE_PEER_ADDRESS=localhost:10051 peer lifecycle chaincode install basic_2.tar.gz
  • 12.
    테스트 (1/4) startKey :페이지 시작 키 end : 페이지 종료 키 pageSize : 한 페이지에 호출할 자료 건수 bookmark : (값을 부여할 경우) 이 키 부터 자료 조회 startKey가 있을 경우, bookmark가 우선 조회 조건 없을 경우 totalQueryLimit 까지 조회
  • 13.
    테스트 (2/4) 시작키 ~종료키까지 300건 단위 조회 - 300건 미만일 경우 bookmark 정보 리턴 없음
  • 14.
    테스트 (3/4) 시작키 ~종료키까지 3건 단위 조회 - bookmark 정보 리턴 되며, 해당 정보로 다음 페이지 조회 가능
  • 15.
    테스트 (4/4) bookmark 값으로조회 - bookmark 키 값 부터 3건 조회

Editor's Notes

  • #3 https://stackoverflow.com/questions/61357361/how-to-view-or-retrieve-data-from-hyperledger-fabric
  • #5 호출 예시 : https://github.com/hyperledger/fabric-samples/blob/c646c5904ff0b45cb9052136b50b7a7a58cefe78/asset-transfer-ledger-queries/application-java/src/main/java/application/java/App.java#L131