نحوه معامله دارایی های دیجیتال با محاسبات چند طرفه و فضای محرمانه، نحوه معامله دارایی های دیجیتال با محاسبات چند طرفه و فضای محرمانه

۱. مرور کلی

قبل از شروع، اگرچه کاملاً ضروری نیست، اما آشنایی با ویژگی‌ها و مفاهیم زیر در این آزمایشگاه کد مفید خواهد بود.

4670cd5427aa39a6.png

آنچه یاد خواهید گرفت

این آزمایشگاه یک پیاده‌سازی مرجع برای انجام امضای بلاکچین سازگار با MPC با استفاده از Confidential Space ارائه می‌دهد. برای روشن شدن مفاهیم، ​​سناریویی را بررسی خواهیم کرد که در آن شرکت Primus می‌خواهد دارایی‌های دیجیتال را به شرکت Secundus منتقل کند. در این سناریو، شرکت Primus از یک مدل سازگار با MPC استفاده می‌کند، به این معنی که به جای استفاده از کلیدهای خصوصی فردی، از کلیدهای اشتراکی توزیع‌شده استفاده می‌کند. این کلیدهای اشتراکی توسط چندین طرف، در این مورد آلیس و باب، نگهداری می‌شوند. این رویکرد مزایای متعددی از جمله تجربه کاربری ساده، کارایی عملیاتی و کنترل بر کلیدهای خصوصی آنها را برای شرکت Primus فراهم می‌کند.

برای توضیح جنبه‌های اساسی این فرآیند، ما جزئیات تنظیمات فنی را شرح خواهیم داد و شما را با فرآیند تأیید و امضا که انتقال دارایی‌های دیجیتال از شرکت Primus به شرکت Secundus را آغاز می‌کند، آشنا خواهیم کرد. لطفاً توجه داشته باشید که باب و آلیس، که هر دو کارمند شرکت Primus هستند، باید تراکنش را تأیید کنند.

اگرچه این پیاده‌سازی مرجع، عملیات امضا را نشان می‌دهد، اما تمام جنبه‌های مدیریت کلید MPC را پوشش نمی‌دهد. به عنوان مثال، ما در مورد تولید کلید بحث نمی‌کنیم. علاوه بر این، رویکردهای جایگزین و مکملی وجود دارد، مانند استفاده از سرویس‌های غیر Google Cloud برای تولید امضاهای مشترک یا داشتن امضاکنندگان مشترک برای ساخت امضاهای بلاکچین در محیط‌های خودشان، که معماری غیرمتمرکزتری است. ما امیدواریم که این آزمایشگاه الهام‌بخش رویکردهای مختلفی برای MPC در Google Cloud باشد.

شما با یک حجم کاری ساده کار خواهید کرد که یک تراکنش اتریوم را در فضای محرمانه با استفاده از مواد کلید مشترک امضا می‌کند. امضای تراکنش اتریوم فرآیندی است که طی آن یک کاربر می‌تواند یک تراکنش را در بلاکچین اتریوم تأیید کند. برای ارسال یک تراکنش اتریوم، باید آن را با کلید خصوصی خود امضا کنید. این ثابت می‌کند که شما صاحب حساب هستید و تراکنش را تأیید می‌کنید. فرآیند امضا به شرح زیر است:

  1. فرستنده یک شیء تراکنش ایجاد می‌کند که آدرس گیرنده، مقدار ETH برای ارسال و هرگونه داده مرتبط دیگر را مشخص می‌کند.
  2. کلید خصوصی فرستنده برای هش کردن داده‌های تراکنش استفاده می‌شود.
  3. سپس هش با کلید خصوصی امضا می‌شود.
  4. امضا به شیء تراکنش پیوست شده است.
  5. این تراکنش به شبکه اتریوم ارسال می‌شود.

وقتی یک گره در شبکه تراکنشی را دریافت می‌کند، امضا را تأیید می‌کند تا مطمئن شود که توسط صاحب حساب امضا شده است. اگر امضا معتبر باشد، گره تراکنش را به بلاکچین اضافه می‌کند.

برای شروع، منابع ابری لازم را پیکربندی خواهید کرد. سپس، بار کاری را در فضای محرمانه اجرا خواهید کرد. این آزمایشگاه کد شما را در مراحل سطح بالای زیر راهنمایی خواهد کرد:

  • نحوه پیکربندی منابع ابری لازم برای اجرای فضای محرمانه
  • نحوه‌ی اعطای مجوز دسترسی به منابع حفاظت‌شده بر اساس ویژگی‌های:
  • چه چیزی : کانتینر حجم کار
  • که در آن : محیط فضای محرمانه (تصویر فضای محرمانه روی ماشین مجازی محرمانه)
  • چه کسی : حسابی که بار کاری را اجرا می‌کند
  • نحوه اجرای بار کاری در یک ماشین مجازی محرمانه که تصویر ماشین مجازی فضای محرمانه را اجرا می‌کند

API های مورد نیاز

برای تکمیل این راهنما، باید APIهای زیر را در پروژه‌های مشخص شده فعال کنید.

نام API

عنوان API

cloudkms.googleapis.com

سیستم مدیریت دانش ابری

compute.googleapis.com

موتور محاسباتی

محرمانه.googleapis.com

محاسبات محرمانه

iamcredentials.googleapis.com

آی ام

artifactregistry.googleapis.com

ثبت آثار باستانی

۲. منابع ابری را تنظیم کنید

قبل از اینکه شروع کنی

  • برای دریافت اسکریپت‌های مورد نیاز که به عنوان بخشی از این آزمایشگاه کد استفاده می‌شوند ، این مخزن را با استفاده از دستور زیر کلون کنید.
git clone https://github.com/GoogleCloudPlatform/confidential-space.git
  • دایرکتوری مربوط به این codelab را تغییر دهید.
cd confidential-space/codelabs/digital_asset_transaction_codelab/scripts
  • مطمئن شوید که متغیرهای محیطی مورد نیاز پروژه را مطابق شکل زیر تنظیم کرده‌اید. برای اطلاعات بیشتر در مورد راه‌اندازی یک پروژه GCP، لطفاً به این codelab مراجعه کنید. می‌توانید برای کسب اطلاعات بیشتر در مورد نحوه بازیابی شناسه پروژه و تفاوت آن با نام پروژه و شماره پروژه، به این مراجعه کنید.
export PRIMUS_PROJECT_ID=<GCP project id>
  • فعال کردن صورتحساب برای پروژه‌هایتان
  • API محاسبات محرمانه و 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
  • برای تنظیم متغیرهای نام منابع، می‌توانید از دستور زیر استفاده کنید. توجه داشته باشید که این دستور، نام منابع خاص پروژه GCP شما را برای شرکت A لغو می‌کند، برای مثال، export PRIMUS_INPUT_STORAGE_BUCKET='primus-input-bucket'
  • متغیرهای زیر را می‌توان برای پروژه GCP شما در شرکت A تنظیم کرد:

سطل ورودی حافظه $PRIMUS

سطلی که کلیدهای رمزگذاری شده را ذخیره می‌کند.

سطل ذخیره سازی $PRIMUS_RESULT_STORAGE

باکتی که نتیجه تراکنش MPC را ذخیره می‌کند.

کلید_پریموس

کلید KMS که برای رمزگذاری داده‌های ذخیره شده در $PRIMUS_INPUT_STORAGE_BUCKET برای بانک Primus استفاده می‌شود.

حلقه کلید $PRIMUS

حلقه کلید KMS که برای ایجاد کلید رمزگذاری $PRIMUS_KEY برای بانک Primus استفاده خواهد شد.

ارائه دهنده خدمات

ارائه دهنده Workload Identity Pool که شامل شرط ویژگی برای استفاده از توکن‌های امضا شده توسط سرویس بار کاری MPC است.

حساب کاربری $PRIMUS_SERVICE

حساب کاربری سرویسی که $PRIMUS_WORKLOAD_IDENTITY_POOL برای دسترسی به منابع محافظت‌شده از آن استفاده می‌کند. این حساب کاربری سرویس اجازه مشاهده کلیدهای رمزگذاری‌شده‌ای را خواهد داشت که در سطل $PRIMUS_INPUT_STORAGE_BUCKET ذخیره شده‌اند.

مخزن آثار هنری $PRIMUS

مخزن مصنوعات برای ذخیره تصویر کانتینر بار کاری.

حساب حجم کار

حساب کاربری سرویس که مجوز دسترسی به ماشین مجازی محرمانه‌ای که بار کاری را اجرا می‌کند، دارد.

$WORKLOAD_CONTAINER

کانتینر داکر که بار کاری را اجرا می‌کند.

نام تصویر_حجم_کار

نام تصویر کانتینر بار کاری.

برچسب تصویر حجم کار

برچسب تصویر کانتینر حجم کار.

  • اسکریپت زیر را اجرا کنید تا نام متغیرهای باقی‌مانده بر اساس شناسه پروژه شما برای نام منابع، به مقادیری تنظیم شوند.
source config_env.sh

منابع ابری را تنظیم کنید

به عنوان بخشی از این مرحله، شما منابع ابری مورد نیاز برای محاسبات چندطرفه را تنظیم خواهید کرد. برای این آزمایش، از کلید خصوصی زیر استفاده خواهید کرد: 0000000000000000000000000000000000000000000000000000000000000001

در یک محیط عملیاتی، شما کلید خصوصی خود را تولید خواهید کرد. با این حال، برای اهداف این آزمایش، ما این کلید خصوصی را به دو بخش اشتراکی تقسیم کرده و هر کدام را رمزگذاری می‌کنیم. در یک سناریوی عملیاتی، کلیدها هرگز نباید در فایل‌های متنی ساده ذخیره شوند. در عوض، کلید خصوصی می‌تواند خارج از Google Cloud تولید شود (یا به طور کامل از آن صرف نظر شود و با ایجاد خرده کلیدهای سفارشی MPC جایگزین شود) و سپس رمزگذاری شود تا هیچ کس به کلید خصوصی یا کلیدهای اشتراکی دسترسی نداشته باشد. برای اهداف این آزمایش، ما از رابط خط فرمان Gcloud استفاده خواهیم کرد.

اسکریپت زیر را برای تنظیم منابع ابری مورد نیاز اجرا کنید. به عنوان بخشی از این مراحل، منابع ذکر شده در زیر ایجاد خواهند شد:

  • یک مخزن ذخیره‌سازی ابری ( $PRIMUS_INPUT_STORAGE_BUCKET ) برای ذخیره اشتراک‌گذاری‌های کلید خصوصی رمزگذاری‌شده.
  • یک مخزن ذخیره‌سازی ابری ( $PRIMUS_RESULT_STORAGE_BUCKET ) برای ذخیره نتیجه تراکنش دارایی دیجیتال.
  • یک کلید رمزگذاری ( $PRIMUS_KEY ) و یک حلقه کلید ( $PRIMUS_KEYRING ) در KMS برای رمزگذاری اشتراک‌گذاری‌های کلید خصوصی.
  • یک مخزن هویت بار کاری ( $PRIMUS_WORKLOAD_IDENTITY_POOL ) برای اعتبارسنجی ادعاها بر اساس شرایط ویژگی‌های پیکربندی‌شده تحت ارائه‌دهنده آن.
  • یک حساب کاربری سرویس ( $PRIMUS_SERVICEACCOUNT ) که به مخزن هویت بار کاری فوق‌الذکر ( $PRIMUS_WORKLOAD_IDENTITY_POOL ) با دسترسی IAM زیر متصل شده است:
  • roles/cloudkms.cryptoKeyDecrypter برای رمزگشایی داده‌ها با استفاده از کلید KMS.
  • objectViewer برای خواندن داده‌ها از مخزن ذخیره‌سازی ابری.
  • roles/iam.workloadIdentityUser برای اتصال این حساب کاربری سرویس به مخزن هویت بار کاری.
./setup_resources.sh

۳. ایجاد حجم کار

ایجاد حساب کاربری سرویس حجم کار

اکنون یک حساب کاربری سرویس برای بار کاری با نقش‌ها و مجوزهای مورد نیاز ایجاد خواهید کرد. برای انجام این کار، اسکریپت زیر را اجرا کنید که یک حساب کاربری سرویس بار کاری برای شرکت A ایجاد می‌کند. این حساب کاربری سرویس توسط ماشین مجازی که بار کاری را اجرا می‌کند، استفاده خواهد شد.

حساب کاربری سرویس بار کاری ( $WORKLOAD_SERVICEACCOUNT ) نقش‌های زیر را خواهد داشت:

  • برای دریافت توکن تایید، confidentialcomputing.workloadUser استفاده کنید.
  • logging.logWriter برای نوشتن گزارش‌ها در Cloud Logging.
  • objectViewer برای خواندن داده‌ها از مخزن ذخیره‌سازی ابری $PRIMUS_INPUT_STORAGE_BUCKET .
  • objectUser برای نوشتن نتیجه بار کاری در سطل ذخیره‌سازی ابری $PRIMUS_RESULT_STORAGE_BUCKET .
./create_workload_service_account.sh

ایجاد حجم کار

این مرحله شامل ایجاد یک ایمیج داکر از محیط کاری است. محیط کاری در این آزمایشگاه کد، یک برنامه ساده 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: این فایل، مسیرها و جزئیات مربوط به استخر هویت بار کاری را برای جعل هویت حساب کاربری سرویس ذخیره می‌کند. در اینجا فایل 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" ]

توجه: برچسب "tee.launch_policy.allow_cmd_override"="true" در Dockerfile یک سیاست راه‌اندازی است که توسط نویسنده تصویر تنظیم شده است. این به اپراتور اجازه می‌دهد هنگام اجرای بار کاری، CMD را نادیده بگیرد. به طور پیش‌فرض، allow_cmd_override روی false تنظیم شده است. برچسب "tee.launch_policy.allow_env_override" به Confidential Space می‌گوید که کاربران تصویر می‌توانند از کدام متغیرهای محیطی استفاده کنند.

اسکریپت زیر را اجرا کنید تا یک بار کاری ایجاد شود که در آن مراحل زیر انجام شود:

  • برای ذخیره تصویر داکر مربوط به حجم کار، یک رجیستری مصنوعات ( $PRIMUS_ARTIFACT_REPOSITORY ) ایجاد کنید.
  • کد بار کاری را با نام منابع مورد نیاز به‌روزرسانی کنید. در اینجا کد بار کاری مورد استفاده برای این آزمایشگاه کد آمده است.
  • برای ساخت یک تصویر داکر از کد بار کاری، یک فایل داکر (Dockerfile) ایجاد کنید. می‌توانید فایل داکر را اینجا پیدا کنید.
  • ایمیج داکر را در رجیستری مصنوعات ( $PRIMUS_ARTIFACT_REPOSITORY ) که در مرحله قبل ایجاد شده است، بسازید و منتشر کنید.
  • به $WORKLOAD_SERVICEACCOUNT مجوز خواندن برای $PRIMUS_ARTIFACT_REPOSITORY اعطا کنید. این کار برای اینکه کانتینر بار کاری بتواند تصویر داکر بار کاری را از رجیستری Artifact دریافت کند، ضروری است.
./create_workload.sh

ایجاد گره بلاکچین

گره اتریوم گاناش

قبل از تأیید بار کاری، باید نمونه اتریوم گاناش را ایجاد کنیم. تراکنش امضا شده به این نمونه گاناش ارسال می‌شود. لطفاً آدرس IP این نمونه را یادداشت کنید. پس از اجرای دستور زیر، ممکن است برای فعال کردن API لازم باشد 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

۴. مجوزدهی و اجرای حجم کار

حجم کار را مجاز کنید

به عنوان بخشی از این مرحله، ما ارائه دهنده مخزن هویت بار کاری را تحت مخزن هویت بار کاری ( $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"

حجم کار را اجرا کنید

این بخش نحوه اجرای بار کاری روی ماشین مجازی محرمانه (Confidential VM) را توضیح می‌دهد. برای انجام این کار، آرگومان‌های TEE مورد نیاز را با استفاده از پرچم فراداده (metadata flag) ارسال خواهیم کرد. علاوه بر این، متغیرهای محیطی را برای کانتینر بار کاری با استفاده از پرچم "tee-env-*" تنظیم خواهیم کرد. این تصویر دارای متغیرهای زیر است:

  • NODE_URL : آدرس اینترنتی گره اتریوم که تراکنش امضا شده را پردازش خواهد کرد.
  • 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 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}"

نتایج ذخیره سازی ابری را بررسی کنید

می‌توانید رسید تراکنش را در فضای ذخیره‌سازی ابری مشاهده کنید. ممکن است چند دقیقه طول بکشد تا فضای محرمانه بوت شود و نتایج ظاهر شوند. وقتی ماشین مجازی در حالت توقف قرار گرفت، متوجه خواهید شد که کانتینر کار خود را انجام داده است.

  1. به صفحه مرورگر فضای ذخیره‌سازی ابری بروید.
  2. روی $PRIMUS_RESULT_STORAGE_BUCKET کلیک کنید.
  3. روی فایل transaction_receipt کلیک کنید.
  4. برای دانلود و مشاهده پاسخ تراکنش، روی دانلود کلیک کنید.

یا می‌توانید دستورات زیر را اجرا کنید تا نتیجه را مشاهده کنید.

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

توجه: اگر نتایج نمایش داده نمی‌شوند، می‌توانید به $WORKLOAD_VM در صفحه Compute Engine Cloud Console بروید و روی «Serial port 1 (console)» کلیک کنید تا گزارش‌ها را مشاهده کنید.

تراکنش بلاکچین گاناش را بررسی کنید

همچنین می‌توانید تراکنش را در گزارش بلاکچین مشاهده کنید.

  1. به صفحه موتور محاسبات ابری بروید.
  2. روی VM ${ETHEREUM_NODE} کلیک کنید.
  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. گزارش‌های مربوط به گاناش را مشاهده کنید و تأیید کنید که تراکنشی در گزارش‌ها ذکر شده است.

۵. تمیز کردن

این اسکریپتی است که می‌تواند برای پاکسازی منابعی که به عنوان بخشی از این آزمایشگاه کد ایجاد کرده‌ایم، استفاده شود. به عنوان بخشی از این پاکسازی، منابع زیر حذف خواهند شد:

  • مخزن ذخیره‌سازی ورودی که برای ذخیره کلیدهای اشتراکی رمزگذاری‌شده استفاده می‌شود ( $PRIMUS_INPUT_STORAGE_BUCKET) .
  • کلید رمزگذاری ( $PRIMUS_KEY ).
  • حساب کاربری سرویس که برای دسترسی به منابع محافظت‌شده استفاده می‌شود ( $PRIMUS_SERVICEACCOUNT ).
  • مخزن هویت بار کاری ( $PRIMUS_WORKLOAD_IDENTITY_POOL ).
  • حساب سرویس حجم کار ( $WORKLOAD_SERVICEACCOUNT ).
  • نمونه‌های محاسبه حجم کار ( $WORKLOAD_VM و $ETHEREUM_NODE ).
  • مخزن ذخیره‌سازی نتایج که برای ذخیره نتیجه تراکنش استفاده می‌شود. ( $PRIMUS_RESULT_STORAGE_BUCKET )
  • رجیستری مصنوعات برای ذخیره تصویر حجم کار ( $PRIMUS_ARTIFACT_REPOSITORY ) استفاده می‌شود.
./cleanup.sh

اگر کاوش شما تمام شد، لطفاً حذف پروژه خود را در نظر بگیرید.

  • به کنسول پلتفرم ابری بروید
  • پروژه‌ای را که می‌خواهید خاموش کنید انتخاب کنید، سپس روی «حذف» در بالا کلیک کنید. این کار پروژه را برای حذف زمان‌بندی می‌کند.

بعدش چی؟

برخی از این آزمایشگاه‌های کد مشابه را بررسی کنید...

مطالعه بیشتر