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 GitHub-Verzeichnis 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 eine Datei Dockerfile. Ignorieren Sie die Dateien metadata.json und chaincode.env.example.
  2. Ändern Sie die Datei Dockerfile wie im folgenden Beispiel dargestellt:
    # 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 Befehlssequenz stellt das Basisimage für die Erstellung des neuen Images auf das Go-Image mit bestimmten Versionen für Go und Alpine Linux ein, erstellt ein Verzeichnis und legt dieses Verzeichnis als Arbeitsverzeichnis fest. kopiert den lokalen Inhalt in das Image, fängt und installiert Go-Abhängigkeiten, kompiliert den Go-Code, konfiguriert den Container für die Überwachung auf Port 9999 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 namens 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, lautet repository.example.org. Der Kubernetes-Secret-Name, mit dem Images abgerufen werden, lautet ocirsecret. Der CHAINCODE_SERVER_ADDRESS-Wert lautet 0.0.0.0:9999. Dies gibt an, dass der Server so konfiguriert ist, dass er eingehende Verbindungen auf Port 9999 von einer beliebigen IP-Adresse akzeptiert, die mit dem Computer verknüpft ist. Rufen Sie den Wert CHAINCODE_ID aus der Chaincode-Package-ID ab, die beim Deployment auf dem Peer-Knoten in Oracle Blockchain Platform angezeigt wird, 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.