Szenario: Chaincode als Service ausführen

Das folgende Beispiel veranschaulicht die Ausführung des Chaincodes FabCar als externer Service (ein Pod im Kubernetes-Cluster), den Sie dann in Oracle Blockchain Platform bereitstellen können.

Bevor Sie die folgenden Schritte ausführen, stellen Sie den Chaincode als externes Package in Oracle Blockchain Platform bereit.

  1. Klonen Sie das Verzeichnis GitHub im Repository hyperledger/fabric-samples, das fabcar/external enthält. Das Verzeichnis enthält die externe Version des Chaincodes FabCar in Go, fabcar.go und einer Datei Dockerfile. Ignorieren Sie die Dateien metadata.json und chaincode.env.example.
  2. Ändern Sie die Datei Dockerfile wie im folgenden Beispiel gezeigt:
    # 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"]

    Diese Befehlsfolge legt das Basisabbild für das Erstellen des neuen Abbilds auf das Go-Abbild mit bestimmten Versionen für Go und Alpine Linux fest, erstellt ein Verzeichnis, legt dieses Verzeichnis als Arbeitsverzeichnis fest, kopiert den lokalen Inhalt in das Image, ruft ab und installiert Go-Abhängigkeiten, kompiliert den Go-Code, konfiguriert den Container so, dass er auf Port 9999 horcht, und legt den Standardbefehl zur Ausführung der ausführbaren Datei fabcar fest.

  3. Führen Sie den folgenden Befehl aus, um das Docker-Image zu erstellen. Dadurch wird ein Docker-Image mit dem Namen fabcar-sample erstellt, das dann in ein Repository übertragen werden kann.
    docker build -t fabcar-sample .
  4. Erstellen Sie eine YAML-Datei für das Kubernetes-Deployment, um das Docker-Image auszuführen, das den Chaincode enthält. Das folgende Beispiel zeigt eine deployment.yaml-Datei. Das Repository, aus dem das Docker-Image abgerufen wird, ist repository.example.org. Der Kubernetes-Secret-Name, mit dem Images abgerufen werden, lautet ocirsecret. Der CHAINCODE_SERVER_ADDRESS-Wert ist 0.0.0.0:9999, was angibt, dass der Server so konfiguriert ist, dass er eingehende Verbindungen an Port 9999 von jeder IP-Adresse akzeptiert, die dem Computer zugeordnet ist. Rufen Sie den Wert CHAINCODE_ID aus der Chaincode-Package-ID ab, die angezeigt wird, wenn Sie das Deployment auf dem Peerknoten in Oracle Blockchain Platform ausführen, indem Sie den externen Chaincodetyp auswählen und eine .zip-Datei hochladen. In der Oracle Blockchain Platform-UI wird die Chaincode-ID als chaincode_name:package_ID angezeigt. Bei Java-Chaincode wird die Chaincode-ID-Variable CORE_CHAINCODE_ID_NAME genannt.
    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. Führen Sie den folgenden Befehl aus, um ein Kubernetes-Secret im Namespace chaincode zu generieren. Geben Sie für name_of_secret das Secret aus der Datei deployment.yaml an. In diesem Beispiel lautet der Name des Secrets 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. Führen Sie den folgenden Befehl aus, um den Kubernetes-Pod und -Service bereitzustellen.
    kubectl apply -f deployment.yaml

Sie können jetzt Transaktionen ausführen, die den externen Chaincode von Oracle Blockchain Platform verwenden.