シナリオ: チェーンコードをサービスとして実行
次の例は、FabCarチェーンコードを外部サービス(Kubernetesクラスタのポッド)として実行し、これをOracle Blockchain Platformにデプロイする方法を示しています。
次のステップを完了する前に、チェーンコードをOracle Blockchain Platformの外部パッケージとしてデプロイします。
fabcar/external
を含むhyperledger/fabric-samples
リポジトリでGitHubディレクトリをクローニングします。このディレクトリには、Go言語で書かれたFabCarチェーンコードの外部バージョンfabcar.go
およびDockerfile
ファイルが含まれています。metadata.json
およびchaincode.env.example
ファイルを無視します。- 次の例に示すように、
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
実行可能ファイルを実行するようにデフォルト・コマンドを設定します。 - 次のコマンドを実行して、Dockerイメージをビルドします。これにより、
fabcar-sample
という名前のDockerイメージが作成され、リポジトリにプッシュできます。docker build -t fabcar-sample .
- 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
- 次のコマンドを実行して、
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'
- 次のコマンドを実行して、Kubernetesポッドおよびサービスをデプロイします。
kubectl apply -f deployment.yaml
Oracle Blockchain Platformから外部チェーンコードを使用するトランザクションを実行できるようになりました。