Cách giao dịch tài sản kỹ thuật số bằng cơ chế tính toán nhiều bên và không gian bảo mật

1. Tổng quan

Trước khi chúng ta bắt đầu, mặc dù không hoàn toàn cần thiết, nhưng kiến thức thực hành về các tính năng và khái niệm sau đây sẽ chứng minh sự hữu ích trong lớp học lập trình này.

4670cd5427aa39a6.pngS

Kiến thức bạn sẽ học được

Phòng thí nghiệm này cung cấp cách triển khai tham chiếu để thực hiện hoạt động ký chuỗi khối tuân thủ MPC bằng Không gian bảo mật. Để minh hoạ cho các khái niệm này, chúng ta sẽ tìm hiểu một tình huống trong đó Công ty Primus muốn chuyển tài sản kỹ thuật số cho Công ty Secundus. Trong trường hợp này, Công ty Primus sử dụng mô hình tuân thủ MPC, có nghĩa là thay vì sử dụng các khoá riêng tư riêng lẻ, họ sử dụng khoá chia sẻ được phân phối. Các nội dung chia sẻ khoá này do nhiều bên nắm giữ, trong trường hợp này là Alice và Bob. Phương pháp này mang lại cho Công ty Primus một số lợi ích, bao gồm trải nghiệm người dùng được đơn giản hoá, hiệu quả hoạt động và khả năng kiểm soát khoá riêng tư của họ.

Để giải thích các khía cạnh cơ bản của quy trình này, chúng tôi sẽ trình bày chi tiết cách thiết lập kỹ thuật cũng như hướng dẫn bạn thực hiện quy trình phê duyệt và ký kết để bắt đầu quá trình chuyển giao tài sản kỹ thuật số từ Công ty Primus sang Công ty Secundus. Xin lưu ý rằng Bob và Alice đều là nhân viên của Công ty Primus phải phê duyệt giao dịch này.

Mặc dù cách triển khai tham chiếu này minh hoạ hoạt động chữ ký, nhưng không bao gồm mọi khía cạnh của hoạt động quản lý khoá MPC. Ví dụ: chúng tôi không thảo luận về việc tạo khoá. Ngoài ra, còn có các phương pháp thay thế và bổ sung, chẳng hạn như sử dụng các dịch vụ không phải của Google Cloud để tạo chữ ký đồng thời hoặc nhờ người đồng ký xây dựng chữ ký chuỗi khối trong môi trường riêng của họ. Đây là một kiến trúc phi tập trung hơn. Chúng tôi hy vọng rằng phòng thí nghiệm này sẽ mang đến nhiều cách tiếp cận cho MPC trên Google Cloud.

Bạn sẽ xử lý một khối lượng công việc đơn giản, trong đó ký kết giao dịch ETH trong Không gian bảo mật bằng các tài liệu khoá của người đồng ký. Ký giao dịch ETH là một quy trình mà người dùng có thể cho phép thực hiện giao dịch trên chuỗi khối ETH. Để gửi giao dịch ETH, bạn cần ký giao dịch bằng khoá riêng tư của mình. Điều này chứng minh rằng bạn là chủ sở hữu tài khoản và cho phép giao dịch. Quy trình ký như sau:

  1. Người gửi tạo một đối tượng giao dịch chỉ định địa chỉ người nhận, số tiền ETH cần gửi và mọi dữ liệu liên quan khác.
  2. Khoá riêng tư của người gửi được dùng để băm dữ liệu giao dịch.
  3. Sau đó, hàm băm được ký bằng khoá riêng tư.
  4. Chữ ký này được đính kèm với đối tượng giao dịch.
  5. Giao dịch sẽ được phát đi đến mạng ETH.

Khi một nút trên mạng nhận được một giao dịch, nút này sẽ xác minh chữ ký để đảm bảo rằng giao dịch đó do chủ sở hữu tài khoản ký. Nếu chữ ký hợp lệ, nút này sẽ thêm giao dịch vào chuỗi khối (blockchain).

Để bắt đầu, bạn sẽ định cấu hình các tài nguyên cần thiết trên Cloud. Sau đó, bạn sẽ chạy khối lượng công việc trong Không gian bảo mật. Lớp học lập trình này sẽ hướng dẫn bạn thực hiện các bước cấp cao sau đây:

  • Cách định cấu hình các tài nguyên cần thiết trên đám mây để chạy Không gian bảo mật
  • Cách cấp quyền truy cập vào các tài nguyên được bảo vệ dựa trên các thuộc tính của:
  • Nội dung: vùng chứa tải công việc
  • Địa điểm: Môi trường Không gian mật (hình ảnh Không gian mật trên máy ảo bảo mật)
  • Đối tượng: tài khoản đang chạy khối lượng công việc
  • Cách chạy khối lượng công việc trong máy ảo bảo mật chạy hình ảnh máy ảo Không gian bảo mật

API bắt buộc

Bạn phải bật các API sau trong dự án được chỉ định thì mới có thể hoàn tất hướng dẫn này.

Tên API

Tiêu đề API

cloudkms.googleapis.com

Cloud KMS

compute.googleapis.com

Compute Engine

confidentialcomputing.googleapis.com

Điện toán bảo mật

iamcredentials.googleapis.com

IAM

artifactregistry.googleapis.com

Artifact Registry

2. Thiết lập tài nguyên trên đám mây

Trước khi bắt đầu

  • Sao chép kho lưu trữ này bằng lệnh bên dưới để lấy các tập lệnh bắt buộc được dùng trong lớp học lập trình này.
git clone https://github.com/GoogleCloudPlatform/confidential-space.git
  • Thay đổi thư mục cho lớp học lập trình này.
cd confidential-space/codelabs/digital_asset_transaction_codelab/scripts
  • Đảm bảo bạn đã thiết lập các biến môi trường bắt buộc của dự án như dưới đây. Để biết thêm thông tin về cách thiết lập dự án GCP, vui lòng tham khảo lớp học lập trình này. Bạn có thể tham khảo điều này để biết thông tin chi tiết về cách truy xuất mã dự án và điểm khác biệt giữa mã này với tên và số dự án. .
export PRIMUS_PROJECT_ID=<GCP project id>
  • Bật tính năng Thanh toán cho dự án của bạn.
  • Bật Protected Computing API (API Điện toán bảo mật) và các API theo dõi cho cả hai dự án.
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
  • Để đặt biến cho tên tài nguyên, bạn có thể dùng lệnh sau. Xin lưu ý rằng thao tác này sẽ ghi đè tên tài nguyên dành riêng cho dự án GCP của công ty A, ví dụ: export PRIMUS_INPUT_STORAGE_BUCKET='primus-input-bucket'
  • Bạn có thể đặt các biến sau cho dự án GCP trong Công ty A:

$PRIMUS_INPUT_STORAGE_BUCKET

Bộ chứa lưu trữ các khoá đã mã hoá.

$PRIMUS_RESULT_STORAGE_BUCKET

Bộ chứa lưu trữ kết quả giao dịch MPC.

$PRIMUS_KEY

Khoá KMS dùng để mã hoá dữ liệu lưu trữ trong $PRIMUS_INPUT_STORAGE_BUCKET cho Primus Bank.

$PRIMUS_KEYRR

Khoá KMS sẽ được dùng để tạo khoá mã hoá $PRIMUS_KEY cho Primus Bank.

$PRIMUS_WIP_PROVIDER

Nhà cung cấp Nhóm Workload Identity bao gồm điều kiện thuộc tính để dùng cho các mã thông báo do dịch vụ tải công việc MPC ký.

$PRIMUS_SERVICEACCOUNT

Tài khoản dịch vụ mà $PRIMUS_WORKCANCEL_IDENTITY_POOL sử dụng để truy cập vào các tài nguyên được bảo vệ. Tài khoản dịch vụ này sẽ có quyền xem các khoá đã mã hoá được lưu trữ trong bộ chứa $PRIMUS_INPUT_STORAGE_BUCKET.

$PRIMUS_ARTIFACT_REPOSITORY

Kho lưu trữ cấu phần phần mềm để lưu trữ hình ảnh vùng chứa tải công việc.

$WORKLOAD_SERVICEACCOUNT

Tài khoản dịch vụ có quyền truy cập vào Máy ảo bảo mật chạy khối lượng công việc.

$WORKLOAD_CONTAINER

Vùng chứa Docker chạy khối lượng công việc.

$WORKLOAD_IMAGE_NAME

Tên của hình ảnh vùng chứa tải công việc.

$WORKCANCEL_IMAGE_TAG

Thẻ của hình ảnh vùng chứa tải công việc.

  • Chạy tập lệnh sau để đặt tên biến còn lại thành các giá trị dựa trên mã dự án cho tên tài nguyên.
source config_env.sh

Thiết lập Tài nguyên trên đám mây

Trong bước này, bạn sẽ thiết lập tài nguyên đám mây cần thiết cho hoạt động tính toán của nhiều bên. Đối với phòng thí nghiệm này, bạn sẽ sử dụng khoá riêng tư sau: 0000000000000000000000000000000000000000000000000000000000000001

Trong môi trường phát hành công khai, bạn sẽ tạo khoá riêng tư của riêng mình. Tuy nhiên, vì mục đích của phòng thí nghiệm này, chúng tôi sẽ chia khoá riêng tư này thành hai phần và mã hoá mỗi phần. Trong trường hợp phát hành chính thức, tuyệt đối không nên lưu trữ khoá trong tệp văn bản thuần tuý. Thay vào đó, bạn có thể tạo khoá riêng tư bên ngoài Google Cloud (hoặc bỏ qua hoàn toàn và thay thế bằng tính năng tạo phân đoạn khoá MPC tuỳ chỉnh), sau đó được mã hoá để không ai có quyền truy cập vào khoá riêng tư hoặc phần chia sẻ khoá. Trong phạm vi của phòng thí nghiệm này, chúng tôi sẽ sử dụng Gcloud CLI.

Chạy tập lệnh sau để thiết lập các tài nguyên đám mây cần thiết. Trong các bước này, chúng tôi sẽ tạo các tài nguyên được đề cập bên dưới:

  • Một bộ chứa Cloud Storage ($PRIMUS_INPUT_STORAGE_BUCKET) để lưu trữ các phần chia sẻ khoá riêng tư đã mã hoá.
  • Một bộ chứa Cloud Storage ($PRIMUS_RESULT_STORAGE_BUCKET) để lưu trữ kết quả của giao dịch tài sản kỹ thuật số.
  • Khoá mã hoá ($PRIMUS_KEY) và bộ khoá ($PRIMUS_KEYRING) trong KMS để mã hoá phần chia sẻ khoá riêng tư.
  • Nhóm danh tính cho khối lượng công việc ($PRIMUS_WORKLOAD_IDENTITY_POOL) để xác thực các thông báo xác nhận quyền sở hữu dựa trên điều kiện về thuộc tính được định cấu hình theo nhà cung cấp.
  • Một tài khoản dịch vụ ($PRIMUS_SERVICEACCOUNT) được liên kết với nhóm danh tính của tải công việc ($PRIMUS_WORKLOAD_IDENTITY_POOL) nêu trên có quyền truy cập IAM sau đây:
  • roles/cloudkms.cryptoKeyDecrypter để giải mã dữ liệu bằng khoá KMS.
  • objectViewer để đọc dữ liệu trong bộ chứa Cloud Storage.
  • roles/iam.workloadIdentityUser để kết nối tài khoản dịch vụ này với nhóm nhận dạng của khối lượng công việc.
./setup_resources.sh

3. Tạo khối lượng công việc

Tạo tài khoản dịch vụ cho tải công việc

Bây giờ, bạn sẽ tạo một tài khoản dịch vụ cho khối lượng công việc với các vai trò và quyền cần thiết. Để thực hiện việc này, hãy chạy tập lệnh sau để tạo tài khoản dịch vụ tải công việc cho Công ty A. Tài khoản dịch vụ này sẽ được dùng trên máy ảo chạy khối lượng công việc.

Tài khoản dịch vụ của tải công việc ($WORKLOAD_SERVICEACCOUNT) sẽ có các vai trò sau:

  • confidentialcomputing.workloadUser để nhận mã thông báo chứng thực
  • logging.logWriter để ghi nhật ký vào Cloud Logging.
  • objectViewer để đọc dữ liệu trong bộ chứa $PRIMUS_INPUT_STORAGE_BUCKET Cloud Storage.
  • objectUser để ghi kết quả khối lượng công việc vào bộ chứa $PRIMUS_RESULT_STORAGE_BUCKET Cloud Storage.
./create_workload_service_account.sh

Tạo khối lượng công việc

Bước này bao gồm tạo hình ảnh Docker tải công việc. Khối lượng công việc trong lớp học lập trình này là một ứng dụng Node.js MPC đơn giản dùng để ký giao dịch kỹ thuật số để chuyển giao tài sản bằng phần chia sẻ khoá riêng tư đã mã hoá. Đây là mã dự án tải công việc. Dự án tải công việc bao gồm các tệp sau.

package.json: Tệp này chứa danh sách các gói nên dùng cho ứng dụng MPC tải công việc. Trong trường hợp này, chúng tôi đang dùng các thư viện @google-cloud/km, @google-cloud/storage, ethers và nhanh-crc32c. Đây là tệp package.json mà chúng ta sẽ sử dụng cho lớp học lập trình này.

index.js: Đây là điểm bắt đầu của ứng dụng khối lượng công việc và chỉ định những lệnh nào sẽ được chạy khi vùng chứa khối lượng công việc khởi động. Chúng tôi cũng đưa vào một giao dịch mẫu chưa ký thường do một ứng dụng không đáng tin cậy cung cấp và yêu cầu người dùng nhập chữ ký. Tệpindex.js này cũng nhập các hàm từ mpc.js mà chúng ta sẽ tạo trong phần tiếp theo. Dưới đây là nội dung của tệpindex.js và bạn cũng có thể tìm thấy tệp này tại đây.

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: Đây là nơi ký giao dịch diễn ra. Thao tác này sẽ nhập các hàm từ kms- giải mã và thông tin xác thực-config. Chúng tôi sẽ trình bày về các hàm này ở phần tiếp theo. Dưới đây là nội dung của tệp mpc.js và bạn cũng có thể tìm thấy tệp này tại đây.

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: Tệp này chứa mã để giải mã bằng cách sử dụng khoá được quản lý trong KMS. Dưới đây là nội dung của tệp kms-resolve.js và bạn cũng có thể tìm thấy tệp này tại đây.

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: Tệp này lưu trữ đường dẫn nhóm danh tính của khối lượng công việc và thông tin chi tiết về việc mạo danh tài khoản dịch vụ. Đây là tệp thông tin xác thực-config.js mà chúng ta sẽ sử dụng cho lớp học lập trình này.

Dockerfile: Cuối cùng, chúng ta sẽ tạo Dockerfile được dùng để tạo hình ảnh Dockerfile cho khối lượng công việc. khai báo Dockerfile như được chỉ định tại đây.

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

Lưu ý: LABEL "tee.launch_policy.allow_cmd_override"="true" trong Dockerfile là một chính sách chạy do tác giả hình ảnh đặt ra. Thư viện này cho phép người vận hành ghi đè CMD khi thực thi khối lượng công việc. Theo mặc định, allow_cmd_override được đặt thành false. LABEL &quot;tee.launch_policy.allow_env_override&quot; cho bí mật Không gian bảo mật biết người dùng hình ảnh có thể sử dụng biến thể môi trường nào .

Chạy tập lệnh sau để tạo khối lượng công việc đang thực hiện các bước sau đây:

  • Tạo Artifact Registry($PRIMUS_ARTIFACT_REPOSITORY) để lưu trữ hình ảnh Docker của khối lượng công việc.
  • Cập nhật mã của khối lượng công việc bằng các tên tài nguyên cần thiết. Đây là mã khối lượng công việc dùng cho lớp học lập trình này.
  • Tạo Dockerfile để tạo hình ảnh Docker của mã tải công việc. Bạn có thể tìm thấy Dockerfile tại đây.
  • Tạo và xuất bản hình ảnh Docker lên Artifact Registry ($PRIMUS_ARTIFACT_REPOSITORY) đã tạo ở bước trước.
  • Cấp quyền đọc cho $WORKLOAD_SERVICEACCOUNT đối với $PRIMUS_ARTIFACT_REPOSITORY. Điều này là cần thiết để vùng chứa tải công việc lấy hình ảnh Docker của tải công việc từ Artifact Registry.
./create_workload.sh

Tạo Nút chuỗi khối

Nút Ganache Etheum

Trước khi uỷ quyền cho khối lượng công việc này, chúng ta cần tạo thực thể Etherum Ganache. Giao dịch đã ký sẽ được gửi đến phiên bản Ganache này. Vui lòng ghi lại địa chỉ IP của trường hợp này. Sau khi chạy lệnh dưới đây, bạn có thể cần nhập y để bật API nà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. Cho phép và chạy khối lượng công việc

Cho phép tải công việc

Trong bước này, chúng ta sẽ thiết lập nhà cung cấp nhóm nhận dạng cho tải công việc trong nhóm nhận dạng của khối lượng công việc ($PRIMUS_WORKLOAD_IDENTITY_POOL). Có các điều kiện thuộc tính được định cấu hình cho thông tin nhận dạng của khối lượng công việc như trình bày dưới đây. Một trong những điều kiện là xác thực hình ảnh khối lượng công việc đang được lấy từ kho lưu trữ cấu phần phần mềm dự kiến.

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"

Chạy khối lượng công việc

Phần này giải thích cách chạy khối lượng công việc trên máy ảo bảo mật. Để thực hiện việc này, chúng ta sẽ truyền các đối số TEE bắt buộc bằng cách sử dụng cờ siêu dữ liệu. Ngoài ra, chúng ta sẽ thiết lập các biến môi trường cho vùng chứa khối lượng công việc bằng cách sử dụng "tee-env-*" cờ. Hình ảnh này có các biến sau:

  • NODE_URL: URL của nút Etherum sẽ xử lý giao dịch đã ký.
  • RESULTS_BUCKET: Bộ chứa lưu trữ kết quả giao dịch mpc.
  • KEY_BUCKET: Bộ chứa lưu trữ các khoá đã mã hoá mpc.
  • PRIMUS_PROJECT_NUMBER: Số dự án được dùng cho tệp cấu hình thông tin xác thực.
  • PRIMUS_PROJECT_ID: Mã dự án dùng cho tệp cấu hình thông tin xác thực. Kết quả thực thi khối lượng công việc sẽ được xuất bản lên $PRIMUS_RESULT_STORAGE_BUCKET.
  • PRIMUS_WORKLOAD_IDENTITY_POOL: Nhóm danh tính của khối lượng công việc dùng để xác thực các thông báo xác nhận quyền sở hữu.
  • PRIMUS_WIP_POROVIDER: Trình cung cấp nhóm danh tính cho tải công việc bao gồm các điều kiện thuộc tính dùng để xác thực các mã thông báo do khối lượng công việc trình bày.
  • WORKLOAD_SERVICEACCOUNT: Tài khoản dịch vụ của khối lượng công việc.
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}"

Kiểm tra kết quả Cloud Storage

Bạn có thể xem biên nhận giao dịch trong Cloud Storage. Có thể mất vài phút để Không gian bảo mật khởi động và kết quả xuất hiện. Bạn sẽ biết vùng chứa được hoàn tất khi máy ảo ở trạng thái dừng.

  1. Chuyển đến trang Trình duyệt Cloud Storage.
  2. Nhấp vào $PRIMUS_RESULT_STORAGE_BUCKET.
  3. Nhấp vào tệp transaction_receipt.
  4. Hãy nhấp vào Tải xuống để tải xuống và xem phản hồi giao dịch.

Lưu ý: Nếu kết quả không xuất hiện, bạn có thể truy cập $WORK hoá_VM trong trang Compute Engine Cloud Console rồi nhấp vào "Cổng nối tiếp 1 (bảng điều khiển)" để xem nhật ký.

Kiểm tra giao dịch chuỗi khối Ganache

Bạn cũng có thể xem giao dịch trong nhật ký chuỗi khối (blockchain).

  1. Truy cập vào trang Cloud Compute Engine.
  2. Nhấp vào mpc-lab-ethereum-node VM.
  3. Nhấp vào SSH để mở cửa sổ SSH-in-browser.
  4. Trong cửa sổ SSH, hãy nhập sudo docker ps để xem vùng chứa Ganache đang chạy.
  5. Tìm mã vùng chứa cho trufflesuite/ganache:v7.7.3
  6. Nhập sudo docker logs CONTAINER_ID thay thế CONTAINER_ID bằng mã nhận dạng cho trufflesuite/ganache:v7.7.3.
  7. Xem nhật ký của Ganache và xác nhận rằng có một giao dịch được liệt kê trong nhật ký.

5. Dọn dẹp

Đây là tập lệnh có thể dùng để dọn dẹp các tài nguyên mà chúng ta đã tạo trong lớp học lập trình này. Trong quá trình dọn dẹp này, các tài nguyên sau sẽ bị xoá:

  • Bộ chứa lưu trữ đầu vào dùng để lưu trữ các phần chia sẻ khoá đã mã hoá ($PRIMUS_INPUT_STORAGE_BUCKET).
  • Khoá mã hoá và bộ khoá ($PRIMUS_KEY$PRIMUS_KEYRING).
  • Tài khoản dịch vụ dùng để truy cập tài nguyên được bảo vệ ($PRIMUS_SERVICEACCOUNT).
  • Nhóm Workload Identity ($PRIMUS_WORKLOAD_IDENTITY_POOL).
  • Tài khoản dịch vụ Workload ($WORKLOAD_SERVICEACCOUNT).
  • Các thực thể điện toán khối lượng công việc (workload).
  • Bộ chứa lưu trữ kết quả được dùng để lưu trữ kết quả giao dịch.($PRIMUS_RESULT_STORAGE_BUCKET).
  • Sổ đăng ký cấu phần phần mềm dùng để lưu trữ hình ảnh khối lượng công việc ($PRIMUS_ARTIFACT_REPOSITORY).
./cleanup.sh

Nếu bạn đã khám phá xong, vui lòng xem xét xoá dự án của bạn.

Tiếp theo là gì?

Hãy xem một số lớp học lập trình tương tự...

Tài liệu đọc thêm