하이퍼레저 패브릭 - Fabric 1.4 to 2.2

choko's avatar
Jun 29, 2024
하이퍼레저 패브릭 - Fabric 1.4 to 2.2
 
 
👉
v2.x의 새로운 기능
  1. 여러 조직이 체인코드의 매개변수에 동의해야 한다.
  1. 보다 신중한 체인코드 업그레이드 프로세스 - 충분한 수의 조직에서 업그레이드 승인 후에만 체인코드 업그레이드 가능.
  1. 더 간단한 보증 정책 및 개인 데이터 수집 업데이트 - fabric lifecycle : 체인코드를 다시 패키징하거나 다시 설치할 필요 없이 보증정책 또는 개인 데이터 수집 구성을 변경할 수 있음.
  1. 검사 가능한 체인코드 패키지 - fabric lifecycle은 체인코드를 tar 파일로 패키징함, 이를 통해 패키지를 쉽게 검사하고 여러 조직에 설치할 수 있음.
  1. 채널에서 하나의 패키지를 사용하여 여러 체인코드를 시작할 수 있다 - 이제 단일 체인코드 패키지 사용하고, 이를 동일 채널 또는 다른 채널에 다른 이름으로 여러번 배포할 수 있다.
  1. 체인코드 패키지는 채널 구성원 간에 동일할 필요가 없음 - 이를 통해 organization은 전체 네트워크가 단계적으로 진행하지 않고도 자체 일정에 따라 수정 사항을 개별적으로 rollout 시킬수 있다.
 
 

체인코드 설치 및 정의

  1. 체인코드 패키징
  1. 피어에 체인코드 설치
  1. 조직의 체인코드 정의 승인
  1. 채널에 체인코드 정의 커밋
 
 
1단계: Smart Contract 패키징
체인코드는 peer에 설치되기 전에 tar 파일로 패키징해야 한다.
→ Fabric SDK 또는 GNU tar와 같은 도구 사용
체인코드를 패키징하는 경우 결과 파일은 아래 형식이어야 한다.
👉
1. 체인코드는 .tar.gz 확장자로 끝나는 tar 파일에 패키징해야 한다. 2. tar 파일은 2개의 파일, ”metadata.json”과 “code.tar.gz”를 포함해야 한다. 2.1 metadata.json은 체인코드 언어, 코드경로, 라벨을 지정하는 JSON이 포함된다. 2.2 code.tar.gz는 체인코드 파일, go.mod, go.sum, vendor 파일을 포함한다.
# metadata.json {"path":"github.com/hyperledger/fabric-samples/chaincode/fabcar/go","type":"golang","label":"fabcar_1"} # code.tar.gz fabcar.go / go.sum / go.mod / vendor
  • Fabric peer 바이너리 및 Fabric SDK는 자동으로 이 형식의 파일을 생성한다
  • 체인코드는 조직별로 분리되어 패키징된다.
 
2단계: Peer에 체인코드 설치
트랜잭션을 실행하고 승인할 모든 peer에 체인코드 패키지를 설치해야 한다. Org는 체인코드를 한 번만 패키징한 후, 조직에 속한 모든 peer에 동일한 패키지를 설치하는 것이 좋다.
 
notion image
 
성공적으로 peer에 체인코드를 설치하면, 체인코드 label에 해시값이 붙은 패키지 식별자가 나온다.
2022-07-26 00:55:19.301 UTC [cli.lifecycle.chaincode] submitInstallProposal -> INFO 002 Chaincode code package identifier: fabcar_1:7e13fd01c8df74c936ffdedaef32cb93acde6660f4dc6a45e3e9874eb1ca46f5
이 패키지 식별자는, peer에 설치된 체인코드 패키지를 Org에서 승인한 체인코드 정의와 연결하는데 사용된다. → 다음 단계를 위해, 이 패키지 식별자를 저장한다. peer CLI를 이용해 이 패키지 식별자를 찾을 수도 있다.
 
3단계: 조직의 체인코드 정의 승인
체인코드는 chaincode definition에 의해 관리된다. 채널 구성원이 체인코드 정의를 승인함으로써 Org의 체인코드 매개변수에 투표를 한다.
chaincode definition는 다음 매개변수가 포함된다.
👉
1. Name : 체인코드 이름 2. Version : 체인코드 바이너리를 업그레이드 할 때마다, 버전 변경이 필요함 3. Sequence : 체인코드가 정의된 횟수, 정수 4. Endorsement Policy : 트랜잭션를 실행하고 검증하는 조직 5. Collection Configuration : 체인코드와 연결된 개인 데이터 Collection 정의 파일의 경로 6. ESCC/VSCC Plugins : 체인코드에서 사용할 사용자 지정 보증/검증 플러그인의 이름 7. Initialization(option) : 체인코드 초기화 함수(Init)가 있을 시 지정
chaincode definition는 패키지 식별자도 포함된다.(모든 조직에 대해 동일할 필요는 없음)
체인코드를 사용하려는 각 채널 구성원은 Org에 대한 chaincode definition를 승인해야 한다.
→ 이 승인은 Ordering service에 제출되어야 하고, 그 후에 모든 peer들에게 배포된다.
→ 이 승인은 Org의 관리자가 제출하여야 한다.
notion image
 
 
4단계: 체인코드 정의를 channel에 커밋
충분한 수의 채널 구성원이 chaincode definition를 승인하면 Org에서 Channel에 커밋할 수 있다.
  1. 커밋 트랜잭션 제안은 먼저 채널 구성원의 peer에 전송되고, 채널 구성원은 Org에 대해 승인된 chaincode definition를 쿼리하고 조직이 승인한 경우 chaincode definition를 승인한다.
  1. 그 후 트랜잭션이 Ordering Service에 제출되고, chaincode definition이 channel에 커밋된다. 이 트랜잭션은 Org Admin이 제출해야 한다.
  1. channel에 성공적으로 커밋하기 전, chaincode definition를 승인해야 하는 조직의 수는 Channel/Application/LifecycleEndorsement의 정책에 따라 결정된다.
    1. 이 정책은 기본적으로 채널의 대다수 Org가 트랜잭션을 승인하도록 요구함.
    2. LifecycleEndorsement 정책은 체인코드 보증 정책과 별개이다.
 
notion image
  • 채널에 체인코드를 커밋하면, 각 Org는 체인코드 패키지를 설치하지 않고도 chaincode definition를 승인할 수 있다.
  • chaincode definition가 커밋되면 체인코드 컨테이너는 체인코드가 설치된 모든 peer에서 시작되어, 채널 구성원들이 체인코드를 사용할 수 있게 된다. 이때 Init 함수가 명시된 경우, Init 함수가 호출되어야 한다.
 
notion image
  • 체인코드가 설치된 최종 모습이다.
 
 

체인코드 업그레이드

체인코드를 설치하고 시작하는데 사용한 것과 동일한 Fabric lifecycle 프로세스를 이용해 체인코드를 업그레이드할 수 있다.
 
1단계: 체인코드 재패키징(체인코드 바이너리를 업그레이드 하는 경우)
notion image
 
2단계: 피어에 새 체인코드 패키지 설치
  1. 새 체인코드 패키지를 설치하면, 새로운 chaincode definition에 전달해야 하는 패키지 ID가 생성된다.
  1. 체인코드 바이너리가 업그레이드 되었는지 추적하기 위해, lifecycle 프로세스에서 사용하는 체인코드 버전을 변경해야 한다.
notion image
 
3단계: 새 체인코드 정의 승인
  1. 체인코드 바이너리를 업그레이드하는 경우 chaincode definition에서 체인코드 version 패키지 ID업데이트 해야 한다.
  1. 또한 체인코드 바이너리를 다시 패키징하지 않고도 체인코드 보증 정책을 업데이트할 수 있다. → 채널 구성원이 새 정책으로 정의를 승인하면 된다(새 정의는 sequence 변수를 1씩 증가시켜야 한다).
           version과 sequence가 1에서 2로 변경되었다. Package ID의 해시값도 변경되었다.
version과 sequence가 1에서 2로 변경되었다. Package ID의 해시값도 변경되었다.
 
4단계: 채널에 대한 정의 커밋
체인코드를 설치할 때와 마찬가지로 충분한 채널 구성원이 새 chaincode definition를 승인하면 커밋을 할 수 있다.
notion image
  1. Fabric 체인코드 lifecycle은 chaincode definition의 sequence를 통해 업그레이드를 추적한다.
  1. 모든 채널 구성원은 sequence 번호를 1씩 증가시키고 체인코드를 업그레이드하기 위해 새 정의를 승인해야 한다.
  1. version은 체인코드 바이너리를 추적하는 데 사용되며 체인코드 바이너리를 업그레이드할 때만 변경해야 한다.
 
 

Chaincode shim 변경

Go 체인코드를 빌드하는 데 사용되는 v2.x ccenv 이미지는 v1.4 ccenv 이미지에서 처럼 체인코드에서 shim 종속성을 자동으로 제공하지 않습니다.
→ Go 모듈을 사용하여, 체인코드 shim을 공급하는것을 추천한다.
 

Chaincode Logger

NewLogger()를 통한 체인코드 shim logger가 제거되었다. 따라서, NewLogger()는 이제 자신이 선호하는 로깅 매커니즘으로 변경해야 한다.
Share article

Tom의 TIL 정리방