Çok Taraflı Hesaplama ve Gizli Alan ile Dijital Varlıkları Dönüştürme

1. Genel Bakış

Başlamadan önce, tamamen gerekli olmasa da aşağıdaki özellikler ve kavramlar hakkında bilgi sahibi olmanız bu codelab'de faydalı olacaktır.

4670cd5427aa39a6.png

Neler öğreneceksiniz?

Bu laboratuvar, Confidential Space'i kullanarak MPC uyumlu blok zinciri imzalama işlemini gerçekleştirme konusunda referans uygulama sunar. Kavramları açıklamak için Primus Şirketi'nin dijital öğeleri Secundus Şirketi'ne aktarmak istediği bir senaryoyu ele alacağız. Bu senaryoda Primus Şirketi, MPC uyumlu bir model kullanır. Bu nedenle, ayrı özel anahtarlar kullanmak yerine dağıtılmış anahtar paylaşımlarını kullanır. Bu anahtar paylaşımları birden fazla taraf (bu örnekte Ayşe ve Ali) tarafından tutulur. Bu yaklaşım, Company Primus'a basitleştirilmiş kullanıcı deneyimi, operasyonel verimlilik ve özel anahtarları üzerinde kontrol gibi çeşitli avantajlar sağlar.

Bu sürecin temel yönlerini açıklamak için teknik kurulumu ayrıntılı olarak anlatacak ve dijital varlıkların Company Primus'tan Company Secundus'a aktarılmasını başlatan onay ve imza sürecinde size yol göstereceğiz. İşlemin, her ikisi de Primus Şirketi çalışanı olan Ali ve Ayşe tarafından onaylanması gerektiğini lütfen unutmayın.

Bu referans uygulama, imza işlemlerini gösterse de MPC anahtar yönetiminin tüm yönlerini kapsamaz. Örneğin, anahtar oluşturma konusunu ele almıyoruz. Ayrıca, Google Cloud dışı hizmetleri kullanarak ortak imzalar oluşturma veya ortak imza sahiplerinin kendi ortamlarında blok zinciri imzaları oluşturmasını sağlama gibi alternatif ve tamamlayıcı yaklaşımlar da vardır. Bu yaklaşımlar daha merkeziyetsiz bir mimari sunar. Bu laboratuvarın, Google Cloud'da MPC'ye yönelik farklı yaklaşımlara ilham vermesini umuyoruz.

İmza sahibi anahtar materyallerini kullanarak Confidential Space'te bir Ethereum işlemi imzalayan basit bir iş yüküyle çalışacaksınız. Ethereum işlem imzası, kullanıcının Ethereum blok zincirindeki bir işlemi yetkilendirebileceği bir süreçtir. Bir Ethereum işlemi göndermek için özel anahtarınızla imzalamanız gerekir. Bu işlem, hesabın sahibi olduğunuzu kanıtlar ve işlemi yetkilendirir. İmzalama süreci şu şekildedir:

  1. Gönderen, alıcı adresini, gönderilecek ETH miktarını ve diğer ilgili verileri belirten bir işlem nesnesi oluşturur.
  2. İşlem verilerini karma oluşturmak için gönderenin özel anahtarı kullanılır.
  3. Karma daha sonra özel anahtarla imzalanır.
  4. İmza, işlem nesnesine eklenir.
  5. İşlem, Ethereum ağına yayınlanır.

Ağdaki bir düğüm bir işlem aldığında, işlemin hesap sahibi tarafından imzalandığından emin olmak için imzayı doğrular. İmza geçerliyse düğüm, işlemi blok zincirine ekler.

Başlamak için gerekli Cloud kaynaklarını yapılandıracaksınız. Ardından, iş yükünü Confidential Space'te çalıştırırsınız. Bu codelab, aşağıdaki üst düzey adımlarda size yol gösterecektir:

  • Confidential Space'i çalıştırmak için gereken Cloud kaynaklarını yapılandırma
  • Aşağıdakilerin özelliklerine göre korunan kaynaklara erişimi yetkilendirme:
  • Ne: İş yükü kapsayıcısı
  • Nerede: Confidential Space ortamı (Gizli Sanal Makine'deki Confidential Space görüntüsü)
  • Kim: İş yükünü çalıştıran hesap
  • İş yükünü, Confidential Space VM görüntüsünü çalıştıran bir Gizli Sanal Makine'de çalıştırma

Gerekli API'ler

Bu kılavuzu tamamlayabilmek için belirtilen projelerde aşağıdaki API'leri etkinleştirmeniz gerekir.

API adı

API başlığı

cloudkms.googleapis.com

Cloud KMS

compute.googleapis.com

Compute Engine

confidentialcomputing.googleapis.com

Gizli Bilişim

iamcredentials.googleapis.com

IAM ile yönetin.

artifactregistry.googleapis.com

Artifact Registry

2. Bulut Kaynaklarını Ayarlama

Başlamadan önce

  • Bu codelab'de kullanılan gerekli komut dosyalarını almak için aşağıdaki komutu kullanarak bu depoyu klonlayın.
git clone https://github.com/GoogleCloudPlatform/confidential-space.git
  • Bu codelab'in dizinini değiştirin.
cd confidential-space/codelabs/digital_asset_transaction_codelab/scripts
  • Gerekli proje ortamı değişkenlerini aşağıda gösterildiği gibi ayarladığınızdan emin olun. GCP projesi oluşturma hakkında daha fazla bilgi için lütfen bu codelab'i inceleyin. Proje kimliğinin nasıl alınacağı ve proje adı ile proje numarasından nasıl farklı olduğu hakkında ayrıntılı bilgi edinmek için bu makaleyi inceleyebilirsiniz. .
export PRIMUS_PROJECT_ID=<GCP project id>
gcloud services enable \
   cloudapis.googleapis.com \
    cloudkms.googleapis.com \
    cloudresourcemanager.googleapis.com \
    cloudshell.googleapis.com \
    container.googleapis.com \
    containerregistry.googleapis.com \
    iam.googleapis.com \
    confidentialcomputing.googleapis.com
  • Kaynak adları için değişkenleri ayarlamak üzere aşağıdaki komutu kullanabilirsiniz. Bu işlemin, A şirketi için GCP projenize özgü kaynak adlarını (ör. export PRIMUS_INPUT_STORAGE_BUCKET='primus-input-bucket') geçersiz kılacağını unutmayın.
  • A Şirketi'ndeki GCP projeniz için aşağıdaki değişkenler ayarlanabilir:

$PRIMUS_INPUT_STORAGE_BUCKET

Şifrelenmiş anahtarların depolandığı bucket.

$PRIMUS_RESULT_STORAGE_BUCKET

MPC işlem sonucunu depolayan paket.

$PRIMUS_KEY

Primus Bank için $PRIMUS_INPUT_STORAGE_BUCKET içinde depolanan verileri şifrelemek üzere kullanılan KMS anahtarı.

$PRIMUS_KEYRING

Primus Bank için $PRIMUS_KEY şifreleme anahtarını oluşturmak üzere kullanılacak KMS anahtarlığı.

$PRIMUS_WIP_PROVIDER

MPC iş yükü hizmeti tarafından imzalanan jetonlar için kullanılacak özellik koşulunu içeren Workload Identity Pool sağlayıcısı.

$PRIMUS_SERVICEACCOUNT

$PRIMUS_WORKLOAD_IDENTITY_POOL'un korunan kaynaklara erişmek için kullandığı hizmet hesabı. Bu hizmet hesabı, $PRIMUS_INPUT_STORAGE_BUCKET paketinde depolanan şifrelenmiş anahtarları görüntüleme iznine sahip olur.

$PRIMUS_ARTIFACT_REPOSITORY

İş yükü container görüntüsünü depolamak için kullanılan yapı deposu.

$WORKLOAD_SERVICEACCOUNT

İş yükünü çalıştıran Confidential VM'ye erişme izni olan hizmet hesabı.

$WORKLOAD_CONTAINER

İş yükünü çalıştıran Docker container'ı.

$WORKLOAD_IMAGE_NAME

İş yükü kapsayıcı resminin adı.

$WORKLOAD_IMAGE_TAG

İş yükü container görüntüsünün etiketi.

  • Kaynak adları için kalan değişken adlarını proje kimliğinize göre değerlere ayarlamak üzere aşağıdaki komut dosyasını çalıştırın.
source config_env.sh

Bulut kaynaklarını ayarlama

Bu adımda, çok taraflı hesaplama için gereken bulut kaynaklarını ayarlayacaksınız. Bu laboratuvarda şu özel anahtarı kullanacaksınız: 0000000000000000000000000000000000000000000000000000000000000001

Üretim ortamında kendi özel anahtarınızı oluşturursunuz. Ancak bu laboratuvarın amaçları doğrultusunda bu özel anahtarı iki paya bölecek ve her birini şifreleyeceğiz. Üretim senaryosunda anahtarlar asla düz metin dosyalarında depolanmamalıdır. Bunun yerine, özel anahtar Google Cloud dışında oluşturulabilir (veya tamamen atlanıp özel MPC anahtar parçası oluşturma ile değiştirilebilir) ve ardından hiç kimsenin özel anahtara veya anahtar paylaşımlarına erişemeyeceği şekilde şifrelenebilir. Bu laboratuvarın amaçları doğrultusunda Gcloud CLI'yı kullanacağız.

Gerekli bulut kaynaklarını ayarlamak için aşağıdaki komut dosyasını çalıştırın. Bu adımlar kapsamında, aşağıda belirtilen kaynaklar oluşturulur:

  • Şifrelenmiş özel anahtar paylaşımlarını depolamak için bir Cloud Storage paketi ($PRIMUS_INPUT_STORAGE_BUCKET).
  • Dijital varlık işleminin sonucunu depolamak için bir Cloud Storage paketi ($PRIMUS_RESULT_STORAGE_BUCKET).
  • Özel anahtar paylaşımlarını şifrelemek için KMS'de bir şifreleme anahtarı ($PRIMUS_KEY) ve anahtarlık ($PRIMUS_KEYRING).
  • Sağlayıcısı altında yapılandırılan özellik koşullarına göre talepleri doğrulamak için bir Workload Identity Pool ($PRIMUS_WORKLOAD_IDENTITY_POOL).
  • Yukarıda belirtilen Workload Identity havuzuna ($PRIMUS_WORKLOAD_IDENTITY_POOL) eklenmiş ve aşağıdaki IAM erişimine sahip bir hizmet hesabı ($PRIMUS_SERVICEACCOUNT):
  • roles/cloudkms.cryptoKeyDecrypter KMS anahtarını kullanarak verilerin şifresini çözmek için.
  • objectViewer Cloud Storage paketinden veri okumak için.
  • Bu hizmet hesabını Workload Identity Pool'a bağlamak için roles/iam.workloadIdentityUser.
./setup_resources.sh

3. İş Yükü Oluşturma

İş yükü hizmet hesabı oluşturma

Şimdi iş yükü için gerekli roller ve izinlere sahip bir hizmet hesabı oluşturacaksınız. Bunu yapmak için Şirket A için bir iş yükü hizmet hesabı oluşturacak olan aşağıdaki komut dosyasını çalıştırın. Bu hizmet hesabı, iş yükünü çalıştıran sanal makine tarafından kullanılır.

İş yükü hizmet hesabında ($WORKLOAD_SERVICEACCOUNT) aşağıdaki roller bulunur:

  • confidentialcomputing.workloadUser onay jetonu almak için
  • logging.logWriter Cloud Logging'e günlük yazmak için.
  • objectViewer, $PRIMUS_INPUT_STORAGE_BUCKET Cloud Storage paketinden veri okumak için kullanılır.
  • objectUser iş yükü sonucunu $PRIMUS_RESULT_STORAGE_BUCKET Cloud Storage paketine yazmak için.
./create_workload_service_account.sh

İş yükü oluşturma

Bu adımda, iş yükü Docker görüntüsü oluşturulur. Bu codelab'deki iş yükü, şifrelenmiş özel anahtar paylaşımlarını kullanarak varlık aktarımı için dijital işlemleri imzalayan basit bir Node.js MPC uygulamasıdır. İş yükü proje kodu burada verilmiştir. İş yükü projesi aşağıdaki dosyaları içerir.

package.json: Bu dosya, iş yükü MPC uygulamasında kullanılması gereken paketlerin listesini içerir. Bu örnekte @google-cloud/kms, @google-cloud/storage, ethers ve fast-crc32c kitaplıklarını kullanıyoruz. Bu codelab'de kullanacağımız package.json dosyasını burada bulabilirsiniz.

index.js: Bu, iş yükü uygulamasının giriş noktasıdır ve iş yükü kapsayıcısı başlatıldığında hangi komutların çalıştırılması gerektiğini belirtir. Ayrıca, kullanıcılardan imza isteyen güvenilmeyen bir uygulama tarafından normalde sağlanan, imzalanmamış örnek bir işlem de ekledik. Bu index.js dosyası, bir sonraki adımda oluşturacağımız mpc.js dosyasındaki işlevleri de içe aktarır. index.js dosyasının içeriğini aşağıda bulabilirsiniz. Ayrıca, bu içeriğe buradan da ulaşabilirsiniz.

import {signTransaction, submitTransaction, uploadFromMemory} from './mpc.js';

const signAndSubmitTransaction = async () => {
  try {
    // Create the unsigned transaction object
    const unsignedTransaction = {
      nonce: 0,
      gasLimit: 21000,
      gasPrice: '0x09184e72a000',
      to: '0x0000000000000000000000000000000000000000',
      value: '0x00',
      data: '0x',
    };

    // Sign the transaction
    const signedTransaction = await signTransaction(unsignedTransaction);

    // Submit the transaction to Ganache
    const transaction = await submitTransaction(signedTransaction);

    // Write the transaction receipt
    uploadFromMemory(transaction);

    return transaction;
  } catch (e) {
    console.log(e);
    uploadFromMemory(e);
  }
};

await signAndSubmitTransaction();

mpc.js: İşlem imzalama burada gerçekleşir. Bu dosya, bir sonraki bölümde ele alacağımız kms-decrypt ve credential-config dosyalarındaki işlevleri içe aktarır. Aşağıda mpc.js dosyasının içeriği verilmiştir. Bu içeriği burada da bulabilirsiniz.

import {Storage} from '@google-cloud/storage';
import {ethers} from 'ethers';

import {credentialConfig} from './credential-config.js';
import {decryptSymmetric} from './kms-decrypt.js';

const providers = ethers.providers;
const Wallet = ethers.Wallet;

// The ID of the GCS bucket holding the encrypted keys
const bucketName = process.env.KEY_BUCKET;

// Name of the encrypted key files.
const encryptedKeyFile1 = 'alice_encrypted_key_share';
const encryptedKeyFile2 = 'bob_encrypted_key_share';

// Create a new storage client with the credentials
const storageWithCreds = new Storage({
  credentials: credentialConfig,
});

// Create a new storage client without the credentials
const storage = new Storage();

const downloadIntoMemory = async (keyFile) => {
  // Downloads the file into a buffer in memory.
  const contents =
      await storageWithCreds.bucket(bucketName).file(keyFile).download();

  return contents;
};

const provider =
    new providers.JsonRpcProvider(`http://${process.env.NODE_URL}:80`);

export const signTransaction = async (unsignedTransaction) => {
  /* Check if Alice and Bob have both approved the transaction
  For this example, we're checking if their encrypted keys are available. */
  const encryptedKey1 =
      await downloadIntoMemory(encryptedKeyFile1).catch(console.error);
  const encryptedKey2 =
      await downloadIntoMemory(encryptedKeyFile2).catch(console.error);

  // For each key share, make a call to KMS to decrypt the key
  const privateKeyshare1 = await decryptSymmetric(encryptedKey1[0]);
  const privateKeyshare2 = await decryptSymmetric(encryptedKey2[0]);

  /* Perform the MPC calculations
  In this example, we're combining the private key shares
  Alternatively, you could import your mpc calculations here */
  const wallet = new Wallet(privateKeyshare1 + privateKeyshare2);

  // Sign the transaction
  const signedTransaction = await wallet.signTransaction(unsignedTransaction);

  return signedTransaction;
};

export const submitTransaction = async (signedTransaction) => {
  // This can now be sent to Ganache
  const hash = await provider.sendTransaction(signedTransaction);
  return hash;
};

export const uploadFromMemory = async (contents) => {
  // Upload the results to the bucket without service account impersonation
  await storage.bucket(process.env.RESULTS_BUCKET)
      .file('transaction_receipt_' + Date.now())
      .save(JSON.stringify(contents));
};

kms-decrypt.js: Bu dosya, KMS'de yönetilen anahtarlar kullanılarak yapılan şifre çözme işleminin kodunu içerir. kms-decrypt.js dosyasının içeriğini aşağıda bulabilirsiniz. Ayrıca, dosyayı buradan da indirebilirsiniz.

import {KeyManagementServiceClient} from '@google-cloud/kms';
import crc32c from 'fast-crc32c';

import {credentialConfig} from './credential-config.js';

const projectId = process.env.PRIMUS_PROJECT_ID;
const locationId = process.env.PRIMUS_LOCATION;
const keyRingId = process.env.PRIMUS_ENC_KEYRING;
const keyId = process.env.PRIMUS_ENC_KEY;

// Instantiates a client
const client = new KeyManagementServiceClient({
  credentials: credentialConfig,
});

// Build the key name
const keyName = client.cryptoKeyPath(projectId, locationId, keyRingId, keyId);

export const decryptSymmetric = async (ciphertext) => {
  const ciphertextCrc32c = crc32c.calculate(ciphertext);
  const [decryptResponse] = await client.decrypt({
    name: keyName,
    ciphertext,
    ciphertextCrc32c: {
      value: ciphertextCrc32c,
    },
  });

  // Optional, but recommended: perform integrity verification on
  // decryptResponse. For more details on ensuring E2E in-transit integrity to
  // and from Cloud KMS visit:
  // https://cloud.google.com/kms/docs/data-integrity-guidelines
  if (crc32c.calculate(decryptResponse.plaintext) !==
      Number(decryptResponse.plaintextCrc32c.value)) {
    throw new Error('Decrypt: response corrupted in-transit');
  }

  const plaintext = decryptResponse.plaintext.toString();

  return plaintext;
};

credential-config.js: Bu dosya, hizmet hesabı kimliğine bürünme için iş yükü kimliği havuzu yollarını ve ayrıntılarını depolar. Bu codelab'de kullanacağımız credential-config.js dosyasını burada bulabilirsiniz.

Dockerfile: Son olarak, iş yükü Docker görüntüsünü oluşturmak için kullanılacak Dockerfile'ımızı oluşturacağız. Dockerfile'ı burada belirtildiği gibi tanımlar.

FROM node:16.18.0

ENV NODE_ENV=production

WORKDIR /app

COPY ["package.json", "package-lock.json*", "./"]

RUN npm install --production

COPY . .

LABEL "tee.launch_policy.allow_cmd_override"="true"
LABEL "tee.launch_policy.allow_env_override"="NODE_URL,RESULTS_BUCKET,KEY_BUCKET,PRIMUS_PROJECT_NUMBER,PRIMUS_PROJECT_ID,PRIMUS_WORKLOAD_IDENTITY_POOL,PRIMUS_WIP_PROVIDER,PRIMUS_SERVICEACCOUNT,PRIMUS_ENC_KEYRING,PRIMUS_ENC_KEY"

CMD [ "node", "index.js" ]

Not: Dockerfile'daki LABEL "tee.launch_policy.allow_cmd_override"="true", görüntü yazarı tarafından belirlenen bir lansman politikasıdır. Bu, operatörün iş yükünü yürütürken CMD'yi geçersiz kılmasına olanak tanır. allow_cmd_override varsayılan olarak false değerine ayarlanır. LABEL "tee.launch_policy.allow_env_override", Confidential Space'e hangi ortam değişkenlerinin görüntü kullanıcıları tarafından kullanılabileceğini bildirir .

Aşağıdaki adımların gerçekleştirildiği bir iş yükü oluşturmak için aşağıdaki komut dosyasını çalıştırın:

  • İş yükü Docker görüntüsünü depolamak için Artifact Registry($PRIMUS_ARTIFACT_REPOSITORY) oluşturun.
  • İş yükü kodunu gerekli kaynak adlarıyla güncelleyin. Bu codelab'de kullanılan iş yükü kodunu burada bulabilirsiniz.
  • İş yükü kodunun Docker görüntüsünü oluşturmak için Dockerfile oluşturun. Dockerfile'ı burada bulabilirsiniz.
  • Docker görüntüsünü, önceki adımda oluşturulan Artifact Registry'ye ($PRIMUS_ARTIFACT_REPOSITORY) derleyip yayınlayın.
  • $WORKLOAD_SERVICEACCOUNT için $PRIMUS_ARTIFACT_REPOSITORY okuma izni verin. Bu, iş yükü Docker görüntüsünün Artifact Registry'den çekilmesi için gereklidir.
./create_workload.sh

Blok zinciri düğümünü oluşturma

Ganache Ethereum düğümü

İş yükünü yetkilendirmeden önce Ethereum Ganache örneğini oluşturmamız gerekir. İmzalanan işlem bu Ganache örneğine gönderilir. Lütfen bu örneğin IP adresini not edin. Aşağıdaki komutu çalıştırdıktan sonra API'yi etkinleştirmek için y girmeniz gerekebilir.

gcloud compute instances create-with-container ${ETHEREUM_NODE} \
  --zone=${PRIMUS_PROJECT_ZONE} \
  --tags=http-server \
  --project=${PRIMUS_PROJECT_ID} \
  --shielded-secure-boot \
  --shielded-vtpm \
  --shielded-integrity-monitoring \
  --container-image=docker.io/trufflesuite/ganache:v7.7.3 \
--container-arg=--wallet.accounts=\"0x0000000000000000000000000000000000000000000000000000000000000001,0x21E19E0C9BAB2400000\" \
  --container-arg=--port=80

4. İş yükünü yetkilendirme ve çalıştırma

İş Yükünü Yetkilendirme

Bu adımda, Workload Identity Pool ($PRIMUS_WORKLOAD_IDENTITY_POOL) altında Workload Identity Pool sağlayıcısını ayarlayacağız. Workload Identity için aşağıdaki gibi yapılandırılmış özellik koşulları vardır. Koşullardan biri, iş yükü görüntüsünün beklenen yapı deposundan çekildiğini doğrulamaktır.

gcloud config set project $PRIMUS_PROJECT_ID
gcloud iam workload-identity-pools providers create-oidc ${PRIMUS_WIP_PROVIDER} \
 --location="${PRIMUS_PROJECT_LOCATION}" \
 --workload-identity-pool="$PRIMUS_WORKLOAD_IDENTITY_POOL" \
 --issuer-uri="https://confidentialcomputing.googleapis.com/" \
 --allowed-audiences="https://sts.googleapis.com" \
 --attribute-mapping="google.subject='assertion.sub'" \
 --attribute-condition="assertion.swname == 'CONFIDENTIAL_SPACE' && 'STABLE' in assertion.submods.confidential_space.support_attributes && assertion.submods.container.image_reference == '${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG' && '$WORKLOAD_SERVICEACCOUNT@$PRIMUS_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts"

İş Yükü Çalıştırma

Bu bölümde, iş yükünün Gizli Sanal Makine'de nasıl çalıştırılacağı açıklanmaktadır. Bunun için meta veri işaretini kullanarak gerekli TEE bağımsız değişkenlerini ileteceğiz. Ayrıca, "tee-env-*" işaretini kullanarak iş yükü kapsayıcısı için ortam değişkenleri ayarlayacağız. Resimde aşağıdaki değişkenler bulunur:

  • NODE_URL: İmzalı işlemi işleyecek Ethereum düğümünün URL'si.
  • RESULTS_BUCKET: MPC işlem sonucunu depolayan paket.
  • KEY_BUCKET: MPC ile şifrelenmiş anahtarların depolandığı paket.
  • PRIMUS_PROJECT_NUMBER: Kimlik bilgisi yapılandırma dosyası için kullanılan proje numarası.
  • PRIMUS_PROJECT_ID: Kimlik bilgisi yapılandırma dosyası için kullanılan proje kimliği. İş yükü yürütme sonucu $PRIMUS_RESULT_STORAGE_BUCKET adresinde yayınlanır.
  • PRIMUS_WORKLOAD_IDENTITY_POOL: Talepleri doğrulamak için kullanılan Workload Identity havuzu.
  • PRIMUS_WIP_POROVIDER: İş yükü tarafından sunulan jetonları doğrulamak için kullanılacak özellik koşullarını içeren Workload Identity Pool sağlayıcısı.
  • WORKLOAD_SERVICEACCOUNT: İş yükünün hizmet hesabı.
gcloud compute instances create $WORKLOAD_VM \
 --confidential-compute-type=SEV \
 --shielded-secure-boot \
 --maintenance-policy=TERMINATE \
 --scopes=cloud-platform \
 --zone=${PRIMUS_PROJECT_ZONE} \
 --project=${PRIMUS_PROJECT_ID} \
 --image-project=confidential-space-images \
 --image-family=confidential-space \
 --service-account=$WORKLOAD_SERVICEACCOUNT@$PRIMUS_PROJECT_ID.iam.gserviceaccount.com \
 --metadata "^~^tee-image-reference=${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG~tee-restart-policy=Never~tee-env-NODE_URL=$(gcloud compute instances describe ${ETHEREUM_NODE} --format='get(networkInterfaces[0].networkIP)' --zone=${PRIMUS_PROJECT_ZONE})~tee-env-RESULTS_BUCKET=$PRIMUS_RESULT_STORAGE_BUCKET~tee-env-KEY_BUCKET=$PRIMUS_INPUT_STORAGE_BUCKET~tee-env-PRIMUS_PROJECT_ID=$PRIMUS_PROJECT_ID~tee-env-PRIMUS_PROJECT_NUMBER=$(gcloud projects describe $PRIMUS_PROJECT_ID --format="value(projectNumber)")~tee-env-PRIMUS_WORKLOAD_IDENTITY_POOL=$PRIMUS_WORKLOAD_IDENTITY_POOL~tee-env-PRIMUS_PROJECT_LOCATION=${PRIMUS_PROJECT_LOCATION}~tee-env-PRIMUS_WIP_PROVIDER=$PRIMUS_WIP_PROVIDER~tee-env-PRIMUS_SERVICEACCOUNT=$PRIMUS_SERVICEACCOUNT~tee-env-PRIMUS_KEY=${PRIMUS_KEY}~tee-env-PRIMUS_KEYRING=${PRIMUS_KEYRING}"

Cloud Storage sonuçlarını kontrol etme

İşlem makbuzunu Cloud Storage'da görüntüleyebilirsiniz. Confidential Space'in başlatılması ve sonuçların gösterilmesi birkaç dakika sürebilir. Sanal makine durdurulmuş durumdayken kapsayıcının tamamlandığını anlarsınız.

  1. Cloud Storage Tarayıcısı sayfasına gidin.
  2. $PRIMUS_RESULT_STORAGE_BUCKET simgesini tıklayın.
  3. transaction_receipt dosyasını tıklayın.
  4. İşlem yanıtını indirip görüntülemek için İndir'i tıklayın.

Alternatif olarak, sonucu görüntülemek için aşağıdaki komutları çalıştırabilirsiniz.

gcloud config set project $PRIMUS_PROJECT_ID
gsutil cat gs://$PRIMUS_RESULT_STORAGE_BUCKET/transaction_receipt

Not: Sonuçlar görünmüyorsa Compute Engine Cloud Console sayfasında $WORKLOAD_VM'ye gidip günlükleri görüntülemek için "Seri bağlantı noktası 1 (konsol)"u tıklayabilirsiniz.

Ganache Blockchain İşlemini Kontrol Etme

İşlemi blok zinciri günlüğünde de görüntüleyebilirsiniz.

  1. Cloud Compute Engine sayfasına gidin.
  2. ${ETHEREUM_NODE} VM simgesini tıklayın.
  3. Tarayıcıda SSH penceresini açmak için SSH simgesini tıklayın.
  4. Çalışan Ganache kapsayıcısını görmek için SSH penceresine sudo docker ps girin.
  5. trufflesuite/ganache:v7.7.3 için kapsayıcı kimliğini bulma
  6. CONTAINER_ID yerine trufflesuite/ganache:v7.7.3 kimliğini girerek sudo docker logs CONTAINER_ID yazın.
  7. Ganache günlüklerini görüntüleyin ve günlüklerde bir işlemin listelendiğini doğrulayın.

5. Temizleme

Bu codelab kapsamında oluşturduğumuz kaynakları temizlemek için kullanılabilecek komut dosyasına buradan ulaşabilirsiniz. Bu temizlik kapsamında aşağıdaki kaynaklar silinecek:

  • Şifrelenmiş anahtar paylaşımlarını depolamak için kullanılan giriş depolama paketi ($PRIMUS_INPUT_STORAGE_BUCKET).
  • Şifreleme anahtarı ($PRIMUS_KEY).
  • Korunan kaynaklara ($PRIMUS_SERVICEACCOUNT) erişmek için kullanılan hizmet hesabı.
  • Workload Identity havuzu ($PRIMUS_WORKLOAD_IDENTITY_POOL).
  • İş yükü hizmet hesabı ($WORKLOAD_SERVICEACCOUNT).
  • İş Yükü İşlem Örnekleri ($WORKLOAD_VM ve $ETHEREUM_NODE).
  • İşlem sonucunu depolamak için kullanılan sonuç depolama paketi ($PRIMUS_RESULT_STORAGE_BUCKET).
  • İş yükü resmini depolamak için kullanılan Artifact Registry ($PRIMUS_ARTIFACT_REPOSITORY).
./cleanup.sh

Keşfetme işlemini tamamladıysanız lütfen projenizi silin.

  • Cloud Platform Console'a gidin.
  • Kapatmak istediğiniz projeyi seçin, ardından üst kısımdaki "Sil"i tıklayın. Bu işlem, projenin silinmesini planlar.

Yapabilecekleriniz

Benzer codelab'lere göz atın...

Daha fazla bilgi