كيفية التعامل مع الأصول الرقمية باستخدام عمليات حوسبة متعددة الأطراف والمساحة السرية

1. نظرة عامة

قبل أن نبدأ، ستكون المعرفة العملية بالميزات والمفاهيم التالية مفيدة في هذا التمرين المعملي حول الترميز، وإن لم يكن ذلك ضروريًا تمامًا.

4670cd5427aa39a6.png

ما ستتعرَّف عليه

يوفّر هذا التمرين المعملي طريقة تنفيذ مرجعية لتوقيع سلسلة الكتل المتوافقة مع MPC باستخدام المساحة السرّية. لتوضيح المفاهيم، سننتقل إلى سيناريو ترغب فيه Company Primus في نقل الأصول الرقمية إلى Company Secundus. في هذا السيناريو، تستخدم Company Primus نموذجًا متوافقًا مع MPC، ما يعني أنه بدلاً من استخدام مفاتيح خاصة فردية، ستستخدم خوادم مشاركة المفاتيح الموزَّعة. وتحتفظ جهات متعددة بهذه المشاركات الرئيسية، في هذه الحالة ياسر وهبة. ويوفر هذا النهج لـ Company Primus العديد من المزايا، بما في ذلك تجربة مستخدم مبسطة وكفاءة تشغيلية والتحكم في مفاتيحهم الخاصة.

لتوضيح الجوانب الأساسية لهذه العملية، سنتناول الإعداد الفني بالتفصيل، وسنرشدك خلال عملية الموافقة والتوقيع التي تبدأ نقل الأصول الرقمية من Company Primus إلى Company Secundus. يُرجى ملاحظة أنّه على كامل وأليس، وهما موظفان في شركة Primus، الموافقة على المعاملة.

على الرغم من أنّ تنفيذ هذا المرجع يوضّح عمليات التوقيع، فهو لا يشمل جميع جوانب إدارة مفاتيح MPC. على سبيل المثال، نحن لا نناقش إنشاء المفاتيح. بالإضافة إلى ذلك، هناك مناهج بديلة وتكميلية، مثل استخدام خدمات غير تابعة لـ Google Cloud لإنشاء توقيعات مشتركة أو الاستعانة بموقِّعين مشاركين لإنشاء توقيعات سلسلة الكتل في بيئاتهم الخاصة، وهي بنية أكثر لامركزية. نأمل أن يكون هذا الدرس التطبيقي مُلهِمًا لأساليب مختلفة لإدارة الوسائط المتعددة القنوات (MPC) على Google Cloud.

سيتم تنفيذ مهام عمل بسيطة لتوقيع معاملة عبر شبكة Ethereum في المساحة السرّية باستخدام مواد أساسية من الموقّعين المشاركين. توقيع معاملة Ethereum هي عملية يمكن للمستخدم من خلالها السماح بإجراء معاملة على سلسلة الكتل في Ethereum. لإرسال معاملة عبر Ethereum، عليك توقيعها باستخدام مفتاحك الخاص. هذا الإجراء يثبت أنّك مالك الحساب وأنّك تجيز المعاملة. في ما يلي عملية التوقيع:

  1. ينشئ المُرسِل كائن معاملة يحدّد عنوان المستلم ومبلغ ETH المطلوب إرساله وأي بيانات أخرى ذات صلة.
  2. يُستخدم المفتاح الخاص للمرسل لتجزئة بيانات المعاملة.
  3. بعد ذلك، يتم توقيع التجزئة باستخدام المفتاح الخاص.
  4. يتم إرفاق التوقيع بعنصر العملية.
  5. سيتم بث المعاملة على شبكة Ethereum.

عندما تتلقّى عقدة على الشبكة معاملة، تتحقّق من التوقيع للتأكّد من أنّه تم توقيعها من قِبل مالك الحساب. إذا كان التوقيع صالحًا، ستضيف العقدة المعاملة إلى سلسلة الكتل.

للبدء، عليك إعداد موارد Cloud اللازمة. بعد ذلك، عليك تنفيذ مهام العمل في "المساحة السرية". سيرشدك هذا الدرس التطبيقي حول الترميز خلال الخطوات العامة التالية:

  • كيفية ضبط موارد السحابة الإلكترونية اللازمة لتشغيل ميزة "المساحة السرية"
  • طريقة السماح بالوصول إلى الموارد المحمية استنادًا إلى سمات:
  • التحديث: حاوية حمولة العمل
  • المكان: بيئة "المساحة السرية" (صورة المساحة السرية على الجهاز الافتراضي (VM) السري)
  • مَن: الحساب الذي يُشغِّل عبء العمل
  • طريقة تنفيذ عبء العمل في جهاز افتراضي سري يستخدم صورة الجهاز الافتراضي (VM) الخاص بالمساحة السرية

واجهات برمجة التطبيقات المطلوبة

يجب تفعيل واجهات برمجة التطبيقات التالية في المشاريع المحدَّدة لتتمكّن من إكمال هذا الدليل.

اسم واجهة برمجة التطبيقات

عنوان واجهة برمجة التطبيقات

cloudkms.googleapis.com

Cloud KMS

compute.googleapis.com

Compute Engine

confidentialcomputing.googleapis.com

الحوسبة السرية

iamcredentials.googleapis.com

إدارة الهوية وإمكانية الوصول

artifactregistry.googleapis.com

Artifact Registry

2. إعداد موارد السحابة

قبل البدء

  • استنسِخ هذا المستودع باستخدام الأمر أدناه للحصول على النصوص البرمجية المطلوبة التي يتم استخدامها كجزء من هذا الدرس التطبيقي حول الترميز.
git clone https://github.com/GoogleCloudPlatform/confidential-space.git
  • يمكنك تغيير دليل هذا الدرس التطبيقي حول الترميز.
cd confidential-space/codelabs/digital_asset_transaction_codelab/scripts
  • تأكد من ضبط متغيرات بيئة المشروع المطلوبة كما هو موضح أدناه. لمزيد من المعلومات عن إعداد مشروع GCP، يُرجى الاطّلاع على هذا الدرس التطبيقي حول الترميز. يمكنك الرجوع إلى هذا للحصول على تفاصيل حول كيفية استرداد رقم تعريف المشروع وكيفية اختلافه عن اسم المشروع ورقمه. .
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
  • لضبط المتغيّرات لأسماء الموارد، يمكنك استخدام الأمر التالي. يُرجى العلم أنّ هذا الإجراء سيؤدي إلى إلغاء أسماء الموارد الخاصة بمشروع Google Cloud Platform للشركة (أ)، على سبيل المثال export PRIMUS_INPUT_STORAGE_BUCKET='primus-input-bucket'.
  • يمكن ضبط المتغيّرات التالية لمشروع Google Cloud Platform في الشركة (أ):

$PRIMUS_INPUT_STORAGE_BUCKET

يشير ذلك المصطلح إلى الحزمة التي تخزِّن المفاتيح المشفّرة.

$PRIMUS_RESULT_STORAGE_BUCKET

الحزمة التي تخزِّن نتيجة معاملة MPC.

$PRIMUS_KEY

مفتاح KMS المستخدم لتشفير البيانات المخزنة في $PRIMUS_INPUT_STORAGE_BUCKET لـ Primus Bank.

$PRIMUS_KEYRING

سلسلة مفاتيح KMS التي سيتم استخدامها لإنشاء مفتاح التشفير $PRIMUS_KEY لمصرف Primus Bank.

$PRIMUS_WIP_PROVIDER

موفّر مجموعة Workload Identity Pool الذي يتضمّن شرط السمة المطلوب استخدامها للرموز المميّزة الموقَّعة من خلال خدمة أحمال العمل في MPC.

$PRIMUS_SERVICEACCOUNT

حساب الخدمة الذي يستخدمه $PRIMUS_WORKLOAD_IDENTITY_POOL للوصول إلى الموارد المحمية. سيحصل حساب الخدمة هذا على إذن لعرض المفاتيح المشفَّرة المخزَّنة في حزمة $PRIMUS_INPUT_STORAGE_BUCKET.

$PRIMUS_ARTIFACT_REPOSITORY

مستودع العناصر لتخزين صورة حاوية أحمال العمل

$WORKLOAD_SERVICEACCOUNT

يشير ذلك المصطلح إلى حساب الخدمة الذي يتضمن الإذن بالوصول إلى جهاز افتراضي سرّي مسؤول عن تنفيذ حِمل العمل.

$WORKLOAD_CONTAINER

حاوية Docker تشغِّل حِمل العمل.

$WORKLOAD_IMAGE_NAME

اسم صورة حاوية حِمل العمل

$WORKLOAD_IMAGE_TAG

علامة صورة حاوية أحمال العمل

  • شغِّل script التالي لضبط أسماء المتغيّرات المتبقية على قيم استنادًا إلى رقم تعريف مشروعك لأسماء الموارد.
source config_env.sh

إعداد موارد Cloud

وكجزء من هذه الخطوة، عليك إعداد موارد السحابة الإلكترونية المطلوبة لإجراء العمليات الحسابية المتعددة الأطراف. ستستخدم المفتاح الخاص التالي في هذا التمرين المعملي: 0000000000000000000000000000000000000000000000000000000000000001

في بيئة الإنتاج، ستنشئ مفتاحك الخاص. ومع ذلك، سنقسّم هذا المفتاح الخاص إلى حصتين ونشفّر كلاً منهما لأغراض هذا التمرين المعملي. في سيناريو الإنتاج، يجب عدم تخزين المفاتيح في ملفات بنص عادي. وبدلاً من ذلك، يمكن إنشاء المفتاح الخاص خارج Google Cloud (أو تخطيه بالكامل واستبداله بإنشاء جزء مخصّص لمفتاح MPC)، ثم تشفيره بحيث لا يمكن لأي شخص الوصول إلى المفتاح الخاص أو مشاركة المفاتيح. لأغراض هذا التمرين، سنستخدم Gcloud CLI.

نفِّذ script التالية لإعداد موارد السحابة الإلكترونية المطلوبة. وكجزء من هذه الخطوات، سيتم إنشاء المراجع المذكورة أدناه:

  • حزمة على Cloud Storage ($PRIMUS_INPUT_STORAGE_BUCKET) لتخزين مشاركات المفتاح الخاص المشفّر
  • حزمة Cloud Storage ($PRIMUS_RESULT_STORAGE_BUCKET) لتخزين نتيجة معاملة الأصول الرقمية
  • مفتاح تشفير ($PRIMUS_KEY) وسلسلة مفاتيح ($PRIMUS_KEYRING) في KMS لتشفير مشاركات المفتاح الخاص.
  • مجموعة هويات وأعباء العمل ($PRIMUS_WORKLOAD_IDENTITY_POOL) للتحقّق من صحة المطالبات استنادًا إلى شروط السمات التي تم ضبطها من قِبل مقدّم الخدمة.
  • حساب خدمة ($PRIMUS_SERVICEACCOUNT) مُرفَق في مجموعة هويات العمل المذكورة أعلاه ($PRIMUS_WORKLOAD_IDENTITY_POOL) مع إمكانية الوصول التالية إلى "إدارة الهوية وإمكانية الوصول":
  • roles/cloudkms.cryptoKeyDecrypter لفك تشفير البيانات باستخدام مفتاح KMS.
  • objectViewer لقراءة البيانات من حزمة Cloud Storage.
  • roles/iam.workloadIdentityUser لربط حساب الخدمة هذا بأداة "تجميع هويات العمل"
./setup_resources.sh

3- إنشاء عبء عمل

إنشاء حساب خدمة أعباء العمل

عليك الآن إنشاء حساب خدمة لتحميل العمل يتضمّن الأدوار والأذونات المطلوبة. لإجراء ذلك، شغِّل script التالي، والذي سيؤدي إلى إنشاء حساب خدمة أحمال عمل للشركة (أ). سيتم استخدام حساب الخدمة هذا بواسطة الجهاز الافتراضي الذي يدير عبء العمل.

سيؤدّي حساب خدمة أحمال العمل ($WORKLOAD_SERVICEACCOUNT) إلى الأدوار التالية:

  • confidentialcomputing.workloadUser للحصول على رمز مصادقة مميز
  • logging.logWriter لكتابة السجلات إلى Cloud Logging.
  • objectViewer لقراءة البيانات من حزمة Cloud Storage على $PRIMUS_INPUT_STORAGE_BUCKET.
  • objectUser لكتابة نتيجة عبء العمل إلى حزمة Cloud Storage على $PRIMUS_RESULT_STORAGE_BUCKET.
./create_workload_service_account.sh

إنشاء أعباء عمل

تتضمن هذه الخطوة إنشاء صورة Docker لتحميل العمل. إنّ عبء العمل في هذا الدرس التطبيقي حول الترميز هو تطبيق بسيط من Node.js MPC لتوقيع المعاملات الرقمية لنقل الأصول باستخدام مشاركات المفاتيح الخاصة المشفَّرة. إليك رمز مشروع أحمال العمل. يتضمن مشروع عبء العمل الملفات التالية.

package.json: يحتوي هذا الملف على قائمة الحِزم التي يجب استخدامها لتطبيق MPC لتحميل العمل. في هذه الحالة، نستخدم مكتبات @google-cloud/kms و @google-cloud/storage وethers وFast-crc32c. إليك ملف package.json الذي سنستخدمه في هذا الدرس التطبيقي حول الترميز.

index.js: يشير هذا إلى نقطة إدخال تطبيق تحميل العمل ويحدّد الأوامر التي يجب تشغيلها عند بدء تشغيل حاوية أحمال العمل. أدرجنا أيضًا نموذج معاملة لم يتم توقيعها يتم تقديمها عادةً من خلال تطبيق غير موثوق به يطلب من المستخدمين توقيعهم. يستورد ملف index.js هذا أيضًا دوال من mpc.js، والتي سننشئها بعد ذلك. في ما يلي محتوى ملف index.js ويمكنك العثور عليه أيضًا هنا.

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: يتم توقيع المعاملة هنا. وهي تستورد الدوال من فك التشفير kms-decrypt وCredential-config، والتي سنتناولها لاحقًا. في ما يلي محتوى ملف mpc.js ويمكنك أيضًا العثور عليه هنا.

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: يحتوي هذا الملف على رمز فك التشفير باستخدام المفاتيح المُدارة في إدارة المفاتيح (KMS). في ما يلي محتوى ملف kms-decrypt.js، ويمكنك العثور عليه أيضًا هنا.

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: يخزِّن الملف مسارات قاعدة بيانات الاعتماد في Workload وتفاصيل انتحال هوية حساب الخدمة. إليك ملف Credential-config.js الذي سنستخدمه لهذا الدرس التطبيقي حول الترميز.

Dockerfile: أخيرًا، سننشئ ملف Dockerfile الذي سيتم استخدامه لإنشاء صورة Docker لحمل العمل. تحدد Dockerfile على النحو المحدد هنا.

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" ]

ملاحظة: LABEL "tee.launch_policy.allow_cmd_override"="true" في ملف Dockerfile هي سياسة تشغيل حدّدها مؤلف الصورة. تسمح لعامل التشغيل بتجاوز CMD عند تنفيذ عبء العمل. بشكل افتراضي، يتم تعيينallow_cmd_override على false. LABEL &quot;tee.launch_policy.allow_env_override&quot; يخبر المساحة السرية بالمتغيرات البيئية التي يمكن للمستخدمين استخدامها .

شغِّل script التالي لإنشاء أعباء عمل يتم فيها تنفيذ الخطوات التالية:

  • عليك إنشاء Artifact Registry($PRIMUS_ARTIFACT_REPOSITORY) لتخزين صورة صندوق تحميل العمل.
  • عدِّل رمز تحميل العمل بأسماء الموارد المطلوبة. يمكنك الاطّلاع هنا على رمز عبء العمل المستخدَم في هذا الدرس التطبيقي حول الترميز.
  • إنشاء ملف شامل لإنشاء صورة Docker لرمز عبء العمل. يمكنك العثور على الملف الشامل هنا.
  • أنشِئ صورة Docker وانشرها في Artifact Registry ($PRIMUS_ARTIFACT_REPOSITORY) الذي تم إنشاؤه في الخطوة السابقة.
  • منح تطبيق "$WORKLOAD_SERVICEACCOUNT" إذن قراءة لـ "$PRIMUS_ARTIFACT_REPOSITORY". يُعدّ هذا الإجراء ضروريًا كي تتمكّن حاوية حِمل العمل من سحب صورة قاعدة تحميل العمل من قاعدة بيانات Artifact Registry.
./create_workload.sh

إنشاء عقدة سلسلة الكتل

عقدة Ganache Ethereum

قبل السماح لأعباء العمل، نحتاج إلى إنشاء مثيل Ethereum Ganache. سيتم إرسال المعاملة الموقَّعة إلى النسخة الافتراضية من Ganache. يرجى تدوين عنوان IP لهذا المثيل. بعد تشغيل الأمر أدناه، قد تحتاج إلى إدخال y لتفعيل واجهة برمجة التطبيقات.

gcloud config set project $PRIMUS_PROJECT_ID
gcloud compute instances create-with-container mpc-lab-ethereum-node \
  --zone=${PRIMUS_PROJECT_ZONE}\
  --tags=http-server \
  --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. تفويض حمل العمل وتشغيله

تفويض عبء العمل

وكجزء من هذه الخطوة، سنُعدّ موفّر خدمة Workload Identity Pool ضمن مجموعة Workload Identity Pool ($PRIMUS_WORKLOAD_IDENTITY_POOL). هناك شروط سمات تم ضبطها لهوية عبء العمل كما هو موضّح أدناه. ويتمثّل أحد الشروط في التحقّق من أنّه يتم سحب صورة عبء العمل من مستودع العناصر المتوقّع.

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"

تنفيذ تحميل العمل

يشرح هذا القسم كيفية تنفيذ مهام العمل على جهاز افتراضي سرّي. للقيام بذلك، سنمرر وسيطات TEE المطلوبة باستخدام علامة البيانات الوصفية. بالإضافة إلى ذلك، سنضبط متغيرات البيئة لحاوية عبء العمل باستخدام الدالة "tee-env-*". . تحتوي الصورة على المتغيّرات التالية:

  • NODE_URL: عنوان URL لعقدة Ethereum التي ستعالج المعاملة المُوقَّعة.
  • RESULTS_BUCKET: الحزمة التي تخزّن نتيجة معاملة "مركز عملائي" (mpc)
  • KEY_BUCKET: الحزمة التي تخزّن المفاتيح المشفّرة بتنسيق mpc
  • PRIMUS_PROJECT_NUMBER: رقم المشروع المُستخدَم لملف إعداد بيانات الاعتماد
  • PRIMUS_PROJECT_ID: رقم تعريف المشروع المُستخدَم لملف إعداد بيانات الاعتماد. سيتم نشر نتيجة تنفيذ عبء العمل على $PRIMUS_RESULT_STORAGE_BUCKET.
  • PRIMUS_WORKLOAD_IDENTITY_POOL: مجموعة المعلومات المتعلّقة بأحمال العمل المُستخدَمة في التحقّق من صحة المطالبات
  • PRIMUS_WIP_POROVIDER: موفّر مجموعة هويات أحمال العمل الذي يتضمّن شروط السمة المطلوب استخدامها للتحقّق من صحة الرموز المميّزة المقدَّمة من خلال أحمال العمل
  • WORKLOAD_SERVICEACCOUNT: حساب الخدمة الخاص بعبء العمل
gcloud config set project $PRIMUS_PROJECT_ID
gcloud compute instances create $WORKLOAD_VM \
 --confidential-compute-type=SEV \
 --shielded-secure-boot \
 --maintenance-policy=TERMINATE \
 --scopes=cloud-platform \
 --zone=${PRIMUS_PROJECT_ZONE} \
 --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 mpc-lab-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

يمكنك الاطّلاع على إيصال المعاملة في Cloud Storage. قد يستغرق تشغيل المساحة السرية بضع دقائق لتظهر النتائج. عندما يكون الجهاز الافتراضي في حالة توقّف، ستعلم أنّ الحاوية قد انتهت.

  1. انتقِل إلى صفحة Cloud Storage Browser.
  2. انقر على $PRIMUS_RESULT_STORAGE_BUCKET.
  3. انقر على الملف transaction_receipt.
  4. انقر على "تنزيل" لتنزيل الردّ على المعاملة والاطّلاع عليه.

ملاحظة: إذا لم تظهر النتائج، يمكنك الانتقال إلى $WORKLOAD_VM في صفحة Compute Engine على Cloud Console والنقر على "المنفذ التسلسلي 1 (وحدة التحكّم)". لعرض السجلات.

الاطّلاع على "معاملة باستخدام سلسلة الكتل" في Ganache

يمكنك أيضًا الاطّلاع على المعاملة في سجلّ سلسلة الكتل.

  1. انتقِل إلى صفحة Cloud Compute Engine.
  2. انقر على mpc-lab-ethereum-node VM.
  3. انقر على SSH لفتح نافذة بروتوكول النقل الآمن (SSH) في المتصفّح.
  4. في نافذة بروتوكول النقل الآمن (SSH)، أدخِل sudo docker ps للاطّلاع على حاوية Ganache قيد التشغيل.
  5. البحث عن رقم تعريف حاوية trufflesuite/ganache:v7.7.3
  6. أدخِل sudo docker logs CONTAINER_ID مع استبدال CONTAINER_ID برقم تعريف trufflesuite/ganache:v7.7.3.
  7. اعرض سجلات Ganache وتأكد من وجود معاملة مدرجة في السجلات.

5- تَنظيم

إليك النص البرمجي الذي يمكن استخدامه لحذف الموارد التي أنشأناها كجزء من هذا الدرس التطبيقي حول الترميز. وكجزء من عملية الإزالة هذه، سيتم حذف الموارد التالية:

  • حزمة تخزين الإدخال المستخدمة لتخزين مشاركات المفاتيح المشفّرة ($PRIMUS_INPUT_STORAGE_BUCKET).
  • مفتاح التشفير وسلسلة المفاتيح ($PRIMUS_KEY و$PRIMUS_KEYRING)
  • حساب الخدمة المستخدَم للوصول إلى الموارد المحمية ($PRIMUS_SERVICEACCOUNT)
  • مجموعة Workload Identity Pool ($PRIMUS_WORKLOAD_IDENTITY_POOL)
  • حساب خدمة أحمال العمل ($WORKLOAD_SERVICEACCOUNT)
  • مثيلات الحوسبة في أحمال العمل
  • حزمة مساحة تخزين النتائج المستخدَمة لتخزين نتيجة المعاملة ($PRIMUS_RESULT_STORAGE_BUCKET)
  • قاعدة بيانات المسجّلين العناصر المستخدَمة لتخزين صورة حجم العمل ($PRIMUS_ARTIFACT_REPOSITORY)
./cleanup.sh

إذا كنت قد انتهيت من الاستكشاف، فيرجى التفكير في حذف مشروعك.

  • انتقِل إلى وحدة تحكُّم Cloud Platform
  • اختَر المشروع الذي تريد إيقافه، ثم انقر على "حذف". في أعلى الصفحة يؤدي هذا إلى جدولة المشروع للحذف.

الخطوات التالية

اطّلع على بعض هذه الدروس التطبيقية المتشابهة حول الترميز...

قراءة إضافية