DEV Community

Rümeysa Öz
Rümeysa Öz

Posted on • Edited on

Kubernetes Üzerinde Hyperledger Fabric Ağının Kurulumu ve Yönetimi

‼️ Ön Koşullar:

  • Bir önceki serideki adımların yapılmış olması gerekmektedir.

Adım 1: Gerekli Değişkenlerin Tanımlanması

Bu adımda, Fabric ağ bileşenleri için Docker imajları ve sürümleri belirleniyor. Bu, kurulum sürecinde kullanılacak temel yapılandırma bilgileridir.

export PEER_IMAGE=hyperledger/fabric-peer
export PEER_VERSION=2.5.0
export ORDERER_IMAGE=hyperledger/fabric-orderer
export ORDERER_VERSION=2.5.0
export CA_IMAGE=hyperledger/fabric-ca
export CA_VERSION=1.5.6
Enter fullscreen mode Exit fullscreen mode

Adım 2: Cluster IP'nin Alınması ve CoreDNS Konfigürasyonu

Kubernetes cluster IP adresi alınıyor ve CoreDNS için özel bir yapılandırma yapılıyor. Bu, ağ trafiğinin yönlendirilmesi ve yönetilmesi için önemlidir.

sudo apt install jq

CLUSTER_IP=$(kubectl -n istio-system get svc istio-ingressgateway -o json | jq -r .spec.clusterIP)
kubectl apply -f - <<EOF
kind: ConfigMap
apiVersion: v1
metadata:
  name: coredns
  namespace: kube-system
data:
  Corefile: |
    .:53 {
        errors
        health {
           lameduck 5s
        }
        rewrite name regex (.*)\.localho\.st host.ingress.internal
        hosts {
          ${CLUSTER_IP} host.ingress.internal
          fallthrough
        }
        ready
        kubernetes cluster.local in-addr.arpa ip6.arpa {
           pods insecure
           fallthrough in-addr.arpa ip6.arpa
           ttl 30
        }
        prometheus :9153
        forward . /etc/resolv.conf {
           max_concurrent 1000
        }
        cache 30
        loop
        reload
        loadbalance
    }
EOF
Enter fullscreen mode Exit fullscreen mode

Adım 3: CA Kurulumu ve Peer Kayıtları

Sertifika otoritesi (CA) kurulumu ve peer kayıtları yapılıyor. Bu adım, ağın güvenlik ve kimlik doğrulama mekanizmalarının temelini oluşturur.

Org1:

# CA Kurulumu org1 için
kubectl hlf ca create --image=$CA_IMAGE --version=$CA_VERSION --storage-class=standard --capacity=1Gi --name=org1-ca \
    --enroll-id=enroll --enroll-pw=enrollpw --hosts=org1-ca.localho.st --istio-port=443

kubectl wait --timeout=180s --for=condition=Running fabriccas.hlf.kungfusoftware.es --all

curl -k https://org1-ca.localho.st:443/cainfo

# Peerler için org1'de kullanıcı kaydı
kubectl hlf ca register --name=org1-ca --user=peer --secret=peerpw --type=peer \
 --enroll-id enroll --enroll-secret=enrollpw --mspid Org1MSP

# Peer Kurulumu org1 için
kubectl hlf peer create --statedb=couchdb --image=$PEER_IMAGE --version=$PEER_VERSION --storage-class=standard --enroll-id=peer --mspid=Org1MSP \
        --enroll-pw=peerpw --capacity=5Gi --name=org1-peer0 --ca-name=org1-ca.default \
        --hosts=peer0-org1.localho.st --istio-port=443


kubectl wait --timeout=180s --for=condition=Running fabricpeers.hlf.kungfusoftware.es --all
Enter fullscreen mode Exit fullscreen mode

Org2:

# CA Kurulumu org2 için
kubectl hlf ca create --image=$CA_IMAGE --version=$CA_VERSION --storage-class=standard --capacity=1Gi --name=org2-ca \
    --enroll-id=enroll --enroll-pw=enrollpw --hosts=org2-ca.localho.st --istio-port=443

kubectl wait --timeout=180s --for=condition=Running fabriccas.hlf.kungfusoftware.es --all

curl -k https://org2-ca.localho.st:443/cainfo

# Peerler için org2'de kullanıcı kaydı
kubectl hlf ca register --name=org2-ca --user=peer --secret=peerpw --type=peer \
 --enroll-id enroll --enroll-secret=enrollpw --mspid Org2MSP

# Peer Kurulumu org2 için
kubectl hlf peer create --statedb=couchdb --image=$PEER_IMAGE --version=$PEER_VERSION --storage-class=standard --enroll-id=peer --mspid=Org2MSP \
        --enroll-pw=peerpw --capacity=5Gi --name=org2-peer0 --ca-name=org2-ca.default \
        --hosts=peer0-org2.localho.st --istio-port=443


kubectl wait --timeout=180s --for=condition=Running fabricpeers.hlf.kungfusoftware.es --all
Enter fullscreen mode Exit fullscreen mode

Org3:

# CA Kurulumu org3 için
kubectl hlf ca create --image=$CA_IMAGE --version=$CA_VERSION --storage-class=standard --capacity=1Gi --name=org3-ca \
    --enroll-id=enroll --enroll-pw=enrollpw --hosts=org3-ca.localho.st --istio-port=443

kubectl wait --timeout=180s --for=condition=Running fabriccas.hlf.kungfusoftware.es --all

curl -k https://org3-ca.localho.st:443/cainfo

# Peerler için org3'de kullanıcı kaydı
kubectl hlf ca register --name=org3-ca --user=peer --secret=peerpw --type=peer \
 --enroll-id enroll --enroll-secret=enrollpw --mspid Org3MSP

# Peer Kurulumu org3 için
kubectl hlf peer create --statedb=couchdb --image=$PEER_IMAGE --version=$PEER_VERSION --storage-class=standard --enroll-id=peer --mspid=Org3MSP \
        --enroll-pw=peerpw --capacity=5Gi --name=org3-peer0 --ca-name=org3-ca.default \
        --hosts=peer0-org3.localho.st --istio-port=443


kubectl wait --timeout=180s --for=condition=Running fabricpeers.hlf.kungfusoftware.es --all
Enter fullscreen mode Exit fullscreen mode

Org4:

# CA Kurulumu org4 için
kubectl hlf ca create --image=$CA_IMAGE --version=$CA_VERSION --storage-class=standard --capacity=1Gi --name=org4-ca \
    --enroll-id=enroll --enroll-pw=enrollpw --hosts=org4-ca.localho.st --istio-port=443

kubectl wait --timeout=180s --for=condition=Running fabriccas.hlf.kungfusoftware.es --all

curl -k https://org4-ca.localho.st:443/cainfo

# Peerler için org4'de kullanıcı kaydı
kubectl hlf ca register --name=org4-ca --user=peer --secret=peerpw --type=peer \
 --enroll-id enroll --enroll-secret=enrollpw --mspid Org4MSP

# Peer Kurulumu org4 için
kubectl hlf peer create --statedb=couchdb --image=$PEER_IMAGE --version=$PEER_VERSION --storage-class=standard --enroll-id=peer --mspid=Org4MSP \
        --enroll-pw=peerpw --capacity=5Gi --name=org4-peer0 --ca-name=org4-ca.default \
        --hosts=peer0-org4.localho.st --istio-port=443


kubectl wait --timeout=180s --for=condition=Running fabricpeers.hlf.kungfusoftware.es --all
Enter fullscreen mode Exit fullscreen mode

Adım 4: Orderer Kurulumu

İşlem sıralayıcı (orderer) bileşeninin kurulumu ve yapılandırılması gerçekleştiriliyor. Orderer, ağ üzerindeki işlemlerin düzenini ve tutarlılığını sağlar.

kubectl hlf ca create  --image=$CA_IMAGE --version=$CA_VERSION --storage-class=standard --capacity=1Gi --name=ord-ca \
    --enroll-id=enroll --enroll-pw=enrollpw --hosts=ord-ca.localho.st --istio-port=443

kubectl wait --timeout=180s --for=condition=Running fabriccas.hlf.kungfusoftware.es --all


curl -vik https://ord-ca.localho.st:443/cainfo

kubectl hlf ca register --name=ord-ca --user=orderer --secret=ordererpw \
    --type=orderer --enroll-id enroll --enroll-secret=enrollpw --mspid=OrdererMSP --ca-url="https://ord-ca.localho.st:443"

kubectl hlf ordnode create --image=$ORDERER_IMAGE --version=$ORDERER_VERSION \
    --storage-class=standard --enroll-id=orderer --mspid=OrdererMSP \
    --enroll-pw=ordererpw --capacity=2Gi --name=ord-node1 --ca-name=ord-ca.default \
    --hosts=orderer0-ord.localho.st --istio-port=443

kubectl wait --timeout=180s --for=condition=Running fabricorderernodes.hlf.kungfusoftware.es --all

kubectl get pods

openssl s_client -connect orderer0-ord.localho.st:443
Enter fullscreen mode Exit fullscreen mode

Adım 5: Kullanıcı Kaydı

Bu adımda, orderer ve diğer organizasyonlar için kullanıcı kayıtları yapılarak ağ üzerindeki roller ve yetkiler tanımlanıyor.

Orderer:

# register
kubectl hlf ca register --name=ord-ca --user=admin --secret=adminpw \
    --type=admin --enroll-id enroll --enroll-secret=enrollpw --mspid=OrdererMSP

# enroll

kubectl hlf ca enroll --name=ord-ca --namespace=default \
    --user=admin --secret=adminpw --mspid OrdererMSP \
    --ca-name tlsca  --output orderermsp.yaml
Enter fullscreen mode Exit fullscreen mode

Org1:

# Kullanıcı Kaydı (Register)
kubectl hlf ca register --name=org1-ca --namespace=default --user=admin --secret=adminpw \
    --type=admin --enroll-id enroll --enroll-secret=enrollpw --mspid=Org1MSP

# Kayıt (Enroll)
kubectl hlf ca enroll --name=org1-ca --namespace=default \
    --user=admin --secret=adminpw --mspid Org1MSP \
    --ca-name ca --output org1msp.yaml
Enter fullscreen mode Exit fullscreen mode

Org2:

# Kullanıcı Kaydı (Register)
kubectl hlf ca register --name=org2-ca --namespace=default --user=admin --secret=adminpw \
    --type=admin --enroll-id enroll --enroll-secret=enrollpw --mspid=Org2MSP

# Kayıt (Enroll)
kubectl hlf ca enroll --name=org2-ca --namespace=default \
    --user=admin --secret=adminpw --mspid Org2MSP \
    --ca-name ca --output org2msp.yaml
Enter fullscreen mode Exit fullscreen mode

Org3:

# Kullanıcı Kaydı (Register)
kubectl hlf ca register --name=org3-ca --namespace=default --user=admin --secret=adminpw \
    --type=admin --enroll-id enroll --enroll-secret=enrollpw --mspid=Org3MSP

# Kayıt (Enroll)
kubectl hlf ca enroll --name=org3-ca --namespace=default \
    --user=admin --secret=adminpw --mspid Org3MSP \
    --ca-name ca --output org3msp.yaml
Enter fullscreen mode Exit fullscreen mode

Org4:

# Kullanıcı Kaydı (Register)
kubectl hlf ca register --name=org4-ca --namespace=default --user=admin --secret=adminpw \
    --type=admin --enroll-id enroll --enroll-secret=enrollpw --mspid=Org4MSP

# Kayıt (Enroll)
kubectl hlf ca enroll --name=org4-ca --namespace=default \
    --user=admin --secret=adminpw --mspid Org4MSP \
    --ca-name ca --output org4msp.yaml
Enter fullscreen mode Exit fullscreen mode

Adım 6: Cüzdan Oluşturma

Bu adımda, MSP (Membership Service Provider) bilgilerini içeren bir cüzdan (wallet) oluşturuluyor. Bu cüzdan, ağdaki çeşitli bileşenlerin kimlik bilgilerini güvenli bir şekilde saklar.

# Secret Oluşturma
kubectl create secret generic wallet --namespace=default \
        --from-file=org1msp.yaml=$PWD/org1msp.yaml \
        --from-file=org2msp.yaml=$PWD/org2msp.yaml \
        --from-file=org3msp.yaml=$PWD/org3msp.yaml \
        --from-file=org4msp.yaml=$PWD/org4msp.yaml \
        --from-file=orderermsp.yaml=$PWD/orderermsp.yaml
Enter fullscreen mode Exit fullscreen mode

Adım 7: Ana Kanalın Oluşturulması (demo kanalı)

Ağın ana iletişim kanalı, demo kanalı oluşturuluyor. Bu kanal, ağdaki tüm peerler ve ordererlar arasında iletişimi sağlar. Kanalın yapılandırması, ağın temel operasyonel parametrelerini belirler.

export PEER_ORG_SIGN_CERT=$(kubectl get fabriccas org1-ca -o=jsonpath='{.status.ca_cert}')
export PEER_ORG_TLS_CERT=$(kubectl get fabriccas org1-ca -o=jsonpath='{.status.tlsca_cert}')
export IDENT_8=$(printf "%8s" "")
export PEER_ORG_SIGN_CERT=$(kubectl get fabriccas org2-ca -o=jsonpath='{.status.ca_cert}')
export PEER_ORG_TLS_CERT=$(kubectl get fabriccas org2-ca -o=jsonpath='{.status.tlsca_cert}')
export IDENT_8=$(printf "%8s" "")
export PEER_ORG_SIGN_CERT=$(kubectl get fabriccas org3-ca -o=jsonpath='{.status.ca_cert}')
export PEER_ORG_TLS_CERT=$(kubectl get fabriccas org3-ca -o=jsonpath='{.status.tlsca_cert}')
export IDENT_8=$(printf "%8s" "")
export PEER_ORG_SIGN_CERT=$(kubectl get fabriccas org4-ca -o=jsonpath='{.status.ca_cert}')
export PEER_ORG_TLS_CERT=$(kubectl get fabriccas org4-ca -o=jsonpath='{.status.tlsca_cert}')
export IDENT_8=$(printf "%8s" "")
export ORDERER_TLS_CERT=$(kubectl get fabriccas ord-ca -o=jsonpath='{.status.tlsca_cert}' | sed -e "s/^/${IDENT_8}/" )
export ORDERER0_TLS_CERT=$(kubectl get fabricorderernodes ord-node1 -o=jsonpath='{.status.tlsCert}' | sed -e "s/^/        /" )

kubectl apply -f - <<EOF
apiVersion: hlf.kungfusoftware.es/v1alpha1
kind: FabricMainChannel
metadata:
  name: demo
spec:
  name: demo
  adminOrdererOrganizations:
    - mspID: OrdererMSP
  adminPeerOrganizations:
    - mspID: Org1MSP
    - mspID: Org2MSP
    - mspID: Org3MSP
    - mspID: Org4MSP
  channelConfig:
    application:
      acls: null
      capabilities:
        - V2_0
      policies: null
    capabilities:
      - V2_0
    orderer:
      batchSize:
        absoluteMaxBytes: 1048576
        maxMessageCount: 10
        preferredMaxBytes: 524288
      batchTimeout: 2s
      capabilities:
        - V2_0
      etcdRaft:
        options:
          electionTick: 10
          heartbeatTick: 1
          maxInflightBlocks: 5
          snapshotIntervalSize: 16777216
          tickInterval: 500ms
      ordererType: etcdraft
      policies: null
      state: STATE_NORMAL
    policies: null
  externalOrdererOrganizations: []
  peerOrganizations:
    - mspID: Org1MSP
      caName: "org1-ca"
      caNamespace: "default"
    - mspID: Org2MSP
      caName: "org2-ca"
      caNamespace: "default"
    - mspID: Org3MSP
      caName: "org3-ca"
      caNamespace: "default"
    - mspID: Org4MSP
      caName: "org4-ca"
      caNamespace: "default"
  identities:
    OrdererMSP:
      secretKey: orderermsp.yaml
      secretName: wallet
      secretNamespace: default
    Org1MSP:
      secretKey: org1msp.yaml
      secretName: wallet
      secretNamespace: default
    Org2MSP:
      secretKey: org2msp.yaml
      secretName: wallet
      secretNamespace: default
    Org3MSP:
      secretKey: org3msp.yaml
      secretName: wallet
      secretNamespace: default
    Org4MSP:
      secretKey: org4msp.yaml
      secretName: wallet
      secretNamespace: default
  externalPeerOrganizations: []
  ordererOrganizations:
    - caName: "ord-ca"
      caNamespace: "default"
      externalOrderersToJoin:
        - host: ord-node1
          port: 7053
      mspID: OrdererMSP
      ordererEndpoints:
        - ord-node1:7050
      orderersToJoin: []
  orderers:
    - host: ord-node1
      port: 7050
      tlsCert: |-
${ORDERER0_TLS_CERT}
EOF
Enter fullscreen mode Exit fullscreen mode

Kanalın oluşturulduğu kontrol edilir:

kubectl get fabricmainchannels.hlf.kungfusoftware.es
Enter fullscreen mode Exit fullscreen mode

Adım 8: Takipçi Kanalların Oluşturulması

Her organizasyon için takipçi kanallar oluşturuluyor. Bu kanallar, ana demo kanalına bağlı olarak çalışır ve organizasyonların kendi peerlerine özel işlemleri yönetmesine olanak tanır.

Org1:

# org1 için
export IDENT_8=$(printf "%8s" "")
export ORDERER0_TLS_CERT=$(kubectl get fabricorderernodes ord-node1 -o=jsonpath='{.status.tlsCert}' | sed -e "s/^/${IDENT_8}/" )

kubectl apply -f - <<EOF
apiVersion: hlf.kungfusoftware.es/v1alpha1
kind: FabricFollowerChannel
metadata:
  name: demo-org1msp
spec:
  anchorPeers:
    - host: org1-peer0.default
      port: 7051
  hlfIdentity:
    secretKey: org1msp.yaml
    secretName: wallet
    secretNamespace: default
  mspId: Org1MSP
  name: demo
  externalPeersToJoin: []
  orderers:
    - certificate: |
${ORDERER0_TLS_CERT}
      url: grpcs://ord-node1.default:7050
  peersToJoin:
    - name: org1-peer0
      namespace: default
EOF
Enter fullscreen mode Exit fullscreen mode

Org2:

# org2 için
export IDENT_8=$(printf "%8s" "")
export ORDERER0_TLS_CERT=$(kubectl get fabricorderernodes ord-node1 -o=jsonpath='{.status.tlsCert}' | sed -e "s/^/${IDENT_8}/" )

kubectl apply -f - <<EOF
apiVersion: hlf.kungfusoftware.es/v1alpha1
kind: FabricFollowerChannel
metadata:
  name: demo-org2msp
spec:
  anchorPeers:
    - host: org2-peer0.default
      port: 7051
  hlfIdentity:
    secretKey: org2msp.yaml
    secretName: wallet
    secretNamespace: default
  mspId: Org2MSP
  name: demo
  externalPeersToJoin: []
  orderers:
    - certificate: |
${ORDERER0_TLS_CERT}
      url: grpcs://ord-node1.default:7050
  peersToJoin:
    - name: org2-peer0
      namespace: default
EOF
Enter fullscreen mode Exit fullscreen mode

Org3:

# org3 için
export IDENT_8=$(printf "%8s" "")
export ORDERER0_TLS_CERT=$(kubectl get fabricorderernodes ord-node1 -o=jsonpath='{.status.tlsCert}' | sed -e "s/^/${IDENT_8}/" )

kubectl apply -f - <<EOF
apiVersion: hlf.kungfusoftware.es/v1alpha1
kind: FabricFollowerChannel
metadata:
  name: demo-org3msp
spec:
  anchorPeers:
    - host: org3-peer0.default
      port: 7051
  hlfIdentity:
    secretKey: org3msp.yaml
    secretName: wallet
    secretNamespace: default
  mspId: Org3MSP
  name: demo
  externalPeersToJoin: []
  orderers:
    - certificate: |
${ORDERER0_TLS_CERT}
      url: grpcs://ord-node1.default:7050
  peersToJoin:
    - name: org3-peer0
      namespace: default
EOF
Enter fullscreen mode Exit fullscreen mode

Org4:

# org4 için
export IDENT_8=$(printf "%8s" "")
export ORDERER0_TLS_CERT=$(kubectl get fabricorderernodes ord-node1 -o=jsonpath='{.status.tlsCert}' | sed -e "s/^/${IDENT_8}/" )

kubectl apply -f - <<EOF
apiVersion: hlf.kungfusoftware.es/v1alpha1
kind: FabricFollowerChannel
metadata:
  name: demo-org4msp
spec:
  anchorPeers:
    - host: org4-peer0.default
      port: 7051
  hlfIdentity:
    secretKey: org4msp.yaml
    secretName: wallet
    secretNamespace: default
  mspId: Org4MSP
  name: demo
  externalPeersToJoin: []
  orderers:
    - certificate: |
${ORDERER0_TLS_CERT}
      url: grpcs://ord-node1.default:7050
  peersToJoin:
    - name: org4-peer0
      namespace: default
EOF
Enter fullscreen mode Exit fullscreen mode

Peer'ların kanala dahil olduğu kontrol edilir:

kubectl get fabricfollowerchannels.hlf.kungfusoftware.es
Enter fullscreen mode Exit fullscreen mode

Adım 9: Ağ Yapılandırmasının İncelenmesi

Burada, oluşturulan ağın genel yapılandırması inceleniyor ve network.yaml dosyası oluşturuluyor. Bu dosya, ağın yapılandırma detaylarını içerir.

kubectl hlf inspect --output network.yaml -o Org1MSP -o Org2MSP -o Org3MSP -o Org4MSP -o OrdererMSP
Enter fullscreen mode Exit fullscreen mode

Adım 10: CA Kayıt İşlemleri

Bu adımda, her organizasyon için CA'ya (Certificate Authority) admin kullanıcıları kaydediliyor. Bu işlem, ağın güvenliğinin temelini oluşturur.

kubectl hlf ca register --name=org1-ca --user=admin --secret=adminpw --type=admin \
 --enroll-id enroll --enroll-secret=enrollpw --mspid Org1MSP \
 --attributes="isAdmin=true:ecert,role=isAdmin:ecert"

kubectl hlf ca register --name=org2-ca --user=admin --secret=adminpw --type=admin \
 --enroll-id enroll --enroll-secret=enrollpw --mspid Org2MSP \
 --attributes="isAdmin=true:ecert,role=isAdmin:ecert"

kubectl hlf ca register --name=org3-ca --user=admin --secret=adminpw --type=admin \
 --enroll-id enroll --enroll-secret=enrollpw --mspid Org3MSP \
 --attributes="isAdmin=true:ecert,role=isAdmin:ecert"

kubectl hlf ca register --name=org4-ca --user=admin --secret=adminpw --type=admin \
 --enroll-id enroll --enroll-secret=enrollpw --mspid Org4MSP \
 --attributes="isAdmin=true:ecert,role=isAdmin:ecert"
Enter fullscreen mode Exit fullscreen mode

Adım 11: Kullanıcıların Kaydedilmesi

Her organizasyon için admin kullanıcıları, CA üzerinden kaydediliyor. Bu kullanıcılar, ağ üzerinde yönetici rollerini üstlenir.

kubectl hlf ca enroll --name=org1-ca --user=admin --secret=adminpw --mspid Org1MSP \
        --ca-name ca  --output peer-org1.yaml

kubectl hlf ca enroll --name=org2-ca --user=admin --secret=adminpw --mspid Org2MSP \
        --ca-name ca  --output peer-org2.yaml

kubectl hlf ca enroll --name=org3-ca --user=admin --secret=adminpw --mspid Org3MSP \
        --ca-name ca  --output peer-org3.yaml

kubectl hlf ca enroll --name=org4-ca --user=admin --secret=adminpw --mspid Org4MSP \
        --ca-name ca  --output peer-org4.yaml
Enter fullscreen mode Exit fullscreen mode

Adım 12: Kullanıcıların Ağa Eklenmesi

Kaydedilen kullanıcılar, ağa ekleniyor. Bu işlem, kullanıcıların ağ üzerindeki rollerini ve yetkilerini etkinleştirir.

kubectl hlf utils adduser --userPath=peer-org1.yaml --config=network.yaml --username=admin --mspid=Org1MSP

kubectl hlf utils adduser --userPath=peer-org2.yaml --config=network.yaml --username=admin --mspid=Org2MSP

kubectl hlf utils adduser --userPath=peer-org3.yaml --config=network.yaml --username=admin --mspid=Org3MSP

kubectl hlf utils adduser --userPath=peer-org4.yaml --config=network.yaml --username=admin --mspid=Org4MSP
Enter fullscreen mode Exit fullscreen mode

Adım 13: Chaincode Paketleme ve Yükleme

Bu adımda, ağ üzerinde çalıştırılacak olan chaincode (akıllı kontrat) paketleniyor ve peerlere yükleniyor.

rm code.tar.gz chaincode.tgz


export CHAINCODE_NAME=test
export CHAINCODE_LABEL=test

cat << METADATA-EOF > "metadata.json"
{
    "type": "ccaas",
    "label": "${CHAINCODE_LABEL}"
}
METADATA-EOF


cat > "connection.json" <<CONN_EOF
{
  "address": "${CHAINCODE_NAME}:7052",
  "dial_timeout": "10s",
  "tls_required": false
}
CONN_EOF



tar cfz code.tar.gz connection.json
tar cfz chaincode.tgz metadata.json code.tar.gz
export PACKAGE_ID=$(kubectl hlf chaincode calculatepackageid --path=chaincode.tgz --language=node --label=$CHAINCODE_LABEL)
echo "PACKAGE_ID=$PACKAGE_ID"
Enter fullscreen mode Exit fullscreen mode
kubectl hlf chaincode install --path=./chaincode.tgz \
    --config=network.yaml --language=golang --label=$CHAINCODE_LABEL --user=admin --peer=org1-peer0.default





kubectl hlf chaincode install --path=./chaincode.tgz \
    --config=network.yaml --language=golang --label=$CHAINCODE_LABEL --user=admin --peer=org2-peer0.default




kubectl hlf chaincode install --path=./chaincode.tgz \
    --config=network.yaml --language=golang --label=$CHAINCODE_LABEL --user=admin --peer=org3-peer0.default




kubectl hlf chaincode install --path=./chaincode.tgz \
    --config=network.yaml --language=golang --label=$CHAINCODE_LABEL --user=admin --peer=org4-peer0.default


Enter fullscreen mode Exit fullscreen mode
kubectl hlf externalchaincode sync --image=docker-hesap-adi/image:latest \
    --name=$CHAINCODE_NAME \
    --namespace=default \
    --package-id=$PACKAGE_ID \
    --tls-required=false \
    --replicas=1



kubectl hlf chaincode queryinstalled --config=network.yaml --user=admin --peer=org1-peer0.default

kubectl hlf chaincode queryinstalled --config=network.yaml --user=admin --peer=org2-peer0.default

kubectl hlf chaincode queryinstalled --config=network.yaml --user=admin --peer=org3-peer0.default

kubectl hlf chaincode queryinstalled --config=network.yaml --user=admin --peer=org4-peer0.default
Enter fullscreen mode Exit fullscreen mode

Adım 13: Chaincode Onayı

Her organizasyon için chaincode'u onaylayın:

export SEQUENCE=1
export VERSION="1.0"
kubectl hlf chaincode approveformyorg --config=network.yaml --user=admin --peer=org1-peer0.default \
    --package-id=$PACKAGE_ID \
    --version "$VERSION" --sequence "$SEQUENCE" --name=test \
    --policy="OR('Org1MSP.member', 'Org2MSP.member', 'Org3MSP.member', 'Org4MSP.member')" --channel=demo

kubectl hlf chaincode approveformyorg --config=network.yaml --user=admin --peer=org2-peer0.default \
    --package-id=$PACKAGE_ID \
    --version "$VERSION" --sequence "$SEQUENCE" --name=test \
    --policy="OR('Org1MSP.member', 'Org2MSP.member', 'Org3MSP.member', 'Org4MSP.member')" --channel=demo

kubectl hlf chaincode approveformyorg --config=network.yaml --user=admin --peer=org3-peer0.default \
    --package-id=$PACKAGE_ID \
    --version "$VERSION" --sequence "$SEQUENCE" --name=test \
    --policy="OR('Org1MSP.member', 'Org2MSP.member', 'Org3MSP.member', 'Org4MSP.member')" --channel=demo

kubectl hlf chaincode approveformyorg --config=network.yaml --user=admin --peer=org4-peer0.default \
    --package-id=$PACKAGE_ID \
    --version "$VERSION" --sequence "$SEQUENCE" --name=test \
    --policy="OR('Org1MSP.member', 'Org2MSP.member', 'Org3MSP.member', 'Org4MSP.member')" --channel=demo
Enter fullscreen mode Exit fullscreen mode

Adım 14: Chaincode Commit İşlemi

Chaincode, ağdaki her organizasyon tarafından onaylanıyor ve ardından ana kanala commit ediliyor. Bu, chaincode'un ağ üzerinde aktif hale gelmesini sağlar.

kubectl hlf chaincode commit --config=network.yaml --user=admin --mspid=Org1MSP \
    --version "$VERSION" --sequence "$SEQUENCE" --name=test \
    --policy="OR('Org1MSP.member', 'Org2MSP.member', 'Org3MSP.member', 'Org4MSP.member')" --channel=demo
Enter fullscreen mode Exit fullscreen mode

Top comments (0)