1. نظرة عامة
قبل البدء، على الرغم من أنّه ليس ضروريًا تمامًا، ستكون المعرفة العملية بالميزات والمفاهيم التالية مفيدة في هذا الدرس التطبيقي.
- مساحة التخزين في السحابة الإلكترونية، وتحديدًا الحزم
- Compute Engine، وتحديدًا الأجهزة الافتراضية ذات الطابع السري
- حسابات الخدمة
- الحاويات والمستودعات البعيدة
- اتحاد هوية أعباء العمل وشروط السمات
المُعطيات
يوفّر هذا التمرين العملي عملية تنفيذ مرجعية لإجراء توقيع على سلسلة الكتل متوافق مع تقنية "المعالجة المتعدّدة للبيانات" باستخدام "المساحة السرية". لتوضيح المفاهيم، سنوضّح سيناريو تريد فيه "الشركة الأولى" نقل مواد العرض الرقمية إلى "الشركة الثانية". في هذا السيناريو، تستخدم شركة Primus نموذجًا متوافقًا مع "المعالجة المتعدّدة للبيانات"، ما يعني أنّها تستخدم حصص مفاتيح موزّعة بدلاً من استخدام مفاتيح خاصة فردية. تملك جهات متعدّدة حصص هذه المفاتيح، وفي هذه الحالة، نبيلة ويوسف. يوفّر هذا النهج لشركة Primus العديد من المزايا، بما في ذلك تجربة المستخدم المبسّطة والكفاءة التشغيلية والتحكّم في مفاتيح التشفير الخاصة.
لشرح الجوانب الأساسية لهذه العملية، سنوضّح التفاصيل الفنية وسنرشدك خلال عملية الموافقة والتوقيع التي تبدأ بنقل مواد العرض الرقمية من "الشركة الأولى" إلى "الشركة الثانية". يُرجى العِلم أنّ على "بسام" و"نور"، وهما موظفان في شركة "أبجد"، الموافقة على المعاملة.
على الرغم من أنّ هذا النموذج المرجعي لتنفيذ وظائف التوقيع يوضّح عمليات التوقيع، إلا أنّه لا يتناول جميع جوانب إدارة مفاتيح التشفير في "المعالجة المحدودة للبيانات". على سبيل المثال، لا نناقش إنشاء المفاتيح. بالإضافة إلى ذلك، هناك طرق بديلة وتكميلية، مثل استخدام خدمات غير Google Cloud لإنشاء التوقيعات المشترَكة أو جعل الموقعين المشترَكين ينشئون توقيعات بتقنية سلسلة الكتل في بيئاتهم الخاصة، وهي بنية أكثر لامركزية. نأمل أن تلهم هذه التجارب أساليب مختلفة لاستخدام ميزة "المعالجة المحدودة للبيانات" على Google Cloud.
ستتعامل مع عبء عمل بسيط يوقّع على معاملة Ethereum في "مساحة العمل السرية" باستخدام مواد مفاتيح الموقّعين المشاركين. توقيع معاملات Ethereum هي عملية يمكن من خلالها للمستخدم تفويض معاملة على سلسلة الكتل Ethereum. لإرسال معاملة على Ethereum، عليك توقيعها باستخدام مفتاحك الخاص. يثبت ذلك أنّك مالك الحساب وأنّك تفوّض المعاملة. في ما يلي خطوات التوقيع:
- ينشئ المُرسِل عنصر معاملة يحدِّد عنوان المستلِم وكمية الإيثر (ETH) المطلوب إرسالها وأي بيانات أخرى ذات صلة.
- يُستخدَم المفتاح الخاص للمُرسِل لتجزئة بيانات المعاملة.
- بعد ذلك، يتم توقيع التجزئة باستخدام المفتاح الخاص.
- يتم إرفاق التوقيع بعنصر المعاملة.
- يتم بث المعاملة إلى شبكة Ethereum.
عندما تتلقّى عقدة على الشبكة معاملة، تتحقّق من التوقيع للتأكّد من أنّه تم توقيعه من قِبل مالك الحساب. إذا كان التوقيع صالحًا، ستضيف العقدة المعاملة إلى سلسلة الكتل.
للبدء، عليك ضبط موارد Cloud اللازمة. بعد ذلك، عليك تشغيل أعباء العمل في "مساحة سرية". سيرشدك هذا الدرس التطبيقي حول الترميز خلال الخطوات الرئيسية التالية:
- كيفية ضبط موارد Cloud اللازمة لتشغيل "المساحة السرية"
- كيفية تفويض الوصول إلى الموارد المحمية استنادًا إلى سمات:
- العنصر: حاوية عبء العمل
- المكان: بيئة Confidential Space (صورة Confidential Space على Confidential VM)
- المستخدِم: الحساب الذي يشغِّل حجم العمل
- كيفية تشغيل حمولة العمل في جهاز افتراضي "سري" يعمل بنظام التشغيل "صورة Confidential Space 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
- تأكَّد من ضبط متغيّرات بيئة المشروع المطلوبة كما هو موضّح أدناه. لمزيد من المعلومات عن إعداد مشروع على Google Cloud Platform، يُرجى الرجوع إلى هذا الدليل التعليمي حول رموز البرامج. يمكنك الرجوع إلى هذا الرابط للحصول على تفاصيل عن كيفية استرداد رقم تعريف المشروع واختلافه عن اسم المشروع ورقمه. .
export PRIMUS_PROJECT_ID=<GCP project id>
- فعِّل ميزة "الفوترة" لمشاريعك.
- فعِّل واجهة برمجة التطبيقات Confidential Computing API وواجهات برمجة التطبيقات التالية لكلا المشروعَين.
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 | مفتاح إدارة مفاتيح التشفير المستخدَم في تشفير البيانات المخزّنة في $PRIMUS_INPUT_STORAGE_BUCKET لبنك Primus. |
$PRIMUS_KEYRING | سلسلة مفاتيح KMS التي سيتم استخدامها لإنشاء مفتاح التشفير $PRIMUS_KEY لبنك Primus |
$PRIMUS_WIP_PROVIDER | موفِّر مجموعة تعريفات أعباء العمل الذي يتضمّن شرط السمة لاستخدام الرموز المميّزة التي وقّعت عليها خدمة "إدارة الأداء في خدمات السحابة الإلكترونية" (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 | علامة صورة حاوية عبء العمل |
- شغِّل النص البرمجي التالي لضبط أسماء المتغيّرات المتبقية على قيم استنادًا إلى رقم تعريف مشروعك لأسماء الموارد.
source config_env.sh
إعداد موارد Cloud
كجزء من هذه الخطوة، عليك إعداد موارد السحابة الإلكترونية المطلوبة للحساب المتعدّد الأطراف. في هذا الدرس، ستستخدم المفتاح الخاص التالي: 0000000000000000000000000000000000000000000000000000000000000001
في بيئة الإنتاج، عليك إنشاء مفتاحك الخاص. ومع ذلك، لأغراض هذا الدرس العملي، سنقسّم هذا المفتاح الخاص إلى حصتين ونشفِّر كلّ حصة. في سيناريو الإصدار العلني، يجب عدم تخزين المفاتيح مطلقًا في ملفات نص عادي. بدلاً من ذلك، يمكن إنشاء المفتاح الخاص خارج Google Cloud (أو تخطّيه بالكامل واستبداله بإنشاء شريحة مفتاح MPC مخصّصة) ثم تشفيره حتى لا يتمكّن أحد من الوصول إلى المفتاح الخاص أو أجزاء المفتاح. لأغراض هذا الدرس التطبيقي، سنستخدم Gcloud CLI.
شغِّل النص البرمجي التالي لإعداد موارد السحابة الإلكترونية المطلوبة. كجزء من هذه الخطوات، سيتم إنشاء الموارد المذكورة أدناه:
- حزمة 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 Storageroles/iam.workloadIdentityUser
لربط حساب الخدمة هذا بمجموعة المعلومات التعريفية
./setup_resources.sh
3- إنشاء "حمل عمل"
إنشاء حساب خدمة لوحدة العمل
ستنشئ الآن حساب خدمة لوحدة العمل مع الأدوار والأذونات المطلوبة. لإجراء ذلك، شغِّل النص البرمجي التالي الذي سينشئ حساب خدمة لتحميل العمل للشركة "أ". سيتم استخدام حساب الخدمة هذا من قِبل الجهاز الظاهري الذي يشغِّل سير العمل.
سيتضمّن حساب الخدمة الخاص بوحدة العمل ($WORKLOAD_SERVICEACCOUNT
) الأدوار التالية:
confidentialcomputing.workloadUser
للحصول على رمز إثبات الهويةlogging.logWriter
لكتابة السجلّات في Cloud LoggingobjectViewer
لقراءة البيانات من حزمة$PRIMUS_INPUT_STORAGE_BUCKET
في Cloud StorageobjectUser
لكتابة نتيجة "حمل العمل" في حزمة$PRIMUS_RESULT_STORAGE_BUCKET
على Cloud Storage
./create_workload_service_account.sh
إنشاء حمل عمل
تتضمّن هذه الخطوة إنشاء صورة Docker لوحدة العمل. إنّ "وحدة العمل" في هذا الدليل التعليمي هي تطبيق بسيط لبروتوكول MPC في Node.js يوقّع المعاملات الرقمية لنقل الأصول باستخدام حصص مفاتيح خاصة مشفّرة. في ما يلي رمز مشروع عبء العمل. يتضمّن مشروع "عبء العمل" الملفات التالية:
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-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: يخزِّن الملف مسارات مجموعة المعلومات التعريفية لوحدة العمل وتفاصيل انتحال هوية حساب الخدمة. في ما يلي ملف 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. يُحدِّد التصنيف "tee.launch_policy.allow_env_override" للمساحات السرية متغيّرات البيئة التي يمكن لمستخدمي الصور استخدامها .
شغِّل النص البرمجي التالي لإنشاء حمولة يتم فيها تنفيذ الخطوات التالية:
- أنشئ Artifact Registry(
$PRIMUS_ARTIFACT_REPOSITORY
) لتخزين صورة Docker الخاصة بحمولة العمل. - عدِّل رمز "عبء العمل" باستخدام أسماء الموارد المطلوبة. في ما يلي رمز الحمولة الذي تم استخدامه في هذا الدرس التطبيقي حول الترميز.
- أنشئ ملف Dockerfile لإنشاء صورة Docker من رمز "وحدة العمل". يمكنك العثور على Dockerfile هنا.
- أنشئ صورة Docker وانشرها في "مستودع العناصر" (
$PRIMUS_ARTIFACT_REPOSITORY
) الذي تم إنشاؤه في الخطوة السابقة. - امنح
$WORKLOAD_SERVICEACCOUNT
إذن القراءة لـ$PRIMUS_ARTIFACT_REPOSITORY
. هذا الإجراء ضروري لكي تسحب حاوية "وحدة العمل" صورة Docker الخاصة بوحدة العمل من "مستودع العناصر".
./create_workload.sh
إنشاء "وحدة تحكّم في شبكة البلوك تشين"
Ganache Ethereum Node
قبل تفويض حمولة العمل، علينا إنشاء مثيل Ethereum Ganache. سيتم إرسال المعاملة الموقَّعة إلى مثيل Ganache هذا. يُرجى تدوين عنوان IP لهذه النسخة. بعد تنفيذ الأمر أدناه، قد تحتاج إلى إدخال y
لتفعيل واجهة برمجة التطبيقات.
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. تفويض "حمل العمل" وتشغيله
منح الإذن لـ Workload
كجزء من هذه الخطوة، سنعمل على إعداد موفِّر مجموعة المعلومات التعريفية لوحدة العمل ضمن مجموعة المعلومات التعريفية لوحدة العمل ($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
: الحزمة التي تخزِّن نتيجة معاملة mpcKEY_BUCKET
: الحزمة التي تخزِّن مفاتيح التشفير mpcPRIMUS_PROJECT_NUMBER
: رقم المشروع المستخدَم لملف إعدادات بيانات الاعتماد.-
PRIMUS_PROJECT_ID
: رقم تعريف المشروع المستخدَم لملف إعدادات بيانات الاعتماد سيتم نشر نتيجة تنفيذ أعباء العمل على$PRIMUS_RESULT_STORAGE_BUCKET
. -
PRIMUS_WORKLOAD_IDENTITY_POOL
: مجموعة المعلومات التعريفية المستخدَمة للتحقّق من صحة المطالب -
PRIMUS_WIP_POROVIDER
: موفِّر مجموعة المعلومات التعريفية لأعباء العمل الذي يتضمّن شروط السمات لاستخدامها في التحقّق من الرموز المميزة التي تقدّمها أعباء العمل. -
WORKLOAD_SERVICEACCOUNT
: حساب الخدمة الخاص بوحدة العمل
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
يمكنك الاطّلاع على إيصال المعاملة في Cloud Storage. قد يستغرق تشغيل "المساحة السرية" وظهور النتائج بضع دقائق. ستتأكّد من اكتمال الحاوية عندما تكون الحالة "تم إيقاف الجهاز الظاهري".
- انتقِل إلى صفحة متصفّح مساحة التخزين في السحابة الإلكترونية.
- انقر على
$PRIMUS_RESULT_STORAGE_BUCKET
. - انقر على ملف
transaction_receipt
. - انقر على "تنزيل" لتنزيل ردّ المعاملة وعرضه.
يمكنك بدلاً من ذلك تنفيذ الأوامر التالية لعرض النتيجة.
gcloud config set project $PRIMUS_PROJECT_ID
gsutil cat gs://$PRIMUS_RESULT_STORAGE_BUCKET/transaction_receipt
ملاحظة: إذا لم تظهر النتائج، يمكنك الانتقال إلى $WORKLOAD_VM في صفحة Compute Engine Cloud Console والنقر على "منفذ تسلسلي 1 (وحدة التحكّم)" لعرض السجلات.
التحقّق من معاملة Ganache Blockchain
يمكنك أيضًا الاطّلاع على المعاملة في سجلّ سلسلة الكتل.
- انتقِل إلى صفحة Cloud Compute Engine.
- انقر على
${ETHEREUM_NODE}
VM
. - انقر على
SSH
لفتح نافذة SSH في المتصفّح. - في نافذة SSH، أدخِل
sudo docker ps
للاطّلاع على حاوية Ganache التي تعمل. - العثور على رقم تعريف الحاوية لـ
trufflesuite/ganache:v7.7.3
- أدخِل
sudo docker logs CONTAINER_ID
مع استبدال CONTAINER_ID بمعرّفtrufflesuite/ganache:v7.7.3
. - اطّلِع على سجلّات Ganache وتأكَّد من توفّر معاملة مُدرَجة في السجلّات.
5- تَنظيم
في ما يلي البرنامج النصي الذي يمكن استخدامه لتنظيف الموارد التي أنشأناها كجزء من هذا الدرس التطبيقي حول الترميز. كجزء من عملية التنظيف هذه، سيتم حذف الموارد التالية:
- إدخال حزمة التخزين المستخدَمة لتخزين أجزاء المفتاح المشفَّر (
$PRIMUS_INPUT_STORAGE_BUCKET)
- مفتاح التشفير (
$PRIMUS_KEY
) - حساب الخدمة المستخدَم للوصول إلى الموارد المحمية (
$PRIMUS_SERVICEACCOUNT
). - مجموعة عناوين العملاء (
$PRIMUS_WORKLOAD_IDENTITY_POOL
). - حساب خدمة "حمل العمل" (
$WORKLOAD_SERVICEACCOUNT
) - نُسخ Workload Compute (
$WORKLOAD_VM
و$ETHEREUM_NODE
) - حزمة تخزين النتائج المستخدَمة لتخزين نتيجة المعاملة (
$PRIMUS_RESULT_STORAGE_BUCKET
). - مستودع Artifact Registry المستخدَم لتخزين صورة "وحدة العمل" (
$PRIMUS_ARTIFACT_REPOSITORY
).
./cleanup.sh
إذا انتهيت من الاستكشاف، يُرجى التفكير في حذف مشروعك.
- انتقِل إلى وحدة تحكّم Cloud Platform.
- اختَر المشروع الذي تريد إغلاقه، ثم انقر على "حذف" في أعلى الصفحة. يؤدي ذلك إلى تحديد موعد لحذف المشروع.
الخطوة التالية
اطّلِع على بعض هذه الدروس التطبيقية حول الترميز المشابهة...
- البيانات المشتركة الآمنة المستخدَمة مع "المساحة السرية"
- الدرس التطبيقي حول صورة الحاوية الموقَّعة
- تحليل البيانات السرية باستخدام "المساحات السرية"