시나리오: Chaincode as a Service 실행

다음 예에서는 FabCar 체인코드를 외부 서비스(Kubernetes 클러스터의 POD)로 실행한 다음 Oracle Blockchain Platform에 배포할 수 있는 방법을 보여 줍니다.

다음 단계를 완료하기 전에 체인코드를 Oracle Blockchain Platform에서 외부 패키지로 배포하십시오.

  1. fabcar/external가 포함된 hyperledger/fabric-samples 저장소에서 GitHub 디렉토리를 복제합니다. 이 디렉토리는 Go, fabcar.goDockerfile 파일에 있는 FabCar 체인 코드의 외부 버전을 포함합니다. metadata.jsonchaincode.env.example 파일을 무시합니다.
  2. 다음 예와 같이 Dockerfile 파일을 수정합니다.
    # Use the Go image from Docker Hub with specified versions for Go and Alpine Linux
    FROM golang:1.13.8-alpine3.10
    
    # Create a directory named "chaincode" in the image
    RUN mkdir /chaincode
    
    # Set "/chaincode" as the working directory within the image
    WORKDIR /chaincode
    
    # Copy the contents of the local directory into "/chaincode" in the image
    COPY . .
    
    # Fetch and install Go dependencies for the project
    RUN go get -d -v ./...
    
    # Install Go dependencies
    RUN go install -v ./...
    
    # Compile the Go code in the current directory, creating an executable binary named "fabcar"
    RUN go build -o fabcar .
    
    # Expose port 9999, indicating that the application within the container will listen on this port
    EXPOSE 9999
    
    # Set the default command to run the "fabcar" executable when the container starts
    CMD ["/chaincode/fabcar"]

    이 명령 시퀀스는 Go 및 Alpine Linux에 대한 특정 버전의 Go 이미지로 새 이미지를 빌드하기 위한 기본 이미지를 설정하고, 디렉토리를 만들고, 해당 디렉토리를 작업 디렉토리로 설정합니다. 로컬 내용을 이미지에 복사하고, Go 종속성을 인출 및 설치하고, Go 코드를 컴파일하고, 포트 9999에서 수신하도록 컨테이너를 구성하고, fabcar 실행 파일을 실행하도록 기본 명령을 설정합니다.

  3. 다음 명령을 실행하여 fabcar-sample라는 Docker 이미지를 만든 다음 저장소로 푸시할 수 있는 Docker 이미지를 빌드합니다.
    docker build -t fabcar-sample .
  4. 체인코드가 포함된 Docker 이미지를 실행할 Kubernetes 배치 YAML 파일을 생성합니다. 다음 예는 deployment.yaml 파일을 보여줍니다. Docker 이미지가 풀링되는 저장소는 repository.example.org입니다. 이미지 풀링에 사용되는 Kubernetes 암호 이름은 ocirsecret입니다. CHAINCODE_SERVER_ADDRESS 값은 0.0.0.0:9999이며, 이는 서버가 컴퓨터와 연관된 IP 주소에서 포트 9999의 수신 연결을 허용하도록 구성되어 있음을 나타냅니다. 외부 체인코드 유형을 선택하고 .zip 파일을 업로드하여 Oracle Blockchain Platform의 피어 노드에 배포할 때 표시되는 체인코드 패키지 ID에서 CHAINCODE_ID 값을 가져옵니다. Oracle Blockchain Platform UI에서 체인코드 ID는 chaincode_name:package_ID로 표시됩니다. Java 체인 코드의 경우 체인코드 ID 변수를 CORE_CHAINCODE_ID_NAME이라고 합니다.
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: external-fabcar-node
    namespace: chaincode
    labels:
    chaincode-type: external
    chaincode-name: external-fabcar-node
    spec:
    replicas: 1
    selector:
    matchLabels:
    chaincode-type: external
    chaincode-name: external-fabcar-node
    template:
    metadata:
    labels:
    chaincode-type: external
    chaincode-name: external-fabcar-node
    spec:
    imagePullSecrets:
    - name: ocirsecret
    containers:
    - env:
    - name: CHAINCODE_SERVER_ADDRESS
    value: "0.0.0.0:9999"
    - name: CHAINCODE_ID
    value: "ext-fabcar-node:7f953544f26124914c29467d5079f601ddefa53375fffec830ecd70c13547877"
    image: repository.example.org/blockchain/fabcar-sample:latest
    imagePullPolicy: Always
    name: assettransfer
    ports:
    - containerPort: 9999
    name: grpc
    protocol: TCP
    
    
    
    ---
    
    apiVersion: v1
    kind: Service
    metadata:
    labels:
    chaincode-name: external-fabcar-node
    chaincode-type: external
    name: external-fabcar-node
    namespace: chaincode
    spec:
    ports:
    - name: grpc
    port: 9999
    protocol: TCP
    targetPort: 9999
    selector:
    chaincode-name: external-fabcar-node
    chaincode-type: external
    type: ClusterIP
  5. 다음 명령을 실행하여 chaincode 네임스페이스에서 Kubernetes 암호를 생성합니다. name_of_secret의 경우 deployment.yaml 파일에서 암호를 지정합니다. 이 예에서 암호 이름은 ocirsecret입니다.
    kubectl create secret docker-registry name_of_secret -n chaincode --docker-server='repository.example.org/blockchain' --docker-username='your_username' --docker-password='auth_token'
  6. 다음 명령을 실행하여 Kubernetes Pod 및 서비스를 배치합니다.
    kubectl apply -f deployment.yaml

이제 Oracle Blockchain Platform에서 외부 체인코드를 사용하는 트랜잭션을 실행할 수 있습니다.