シナリオ: チェーンコードをサービスとして実行

次の例は、FabCarチェーンコードを外部サービス(Kubernetesクラスタのポッド)として実行し、これをOracle Blockchain Platformにデプロイする方法を示しています。

次のステップを完了する前に、チェーンコードをOracle Blockchain Platformの外部パッケージとしてデプロイします。

  1. fabcar/externalを含むhyperledger/fabric-samplesリポジトリでGitHubディレクトリをクローニングします。このディレクトリには、Go言語で書かれたFabCarチェーンコードの外部バージョンfabcar.goおよびDockerfileファイルが含まれています。metadata.jsonおよびchaincode.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. 次のコマンドを実行して、Dockerイメージをビルドします。これにより、fabcar-sampleという名前のDockerイメージが作成され、リポジトリにプッシュできます。
    docker build -t fabcar-sample .
  4. KubernetesデプロイメントYAMLファイルを作成して、チェーンコードを含むDockerイメージを実行します。次の例は、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ポッドおよびサービスをデプロイします。
    kubectl apply -f deployment.yaml

Oracle Blockchain Platformから外部チェーンコードを使用するトランザクションを実行できるようになりました。