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

1. بررسی اجمالی

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

4670cd5427aa39a6.png

چیزی که یاد خواهید گرفت

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

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

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

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

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

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

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

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

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

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

نام API

عنوان API

cloudkms.googleapis.com

Cloud KMS

compute.googleapis.com

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

confidentialcomputing.googleapis.com

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

iamcredentials.googleapis.com

IAM

artifactregistry.googleapis.com

رجیستری مصنوعات

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
  • برای تنظیم متغیرها برای نام منابع می توانید از دستور زیر استفاده کنید. توجه داشته باشید که این نام منابع خاص پروژه GCP شما را برای شرکت A لغو می کند، به عنوان مثال، export PRIMUS_INPUT_STORAGE_BUCKET='primus-input-bucket'
  • متغیرهای زیر را می توان برای پروژه GCP شما در شرکت A تنظیم کرد:

PRIMUS_INPUT_STORAGE_BUCKET دلار

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

PRIMUS_RESULT_STORAGE_BUCKET دلار

سطلی که نتیجه تراکنش MPC را ذخیره می کند.

PRIMUS_KEY $

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

PRIMUS_KEYRING دلار

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

PRIMUS_WIP_PROVIDER $

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

PRIMUS_SERVICEACCOUNT $

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

PRIMUS_ARTIFACT_REPOSITORY $

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

WORKLOAD_SERVICEACCOUNT $

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

WORKLOAD_CONTAINER $

ظرف Docker که حجم کار را اجرا می کند.

$WORKLOAD_IMAGE_NAME

نام تصویر ظرف حجم کاری.

WORKLOAD_IMAGE_TAG $

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

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

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

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

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

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

  • یک سطل ذخیره‌سازی ابری ( $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 ) با دسترسی IAM زیر:
  • roles/cloudkms.cryptoKeyDecrypter برای رمزگشایی داده ها با استفاده از کلید KMS.
  • objectViewer برای خواندن داده ها از سطل Cloud Storage.
  • roles/iam.workloadIdentityUser برای اتصال این سرویس-حساب به مخزن هویت حجم کاری.
./setup_resources.sh

3. بار کاری ایجاد کنید

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

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

حساب سرویس حجم کاری ( $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 بار کاری است. حجم کار در این Codelab یک برنامه MPC ساده Node.js است که تراکنش های دیجیتال را برای انتقال دارایی ها با استفاده از اشتراک های کلید خصوصی رمزگذاری شده امضا می کند. در اینجا کد پروژه حجم کار آمده است. پروژه حجم کاری شامل فایل های زیر می باشد.

package.json: این فایل حاوی لیست بسته هایی است که باید برای برنامه MPC حجم کاری استفاده شود. در این مورد، ما از کتابخانه‌های @google-cloud/kms، @google-cloud/storage، اترها و 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 خود را ایجاد می کنیم که برای ساختن تصویر داکر حجم کار استفاده می شود. 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 "tee.launch_policy.allow_env_override" به فضای محرمانه می گوید که کاربران تصویر از کدام متغیرهای محیطی می توانند استفاده کنند.

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

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

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

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

قبل از مجاز کردن حجم کار، باید نمونه Ethereum Ganache را ایجاد کنیم. تراکنش امضا شده به این نمونه Ganache ارسال می شود. لطفاً آدرس IP این نمونه را یادداشت کنید. پس از اجرای دستور زیر، ممکن است لازم باشد y برای فعال کردن API وارد کنید.

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

مجوز بار کاری

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

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

  1. به صفحه Cloud Storage Browser بروید.
  2. روی $PRIMUS_RESULT_STORAGE_BUCKET کلیک کنید.
  3. روی فایل transaction_receipt کلیک کنید.
  4. برای دانلود و مشاهده پاسخ تراکنش روی دانلود کلیک کنید.

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

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

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

  1. به صفحه Cloud Compute Engine بروید.
  2. روی mpc-lab-ethereum-node VM کلیک کنید.
  3. روی SSH کلیک کنید تا پنجره SSH-in-browser باز شود.
  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 ).
  • مجموعه هویت حجم کاری ( $PRIMUS_WORKLOAD_IDENTITY_POOL ).
  • حساب خدمات بار کاری ( $WORKLOAD_SERVICEACCOUNT ).
  • نمونه های محاسبه حجم کار
  • سطل ذخیره‌سازی نتیجه برای ذخیره نتیجه تراکنش استفاده می‌شود. ( $PRIMUS_RESULT_STORAGE_BUCKET ).
  • رجیستری مصنوع مورد استفاده برای ذخیره تصویر حجم کاری ( $PRIMUS_ARTIFACT_REPOSITORY ).
./cleanup.sh

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

  • به کنسول Cloud Platform بروید
  • پروژه ای را که می خواهید تعطیل کنید انتخاب کنید، سپس روی "حذف" در بالا کلیک کنید. این برنامه پروژه را برای حذف برنامه ریزی می کند.

بعدش چی؟

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

در ادامه مطلب